加密和安全

安全机制

信息安全防护的目标

保密性 Confidentiality
完整性 Integrity
可用性 Usability
可控制性 Controlability
不可否认性 Non-repudiation

安全防护环节

物理安全:各种设备/主机、机房环境
系统安全:主机或设备的操作系统
应用安全:各种网络服务、应用程序
网络安全:对网络访问的控制、防火墙规则
数据安全:信息的备份与恢复、加密解密
管理安全:各种保障性的规范、流程、方法

安全

Spoofing 假冒
Tampering 篡改
Repudiation 否认
Information Disclosure 信息泄漏
Denial of Service 拒绝服务
Elevation of Privilege 提升权限

安全设计基本原则

使用成熟的安全系统
以小人之心度输入数据
外部系统是不安全的
最小授权
减少外部接口
缺省使用安全模式
安全不是似是而非
从STRIDE思考
在入口处检查
从管理上保护好你的系统

安全算法

常用安全技术

认证
授权
审计
安全通信

加密算法和协议

对称加密
公钥加密
单向加密
认证协议

对称加密算法:
加密和解密使用同一个密钥
特性:
1、加密、解密使用同一个密钥,效率高
2、将原始数据分割成固定大小的块,逐个进行加密
缺陷:
1、密钥过多
2、密钥分发
3、数据来源无法确认

非对称加密算法
公钥加密:密钥是成对出现

公钥:公开给所有人;public key
私钥:自己留存,必须保证其私密性;secret key

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

数字签名:主要在于让接收方确认发送方身份
对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
数据加密:适合加密较小数据

缺点:密钥长,加密解密效率低下
算法:
RSA(加密,数字签名)
DSA(数字签名)
ELGamal
数字签名
Linux之加密和安全

Shell中可以使用

sha256sum 计算文件的哈希值,从而和网上下载提供的哈希值对比,如果相同证明该文件未被篡改过。

使用gpg实现对称加密
对称加密file文件需输入两次密码

gpg -c file
ls file.gpg
Linux之加密和安全

在另一台主机上解密file 指定解密后文件名并解密

gpg -o file -d file.gpg
Linux之加密和安全

使用gpg工具实现公钥加密密钥生成后在家目录下.gnupg目录中
在hostB主机上用公钥加密,在hostA主机上解密
在hostA主机上生成公钥/私钥对

gpg --gen-key

在hostA主机上查看公钥

gpg --list-keys

在hostA主机上导出公钥到martinhe.pubkey

gpg -a --export -o martinhe.pubkey

从hostA主机上复制公钥文件到需加密的B主机上

scp marinthe.pubkey hostB

在需加密数据的hostB主机上生成公钥/私钥对

gpg --list-keys
gpg --gen-key

在hostB主机上导入公钥

gpg --import martinhe.pubkey
gpg --list-keys

用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.gpg

gpg -e -r martinhe file
file file.gpg

复制加密文件到hostA主机

scp fstab.gpg hostA:

在hostA主机解密文件

gpg -d file.gpg
gpg -o file -d file.gpg

删除公钥和私钥:先删除导入的A公钥,再删除本机的私钥,最后删除本机的公钥

gpg --delete-keys martinhe
gpg --delete-secret-keys chengge
gpg --delete-keys chengge

CA和证书
PKI:Public Key Infrastructure

签证机构:CA(Certificate Authority)
注册机构:RA
证书吊销列表:CRL
证书存取库:

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

版本号
序列号
签名算法
颁发者
有效期限
主体名称
主体公钥
CRL分发点
扩展信息
发行者签名

证书获取
证书类型:

证书授权机构的证书
服务器
用户证书

获取证书两种方法:
使用证书授权机构

生成证书请求(csr)
将证书请求csr发送给CA
CA签名颁发证书

自签名的证书

自已签发自己的公钥

SSL/TLS
Linux之加密和安全
HTTPS结构
Linux之加密和安全
HTTPS工作过程
Linux之加密和安全
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
加密:-a 指定加密基于base64编码(不指定生成机密文件内为乱码):每6位分割,不足6位后面补零

openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
Linux之加密和安全

解密:解密时如果不指定输出文件,则在屏幕打印解密文件内容

openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
openssl ?
Linux之加密和安全

用于校验本地文件是否被篡改,可提前生成校验文件然后保存下来

md5sum sohu.txt > sohu.txt.md5
md5sum -c|--check sohu.txt
Linux之加密和安全

单向加密:

工具:md5sum, sha1sum, sha224sum,sha256sum…
openssl dgst

dgst命令:

帮助:man dgst
openssl dgst -md5 [-hex默认] /PATH/SOMEFILE
openssl dgst -md5 testfile
Linux之加密和安全
md5sum /PATH/TO/SOMEFILE

MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现
网络通信中保证所传输数据的完整性机制

CBC-MAC
HMAC:使用md5或sha1算法

生成用户密码:

passwd命令:
帮助:man sslpasswd
openssl passwd -1 -salt SALT(最多8位)
openssl passwd -1 –salt centos

生成随机数:

帮助:man sslrand
openssl rand -base64|-hex NUM
NUM: 表示字节数,使用-hex,每个字符为十六进制,相当于4位二进制,
出现的字符数为NUM*2
openssl rand -base64 12 | grep -o "[[:alnum:]]{9}"
可用于生成9位随机字母数字的字串
Linux之加密和安全

公钥加密:

算法: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 –des3 ) 生成私钥的同时使用des3对称口令加密-平时不加口令,前提确保密钥安全
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:从熵池返回随机数;随机数用尽,会利用软件生成伪随机
数,非阻塞

PKI:Public Key Infrastructure

CA
RA
CRL
证书存取库

建立私有CA:

OpenCA
openssl

证书申请及签署步骤:

1、生成申请请求
2、RA核验
3、CA签署
4、获取证书

创建CA和申请证书

创建私有CA:

openssl的配置文件:/etc/pki/tls/openssl.cnf
三种策略:match匹配、optional可选、supplied提供
match:要求申请填写的信息跟CA设置信息必须一致
optional:可有可无,跟CA设置信息可不一致
supplied:必须填写这项申请信息,

1、创建所需要的文件

touch /etc/pki/CA/index.txt 生成证书索引数据库文件
echo 01 > /etc/pki/CA/serial 指定第一个颁发证书的序列号

2、 CA自签证书

生成私钥
cd /etc/pki/CA/
(umask 066; openssl genrsa -out private/cakey.pem 2048)

生成自签名证书

openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem

选项说明:

-new:生成新证书签署请求
-x509:专用于CA生成自签证书
-key:生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径

3、颁发证书

在需要使用证书的主机生成证书请求
给web服务器生成私钥

(umask 066; openssl genrsa –out /data/test.key 2048)

生成证书申请文件

openssl req -new -key /data/test.key -out /data/test.csr

将证书请求文件传输给CA
CA签署证书,并将证书颁发给请求者

openssl ca -in /tmp/test.csr –out /etc/pki/CA/certs/test.crt -days 100
注意:默认要求 国家,省,公司名称三项必须和CA一致

查看证书中的信息:

openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates
openssl ca -status SERIAL 查看指定编号的证书状态

4、吊销证书

在客户端获取要吊销的证书的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.pem

查看crl文件:

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

实验:私有CA建立和证书申请,写成脚本

Linux之加密和安全
1 创建CA /etc/pki/tls/openssl.cnf 此文件为CA配置文件

cd /etc/pki/CA
touch index.txt 数据库文件
echo 0F > serial 证书序列号-16进制数
(umask 066;openssl genrsa -out private/cakey.pem 4096 ) 创建根CA私钥 长度4096 保证权限为600
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
req:证书申请
-new:新的证书
-x509:自签名
-key:提交自己的私钥
-out:生成证书文件
-days:有效期3650天 私钥自签名证书
此三项必填(填写国家、省会,公司名称),城市,部门名称,主机名称,邮箱可写可不写。
openssl x509 -in cacert.pem -noout -text 查看证书内容

2 在客户端生成证书申请

(umask 066;openssl genrsa -out test.key 1024) 生成私钥
openssl req -new -key test.key -out test.csr 利用私钥生成证书申请csr文件,其中填写三项必须和上面一致。
scp test.csr 192.168.36.7:/data

3 在根CA给客户端颁发证书

openssl ca -in /data/test.csr -out certs/test.crt -days 100 颁发证书
同一个证书申请csr如果向重复颁发证书文件,需要把index.txt.attr文件里的字段唯一性检查改为no

4 吊销证书

在客户端获取要吊销的证书的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.pem

查看crl文件:

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

#!/bin/bash
#
#---------------------------------------
#Author:                    MartinHe
#Date:                      2019-04-19
#FileName:                  CA_create.sh
#URL:                       https://blog.51cto.com/5033330 
#Desciption:                The test Scirpt
#Copyright(c)               2019 All rights reserved
#---------------------------------------

# 根CA创建函数,内部定义自行修改
creatCA () {

expect<<EOF
spawn openssl req -new -x509 -key $DIR/private/cakey.pem -out $DIR/cacert.pem -days 3650
expect {
"Country Name" { send "CN\n";exp_continue } 
"State or Province Name" { send "beijing\n";exp_continue }
"Locality Name" { send "beijing\n";exp_continue }
"Organization Name" { send "martinhe\n";exp_continue }

"Organizational Unit Name" { send "m36\n";exp_continue}  
"Common Name" { send "ca.martinhe.com\n";exp_continue }
"Email Address" { send "admin@martinhe.com\n" }
}
    expect eof
EOF

}

# 使用私钥生成证书申请csr文件,内部定义自行修改
applyCA () {

expect<<EOF                                                                                             
spawn openssl req -new  -key ./${KEY}.key -out ./${KEY}.csr 
expect {
"Country Name" { send "CN\n";exp_continue } 
"State or Province Name" { send "beijing\n";exp_continue }
"Locality Name" { send "haidian\n";exp_continue }
"Organization Name" { send "martinhe\n";exp_continue }
"Organizational Unit Name" { send "m36_devops\n";exp_continue}  
"Common Name" { send "m36.martinhe.com\n";exp_continue }
"Email Address" { send "m36@martinhe.com\n" ;exp_continue }
"A challenge password" { send "\n";exp_continue }
"An optional company name" { send "\n" }
}                                                                                                           
        expect eof
EOF

}

BC="\e[1;32m"
EC="\e[0m"

PS3="Please choose a num which one you want to do: "

DIR="/etc/pki/CA"

select menu in createCA applyCA awardCA quit;do

case $menu in

createCA)
touch $DIR/{index.txt,serial}
echo 01 > $DIR/serial
(umask 066;openssl genrsa -out $DIR/private/cakey.pem 4096) &> /dev/null
 creatCA
   ;;

applyCA)
    echo -e "${BC}please input a private key name: ${EC}\c";read KEY
    (umask 066;openssl genrsa -out ${KEY}.key 1024)
    applyCA
    echo -e "${BC}please input the CA server IP: ${EC}\c"; read IP
    scp ${KEY}.csr ${IP}:
    ;;

awardCA)
        echo
    ls /root/*.csr
        echo
    echo -e "${BC}please input the csr name to ward(such as test): ${EC}\c";read CSR
    openssl ca -in /root/${CSR}.csr  -out $DIR/certs/$CSR.crt -days 100
  ;;
    quit)
        echo you input is $REPLY
        break
        ;;
    *)
        echo -e "${BC}Wrong choose,stupid!!!${EC}"
    esac
done