安全与加密

本章目录

  1. 安全机制

  2. 对称加密

  3. 非对称加密

  4. 散列算法

  5. PKI和CA

  6. openssl

  7. 证书管理

在互联网数据传输的过程的,数据的安全私密性是及其重要的,所以就有数据的加密和解密的过程。

数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。

数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息的安全的作用。

加密需要:

不加密流量的易受***性:

  • 密码/数据嗅探

  • 数据操作

  • 验证操作

  • 相当于邮寄明信片

不安全的传统协议

  • telnet、FTP、POP3等等;不安全密码

  • http、smtp、NFS等等;不安全信息

  • Ldap、NIS、rsh等等;不安全验证

示例:利用telnet协议伪造邮件

发送方

[zh@centos7 ~]$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 centos7.localdomain ESMTP Postfix
helo m.com
250 centos7.localdomain
mail from:Boss@work.com
250 2.1.0 Ok
rcpt to:lisi
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject:work
Come to the office   
.
250 2.0.0 Ok: queued as 722632668DD
quit
221 2.0.0 Bye
Connection closed by foreign host.

接收方

[lisi@centos7 ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/lisi": 1 message 1 new
>N  1 Boss@work.com         Mon Nov 21 21:10  14/447   "work"
& 1
Message  1:
From Boss@work.com  Mon Nov 21 21:10:09 2016
Return-Path: <Boss@work.com>
X-Original-To: lisi
Delivered-To: lisi@centos7.localdomain
subject:work
Date: Mon, 21 Nov 2016 21:08:51 +0800 (CST)
From: Boss@work.com
Status: R

Come to the office

&

由此可见,不安全的传统协议是多么的“不靠谱”,所以加密的重要性就无可厚非了,关于密码的定制也是具有一定能够的规格和属性的。

1.安全机制

NIST(美国国家标准与技术研究院)定义的安全属性  1.保密性
        数据保密性
        隐私性  2.完整性:不可篡改
        数据完整性
        系统完整性  3.可用性

安全机制的方式:

  • 加密

  • 数字签名

  • 访问控制

  • 数据完整性

  • 认证交换

  • 流量填充

  • 路由控制

  • 公正

安全服务

  • 认证

  • 访问控制

  • 数据保密性

    • 连接保密性

    • 无连接保密性

    • 选择域保密性

    • 流量保密性

  • 数据完整性

  • 不可否认性

关于安全机制和安全服务的类别,做了简单的列举,我们在设置安全规则的时候一定要注意一定的安全基本原则

设计基本原则

  • 使用成熟的安全系统

  • “以小人之心度君子之腹”

  • 外部系统都是不安全的!

  • 减少外部接口

  • 最小授权

  • 缺省使用安全模式

  • 安全不是似是而非

  • 从入口处检查

  • 从管理上保护好你的系统

安全算法

常用安全技术

  • 认证

  • 授权

  • 安全通信

  • 审计

密码算法和协议

  • 对称加密

  • 公钥加密

  • 单向加密

  • 认证协议

2.对称加密

对称加密即为加密和解密使用同一个密码- 明文加密(data plain text), 密文加密(cipher text)

  • 加密与解密过程

wKiom1g6jSXA82uJAAAVtYUpJ7c675.png

注:key1=key2

  • 加密算法

    • DES (数据加密标准,56bits)

    • 3DES(三重数据加密算法,相当于每个数据块使用三次DES加密算法)

    • AES (高级加密标准,128bits)

    • IDEA(类似于三重DES)

  • 特性

  1. 加密、解密使用同一个密钥,效率高

  2. 将原始数据分割成固定大小的块,逐个进行加密

缺陷
  1. 密钥过多

  2. 密钥分发困难

  3. 数据来源无法确认

3.非对称加密

非对称加密:基于一对公钥/密钥对,用密钥对中的一个加密,另一个解密。

  • 公钥加密:密钥成对出现

    • 公钥(public key):公开给所有人

    • 私钥(secret key):自己留存,必须保证其私密性;

  • 特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然。

  • 功能:

    • 数字签名:主要在于让接收方确认发送方身份

    • 对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方

    • 数据加密:适合加密较小数据

  • 缺点:密钥长,加密解密效率底下

  • 算法:

    • RSA(加密,数字签名)

    • DSA(数字签名)

    • ELGamal

  • 实现加密:

    • 接收者:生成公钥/密钥对:P和S;公开公钥P,保密私钥S

    • 发送者:使用接收者的公钥来加密消息M,将P(M)发送给接收者

    • 接收者:使用密钥S来解密:M=S(P(M))

wKioL1g6jVeAQqVfAAANZi6EVj8387.png

  • 实现数字签名:

    • 发送者:生成公钥/密钥对:P和S;公开公钥P,保密密钥S,使用密钥S来加密消息M,发送给接收者S(M)

    • 接收者:使用发送者的公钥来解密M=P(S(M)),结合签名和加密,分离签名获得消息。

  • 密钥交换算法

  1. A: a,p协商生成公开的整数a,大素数p; B: a,p

  2. A:生成隐私数据:x (x<p ),计算得出a^x%p,发送给B;
    B:生成隐私数据:y,计算得出a^y%p,发送给A

  3. A:计算得出(ay%p)x = a^xy%p,生成为密钥;
    B:计算得出(ax%p)y = a^xy%p, 生成为密钥

4.散列算法(单项散列)

单项散列既是将任意数据缩小成固定大小的“指纹”

  • 特性

    • 任意长度输入

    • 固定长度输出

    • 若修改数据,指纹也会改变

    • 无法从指纹中重新生成数据

  • 功能:保证数据完整性

  • 常见算式

    • md5: 128bits

    • sha1: 160bits

    • sha224

    • sha256

    • sha384

    • sha512

  • 常用工具:

    • md5sum | sha1sum [ --check ] file

    • openssl、gpg

    • rpm -V

  • 示例 :若修改数据,指纹也会改变

[root@centos7 testdir]# ll
总用量 8
-rw-r--r-- 1 root root 6 11月 23 23:39 f1
-rw-r--r-- 1 root root 3 11月 23 23:39 f2
[root@centos7 testdir]# md5sum f1 f2
b1946ac92492d2347c6235b4d2611184  f1
764efa883dda1e11db47671c4a3bbd9e  f2
[root@centos7 testdir]# echo >> f1   
[root@centos7 testdir]# md5sum f1 f2
14e273e6f416c4b90a071f59ac01206a  f1 
764efa883dda1e11db47671c4a3bbd9e  f2

可发现向f1文件中追加一个换行符,f1的“指纹”就发生了改变,f2未改动则“指纹不变”

校验

[root@centos7 testdir]# md5sum f1 > f1.md5
[root@centos7 testdir]# md5sum --check f1.md5 
f1: 确定
[root@centos7 testdir]# echo ' ' >> f1
[root@centos7 testdir]# md5sum --check f1.md5 
f1: 失败
md5sum: 警告:1 个校验和不匹配

5.PKI和CA

PKI: 公钥基础设施(Public Key Infrastructure);是一种遵循标准的利用公钥加密技为电子商务的开展提供一套安全基础平台的技术和规范。PKI体系结构采用证书管理公钥,通过第三方的可信机构CA,把用户的公钥和用户的其他标识信息捆绑在一起,在Internet网上验证用户的身份,PKI体系结构把公钥密码和对称密码结合起来,在Internet网上实现密钥的自动管理,保证网上数据的机密性、完整性。

CA:CA(Certificate Authority),是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。

  • 签证机构:CA(Certificate Authority)

  • 注册机构:RA

  • 证书吊销列表:CRL

X.509:定义了证书的结构以及认证协议标准;

包含有:

  • 版本号

  • 序列号

  • 签名算法

  • 颁发者

  • 有效期限

  • 主题名称

  • 主体公钥

  • CRL分发点

  • 扩展信息

  • 发行者签名

证书获取

  • 证书类型

    • 证书授权机构的证书

    • 服务器

    • 用户证书

  • 获取证书的两种方法

    • 即自己签发自己的公钥

    • 生成签名请求(csr)

    • 将csr发送给CA

    • 从C处接收签名

  1. 使用证书授权机构

  2. 自签名的证书

证书申请验证过程

申请证书方申请证书时,需要按规定填写申请表以及生成密钥提交申请,CA签署后发回给申请者;CA的证书是属于自签证书。 在互相得到了证书后,到CA获取公钥进行解密,解密成功可证实对方身份,之前还需要进行核实证书的有效期限和是否被吊销等信息。

证书申请验证

6. openssl

openssl命令:OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

  • 三个组件:

    • openssl:多用途的命令行工具

    • libcrypto:加密算法库

    • libssl: 加密模块应用库,实现ssl及tls

  • openssl命令:

    • 两种运行模式:交互模式和批处理模式

  1. 直接输入openssl回车进入交互模式

  2. 输入带命令选项的openssl进入批处理模式。

对称加密算法 OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。
  • 工具: openssl enc, gpg

加密:
[root@centos7 testdir]# openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:

解密:
[root@centos7 testdir]# openssl enc -d -des3 -a -salt -in testfile.cipher -out testfile1
enter des-ede3-cbc decryption password:
  • 非对称加密算法 OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。

  • 信息摘要算法 OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。

    • 工具:md5sum, sha1sum,sha224sum.sha256sum... openssl dgst

用SHA1算法计算文件file.txt的哈西值,输出到stdout: 
# openssl dgst -sha1 file.txt 
用SHA1算法计算文件file.txt的哈西值,输出到文件digest.txt: 
# openssl sha1 -out digest.txt file.txt
  • 生成用户密码

    • openssl passwd -1 -salt SALT(最多8位)

    • passwd命令:man sslpasswd

[root@centos7 ~]# openssl passwd -1 -salt centos
Password: 
$1$centos$Sm4Goo.NmvaS9rG86gpF01
  • 生成随机数 :(man sslrand)

openssl rand -base64 | -hex NUM

NUM: 表示字节数;-hex时,每个字符4位,出现的字符数为NUM*2HMAC:使用md5或sha1算法

  • 生成密钥对(man genrsa)

    • openssl rsa -in PRIVATEKEYFLE -pubout -out PUBLICKEYFILE

    • openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS

    • 生成密钥

    • 从私钥中提取公钥:

生成密钥
[root@centos7 ~]# (umask 077; openssl genrsa -out key.pem -passout pass:centos -des 2048 )
Generating RSA private key, 2048 bit long modulus
.........+++
..............................................+++
e is 65537 (0x10001)
从私钥中提取公钥
[root@centos7 ~]# openssl rsa -in key.pem -passin pass:centos -pubout -out pubkey.pem
writing RSA key
  • 随机数生成器:伪随机数字

    • 键盘和鼠标

    • 块设备中断

    • /dev/random:仅从熵池返回随即谁;随机数用尽,阻塞

    • /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞

7. 证书管理

  • 证书申请及签署步骤:

  1. 生成申请请求

  2. RA核验

  3. CA签署

  4. 获取证书

创建CA和申请证书

  • 创建私有CA:openssl的配置文件:/etc/pki/tls/openssl.cnf

[root@centos7 ~]# vim /etc/pki/tls/openssl.cnf 
[ CA_default ]
dir             = /etc/pki/CA           # 工作目录
certs           = $dir/certs            # 签署文件证书目录
crl_dir         = $dir/crl              # 吊销列表
database        = $dir/index.txt        # 数据库索引文件
#unique_subject = no                    #
                                        #
new_certs_dir   = $dir/newcerts         # 当前签署的证书目录
certificate     = $dir/cacert.pem       # CA自身的证书
serial          = $dir/serial           # 当前签署的证书编号
crlnumber       = $dir/crlnumber        # 吊销列表编号
                                        #
crl             = $dir/crl.pem          # 当前使用的crl
private_key     = $dir/private/cakey.pem# CA的私有KEY
RANDFILE        = $dir/private/.rand    # private random number file
x509_extensions = usr_cert              # The extentions to add to the cert

配置文件中可以看到定义CA的默认属性;了解属性后即可配置CA

  1. 创建所需要的文件

[root@centos7 ~]# cd /etc/pki/CA/
[root@centos7 CA]# touch index.txt
[root@centos7 CA]# echo 01 > serial
  1. CA自签证书

  • 生成私钥

[root@centos7 CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...............+++
............................................+++
e is 65537 (0x10001)
  • 生成自签证书

[root@centos7 CA]# openssl req -new -x509 -key private/cakey.pem -days 365 -out 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        #国家名称(2字母代码) 
State or Province Name (full name) []:Beijing       #州或省名称(全名) 
Locality Name (eg, city) [Default City]:Beijing     #地区名称(如城市)(默认城市) 
Organization Name (eg, company) [Default Company Ltd]:linux     #组织名称(如公司)(默认有限公司) 
Organizational Unit Name (eg, section) []:centos  #组织单元名称(例如,部门) 
Common Name (eg, your name or your server's hostname) []:ca.linux.com  #常见的名字(例如你的名字或你的服务器的主机名) 
Email Address []:ca@linux.com   #邮件地址

注:命令选项释义

  • -new: 生成新证书签署请求

  • -x509: 专用于CA生成自签证书

  • -key: 生成请求时用到的私钥文件

  • -days n:证书的有效期限

  • -out /PATH/TO/SOMECERTFILE: 证书的保存路径

  1. 颁发证书

  • 在需要使用证书的主机生成证书请求;

示例:HTTPS的实现:
1.给web服务器生成私钥
[root@zhlinux ~]# mkdir /etc/httpd/ssl
[root@zhlinux ~]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
.............................................................+++
......................................+++
e is 65537 (0x10001)
[root@zhlinux ~]# ll /etc/httpd/ssl/
总用量 4
-rw------- 1 root root 1675 11月 24 15:47 httpd.key

2.生成证书申请文件
[root@zhlinux ~]# openssl req -new -key /etc/httpd/ssl/httpd.key -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]:Beijing
Organization Name (eg, company) [Default Company Ltd]:linux
Organizational Unit Name (eg, section) []:centos
Common Name (eg, your name or your server's hostname) []:zh.linux.com
Email Address []:zh@linux.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
#与CA上证书生成是差不多的,区别在于主机名和多了个密码,密码这里留空
#由于是内部使用,注意:默认国家,省,公司名称必须和CA一致
  • 将证书请求文件传输给CA

#在CA主机上/etc/pki/下创建用于存储审核文件的目录
[root@centos7 CA]# mkdir /etc/pki/sign
[root@centos7 CA]# cd /etc/pki/sign
#将文件传输给CA
[root@zhlinux ~]# scp /etc/httpd/ssl/httpd.csr 10.1.252.141:/etc/pki/sign
root@10.1.252.141's password: 
httpd.csr                                                    100% 1045     1.0KB/s   00:00
  • CA签署证书,并将证书颁发给请求者;

[root@centos7 sign]# openssl ca -in httpd.csr -out httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Nov 24 08:08:11 2016 GMT
            Not After : Nov 24 08:08:11 2017 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Beijing
            organizationName          = linux
            organizationalUnitName    = centos
            commonName                = zh.linux.com
            emailAddress              = zh@linux.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                45:BE:5E:35:36:07:2D:6F:F5:1B:84:7B:A0:49:D4:2F:C3:08:63:0C
            X509v3 Authority Key Identifier: 
                keyid:6F:BD:95:95:1C:69:CF:C5:D4:9B:09:39:83:7F:F9:AD:21:C3:3A:B5

Certificate is to be certified until Nov 24 08:08:11 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
# 将证书颁发给请求者
[root@centos7 sign]# scp httpd.crt 10.1.252.12:/etc/httpd/ssl/
The authenticity of host '10.1.252.12 (10.1.252.12)' can't be established.
ECDSA key fingerprint is cc:6d:c9:4a:8f:78:7a:b7:87:01:6d:c8:2d:28:cd:26.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.1.252.12' (ECDSA) to the list of known hosts.
root@10.1.252.12's password: 
httpd.crt                                                    100% 4593     4.5KB/s   00:00
[root@zhlinux ~]# ls /etc/httpd/ssl/
httpd.crt  httpd.csr  httpd.key
#请求主机收到证书
  • 查看证书中的信息

openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|subject|serial|dates

  • 验证

#1.安装mod_ssl模块
[root@zhlinux ~]# yum -y install mod_ssl
#2.编辑ssl的配置文件,定义虚拟主机
[root@zhlinux ~]# vim /etc/httpd/conf.d/ssl.conf 
<VirtualHost _default_:443>

DocumentRoot "/var/www/html"
ServerName zh.linux.com:443

SSLCertificateFile /etc/httpd/ssl/httpd.crt  
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
#3.启动http服务
[root@zhlinux ~]# systemctl start httpd.service 
[root@zhlinux ~]# ss -tnl
State       Recv-Q Send-Q  Local Address:Port                 Peer Address:Port
LISTEN      0      128                :::80                             :::*    
LISTEN      0      128                :::443                            :::*   
#4.访问测试
- 需将CA的证书导入到客户端主机,否则CA将不会被信任。9
[root@centos7 ~]# cp /etc/pki/CA/cacert.pem /etc/pki/ca-trust/source/anchors/
[root@centos7 ~]# update-ca-trust 
[root@centos7 ~]# curl https://zh.linux.com
Hello,I'm Groot

wKioL1g6janhgY4xAAARjr8Z2MA395.png

至此一个简单的CA以及申请和签署步骤已完成。这种CA一般应用于内部局域网,如大范围使用或专业使用,建议使用OpenCA或者购买专业公司提供的。

  1. 吊销证书

证书吊销需要在用户申请或者用户未付款的情况下。正常状态下是不能操作的。

  • 在客户端获取要吊销的证书的serial

    openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject

  • 在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致

    openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

    • 吊销证书

  • 生成吊销证书的编号(第一次吊销一个证书时才需要执行)

    echo 01 > /etc/pki/CA/crlnumber

  • 更新证书吊销列表

    openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl

  • 查看crl文件:

    openssl crl -in /etc/pki/CA/crl/ca.crl -noout -text