Linux安全和openssl、gpg加密
本章内容:
安全机制
对称加密
不对称加密
散列算法
PKI和CA
openssl
证书管理
gpg
加密需要:
不加密的流量易受攻击性
密码/数据嗅探
数据操作
验证操作
相当于邮寄明信片
不安全的传统协议:
telnet、ftp、pop3、等;不安全密码
http、smtp、nfs、等;不安全信息
ldap、nis、rsh、等;不安全验证
安全机制:
NIST(美国国家标准与技术研究院)定义的安全属性:
保密性:
数据保密性;
隐私性;
完整性:
不可篡改
数据完整性
系统完整性
可用性
可扩展性
安全攻击:
spoofing(假冒)、tampering(篡改)、repudiation(否认)、informationdisclosure(信息泄露)、denial of service(拒绝服务)、elevation of privilege(提升权限)
安全机制:
加密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证
安全服务:
认证
访问控制
数据保密性
链接保密性
无连接保密性
选择域保密性
流量保密性
数据完整性
不可否认性
设计基本原则:
使用成熟的安全系统
以小人之心度输入数据
外部系统是不安全的
最小授权
减少外部接口
缺省使用外部接口
缺省使用安全模式
安全不是似是而非
从stride思考
在入口处检查
从管理上保护好你的系统
安全算法:
常用安全技术
认证
授权
安全通信
审计
密码算法和协议
对称加密
公钥加密
单向加密
认证协议
Linux系统:openssl,gpg(gpg协议的实现)
对称加密算法:
对称加密:加密和解密使用同一个秘钥
DES:data encryption standard 56bits
3DES:
AES:advanced(128 192 256bits)
IDEA,RC6,CAST5
特性:
1、加密、解密使用同一个秘钥,效率高;
2、将原始数据分隔成固定大小的块,逐个进行加密
缺陷:
1、秘钥过多
2、秘钥分发
3、数据来源无法确认
非对称加密算法:
公钥加密:秘钥是成对出现
公钥:公开所有人:public key
私钥:自己留存,必须保证其私密性,secret key
特点:
用公钥加密数据,只能使用与之配对的私钥解密:反之亦然。
功能:
数字签名:主要在于让接受方确认发送方身份;
对称秘钥交换:发送方用对方的公钥加密一个对称秘钥后发送给对方;
数据加密:适合加密较小的数据;
缺点:密钥长,加密解密效率低下;
算法:RSA(加密、数字签名)DSA(数字签名)
基于一对公钥/密钥对:
用密钥对中的有个加密,另一个解密
实现加密:
接收者:
生成公钥/密钥对:p和s
公开公钥p,保密密钥s
发送者:
使用接受者的公钥来加密消息m
将p(m)发送给接受者
接收者:
使用密码S来解密:M=S(p(m))
实现数字签名:
发送者:
生成公钥/密钥对:p和s
公开公钥p,保密密钥 s
使用密钥s来加密消息m
发送给接收者s(m)
接收者:
使用发送者的公钥来解密M=P(s(m))
结合签名和加密:
分离签名:
单向散列:
将任意数据缩小成固定大小的“指纹”
任意长度输入
固定长度输入
若修改数据,指纹也会改变(不会产生冲突)
无法从指纹中重新生成数据(单向)
功能:数据完整性
常见算式:
md5:128bits 、sha1:160bits、 sha224、sha256、sha384、sha512
检查MD5加密的文件是否被改过:
[root@centos7 ~]# md5sum f1 > f1.md5
[root@centos7 ~]# md5sum –check f1.md5
f1: OK
[root@centos7 ~]#
常用工具:
MD5sum、sha1sum、openssl 、rpm -V
密钥交换:IKE(Internet key exchange)
公钥加密:DH(Deffie-Hellman)
DH:
1、A:a,p协商生成公开的整数a,大素数p
B:a,p
2、A:生成隐私数据:x(x<p),计算的出a^y%p,发送给A
B:生成隐私数据:y,计算得出a^y%p,发送给A
3、A:计算得出(a^y%p)^x=a^xy%p,生成为密钥
B:计算得出(a^x%p)^y=a^xy%p,生成为密钥
CA和证书:
PKI:public key infrastructure
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书取存库
X.509定义了证书的结构以及认证协议标准:
版本号 主体公钥
序列号 CRL分发点
签名算法 扩展信息
颁发者 发行者签名
有效期限
主体名称
证书获取:
证书类型:
证书授权机构的证书
服务器
用户证书
获取证书的两种方法:
使用证书授权机构:
生成签名请求(csr)
将(csr)发送给CA
从CA处接受签名
自签名的证书:
自己签发自己的公钥
安全协议:
ssl:secure socket layer
功能:机密性、认证、完整性、重放保护
两阶段协议:分为握手阶段和应用阶段
握手阶段(协商阶段):客户端和服务器端认证对方的身份,(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过Mastersecret生成。
应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信。
SSL/TLS:
SSL protocol(ssl 协议):
Handshake协议:包括协商安全参数和密码套件、服务器身份验证(客户端身份认证可选)、密钥交换。
ChangCipherspec协议:一条消息表明握手协议已经完成。
Alert协议:对握手协议中的一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断ssl链接,而warning级别的错误ssl链接仍可继续,只是会给出错误警告。
Record协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等。
HTTPS协议:就是“http”协议和“ssl/tls”协议的组合。http over ssl 或http over tls,对http协议的文本数据进行加密处理后,成为二进制形式传输。
openssl开源项目:
三个组件:
openssl:多用途的命令行工具;
libcrypot:加密算法库
libssl:加密模块应用库,实现了ssl及tls
openssl命令:
两种运行模式:交互模式和批处理模式;
openssl version:程序版本号;
标准命令、消息摘要命令、加密命令
标准命令:enc、ca、req、dgst、passwd
openssl命令:
对称加密:
enc命令:对称加密
示例:加密
加密/root/fstab文件,把加密后的文件保存至fstab.des3文件中,删除原有文件。
[root@centos7 ~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.des3
[root@centos7 ~]#rm -rf /root/fstab
示例:解密
对刚才加密的/root/fstab文件解密,解密成原文件名;
[root@centos7 ~]# openssl enc -d -des3 -a -salt -in fstab.des3 -out fstab
单向加密:
工具: md5:128bits 、sha1:160bits、 sha224、sha256、sha384、sha512
dgst命令: openssl dgst
示例:
1、使用MD5对fstab文件单向加密
[root@centos7 ~]# openssl dgst -md5 fstab
MD5(fstab)= 7821f49dddb994d0156cdc784a8863b6
[root@centos7 ~]#
2、同时还可以使用:MD5sum –check file 将保存到指定文件中的MD5单向加密值,实时检查文件是否被篡改;
[root@centos7 ~]# openssl dgst -md5 fstab > f1.md5
[root@centos7 ~]# cat f1.md5
MD5(fstab)= 7821f49dddb994d0156cdc784a8863b6
[root@centos7 ~]# md5sum –check f1.md5
fstab: OK
[root@centos7 ~]#
生成用户加密口令:
passwd命令:man sslpasswd
openssl passwd -1 -salt ##### SALT(最多8位)
示例:
为用户生成一个加密口令:
[root@centos7 ~]# openssl passwd -1 -salt "123456" centos
$1$123456$3GFsiB8xUJ7EaYT.K6Spz0
[root@centos7 ~]#
生成随机数:
openssl rand -base64 | -hex number(指定数字)
示例:生成随机数
[root@centos7 ~]# openssl rand -base64 10
9cqdc7tAaCE5KQ==
[root@centos7 ~]#
生成密钥对儿(非对称加密):man genrsa
生成私钥:
openssl genrsa -out /PATH/TO/PRIVATE.FILE NUM_BITS
des:给私钥文件设置个密码;
从私钥中提取公钥:
openssl rsa -in PRIVATE.FILE -pubout PUBLICKEY.FIEL
示例:
生成私钥文件,在子shell中执行需加上():
[root@centos7 ~]# (umask 066;openssl genrsa -out key.private -des 2048 )
生成私钥文件的权限600:
[root@centos7 ~]# ll key.private
-rw——- 1 root root 1738 oct 2 10:35 key.private
[root@centos7 ~]
从私钥中提取公钥:
[root@centos7 ~]# openssl rsa -in key.private -pubout -out key.public
Enter pass phrase for key.private:
writing RSA key
[root@centos7 ~]#
生成公钥文件的权限644:
[root@centos7 ~]# ll key.public
-rw-r–r– 1 root root 451 oct 2 10:47 key.public
[root@centos7 ~]
随机数生成器:伪随机数
键盘和鼠标
块设备中断
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
/dev/urando:从熵池返回随机数,随机数用尽,利用软件生成伪随机数,非阻塞。
openssl:PKI:public key infraStructure
创建私有CA和申请证书:
创建私有CA:
openssl的配置文件:/etc/pki/tls/openssl.cnf
(1)创建所需要的文件:
创建CA数据库文件;
touch /etc/pki/CA/index.txt
创建CA数据库索引编号文件;
echo “01” > /etc/pki/CA/serial
(2)CA自签证书:
生成私钥;
(umask 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
生成自签名证书:
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -0ut
/etc/pki/CA/cacert.pem
req:申请证书;
-out:证书的保存路径;
-new:申请新证书;
-x509:生成专用于CA的自签证书;
-key:生成请求时用到的私钥文件;
-days:证书的有效期;
颁发证书:
在需要使用证书的主机生成证书请求:
1、 给web服务器生成私钥:
(umask 066;openssl genrsa -out /etc/httpd/ssl/httpkey.private 2048)
2、生成证书申请文件:
openssl req -new -key /etc/httpd/ssl/httpkey.private -days 365 -out /etc/httpd/ssl/httpd.csr
3、将证书申请文件传输给CA
4、CA签署证书,并将证书颁发给请求者;
openssl ca -in /root/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
5、查看证书中的信息;
openssl x509 -in /etc/pki/CA/cacert.pem -noout -text
6、吊销证书;
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
7、生成吊销证书编号(第一次吊销一个证书时才需要执行)
echo "01" > /etc/pki/CA/crlnumber
8、更新证书吊销列表;
openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl
9、查看吊销的crl证书文件;
openssl crl -in /etc/pki/CA/crl/ca.crl -noout -text
示例:搭建私有CA
*根据openssl的配置文件:/etc/pki/tls/openssl.cnf中定义的文件路径来创建所需文件。
(1)创建所需的文件:
[root@centos7 ~]# touch /etc/pki/CA/index.txt //创建CA数据库文件
[root@centos7 ~]# echo "01" > /etc/pki/CA/serial //创建CA数据库索引编号文件
[root@centos7 ~]# cat /etc/pki/CA/serial
01
[root@centos7 ~]#
(2)CA自签证书:
1)生成私钥;
[root@centos7 ~]# (umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
…………………………………………………………………………………………………………………………+++
……….+++
e is 65537 (0x10001)
[root@centos7 ~]#
2)生成自签名证书;
1)[root@centos7 ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
—–
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:mage.com
Organizational Unit Name (eg, section) []:m20-1
Common Name (eg, your name or your server's hostname) []:centos7
Email Address []:admin@magedu.com
root@centos7 ~]#
2)查看所生成的证书:
root@centos7 CA]# openssl x509 -in /etc/pki/CA/cacert.pem -noout -text
同样也可以copy到Windows桌面进行查看,但需要更改证书后缀名为:xxx.cer
(3)颁发证书:
1)在需要使用证书的主机生成证书请求:
例:给www.magedu.com web服务器申请证书。
(实验环境说明:CA server为:centos7 web server为:centos6)
首先在web服务器中生成一个私钥文件,用私钥文件生成证书申请文件;并将证书申请文件传送给CA。
第一步:在web服务器(centos6)中生成一个私钥文件:
[root@centos6 Desktop]# mkdir /etc/httpd/ssl
[root@centos6 ]# (umask 066;openssl genrsa -out /etc/httpd/ssl/httpkey.private 2048)
Generating RSA private key, 2048 bit long modulus
………………………+++
……………………………………………………………………………………………………………………+++
e is 65537 (0x10001)
[root@centos6 Desktop]#
第二步:生成证书申请文件:
[root@centos6 Desktop]# openssl req -new -key /etc/httpd/ssl/httpkey.private -days 365 -out /etc/httpd/ssl/httpd.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
—–
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:magedu.com
Organizational Unit Name (eg, section) []:m20-1
Common Name (eg, your name or your server's hostname) []:www.magedu.com
Email Address []:root@magedu.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@centos6 Desktop]#
第三步:将证书申请文件通过scp传送给CA;
[root@centos6 Desktop]# scp /etc/httpd/ssl/httpd.csr 192.168.3.11:/root
第四步:CA签署证书,并将证书颁发给请求者;并将证书保存到/etc/pki/CA/certs/目录下。
[root@centos7 CA]# openssl ca -in /root/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
如果该证书存在违法行为,我们该如何吊销此证书呢?
吊销www.magedu.com的证书:
[root@centos7 newcerts]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
[root@centos7 newcerts]#
生成吊销证书的编号(第一次吊销一个证书时才需要执行)
[root@centos7 CA]# echo "01" > /etc/pki/CA/crlnumber
[root@centos7 CA]#
更新证书吊销列表;
[root@centos7 crl]# openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl
Using configuration from /etc/pki/tls/openssl.cnf
[root@centos7 crl]#
查看吊销的crl证书文件;
[root@centos7 crl]# openssl crl -in /etc/pki/CA/crl/ca.crl -noout -text
使用gpg实现对称加密:
对称加密file文件:
gpg -c file 选项: -c:对称加密
注:加密后的文件会以file.gpg结尾,如果在同一台机器上解密是不用输入密码的。
在另一台主机上解密file:
gpg -o file -d file.gpg 选项:-o:重定向 -d:解密
示例:
在centos7主机上使用gpg加密一个文件,在centos6上解密这个文件,这样可以防止别人偷拷贝你的数据。
[root@centos7 ~]# gpg -c fstab //加密后的文件会以fstab.gpg结尾。
[root@centos6 ~]# gpg -o fstab -d fstab.gpg //把fstab.gpg文件解密到fstab文件中。
使用gpg工具实现公钥加密:
1)在主机上生成公钥/私钥对儿
gpg –gen-key
注意:生成的公钥私钥文件放在了/root/.gnupg目录下。
2)在主机上查看公钥
gpg –list-key
3)在主机中导出公钥到指定的文件中
gpg -a –export -o file 选项: -a:表示使用base64机制编码
注:因为默认的公钥文件是无法使用命令查看的。
4)从A本机复制公钥文件到B主机上加密
使用scp命令
5)在B主机中导入A主机的公钥
gpg —import file
6)用从A主机导入的公钥,加密B主机的文件file,生成file.gpg
gpg -e -r PUBLIC_UID file
选项:
-e:加密。
-r:指定使用哪个 PUBLIC_UID加密文件。
7)复制加密文件到A主机:
scp file.gpg A主机
8)在A主机中解密文件:
gpg -d file.gpg
gpg -o file -d file.gpg
9)删除公钥和私钥
gpg –delete-keys PUBLIC_UID
gpg –delete-secret-keys PUBLIC_UID (如果私钥存在要先删除私钥)
示例:
使用gpg工具实现公钥加密:
实验环境:在centos7上使用gpg工具生成公钥/私钥密钥对儿,然后把公钥copy到centos6主机上,使用centos7的公钥加密文件,然后把加密后的文件在copy到centos7上,使用centos7的私钥进行解密该文件。
1、在centos7上生成公钥/私钥密钥对儿:
[root@centos7 ~]# gpg –gen-key
2、可以使用gpg –list-key进行查看公钥
[root@centos7 ~]# gpg –list-keys
/root/.gnupg/pubring.gpg
————————
pub 1024R/0379276C 2016-10-03
uid zhengyibo <root@magedu.com>
sub 1024R/CF708D9E 2016-10-03
[root@centos7 ~]#
3、把centos7中的公钥文件以base64机制导入到一个新文件中:
[root@centos7 ~]# gpg -a –export -o ./zheng.public
4、使用scp命令将zheng.public公钥文件copy到centos6中。
[root@centos7 ~]# scp ./zheng.public 192.168.3.2:/root
5、在centos6中将/root/zheng.public公钥导入到/root/gnupg/pubring.gpg文件中。
[root@centos6 .gnupg]# gpg –import /root/zheng.public
gpg: key 0379276C: public key "zhengyibo <root@magedu.com>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
[root@centos6 .gnupg]#
* 使用gpg –list-key进行查看:
[root@centos6 .gnupg]# gpg –list-key
/root/.gnupg/pubring.gpg
————————
pub 1024R/0379276C 2016-10-03
uid zhengyibo <root@magedu.com>
sub 1024R/CF708D9E 2016-10-03
[root@centos6 .gnupg]#
6、测试,使用centos7中生成的公钥文件,加密centos6中的文件。
注:建议不要加密过大的文件,因为文件过大,加密速度会很慢。
[root@centos6 ~]# vim testgpg
[root@centos6 ~]# cat testgpg
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
knknkkkkkkkkkkkkkkkkkkkkkkk
jjjjjjjjjjjjjjjjjjj
ccccccccccccccccccccccc
[root@centos6 ~]# gpg -e -r zhengyibo testgpg
gpg: CF708D9E: There is no assurance this key belongs to the named user
pub 1024R/CF708D9E 2016-10-03 zhengyibo <root@magedu.com>
Primary key fingerprint: 7F2D 8D74 E242 DCC9 FFD1 D30D F987 C0DB 0379 276C
Subkey fingerprint: 0E93 FD5A 7B46 2F12 9A61 BA1C D21F BBC5 CF70 8D9E
It is NOT certain that the key belongs to the person named
in the user ID. If you *really* know what you are doing,
you may answer the next question with yes.
Use this key anyway? (y/N) y
[root@centos6 ~]#
* 在当前目录使用ls命令查看生成的testgpg.gpg文件。
7、使用scp命令copy testgpg.gpg到centos7主机中。
[root@centos6 ~]# scp ./testgpg.gpg 192.168.3.11:/root
8、在centos7中解密testgpg.gpg文件。
[root@centos7 ~]# ggp -d testgpg.gpg
* 把testgpg.gpg加密文件重定向到指定的文件中。
[root@centos7 ~]# gpg -o test -d testgpg.gpg
[root@centos7 ~]# cat test
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
knknkkkkkkkkkkkkkkkkkkkkkkk
jjjjjjjjjjjjjjjjjjj
ccccccccccccccccccccccc
[root@centos7 ~]#
9、删除centos6上的公钥文件,删除centos7上的公钥/私钥文件
[root@centos6 ~]# gpg –delete-key zhengyibo //centos6上的公钥文件
[root@centos7 ~]# gpg –delete-secret-key zhengyibo //centos7上的私钥文件
[root@centos7 ~]# gpg –delete-key zhengyibo //centos7上的公钥文件
注意:在删除公钥时,如果私钥存在,一定要先删除私钥在去删除公钥文件。
原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/50307