Linux安全与加密基础(一)
常见的加密算法
SSL: Openssl与CA认证
ssh服务
dropbear
AIDE
sudo
常见的加密算法
密码学古以有之,尤其是在中国古代的战争中,在现在科技中,密码学不得不说是一门高深的学问,普通人知其一二足矣;本文要讨论的是关于加密与解密的基本原理与应用,以及关于Linux系统中的一些安全管理问题,如ssh服务,监控系统关键文件是否被篡改,sudo提权等。
1、对称加密
所谓对称加密,就是同一个密钥可以同时用作信息的加密和解密。
常见的对称加密算法有:DES、3DES、Blowfish、AES等。
对称加密的特点:
对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。
对称加密算法的缺点是在通信之前,发送方和接收方必须商定好秘钥,然后双方都能够保存好秘钥。另外,无法实现对数据来源的确认。
对称加密的隐患是:如果任何一方的秘钥没有保存好,那么数据就不安全了;其次,收、发双方在使用对称加密时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。
其工作原理可参考下图:将原始数据分割成固定大小的块,逐个进行加密
2、非对称加密
对称加密有一个密钥,其加密与解密的过程使用一个密钥,而非对称加密有两个密钥,即公钥(public key)和私钥(private key),公钥与私钥是一对儿,其加密与解密的过程要使用两个密钥;如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
常见的非对称加密算法有:RSA(加密,数字签名)、DSA(数字签名)
非对称加密的特点:
非对称的优点是在收发双方通信之前,不需要协商秘钥;公钥与私钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的。
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
非对称加密可参考下图:
RSA:
从上图可看出:在非对称加密中,发送方首先得生成一个秘钥对儿(公钥与私钥),然后公开公钥,使用自己的私钥加密数据成密文,最后发送;而接收方会用发送方的公钥对密文解密。
非对称加密可实现数字签名与对称密钥交换的功能:
数字签名:就是加密特征码,把文件指纹信息(特征码)取出来,用私钥加密特征码,数字签名的目的是验证对方的身份。
对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
注:提取特征码的过程就是单向加密
3、单向加密
所谓单向加密,就是只能加密,不能解密,其作用主要就是提取数据的特征码,又称指纹信息。
常见的单向加密算法有:MD5: 128bits定长输出, SHA1: 160bits输出;SHA256, SHA512
单向加密特点:
(1) 定长输出:无论原来的数据是多大级别,其加密结果长度是一样的; (2)雪崩效应:原始数据微小改变,将导致结果巨大变化 (3) 不可逆
单向加密的功能:
(1) 数据完整性 (2)系统帐号密码校验
常用工具
md5sum | sha1sum [ --check ] fileopenssl、gpg rpm -V
4、密钥交换
密钥交换,IKE(Internet Key Exchange): 双方通过交换密钥来实现数据的加密解密;密钥交换有以下两种情况:
公钥加密:将公钥加密后通过网络传输到对方进行解密,不常用,因为很有可能被截取破解;
DH(Deffie-Hellman): 双方共有一些参数,共同协商加密算法,此外,双方还有属于自己的私有参数;通过共有的参数、私有参数和算法信息进行加密,然后双方将计算后的结果进行交换,交换完成后再和属于自己私有的参数进行特殊算法,经过双方计算后的结果是相同的,而这个结果就是密钥。
DH:
1、A: a,p协商生成公开的整数a,大素数p B: a,p2、A:生成隐私数据:x (x
在数据通信的过程中,加密往往都不是单一的,一个可选的加密通信过程,会有自己特有的加密算法组合,如:
a-->b
Pb{data+Sa[hash(data)]}
{Pb(key){对称key}}+{对称key{data+{Sa[hash(data)]}}}
一般地,一次加密的通信过程:
发送者:
1.使用单向加密算法提取生成数据的特征码; 2.使用自己的私钥加密特征码附加在数据后面; 3.生成用于对称加密的临时密钥; 4.用此对称密钥加密数据和已经使用私钥加密后的特征码; 5.使用接收方的公钥加密此对称密钥,附加在对称加密后的数据后方;接收方:
1.使用自己的私钥解密加密的对称(临时)密钥,从而获得对称密钥; 2.使用对称密钥解密对称加密的数据和私钥加密的特征码密文;从而获得数据和特征码密文; 3.使用发送方的公钥解密特征码密文,从而获得计算生成的特征码; 4.使用与对方相同的单向加密算法计算数据的特征码,并与解密而来的特征码进行比较;
SSL: Secure Socket Layer
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。
1995:SSL 2.0 Netscape1996: SSL 3.0 1999: TLS 1.0 2006: TLS 1.1 RFC(Request For Comments )4346 2008:TLS 1.2 当前使用2015: TLS 1.3SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL的体系结构中包含两个协议子层,其中底层是SSL纪录协议层(SSL Record Protocol Layer);高层是SSL握手协议层(SSL HandShake Protocol Layer)。SSL的协议栈如下图所示,其中阴影部分即SSL协议。
SSL纪录协议层的作用是为高层协议提供基本的安全服务。SSL纪录协议针对HTTP协议进行了特别的设计,使得超文本的传输协议HTTP能够在SSL运行。纪录封装各种高层协议,具体实施压缩解压缩、加密解密、计算和校验MAC等与安全有关的操作。
https简介
HTTPS(Hypertext Transfer Protocol Secure)安全超文本传输协议
它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的完全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁,
它的安全保护依赖浏览器的正确实现以及服务器软件、实际加密算法的支持.
SSL通信过程
客户端发起请求,包含一个hello消息,并附上客户端支持的密码算法和 SSL 协议的版本消息以及用于生成密钥的随机数。 服务器收到消息后,服务器端选择加密压缩算法并生成服务器端的随机数,将该信 息反馈给客户端;接着服务器端将自身的数字证书(一个 X.509 数字证书)发送到客户端; 完成上述动作后后服务器端会发送“hello done”消息给客户端。此外如果服务器需要对客户端进行身份认证,服务器端还会发 送一个请求客户端证书的消息。 一旦客户端收到”hello done” , 就开始对服务器端的数字证书进行认证并检查服务器端选中的算法是可行的。如果 服务器要求认证客户端身份,客户端还会发送自己的公钥证书。 如果对服务器的身份认证通过,客户端会发起密钥交换的请求。 服务器端和客户端根据先前协商的算法和交换随机数生成对称密钥进行后续的通信。ssl的相关报文:
Client Hello
Server Hello
Server-->Client
Client-->Server
Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证 可选)、密钥交换;Change Cipher Spec 协议:一条消息表明握手协议已经完成 Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别, fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是 会给出错误警告Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等。 HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”, 对http协议的文本数据进行加密处理后,成为二进制形式传输总而言之,当浏览器向服务器请求一个安全的网页(通常是 https://)时,服务器就把它的证书和公匙发回来,浏览器检查证书是不是由可以信赖的机构颁发的,确认证书有效和此证书是此网站的。
接着,浏览器使用公钥加密了一个随机对称密钥,包括加密的URL一起发送到服务器,服务器用自己的私匙解密了浏览器发送的钥匙。然后用这把对称加密的钥匙给你请求的URL链接解密。
最后,服务器用你发的对称钥匙给你请求的网页加密。你也有相同的钥匙就可以解密发回来的网页了。
ssl提供的服务
1)认证用户和服务器,确保数据发送到正确的客户机和服务器; 2)加密数据以防止数据中途被窃取; 3)维护数据的完整性,确保数据在传输过程中不被改变。Openssl
Openssl是ssl的一个,其由三部分组成:
openssl: 多用途的命令行工具 libcrypto: 加密算法库 libssl:加密模块应用库,实现了ssl及tls openssl: 众多子命令: 标准命令 消息摘要命令(dgst子命令) 加密命令(enc子命令) 标准命令:enc, ca, req, genrsa, ... 对称加密: 工具:openssl enc, gpg 支持的算法:3des, aes, blowflsh, towflsh示例:
加密: ~]#openssl enc -e -des3 -a -salt -in fstab -out fstab.cry 解密: ~]#openssl enc -d -des3 -a -salt -out fstab.new -in fstab.cry可见,加密有“盐” -a -salt 时,解密必须加-a -salt,否则会解密失败。但加密时可以省略-a -salt.
单向加密:
工具:openssl dgst,md5sum, sha1sum,sha224sum,...gpgdgst命令: ~]#openssl dgst -md5 /PATH/TO/SOMEFILE[root@centos7 ~]#openssl dgst -md5 issueMD5(issue)= f078fe086dfc22f64b5dca2e1b95de2c [root@centos7 ~]#生成用户密码:
工具:passwd,openssl passwd openssl passwd -1 -salt SALTsalt的生成-->生成随机数:
工具:openssl rand ~]# openssl rand -base64 # ~]# openssl rand -hex # ~]#openssl passwd -1 -salt `openssl rand -hex 4`公钥加密:
加密解密: 算法:RSA, ELGamal 工具:openssl rsautl, gpg 数字签名: 算法:RSA, DSA, ELGamal 工具:openssl rsautl, gpg 密钥交换: 算法:DH生成密钥:
生成私钥: ~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS) 提取公钥: ~]# openssl rsa -in /tmp/mykey2.private -puboutMAC: Message Authentication Code,单向加密的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制。
CBC-MAC HMAC:使用md5或sha1算法随机数生成器:random和urandom
键盘和鼠标 块设备中断 /dev/random:仅从熵池返回随机数;随机数用尽,阻塞 /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞熵池:在操作系统上有一个叫做熵池的地址,它是用来保存硬件中断产生的随机数,即每一次硬件终端都会产生一个随机数。
CA认证与管理
CA(Certificate Authority),即认证授权机构,是PKI(Public Key Infrastructure 公钥基础设施) 的一个组成部分,PKI包括:
CA:签证机构 RA:注册机构 CRL:证书吊销列表 证书存取库:请求认证时的资料库CA: 保证公钥数据的安全性
在双方通信的过程中,数据的加解密依赖于对方的公钥,因此就需要一种可选机制能够保证公钥数据的安全性,这种机制就CA。
CA的公信力:A要跟B进行通信,A将自己的公钥转发给B,那么B就需要知道A发过来的公钥是否为正规的CA颁发,解铃还须系玲人,我们可通过验证CA自身的证书就可以了!如何保证CA的公信力,从互联网上获得的证书自然不可信任,我们就只能从操作系统上获得,即系统发生厂商把CA证书做进操作系统里面,在需要的时候直接去比对,如果操作系统中没有固化的CA证书,则该CA证书是不合法的。
数字证书的获取
获取证书的途径有两种:花钱向RA注册购买;创建私有CA
向RA注册申请的CA通常用于企业环境当中,以满足业务的要求;而当我们仅仅用于企业内部或个人测试需要时,可用Openssl工具创建私有CA。
我们从火狐浏览器上导出一个证书看看:
接下来我们就创建个私有CA吧!
使用OpenSSL创建私有CA的步骤:
1、生成私钥2、生成自签证书 (1) 私钥用于签发证书时,向证书添加数字签名使用; (2) 证书:每个通信方都导入此证书至“受信任的证书颁发机构” 涉及的配置文件:/etc/pki/tls/openssl.cnf 工作目录:/etc/pki/CA我们以CentOS 7为服务端,以CentOS 6为客户端。
服务器端:
创建私有CA:
1.创建CA的数据库索引文件
# touch /etc/pki/CA/{serial,index.txt} # 索引文件 # echo 01 > /etc/pki/CA/serial # 索引文件编号[root@centos7 ~]#touch /etc/pki/CA/{index.txt,serial} [root@centos7 ~]#echo 01 > /etc/pki/CA/serial [root@centos7 ~]2.生成私钥与自签证书:cakey.pem --> cacert.pem
[root@centos7 ~]#(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) Generating RSA private key, 2048 bit long modulus ...............+++ ........+++ e is 65537 (0x10001) [root@centos7 ~]# [root@centos7 ~]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365注:在bash命令行上在小括号中执行的命令,其实是通过打开一个子shell进程进行的!
-new: 生成新证书签署请求; -x509: 专用于CA生成自签证书; -key: 生成请求时用到的私钥文件;- days n:证书的有效期限; -out /PATH/TO/SOMECERTFILE: 证书的保存路径
给节点颁发证书:
客户端: 1、生成私钥与证书签署请求
2、把请求发送给CA
注:a. 其中subject部分要与CA一致; b. Common Name要使用此主机的真实名字在需要使用证书的主机生成证书请求,譬如给给web服务器生成私钥
1.生成私钥与证书签署请求
[root@centos6 ~]#mkdir /etc/httpd/ssl [root@centos6 ~]#(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048) Generating RSA private key, 2048 bit long modulus .................................................................................................................+++ .......................+++ e is 65537 (0x10001) [root@centos6 ~]# [root@centos6 ~]#openssl req -new -key /etc/httpd/ssl/httpd.key -days 365 -out /etc/httpd/ssl/httpd.csr注意证书签署请求时没有 -x509选项。且国家、州、公司名必须要一致!
2.把请求发送给CA
[root@centos6 ~]#scp /etc/httpd/ssl/httpd.csr 10.1.1.2:/etc/pki/CA The authenticity of host '10.1.1.2 (10.1.1.2)' can't be established. RSA key fingerprint is de:09:0a:d2:ed:57:96:cf:ee:6d:7b:71:ab:93:fb:c0. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.1.1.2' (RSA) to the list of known hosts. [email protected]'s password: httpd.csr 100% 1424 1.4KB/s 00:00 [root@centos6 ~]#
服务器端:签发证书
(1) 验证请求者信息 (2) 签署证书 (3) 把签署好的证书还给请求者1.签署证书:
[root@centos7 ~]#openssl ca -in /etc/pki/CA/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365查看签署的证书:
[root@centos7 ~]#openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -text2.把签署好的证书发给请求者
[root@centos7 ~]#scp /etc/pki/CA/certs/httpd.crt 10.1.1.1:/etc/httpd/ssl The authenticity of host '10.1.1.1 (10.1.1.1)' can't be established. RSA key fingerprint is 39:43:7d:e0:79:7f:ca:9c:55:71:99:6d:5b:f3:c3:a3. Are you sure you want to continue connecting (yes/no)? y Please type 'yes' or 'no': yes Warning: Permanently added '10.1.1.1' (RSA) to the list of known hosts. [email protected]'s password: httpd.crt 100% 4627 4.5KB/s 00:00 [root@centos7 ~]#查看数据库文件是否更新:
吊销证书
1.在客户端获取要吊销的证书的serial
[root@centos6 ~]#openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject serial=01 subject= /C=CN/ST=Beijing/O=Liansir.com/OU=leader/CN=centos 6/[email protected] [root@centos6 ~]#2.在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,然后吊销证书
[root@centos7 /etc/pki/CA]#openssl ca -revoke certs/httpd.crt Using configuration from /etc/pki/tls/openssl.cnf Revoking Certificate 01. Data Base Updated [root@centos7 /etc/pki/CA]#查看吊销证书后的数据库状态:
3.生成吊销证书的编号
[root@centos7 /etc/pki/CA]#touch crlnumber [root@centos7 /etc/pki/CA]#echo 01 > crlnumber
更新证书吊销列表
[root@centos7 /etc/pki/CA]#openssl ca -gencrl -out ./crl/ca.crl Using configuration from /etc/pki/tls/openssl.cnf [root@centos7 /etc/pki/CA]#后我们来看看CA的相关配置文件:
本文主要介绍了常见加密算法的基本原理与应用,重点是对称加密与非对称加密;以及涉及到网络安全传输的ssl服务,重点是ssl握手协议的过程,最后通过实验创建了一个私有CA的创建、节点如何申请证书及证书的吊销。
2016.9.21