安全通信
安全机制
对称加密算法
非对称加密算法
散列算法
base64编码机制
安全协议
OpenSSL
相关实验
安全机制
信息安全防护的目标
- 保密性 Confidentiality
- 完整性 Integrity
- 可用性 Usability
- 可控制性 Controlability
- 不可否认性 Non-repudiation
安全防护环节
- 物理安全:各种设备/主机、机房环境
- 系统安全:主机或设备的操作系统
- 应用安全:各种网络服务、应用程序
- 网络安全:对网络访问的控制、防火墙规则
- 数据安全:信息的备份与恢复、加密解密
- 管理安全:各种保障性的规范、流程、方法
安全攻击: STRIDE
- Spoofing 假冒
- Tampering 篡改
- Repudiation 否认
- Information Disclosure 信息泄漏
- Denial of Service 拒绝服务
- Elevation of Privilege 提升权限
安全设计基本原则
- 使用成熟的安全系统
- 以小人之心度输入数据
- 外部系统是不安全的
- 最小授权
- 减少外部接口
- 缺省使用安全模式
- 安全不是似是而非
- 从STRIDE思考
- 在入口处检查
- 从管理上保护好你的系统
常用安全技术
- 认证
- 授权
- 审计
- 安全通信
加密算法和协议
- 对称加密
- 公钥加密
- 单向加密
- 认证协议
对称加密算法
对称加密:加密和解密使用同一个密钥
- DES:Data Encryption Standard,56bits
- 3DES:
- AES:Advanced (128, 192, 256bits)
- Blowfish,Twofish
- IDEA,RC6,CAST5
对称加密的特性:
- 1、加密、解密使用同一个密钥,效率高
- 2、将原始数据分割成固定大小的块,逐个进行加密
对称加密的缺陷:
- 1、密钥过多
- 2、密钥分发
- 3、数据来源无法确认
非对称加密算法
公钥加密:密钥是成对出现
- 公钥:公开给所有人;public key
- 私钥:自己留存,必须保证其私密性;secret key
非对称加密算法特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
非对称加密算法功能:
- 数字签名:主要在于让接收方确认发送方身份
- 对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
- 数据加密:适合加密较小数据
非对称加密算法缺点:密钥长,加密解密效率低下
非对称加密算法算法:
- RSA(加密,数字签名)
- DSA(数字签名)
- ELGamal
基于一对公钥/密钥对
- 用密钥对中的一个加密,另一个解密
实现加密:
- 接收者
生成公钥/密钥对: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、
常用工具
- md5sum | sha1sum [ --check ] file
- openssl、gpg
- rpm -V
利用三种加密算法实现安全通信
对称加密:效率高、但无法确认数据来源
非对称加密:可以确定数据来源但效率低
数字签名
Alice == Bob
其中Alice的公钥PubA,私钥PriA
其中Bob的公钥PubB,私钥PriB
(data) --> PubB{PriA[hash(data)]+data} == data’ ==>to Bob
–> PriB(data’)–>PubA{PriA[hash(data)]+data}
–> hash(data) == hash(data)? :确认数据是否被篡改
–> 安全通信
但是:使用Bob公钥加密数据若太大,则解密时间消耗比较长
综合hash、对称、非对称三种通信:
(data) —> hash(data)
–> PriA[hash(data)] + key(data) + PubB(key) ==data’ ==>to Bob
–> PriB(PubB(key))==key 提取非对称加密数据的钥匙
–> PubA([hash(data)])==hash(data)提取data的digest 并验证data来源
–> key(key(data))==data 提取data
–> hash(data)=? hash(data) 确认data传输过程未被修改
秘钥交换
密钥交换:IKE( Internet Key Exchange )
方法一:公钥加密
方法二:DH (Deffie-Hellman):生成会话密钥
参看:https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
gpg工具
使用gpg实现对称加密
- gpg -c file 加密文件
- gpg -o file -d file.gpg 解密文件 -o选项需在-d选项之前
使用gpg工具实现公钥加密
- gpg --gen-key
- gpg --list-keys
- gpg -a --export -o XXX.pubkey
- scp wang.pubkey hostB:
- gpg -e -r XXX file file file.gpg
CA和证书
PKI:Public Key Infrastructure
- 签证机构:CA(Certificate Authority)
- 注册机构:RA
- 证书吊销列表:CRL
- 证书存取库:
X.509:定义了证书的结构以及认证协议标准
- 版本号
- 序列号
- 签名算法
- 颁发者
- 有效期限
- 主体名称
- 主体公钥
- CRL分发点
- 扩展信息
- 发行者签名
证书类型:
- 证书授权机构的证书
- 服务器
- 用户证书
获取证书两种方法:
-
使用证书授权机构
生成证书请求(csr)
将证书请求csr发送给CA
CA签名颁发证书 -
自签名的证书
自已签发自己的公钥
安全协议
SSL:Secure Socket Layer,TLS: Transport Layer Security
- 1995:SSL 2.0 Netscape
- 1996:SSL 3.0
- 1999:TLS 1.0
- 2006:TLS 1.1 IETF(Internet工程任务组) RFC 4346
- 2008:TLS 1.2 当前使用
- 2015:TLS 1.3
功能:机密性,认证,完整性,重放保护
两阶段协议,分为握手阶段和应用阶段
- 握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成
- 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信
HTTPS结构
TLS(or SSL) 工作在应用层和传输层之间,对应用层数据进行加密。
OpenSSL
OpenSSL:开源项目
- 三个组件:
openssl:多用途的命令行工具,包openssl
libcrypto:加密算法库,包openssl-libs
libssl:加密模块应用库,实现了ssl及tls,包nss
openssl命令:
- 两种运行模式:交互模式和批处理模式
- openssl version:程序版本号
- 标准命令、消息摘要命令、加密命令
- 标准命令:enc, ca, req, …
openssl命令用法
对称加密:
- 工具:openssl enc, gpg
- 算法:3des, aes, blowfish, twofish
- enc命令:
帮助:man enc
单向加密:
-
工具:md5sum, sha1sum, sha224sum,sha256sum…
openssl dgst -
dgst命令:
帮助:man dgst -
MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现
网络通信中保证所传输数据的完整性机制
生成用户密码:
- passwd命令:
帮助:man sslpasswd
生成随机数:
- 帮助:man sslrand
- openssl rand -base64|-hex NUM
- NUM: 表示字节数,使用-hex,每个字符为十六进制,相当于4位二进制,
出现的字符数为NUM*2
公钥加密:
- 算法:RSA, ELGamal
- 工具:gpg, openssl rsautl(man rsautl)
数字签名:
- 算法:RSA, DSA, ELGamal
密钥交换:
- 算法:dh
- DSA:Digital Signature Algorithm
- DSS:Digital Signature Standard
- RSA:
生成密钥对儿:man genrsa
- 生成私钥
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
(umask 077; openssl genrsa –out test.key –des 2048)
openssl rsa -in test.key –out test2.key 将加密key解密
- 从私钥中提取出公钥
openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE
openssl rsa –in test.key –pubout –out test.key.pub
随机数生成器:伪随机数字
- 键盘和鼠标,块设备中断
- /dev/random:仅从熵池返回随机数;随机数用尽,阻塞
- /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机
数,非阻塞
相关实验
base64编码机制
base64编码:[ 字母 | 数组 | + | / ]
因为ASCII码128中具有不可见字符,使用文本工具打开将乱码,base64编码字符 可见,因此base64可以将二进制文件用可见字符表示。
一个字节: 8bit
ASCII 8bit
base64 6bit
base64编码编码与ascii编码转换:<>
以ab、abc为例
~]# echo -n ab|base64
YWI=
a ascii 97
b=98
c=99
ascii 01100001 01100010
base64 011000 | 01 0110 | 001000 <不够6位末尾添0补足>
Y | W | I =表示有用0补位
~]# echo -n abc|base64
YWJj
ascii 01100001 01100010 01100011
base64 011000 | 01 0110 | 001001 | 100011
Y | w | J | j
因此输出要为完整的base64编码时,24的倍数字节即为3的倍数
使用openssl生成随机数作口令:
~]# openssl rand -base64 9<此处9表示9字节 72 bite >
6ptxyuxOKs6L <因此对应base64位12字符>
生成8位随机数做密码
~]# openssl rand -base64 6
6qTJ19ag
使用随机数8个字符串口令:
~]# cat /dev/urandom | tr -dc '[[:alnum:]]' |head -c 8
~]# openssl rand -base64 6
创建私有CA
创建私有CA必须满足以下条件:
- 关闭selinux
- 关闭iptables
- 时间同步<涉及加密时间至关重要>
创建私有CA:
- OpenSSL的配置文件:/etc/pki/tls/openssl.cof
- 三种策略:match匹配、option可选、supplied提供
match:要求申请填写的信息与CA设置信息必须一致
optional:可有可无,跟CA设置信息可不一致
supplied:必须填写这项申请信息
openssl配置文件/etc/pki/tls/openssl.cof详解:
#######################
[ ca ] 一台主机可以搭建多个CA,此处设置的是默认CA
default_ca = CA_default
#######################
[ CA_default ] 定义默认CA的相关信息
dir = /etc/pki/CA <默认CA相关数据的存放路径>
certs = $dir/certs <certs目录存放被颁发的证书>
crl_dir = $dir/crl <crl目录存放证书吊销列表>
database = $dir/index.txt <颁发的证书的索引数据库>
默认index.txt在/etc/pki/CA目录下不存在,需要手动创建
new_certs_dir = $dir/newcerts <新证书存放路径>
certificate = $dir/cacert.pem <CA证书存放路径><根CA证书自签证明>
serial = $dir/serial <当前序列号><颁发的证书有序列号>
<当前编号表示下一个颁发的证书的编号><刚开始需要手动创建并指明初始编号>
crlnumber = $dir/crlnumber <证书吊销列表的编号>
crl = $dir/crl.pem <证书吊销列表存放路径>
private_key = $dir/private/cakey.pem <私钥存放路径>
...
#######################
##没有特别指定时的默认设置项
default_days = 365 <颁发证书的默认有效期>
default_crl_days= 30 <吊销列表有效期>
default_md = sha256 <hash值算法>
preserve = no
#######################
# 需要遵守的策略 match,optional,supplied
policy = policy_match
# For the CA policy
[ policy_match ] <搭建CA需要提供的相关信息>
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
....
[ policy_anything ] <另一个策略>
证书申请及签署步骤
- 1、生成申请请求
- 2、RA核验
- 3、CA签署
- 4、获取证书
创建私有CA:
- 1、创建所需要的文件
- 2、CA自签证书
- 3、颁发证书
- 4、吊销证书
生成自签证书的相关选项:
- -new:生成新证书签署请求
- -x509:专用于CA生成自签证书
- -key:生成请求时用到的私钥文件
- -days n:证书的有戏期限
- -out /PATH/TO/SOMECERTFILE:证书的保存路径
私有CA使用场景:企业内部使用与安全通信相关时,需要搭建私有CA;eg:https
===============================================
创建私有CA<创建CA主机>:
~]# cd /etc/pki/CA/ <先进入/etc/pki/CA/此目录>
①CA的私钥文件:/etc/pki/CA/private/cakey.pem
CA]#(umask 066; openssl genrsa -out private/cakey.pem -des 2048 )
-des <使用对称加密设置密码,防止私钥被盗用>
②生成自签名证书
CA]# openssl req -new -x509 -key private/cakey.pem -days 3650 -out cacert.pem
填写相关信息:
:CN <国家>
:BJ <省份>
:BJ <城市>
:xixi.com <组织/公司>
:ops <部门>
:ca.xixi.com<网站的哪个主机>
注意:创建CA时并没创建/etc/pki/CA/index.txt和/etc/pki/CA/serial文件
因此CA此时直接给其他主机颁发证书会报错。
③创建/etc/pki/CA/index.txt 颁发证书的索引文件
CA]# touch index.txt
④创建/etc/pki/CA/serial 颁发证书的当前序号 (两个数字表示16进制)
CA]# echo 0F > serial
至此私有CA创建完成,可以给其他主机颁发证书。
++++++++++++++++++++++++++++++++++++++++++++++++
当有主机向CA主机发来证书申请请求时:
一、同意证书申请:
1)CA主机向请求证书颁发证书:颁发证书存放路径:/etc/pki/CA/certs/file.crt
CA]# openssl ca -in app.csr -out certs/app.crt -days 100
此时:/etc/pki/CA/index.txt和/etc/pki/CA/serial 默认会添加记录
对应我此处使用的记录:
CA]# cat index.txt
V 191208123005Z 0F unknown /C=CN/ST=BJ/O=xixi.com/OU=ops/CN=app.xixi.com
CA]# cat serial
10 <OF当时设置的0F> 则下一个颁发的证书编号为10,16进制数字
── certs
│ └── app.crt
├── newcerts <自动生成app.crt的拷贝文件放置于newcerts目录>
│ └── 0F.pem
2)将颁发的证书传给请求主机
CA]# scp certs/app.crt root@192.168.38.17:/data/app
================================================
此时另一主机某服务使用加密时向CA申请证书:
①新建文件夹:/data/app --> 此处仅参考使用<对应于某一服务目录下的配置文件>
~]# mkdir /data/app; cd /data/app<进入新建目录>
②生成对应服务的私钥文件
app]# (umask 077; openssl genrsa -out app.key 1024)
③生成证书申请文件<此文件为证书申请文件文件后缀一般为:filename.csr>
app]# openssl req -new -key app.key -out app.csr
填写相关信息:
:CN <国家>
:BJ <省份>
:BJ <城市>
:xixi.com <组织/公司>
:ops <部门>
:app.xixi.com<网站的哪个主机>
<因为采取的默认policy_match策略需要保持三项相同>
countryName = match <国家>
stateOrProvinceName = match <省份>
organizationName = match <组织/公司>
④将证书申请文件传给CA主机、等待CA主机颁发证书
app]# scp app.csr root@192.168.38.7:/etc/pki/CA/
##############################################
# 创建CA主机的脚本?
# CA主机给服务主机颁发证书脚本?
# 合并两个脚本至同一脚本中