一、安全及威胁
NIST(National Institute of Standard and Technology,美国国家标准与技术研究院)制定了安全的数据应该具备的安全属性:
1)保密性
即认为安全的数据是具有隐私性的
2)完整性:数据不可被篡改,包括:
数据完整性;
系统完整性。
3)可用性
加密过的数据可以被还原且继续被使用
威胁我们数据安全的主要有以下攻击方式:STRIDE
1)Spoofing(假冒),arp欺骗等
2)Tampering(篡改)
3)Repudiation(否认)
4)Information Disclosure(信息泄露)
5)Denial of Service (拒绝服务)
通过短时间内对服务器进行大量恶意访问,导致服务器忙于应付这些访问,而无法对真正的请求者发起的有用请求做出响应,最终服务器会因资源过度消耗如CPU资源、内存资源等,而导致服务器性能表现极差,甚至倒是宕机。
由于现在的服务器性能很好,通过几台计算机就发起DoS攻击是几乎是不可能的。所以黑客会通过各种不正当手段,在当事人不知情的情况下,控制当事人的计算机作为“肉机”。在获得足够多的这样的机器后,再发起DoS攻击,由于这些机器分属不同的地方,攻击的方式可能也不同,因此这种攻击称为DDoS(Distribute Denial of Servie,分布式拒绝服务)
6)Elevation of Privilege (提升权限)
在某些操作系统(如某些版本的Linux)上利用系统漏洞,以及专业软件工具,普通用户可被提升为管理员用户
二、安全机制
安全机制是为了应对互联网上的安全威胁,包括:加密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证。
这些安全机制是由服务去具体实现的,包括:认证服务、访问控制服务、数据保密性服务(连接保密性、无连接保密性、选择域保密性、流量保密性)、数据完整性服务、不可否认性服务
安全的系统应该从以下几方面的设计基本原则去考虑
使用成熟的安全系统
以小人之心度输入数据
外部系统是不安全的
最小授权
减少外部接口
缺省使用安全模式
安全不是似是而非
从STRIDE 思考
在入口处检查
从管理上保护好你的系统
三、安全算法
安全算法常与以下安全技术相结合:
认证:Authentication
授权:Authorization
审计:Account
安全通信
Attention:前三个被称为3A体系
常用的加密算法和协议有:对称加密、公钥加密、单向加密和认证协议
在Linux系统上,有两个加密解密的工具OpenSSL和gpg(pgp协议的实现)
1)对称加密算法 symmetric encryption algorithm
对称加密:加密和解密使用同一个密钥
DES :Data Encryption Standard ,56bits
3DES: 迭代三次的DES算法
AES :Advanced Encryption Standard(128, 192, 256bits),高级的加密标准
Blowfish ,Twofish
IDEA ,RC6 ,CAST5
特性:
1 、加密、解密使用同一个密钥,效率高
2、将原始数据分割成固定大小的块,逐个进行加密
缺陷:
1、密钥过多:
随着加密需求的增多,密钥的数量也会随之增多,当然也可以使用同一密钥加密所有或一部分,但安全性会下降
2、密钥分发:
密钥在传输时,容易被人截获
3、无法实现数据来源的确认:
只要知道密钥的发送方,都能对接收方发送一份密文。但是对于接收方来说,只想接收来自信任的发送方发来的数据,通常只要保证只有收信任的发送有密钥即可,但由于密钥在传输过程中容易被人截获,因此这一点很难保证。因此,数据来源很难被确认
2)非对称加密算法 asymmetric encryption algorithm
公钥(Public Key):可以公开给任何人
私钥(Secret Key):不公开,自己存放
特点:私钥加密,只能用匹配的公钥来解密; =====>数字签名
公钥加密,只能用匹配私钥来解密 =====>公钥加密
非对称加密可以理解为:数字签名和公钥加密的组合
Attention:1.私钥和公钥都是由加密方自己产生的,公钥来自私钥的一部分
2.这种加密方式速度很慢,通常的做法是用对称加密来加密数据本身,而用公钥加密来加密对称密钥
功能:
数字签名:使接收方能确认发送方的身份
应用的是公钥加密中私钥加密&公钥解密的方式,因为私钥是不进行网络传输,即使中间人获得数据,用加密人的公钥解密数据,但再无法用加密人的私钥来加密数据,这样数据的来源就变了,所以可以极大程度上证明加密数据人的身份
公钥加密:适合加密较小数据
对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方,其实它属于加密功能的一种。
缺点:密钥长, 加密解密效率低下
常见非对称加密算法
RSA:可以完成加密和数字签名功能
DSA:只能完成数字签名,由ELGamal发展而来
3)单向散列算法,哈希算法
将任意数据转换成固定大小的“指纹”(或者叫数据摘要digest)
特点:
1.定长输出
2.不可逆:不能由加密结果反过来得出原数据
3.雪崩效应:原数据的细微改变可以导致加密结果的巨大变化
功能:保证数据完整性
常见算法及加密结果的输出长度
常见算式
md5: 128bits
sha1: 160bits
sha224:
sha256 :256bits
sha384 :
sha512 :256bits
常用工具
md5sum | sha1sum [ --check ] file
如:md5sum f1 >f1.md5
md5sum --check f1.md5
可以检测文件的md5有没有发生变化,也就是原文件有没有发生变法
Atttention:在执行md5sum --check f1.md5时,f1必须存在
openssl 、gpg
rpm -V 参考rpm
四、密钥交换 IKE:Internet Key Exchange。通常指的是,对称密钥的交换
1)公钥加密:这个过程只传输,不创建密钥
利用公钥加密,也就是非对称加密算法的特点,来传输对称密钥
发送方用对方的公钥加密一个对称密钥后发送给对方,这样接收方接收到密文,用自己的私钥解密,也就得到了公钥。而发送方拿到的公钥来自于双方都信任的证书颁发机构颁发的证书。
2)DH(Deffie-Hellman) 这个过程双方协商关键,并利用自己的私有参数生成相同密钥的过程
1 、双方协商生成公开的整数a, 大素数p,这样AB双方都得到了数字a、p
A: a,p
B: a,p
2 、A: 生成私有数据 :x (x<p ) ,计算得出 (a^x)%p ,发送给B
B: 生成私有数据 :y (y<p ), 计算得出 (a^y)%p ,发送给A
3 、A:利用私有数据x,计算得出 (a^y)%p )^x = (a^xy)%p, 生成为密钥
B:利用私有数据y,计算得出 (a^x)%p )^y = (p^xy)%p, 生成为密钥
至此双方都得到了相同的密钥了。
五、一次典型的加密通信,并依赖于某一个加密算法,而是结合了多种算法形成的综合方法
数据在网络上甲乙两方进行安全传输的具体做法
1.甲方先产生自己的公钥和私钥
2.甲方用单向加密来加密数据,将生成的数据特征码(称为摘要或哈希值)用甲方的私钥来加密(甲方对数据特征码做数字签名),将加密后的特征码和数据本身结合,组成整体数据
3.甲方再产生对称密钥
4.甲方用自己的对称密钥加密第2步最后产生的整体数据,生成新的数据。
5.甲方向乙方索要乙方的公钥(使用非对称加密算法来进行密钥交换)
6.甲方用乙方的公钥加密甲方数据的对称密钥,并结合第4步生成的数据,组成最终要传送的数据
六、公共基础设施:PKI: Public Key Infrastructure (是一种框架,而非具体解决方案),核心就是证书颁发机构CA
签证机构:CA (Certificate Authority) )
注册机构:RA
证书吊销列表:CRL
证书存取库:
五中的过程都是建立在双方可以安全准确地获得彼此公钥的基础之上,那么该如何保证呢?
于是有了证书颁发机构(CA)
1)从公共CA(相对于下面的私有CA而言)获得证书
首先,这个证书颁发机构应该是甲乙双方都信任的机构
然后,(以甲为例,乙类同)甲先产生自己的私钥文件,本地生成一个证书申请的文件(包含甲方自己从私钥中提取的公钥信息),并向CA所在实体公司发起申请,CA会派工作人员来核实,甲的相关信息,并将证书申请的文件带回CA公司,如果同意其申请,就会在CA公司本地生成一份证书
证书中包含:1.证书持有者的相关信息
2.CA的信息
3.证书使用方法
4.证书持有者的公钥信息
x.509定义了证书的结构以及认证协议标准
版本号
发行者签名
序列号
签名算法
颁发者
有效期限
主体名称
主体公钥
CRL 分发点
扩展信息
主体公钥
CRL 分发点
扩展信息
发行者签名
证书从适用的群体不同,可分为以下几种类型
1)证书授权机构的证书
2)服务器证书
3)用户证书
Attention:1.证书是被CA私钥加密过的,即CA做了数字签名,只有通过CA的公钥来解密来能获得
2.希望建立安全连接的双方,只要在通信前向对方索要自己信任CA颁发的证书即可
2)从私有CA获得证书
理论上,与从公共CA处获得证书一样,但由于私有CA为内部使用,审核,分发可能没有公共CA做的那么严谨,就像我们下面做的实验一样。
3)自签发证书
自己做CA,给自己签发证书
七、安全协议
SSL: Secure Socket Layer
TLS: Transport Layer Security SSL的继任者
1995 :SSL 2.0 Netscape
1996: SSL 3.0
1999: TLS 1.0
2006: TLS 1.1 RFC( Request For Comments ) 4346
2008 :TLS 1.2 当前使用
2015: TLS 1.3
功能:机密性,认证,完整性,重放保护
两阶段协议,分为握手阶段和应用阶段
握手阶段( 协商阶段): 客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥(MasterScrete)。 后续通信使用的所有密钥都是通过MasterSecret生成 。
应用阶段:在 握手阶段完成 后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信。
SSL/TLS工作的TCP/IP模型的传输层和应用层之间,分为两个子层:
1)HandShake Layer 握手层,包括HandShake协议、ChangeCipherSpec协议、Alert协议
Handshake 协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换;
ChangeCipherSpec 协议:一条消息表明握手协议已经完成
Alert 协议:对握手协议中一些异常的错误提醒,分为fatal(致命的)和 和warning 两个级别,fatal 类型错误会直接中断SSL 链接,而warning 级别的错误SSL 链接仍可继续,只是会给出错误警告
2)Record Layer 记录层,包括对消息的分段、压缩、消息认证和加密等
通常SSL/TLS是和某些应用层协议结合来增加其安全性,如http,ftp,smtp,imap,pop3等转换后的协议分别是https,ftps,smtps,imaps,pop3s等。这些协议对应端口号都放在/etc/services中
SSL会话的建立:(以C/S模式说明)
1.Client向Server发起建立连接的请求
2.Server向将由Server和Client都信任的CA颁发给Server的证书发送给Client
3.证书中的网址要跟Client在浏览器中输入的网址一致,否则会报出证书不可信的错误
Client用颁发上述证书的CA的公钥解密证书的签名,解密成功则表示,证书可信
4.双方协商用什么对称密钥来解密,Client将协商好的对称密码用证书中的Server的公钥来加密,传送给ServerServer用自己的私钥来解密,这样双方都得到了对称密钥,加密会话中的对称密钥了,之后的会话都可以在加密后进行了
八、openSSL是SSL/TLS协议的一种实现,它是一个开源项目
三个组件:
openssl: 多用途的命令行工具
libcrypto: 加密算法库
libssl :加密模块 应用 库,实现了ssl 及tls
openssl 可以在交互模式下运行,也可在批处理模式下运行
1)交互式模式:opennssl 回车即可
获得帮助 输入任何非法命令都可以得到帮助,因此我们认为?是获得帮助,实际它只是个非法命令
2)批处理模式:openssl enc|ca|req|passwd
获得帮助:whatis 子命令
而后man 对应子命令的man文档名字即可如man req|enc|ca,基本都可以直接使用man,除了passwd需要,man sslpasswd,因为openssl的子命令passwd的man文档名字是sslpasswd
下面主要在批处理模式下进行:
1)对称加密:
工具:openssl enc, gpg
算法:3des, aes, blowfish, twofish
enc 命令:man enc
加密:
openssl enc -e -des3 -a -salt -in /tmp/fstab -out fstab.ciphertext 回车后,会要求键入密码,即加密此文件的密码
-e : encrypt 加密操作
-des3 : 加密算法:3des,写成des3 是因为参数要求的写法而已
-a : 密码以ascii码方式显示
-salt: 加“盐”,随机数
解密:
openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab 回车后,会要求键入密码,即解密密码,因此是对称加密,也就是加密密码
-d : decrypt 解密操作
2)单向加密
单向加密:
工具:md5sum, sha1sum, sha224sum,sha256sum…
openssl dgst
dgst 命令:man dgst
openssl dgst -md5 [-hex] /PATH/TO/SOMEFILE
openssl dgst -md5 fstab
md5sum /PATH/TO/SOMEFILE
1.md5sum file
=poenssl dgst -md5 file
2.sha1sum file
=openssl dgst -sha1 file
MAC : Message Authentication Code ,单向加密的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制
CBC-MAC
HMAC :使用md5 或sha1
3) 生成用户密码:
命令:passwd
帮助:man sslpasswd
openssl passwd -1 -salt SALT( 最多8 位)
openssl passwd -1 –salt centos
4) 生成随机数:
命令:rand
帮助:man sslrand
openssl rand -base64|-hex NUM
NUM: 表示字节数;-hex 时,每个字符4位,出现的字符数为NUM*2
5) 公钥加密:
算法:RSA, ELGamal
工具:gpg, openssl rsautl (man rsautl)
6) 数字签名:
算法:RSA, DSA, ELGamal
DSA: Digital Signature Algorithm
DSS :Digital Signature Standard
RSA: Ron [R]ivest, Adi [S]hamir, and Leonard [A]dleman
7) 密钥交换:
算法:dh
8) 生成密钥对儿:man genrsa
1.生成私钥
#openssl genrsa -out /path/to/privatekey.file 1024
genrsa表示用rsa算法generate生成私钥
私钥位数为1024
将私钥写入/path/to/privatekey.file
上面命令等价于
#openssl genrsa 1024 >/path/to/privatekey.file
genrsa表示用rsa算法generate生成私钥
私钥位数为1024
默认将私钥打印到屏幕上,这里将其重定向到文件中
如果将产生的私钥存放到一个文件中去,那么这个文件的权限我们希望值是600,只有文件属主有权限读写,而不需要其他任何人有任何权限
1.我们可以在文件生成之后,改其权限,chmod 600 file
2.我们也可以在产生这个文件之时,直接将文件的权限改掉(这就牵扯到变量umask了)
#(umask 077;openssl genrsa 1024 >file)
文件或目录的权限是,666/777-umask之后得到的,结果小于0的自动置0(权限位与umask中1对应的位置清零,否则不变)
而我们只希望umask只影响openssl genrsa 1024 >file的执行,所以需要加上(),表示在子shell中执行
openssl genrsa -des3(aes) -out 私钥要存放的文件 1024
等价于openssl genrsa -des3(aes) 1024 > 私钥要存放的文件
此时-des3/aes表示生成1024位私钥,并加密密钥内容存放到文件中去
#openssl rsa -in 已存在但未加密的私钥文件 -des3(aes) -out 加密的私钥文件
此命令用来解决将生成的私钥文件之后,加密存放
之后需要键入加密此文件的对称密钥并确认
解密此加密后的私钥文件:
#openssl rsa -in 加密过的私钥文件 -out 解密后的私钥文件
键入对称密钥并确认
2.从私钥中提取公钥
#openssl rsa -in 存放私钥的文件 -pubout
-in 表示从哪个文件中提取公钥
-pubout 表示提取公钥
最后将公钥打印到屏幕上来
Attention:可以将公钥直接输出到文件中去
1.openssl rsa -in 存放私钥的文件 -pubout -out file
将从存放私钥的文件提取的公钥存放到file中
2.openssl rsa -in 存放私钥的文件 -pubout >file
将从存放私钥的文件提取的公钥存放到file中
九、搭建私有CA
1.配置文件
执行rpm -ql openssl,可以发现,openssl的配置文件在
/etc/pki/tls/openssl.cnf
其中的几项,我们需要了解和修改
在配置文件中,同类配置被划分为一个个所谓的section
1)在[ CA_default ] Section中
a)在CentOS6和7上,如下内容,表示与证书相关的所有内容都存放在/etc/pki/CA目录中
dir = /etc/pki/CA # Where everything is kept
而在RHEL 5中,如下内容,表示与证书相关的所有内容都存放在/etc/pki/tls/的爷爷目录下的CA目录中,也就是/etc/CA目录中,通常这项需要修改为/etc/pki/CA
dir = ../../CA # Where everything is kept
改为
dir = /etc/pki/CA # Where everything is kept
b)database = $dir/index.txt # database index file.
这是存放颁发证书信息的数据库,dir就是a)中介绍的目录,这个index.txt是不存在的,需要事先创建
c)serial = $dir/serial # The current serial number
这是存放要颁发证书的序号,在颁发完证书时,还会生成serial.old,它存放的最近一个颁发证书的序号,也就是已颁发证书的最大序号
2)在[ policy_match ] Section中,有如下内容(已经做了修改)
# For the CA policy
[ policy_match ]
#countryName = match
#stateOrProvinceName = match
#organizationName = match
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied 一定要提供,不能置空
emailAddress = optional
这些内容表示在本机做CA时,CA规定了必须匹配的属性,客户只有将这些属性设置得跟CA一样,CA才会签署证书.
默认countryName,stateOrProvinceName,organizationName(公司名称)必须匹配,CA才会签发证书
match:表示一定要匹配
optional:表示不必匹配
supplied:表示一定要提供,不能置空
这样,就可以根据需要修改这些设置了
3)在[ req_distinguished_name ]Section中,可以去修改,默认的countryname等内容,这样在制作证书申请时,就不必一项一项考虑了。特别是对于证书申请者意义重大,当然是对私有CA来说,证书申请者在这里将必须与CA匹配的项改为跟CA一样,即修改对应项默认设置。那么在制作证书申请时,就不必为是否匹配CA而烦恼了,可以提高效率。
2.创建所需要文件
a)#cd /etc/pki/CA
初始状态下,这里只有目录
certs crl newcerts private
certs是存放我们颁发的证书
newcerts是跟certs存放的内容一样,不过命名方式不一样,是以serial.pem命名的
crl存放吊销证书
private存放CA的私钥文件,并且以cakey.pem命名
在了解了配置文件后,我们知道它还需要手动创建serial文件和index.txt文件
# touch /etc/pki/CA/index.txt
# echo 01 > /etc/pki/CA/serial
b)CA自签证书
生成私钥文件
# (umask 077;openssl genrsa -out private/cakey.pem)
生成自签名证书
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem
-new: 生成新证书签署请求;
-x509: 专用于CA 生成自签证书;
-key: 生成请求时用到的私钥文件;
-days n :证书的有效期限;
-out / PATH/TO/SOMECERTFILE : 证书的保存路径
之后键入相关信息:
...
Common Name:外部访问本机某服务而输入的地址
自己给自己发,则写本机的主机名即可
自己给自己发证,此过程既申请又发证,所以不必再签署了
至此,私有CA已搭建完成,接下来就可以根据请求完整签发证书了
十、客户申请证书,CA签发证书
1)申请证书
以为httpd服务创建证书为例
Client: #mkdir /etc/httpd
#cd /etc/httpd
#mkdir ssl
#cd ssl/
创建私钥文件
#(umask 077;openssl genrsa 2048>key.secret(私钥文件))
创建证书申请文件
#openssl req -new -key key.secret(私钥文件) -out httpd.csr(Certificate Signature Request)
Attention:默认情况下,国家,省 ,公司名称必须和CA 一致,否则证书是签发不成功的
将证书发送给CA
#scp httpd.csr [email protected]:/tmp 放到CA的/tmp路径下
CA:签署证书
#openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt
如果证书申请满足要求,那么接下来会询问是否同意签发,并且生成/tmp/httpd.crt,在/etc/pki/CA/newcerts有新文件生成,且更新index.txt和serial等,生成serial.old等,在第九项中有介绍
否则,会直接返回,但/tmp/httpd.crt会生成,大小为0字节,而/etc/pki/CA/newcerts没有新文件生成,也不会更新设置
Client: 将证书取回
#scp [email protected]:/tmp/httpd.crt ./ 将证书httpd.crt下载到本机的当前目录下来
查看证书中的信息:
CA/Client:
#openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|subject|serial|dates
CA:撤销证书
(a) 在客户端获取要吊销的证书的serial
# openssl x509 -in / PATH/FROM/CERT_FILE -noout -serial -subject
(b) 在CA 上,根据客户提交的serial 与subject 信息,对比检验是否与index.txt 文件中的信息一致
吊销证书:
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
或直接吊销自己生成的那个文件
#openssl ca -revoke httpd.crt
这样会更新数据库index.txt,对应项的首字母从V变成R
撤销前
V 170629085321Z 01 unknown /C=US/ST= California/O=Berkeley/OU=computer department/CN=www.Berkeley.edu.com.cn/[email protected]
撤销后
R 170629085321Z 160630030308Z 01 unknown /C=US/ST= California/O=Berkeley/OU=computer department/CN=www.Berkeley.edu.com.cn/[email protected]
(c) 生成吊销证书的编号( 第一次吊销一个证书时才需要执行)
# echo 01 > /etc/pki/CA/crlnumber
(d) 更新证书吊销列表
# openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl
查看crl 文件:
# openssl crl -in /etc/pki/CA/crl/ca.crl
-noout -text
十一、熵池
随机数生成器:伪随机数字
键盘和鼠标
块设备中断
/dev/random :仅从熵池返回随机数;随机数用尽,阻塞
/dev/urandom :从熵池返回随机数;随机数用尽,会利用软件生成伪随机数, 非阻塞