14.加密技术和安全
1 加密技术
1.1 对称加密算法
对称加密:加密和解密使用同一个密钥
特性:
- 加密、解密使用同一个密钥,效率高
- 将原始数据分割成固定大小的块,逐个进行加密
缺点:
- 不同对象间会产生不同密钥,造成密钥数过多
- 密钥不好分发给对方
- 无法确认数据来源
常见的对称加密算法:
- 3DES:
- AES:Advanced (128, 192, 256bits)
1.2 非对称加密算法
非对称加密:密钥是成对出现,分为公钥和私钥
- 公钥:public key,公开给所有人,主要给别人加密使用
- 私钥:secret key,private key 自己留存,必须保证其私密性,用于自已加密签名
注意:用公钥加密数据,只能使用与之配对的私钥解密
主要功能:
- 数字签名:接收方能够确认发送发身份
- 数字加密:可用于加密对称密钥
缺点:
- 密钥较长,算法较复杂
- 加密和解密效率低
常见算法:
- RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可 变的,可实现加密和数字签名
- DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准)
- ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学,比RSA加密算法使用更小的密钥, 提供相当的或更高等级的安全
1.3 单向哈希算法
哈希算法:也称为散列算法,将任意数据缩小成固定大小的“指纹”,称为digest,即摘要
特点:
- 任意长度输入,固定长度输出
- 若修改数据,指纹也会改变,且有雪崩效应,数据的一点微小改变,生成的指纹值变化非常大。
- 无法从指纹中重新生成数据,即不要逆,具有单向性
功能:用于校验数据完整性
常见算法
md5: 128bits、sha1: 160bits、sha224 、sha256、sha384、sha512
常用工具
- md5sum | sha1sum [ --check ] file
- openssl、gpg
- rpm -V
1.5 多种加密方式
1.5.1 实现数据加密
1.5.2 实现数字签名
1.5.3 综合加密和签名
方式一:数字签名和非对称加密组合
A(Alice):hash原文→A私钥加密摘要成为数字签名→B公钥加密原文和数字签名→传送给Bob
B(Bob):B私钥解密成数字签名和原文→A公钥解密数字签名称为摘要和原文→对比A和B的原文摘要
方式二:数字签名和对称加密组合
A(Alice):hash原文→A私钥加密摘要成为数字签名→对称加密原文和数字签名→公钥B加密对称密钥→传送给Bob
B(Bob):B私钥解密对称密钥→对称密钥解密→A公钥解密数字签名→对比A和B的原文摘要
1.6 CA和证书
1.6.1 CA和证书
CA和证书主要是为了防止中间人将服务端返回的公钥替换为自己公钥,其工作原理如下:
PKI:Public Key Infrastructure 公共密钥加密体系
签证机构:CA(Certificate Authority)
注册机构:RA
证书吊销列表:CRL
1.6.2 HTTPS
HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。
从上图我们知道HTTPS无非是在传输层和应用层中间加了一层TLS
1.6.3 安全协议 SSL/TLS
1、SSL/TLS:是为网络通信提供安全及数据完整性的一种传输层安全协议
- SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
功能:
- 机密性:SSL协议使用密钥加密通信数据。
- 可靠性:服务器和客户都会被认证,客户的认证是可选的。
- 完整性:SSL协议会对传送的数据进行完整性检查。
2、TLS组成:
- Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密 钥交换
- ChangeCipherSpec 协议:一条消息表明握手协议已经完成
- Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会 直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
- Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
3、TLS基本的运行过程(HTTPS工作过程)
实现分为握手阶段和应用阶段
- 握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认 证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过 MasterSecret生成
- 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信
握手阶段详细过程:
这个阶段总共涉及四次通信,而且此阶段所有通信都是明文
-
客户端发出请求(ClientHello)
客户端首先向服务器发出加密通信请求,称为ClientHello。
这一步客户端提供
-
TLS协议版本
-
一个客户端生成的随机数
-
支持加密的方法
-
支持压缩的方法
-
-
服务端回应(ServerHello)
服务端向客户端发出回应,回应包含
- 确认使用的加密通信协议版本
- 服务器生成的随机数
- 确认加密方法
- 服务器证书
-
客户端回应
客户端收到服务器回应后,会先验证服务器证书是否可信,不可信则会告警,接着会从证书中取出服务器公钥,再向服务器发送三项信息
- 一个随机数,这个随机数会用服务器公钥加密
- 编码改变通知,表示以后双方发送的信息会用协商好的加密方式发送
- 客户端握手结束通知,这项也是前面发送所有内容的hash值,用来供服务器校验。
整个阶段出现了三个随机数,主要是为了使得加密更安全,不容易被破解
-
服务器回应
服务器收到客户端第三个随机数后,利用者三个数计算生成所用的“会话密钥”,向客户端发送信息
- 编码改变通知
- 服务器握手结束通知,这项也是前面发送所有内容的hash值,用来供客户端校验。
至此握手阶段全部结束,接下来使用会话密钥进入“加密通信”,不过使用的是普通HTTP协议

目前密钥交换 + 签名有三种主流选择:
- RSA 密钥交换、RSA 数字签名
- ECDHE 密钥交换、RSA 数字签名
- ECDHE 密钥交换、ECDSA 数字签名
上面所描述握手采用第一种方式,整个握手阶段都不加密(也没法加密),都是明文的。因此,如果有人窃听通信,他可以知道双方选择的加密方法,以及三个随机数中的两个。整个通话的安全,只取决于第三个随机数(Premaster secret)能不能被破解。
虽然理论上,只要服务器的公钥足够长(比如2048位),那么Premaster secret可以保证不被破解。但是为了足够安全,我们可以考虑把握手阶段的算法从默认的RSA算法,改为 Diffie-Hellman算法(简称DH算法)。
采用DH算法后,Premaster secret不需要传递,双方只要交换各自的参数,就可以算出这个随机数。

上图中,第三步和第四步由传递Premaster secret变成了传递DH算法所需的参数,然后双方各自算出Premaster secret。
参考链接:
http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
https://tools.ietf.org/html/rfc5246
2 openssl
2.1 openssl介绍
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连线者的身份。
其主要库是以C语言所写,实现了基本加密功能,实现了SSL与TLS协议
openssl官方推荐电子书:https://www.feistyduck.com/library/openssl-cookbook/
2.2 Base64编码
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。每6位二进制数为一个单元。3个字节共有24个二进制位,所以对应64个Base64单元,也就是说3个字节可由4个可打印字符表示。
如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。
参考:https://zh.wikipedia.org/wiki/Base64
范例:
[root@centos8 ~]#echo -n Man | base64
TWFu
[root@centos8 ~]#echo TWFu | base64 -d
Man[root@centos8 ~]#
[root@centos8 ~]#echo -n ab | base64
YWI=
[root@centos8 ~]#echo -n ab | base64 | base64 -d
ab[root@centos8 ~]#
2.3 openssl命令
两种运行模式:
- 交互模式
- 批处理模式
三种子命令:
- 标准命令
- 消息摘要命令
- 加密命令
范例:
[root@centos8 ~]# openssl version
OpenSSL 1.1.1c FIPS 28 May 2019
[root@centos8 ~]# openssl help
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dhparam
dsa dsaparam ec ecparam
enc engine errstr gendsa
......
Message Digest commands (see the `dgst' command for more details)
sha3-384 sha3-512 sha384 sha512
sha512-224 sha512-256 shake128 shake256
sm3
......
Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
......
[root@centos8 ~]# openssl
OpenSSL> version
OpenSSL 1.1.1c FIPS 28 May 2019
2.3.1 openssl命令对称加密
命令:
openssl enc
算法:
3des, aes, blowfish, twofish
帮助:man enc
选项:
- -a 使用base64对加密后解密前的数据进行处理
- -e 加密输入数据。默认选项
- -des3 DES(Data Encryption Standard),用DES3算法的CBC模式加密文件
- -salt 加密时加入随机生成数
- -in,-out 输入输出文件
范例:
#加密
[root@centos8 data]# openssl enc -des3 -a -salt -in test.txt -out test1
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
[root@centos8 data]# cat test1
U2FsdGVkX18/V5eX2Mqt8dzbLtLUyx3H
#解密
[root@centos8 data]# openssl enc -d -des3 -a -in test1 -out test2
enter des-ede3-cbc decryption password:
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
[root@centos8 data]# cat test2
123
2.3.2 openssl命令单向哈希加密
命令:
openssl dgst
算法:
md5sum, sha1sum, sha224sum,sha256sum…
帮助:man dgst
范例:
#用MD5算法计算文件fstab的哈西值,输出到stdout:
[root@centos8 data]# openssl dgst -md5 fstab
MD5(fstab)= ab3ee666e086e8dac26f96079ac5e63d
2.3.3 openssl命令生成用户密码
帮助:man sslpasswd
范例:
#以交互方式生成
[root@centos8 data]# openssl passwd -6 -salt qweewq -stdin
xiaoming
$6$qweewq$Uy5hJssuD8tzMmnK2S.7rYLgveMlQ0uvOwsJR2.oyNCjd7ksEt2K6SE7VK5toP1jnyQzQRj0HLapvScAECSKE/
#以非交互式生成
[root@centos8 data]# echo xiaoming | openssl passwd -6 -salt qweewq -stdin
$6$qweewq$Uy5hJssuD8tzMmnK2S.7rYLgveMlQ0uvOwsJR2.oyNCjd7ksEt2K6SE7VK5toP1jnyQzQRj0HLapvScAECSKE/
#创建用户同时生成密码(centos和ubuntu通用)、
[root@centos8 data]# useradd -p `echo xiaoming | openssl passwd -6 -salt qweewq -stdin` user2
[root@centos8 data]# getent shadow user2
user2:$6$qweewq$Uy5hJssuD8tzMmnK2S.7rYLgveMlQ0uvOwsJR2.oyNCjd7ksEt2K6SE7VK5toP1jnyQzQRj0HLapvScAECSKE/:18719:0:99999:7:::
2.3.4 openssl命令生成随机数
帮助:man sslrand
范例:
#采用base64编码输出9个字符随机数
[root@centos8 ~]# openssl rand -base64 9
mTLC8hWynv6M
#生成随机10位长度密码
[root@centos8 ~]# openssl rand -base64 9 | head -c10
cV5MLKUmHz[root@centos8 ~]#
我们还可以使用随机数生成器生成随机数
随机数生成器:伪随机数字,利用键盘和鼠标,块设备中断生成随机数 /dev/random:仅从熵池返回随机数;随机数用尽,阻塞 /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
范例:
#删除不是字母和数字的内容
[root@centos8 ~]# tr -dc '[:alnum:]' < /dev/random | head -c10
23u6MUama3
2.3.5 openssl rsa命令实现非对称加密
openssl命令生成密钥对儿:man genrsa
生成私钥格式:
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE [-des3] [NUM_BITS,默认2048]
范例:
[root@centos8 data]# openssl genrsa -out app.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
....+++++
......+++++
e is 65537 (0x010001)
#将私钥使用des3加密,这样更安全不过会比较麻烦
[root@centos8 data]# openssl genrsa -out app2.key -des3 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
............+++++
..............................................................................+++++
e is 65537 (0x010001)
Enter pass phrase for app2.key:
Verifying - Enter pass phrase for app2.key:
提取公钥格式:
openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE
范例:解密之前生成的私钥
[root@centos8 data]# openssl rsa -in app2.key -pubout -out app2.key.pub
Enter pass phrase for app2.key:
writing RSA key
[root@centos8 data]# ls
app2.key app2.key.pub app.key fstab script
[root@centos8 data]# cat app2.key.pub
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyIKRptwChdIgUiRFt3nV
BnyrbzqDqPcwECNYQeGHUivQCVYTxDny6WrZ8JscrLef1NL18Sa0l5rle8AuGg6N
EKB3OnWOfzXX9F8sc7GPMJTi4nK45SwnOR8k6KYYnIONDethTrbpNuLK0/O3EuYl
0Ez2/6QWu15bbjZUHxFXEsEbQQf3sKT+N68zJGrG8ZZOZjeBpoWGMvbucYks7aHt
bs4gq1uedSAf66f74CLMD/UmvXzYubWV1HZN7yqWJidfnnARRJ/shu7HlWavShun
X2YBDLXHLuOBHLqWNypa5U/emGpf3O2zFRjGKp/IdRq4e/jRL/qWOy/pXfzYY9Bd
nwIDAQAB
-----END PUBLIC KEY-----
2.4 建立私有CA实现证书申请颁发
openssl的配置文件:
#通常在创建根CA时会用到此文件
/etc/pki/tls/openssl.cnf
[root@centos8 ~]#cat /etc/pki/tls/openssl.cnf
......
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several certs with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# The private key
x509_extensions = usr_cert # The extensions to add to the cert
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions = crl_ext
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = sha256 # use SHA-256 by default
preserve = no # keep passed DN ordering
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match
# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
三种策略:
- match:要求申请填写的信息跟CA设置信息必须一致
- optional:可有可无,跟CA设置信息可不一致
- supplied:必须填写这项申请信息
2.4.1 创建私有根CA自签名证书
1、创建文件
[root@centos8 CA]# mkdir private
[root@centos8 CA]# touch private/cakey.pem
2、生成CA私钥
[root@centos8 pki]# mkdir CA;cd CA
[root@centos8 CA]# openssl genrsa -out private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..................+++++
...............................................................................................+++++
e is 65537 (0x010001)
[root@centos8 CA]# ll private/cakey.pem
-rw-r--r--. 1 root root 1679 Apr 4 07:20 private/cakey.pem
3、生成CA自签名证书
[root@centos8 CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/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
State or Province Name (full name) []:chengdu
Locality Name (eg, city) [Default City]:chengdu
Organization Name (eg, company) [Default Company Ltd]:tenxun
Organizational Unit Name (eg, section) []:jishu
Common Name (eg, your name or your server's hostname) []:
Email Address []:
#查看生成证书
[root@centos8 CA]# openssl x509 -in ./cacert.pem -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
06:af:b5:16:75:af:cb:41:b4:6c:65:fe:7c:fa:98:ab:85:e4:37:2c
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = chengdu, L = chengdu, O = tenxun, OU = jishu
Validity
......
2.4.2 申请证书并颁发证书
1、为需要使用证书的主机生成生成私钥
[root@centos8 CA]# openssl genrsa -out /data/test.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
........................................................................................................................+++++
...................................+++++
e is 65537 (0x010001)
2、为需要使用证书的主机生成证书申请文件
#注意:由于配置文件的选项国家省份组织这三个选项必须和CA配置一致
[root@centos8 CA]# openssl req -new -key /data/test.key -out /data/test.crs
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) []:chengdu
Locality Name (eg, city) [Default City]:chengdu
Organization Name (eg, company) [Default Company Ltd]:tenxun
Organizational Unit Name (eg, section) []:renli
Common Name (eg, your name or your server's hostname) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
3、在CA签署证书并将证书颁发给请求者
[root@centos8 CA]# openssl ca -in /data/test.crs -out /etc/pki/CA/newcerts/test.crt
Using configuration from /etc/pki/tls/openssl.cnf
140065476847424:error:02001002:system library:fopen:No such file or directory:crypto/bio/bss_file.c:72:fopen('/etc/pki/CA/index.txt','r')
140065476847424:error:2006D080:BIO routines:BIO_new_file:no such file:crypto/bio/bss_file.c:79:
140674566915904:error:02001002:system library:fopen:No such file or directory:crypto/bio/bss_file.c:72:fopen('/etc/pki/CA/serial','r')
#注意:这里由于没有创建相关文件报错,所以先创建相关文件
[root@centos8 CA]# touch index.txt
[root@centos8 CA]# touch serial
[root@centos8 CA]# echo 01 > /etc/pki/CA/serial
#再次颁发证书
[root@centos8 CA]# openssl ca -in /data/test.crs -out /etc/pki/CA/newcerts/test.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
......
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
4、查看证书中的信息:
openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates
#查看指定编号的证书状态
openssl ca -status SERIAL
2.4.3 吊销证书
在客户端获取要吊销的证书的serial
[root@centos8 CA]# openssl x509 -in /etc/pki/CA/newcerts/test.crt --noout -serial -subject
serial=01
subject=C = CN, ST = chengdu, O = tenxun, OU = renli
在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证 书:
[root@centos8 CA]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
#吊销完成证书发生改变的文件,其状态由v变为R
[root@centos8 CA]# cat /etc/pki/CA/index.txt
R 310401235120Z 210404000314Z 01 unknown /C=CN/ST=chengdu/O=tenxun/OU=renli
和颁发证书一样此时也需要创建一个吊销证书列表文件
[root@centos8 CA]# echo 01 > /etc/pki/CA/crlnumber
更新证书吊销列表
[root@centos8 CA]# openssl ca -gencrl -out /etc/pki/CA/crl.pem
Using configuration from /etc/pki/tls/openssl.cnf
查看
[root@centos8 CA]# openssl crl -in /etc/pki/CA/crl.pem -noout -text
Certificate Revocation List (CRL):
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = chengdu, L = chengdu, O = tenxun, OU = jishu
Last Update: Apr 4 00:08:48 2021 GMT
Next Update: May 4 00:08:48 2021 GMT
......
2.4.4 CentOS 7 创建自签名证书
在centos7中可以利用/etc/pki/tls/certs文件下的makefile脚本来帮助我们完成证书吊销和颁发
[root@centos7 ~]#cd /etc/pki/tls/certs
[root@centos7 certs]#cat Makefile
UTF8 := $(shell locale -c LC_CTYPE -k | grep -q charmap.*UTF-8 && echo -utf8)
DAYS=365
KEYLEN=2048
[root@centos7 certs]#make app.crt
由于centos8没有这个文件,因此可以将makefile文件复制到centos8中,也能实现脚本颁发证书
3 ssh服务
3.1 服务介绍
ssh: secure shell, protocol, 22/tcp, 安全的远程登录,实现加密通信,代替传统的 telnet 协议
具体的软件实现:
- OpenSSH:ssh协议的开源实现,CentOS 默认安装
- dropbear:另一个ssh协议的开源项目的实现
ssh首次连接时公钥交换
https://www.ssh.com/ssh/protocol/
ssh通讯过程中加密原理
3.2 openssh 服务
OpenSSH是SSH (Secure SHell) 协议的免费开源实现,一般在各种Linux版本中会默认安装,基于 C/S结构
openssh服务端相关文件:
- 服务端:/usr/sbin/sshd
- unit文件:/usr/lib/systemd/system/sshd.service
openssh客户端相关文件:
- /usr/bin/ssh
- /etc/ssh/ssh_config
- /etc/ssh中相关密钥文件
- 用户家目录中公钥文件
3.2.1 客户端登陆方式和原理
ssh服务登陆常用验证方式
- 用户和口令
- 基于密钥
基于用户和口令登陆验证
基于密钥登陆验证
3.2.2 ssh客户端命令
ssh命令是ssh客户端,允许实现对远程系统经验证地加密安全访问
格式:
ssh [user@]host [COMMAND]
ssh [-l user] host [COMMAND]
常见选项:
- -p 指定远程服务器监听端口
- -b 指定连接的源IP,可用于本机多ip情况
- -v 调试模式
- -c 压缩方式传输数据
- -x 支持x11转发,基于x11可实现本地显示远程图形界面
- -t 强制伪tty分配,用于多主机跳转情况
- -o option 可用于指定配置文件中设置
- -i
指定私钥文件路径
范例:ssh连接时不询问是否连接
[root@centos7 ~]#sed -i.bak '/StrictHostKeyChecking/s/.*/StrictHostKeyChecking
no/' /etc/ssh/ssh_config
范例:一条命令实现多主机跳转至目标主机
[root@centos8 ~]#ssh -t 10.0.0.8 ssh -t 10.0.0.7 ssh 10.0.0.6
root@10.0.0.8's password:
root@10.0.0.7's password:
root@10.0.0.6's password:
Last login: Fri May 22 09:10:28 2020 from 10.0.0.7
范例:远程执行命令
#主机后面直接跟命令
[root@localhost ~]# ssh root@192.168.1.140 hostname -I
The authenticity of host '192.168.1.140 (192.168.1.140)' can't be established.
ECDSA key fingerprint is SHA256:Ft+oMSnzLdMmXE3nOIRaRvrstvDiRj35kInIufWMrPk.
ECDSA key fingerprint is MD5:c2:94:4d:01:29:57:23:eb:d2:2f:da:a1:c5:87:04:c1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.140' (ECDSA) to the list of known hosts.
root@192.168.1.140's password:
192.168.1.140
#输入重定向方式执行命令
[root@centos8 ~]#ssh 10.0.0.18 /bin/bash < test.sh
root@10.0.0.18's password:
10.0.0.18
3.2.3 基于密钥登陆的实现
1、客户端生成密钥对
ssh-keygen -t rsa [-P 'password'] [-f “~/.ssh/id_rsa"]
选项:
- -p 对密钥进行加密
- -f 指定密钥文件
还可以对私钥重设口令
ssh-keygen –p
2、把公钥文件传输至远程服务器对应用户的家目录中
ssh-copy-id [-i [identity_file]] [user@]host
3、使用ssh登陆
ssh [user@]host [COMMAND]
注意:当我们使用基于密钥方式登陆服务端时,服务端是通过客户端私钥进行验证,因此任何一个客户端拿到私钥都可以使用此方式远程登陆服务端。所以为了保证私钥安全,我们可以对私钥进行加密。
验证代理(authentication agent)
保密解密后的密钥,口令就只需要输入一次,从而避免了交互式登陆
代理启用方式:
#启用代理
ssh-agent bash
#钥匙通过命令添加给代理
ssh-add
3.2.4 其他ssh客户端工具
scp命令
格式:
scp [options] SRC... DEST/
scp [options] [user@]host:/sourcefile /destpath
scp [options] /sourcefile [user@]host:/destpath
常用选项:
- -C 压缩数据流
- -p 保持原文件的属性信息
- -r 递归复制
- -q 静默模式
- -P PORT 指明remote host的监听的端口
rsync 命令
rsync工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传 输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包
注意:通信两端主机都需要安装 rsync软件
格式:
rsync -av /etc server1:/tmp #复制目录和目录下文件
rsync -av /etc/ server1:/tmp #只复制目录下文件
常用选项:
- -v 显示详细过程
- -r 递归赋值目录树
- -p 保留权限
- -t 保留修改时间戳
- -g 保留组信息
- -o 保留所有者信息
- -l 将软链接文件本身进行复制
- -L 将软链接文件指向的文件复制
- -u 如果接收者的文件比发送者的文件较新,将忽略同步
- -z 压缩,节约网络带宽
- -a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
- --delete 源数据删除,目标数据也自动同步删除
sftp命令
格式:
sftp [user@]host
sftp> help
3.3.5 ssh高级应用
本地端口转发
原理图:
简单来说是将要转发的数据封装在ssh协议中发送,提高了安全性
SSH 端口转发能够提供两大功能:
- 加密 SSH Client 端至 SSH Server 端之间的通讯数据
- 突破防火墙的限制完成一些之前无法建立的 TCP 连接
格式:
#在客户端执行
ssh -L localport:remotehost:remotehostport sshserver
选项:
- -f 后台启用
- -N 不打开远程shell
- -g 启用网关功能
范例:
#客户端执行命令建立通道
ssh –L 9527:telnetsrv:23 -Nfg sshsrv
#访问客户端本机端口,ssh服务器代理转发数据
telnet 127.0.0.1 9527
3.3.6 ssh服务器配置选项
配置文件路径:/etc/ssh/sshd_config
配置文件帮助文档:man 5 sshd_config
常用配置设置:
Port
ListenAddress ip
LoginGraceTime 2m
PermitRootLogin yes #默认ubuntu不允许root远程ssh登录
StrictModes yes #检查.ssh/文件的所有者,权限等
MaxAuthTries 6 #身份验证的允许失败的最大次数
MaxSessions 10 #同一个连接最大会话
PubkeyAuthentication yes #基于key验证
PermitEmptyPasswords no #空密码连接
PasswordAuthentication yes #基于用户名和密码连接
GatewayPorts no
ClientAliveInterval 10 #单位:秒
ClientAliveCountMax 3 #默认3
UseDNS yes #提高速度可改为no
GSSAPIAuthentication yes #提高速度可改为no
MaxStartups #未认证连接最大值,默认值10
Banner /path/file
#以下可以限制可登录用户的办法:
AllowUsers user1 user2 user3
DenyUsers
AllowGroups
DenyGroups
范例:提升ssh连接速度
vim /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication no
systemctl restart sshd
ssh服务建议配置策略:
- 建议使用非默认端口
- 禁止使用protocol version 1
- 限制可登录用户
- 设定空闲会话超时时长
- 利用防火墙设置ssh访问策略
- 仅监听特定的IP地址
- 基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs
- 使用基于密钥的认证
- 禁止使用空密码
- 禁止root用户直接登录
- 限制ssh的访问频度和并发在线数
- 经常分析日志
3.3 ssh 其它相关工具
3.4.1 自动登录ssh工具sshpass
EPEL源提供,ssh登陆不能在命令行中指定密码。sshpass的出现,解决了这一问题。同样可以解决非交互式登陆的还有expect,只不过expect语法不友好,使用sshpass可以更为方便实现非交互式登陆。
格式:
sshpass [option] command parameters
常用选项:
- -p password #后跟密码它允许你用 -p 参数指定明文密码,然后直接登录远程服务器
- -f filename #后跟保存密码的文件名,密码是文件内容的第一行。
- -e #将环境变量SSHPASS作为密码
范例:
[root@centos8 ~]#sshpass -p 123456 ssh -o StrictHostKeyChecking=no 10.0.0.6
hostname -I
范例:实现批量下发密钥
[root@server1 ssh]# cat ssh_key
#!/bin/bash
HOSTS="
172.16.60.110
172.16.60.114
"
PASS=123321
ssh-keygen -P "" -f /root/.ssh/id_rsa &> /dev/null
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
for i in $HOSTS;do
{
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub $i &> /dev/null
}&
done
wait
4 文件完整性检查
AIDE(Advanced Intrusion Detection Environment高级入侵检测环境)是一个入侵检测工具,主要用途 是检查文件的完整性,审计计算机上的那些文件被更改过了
AIDE能够构造一个指定文件的数据库,它使用aide.conf作为其配置文件。AIDE数据库能够保存文件的 各种属性,包括:权限(permission)、索引节点序号(inode number)、所属用户(user)、所属用户组 (group)、文件大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小以 及连接数。AIDE还能够使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每个文件的校 验码或散列号
通常来说数据库不应该保存那些经常变动的文件信息,例如日志文件等
配置文件
vim /etc/aide.conf
范例:
#定义监控项权限+索引节点+链接数+用户+组+大小+最后一次修改时间+创建时间+md5校验值
R=p+i+n+u+g+s+m+c+md5
NORMAL = R+rmd60+sha256
/data/test.txt R
/bin/ps R+a
/usr/bin/crontab R+a
/etc PERMS
!/etc/mtab #“!”表示忽略这个文件的检查
初始化默认的AIDE的库:
/usr/local/bin/aide -i | --init
生成检查数据库(建议初始数据库存放到安全的地方)
cd /var/lib/aide
mv aide.db.new.gz aide.db.gz
检测
/usr/local/bin/aide -C | --check
更新数据库
aide -u | --update
5 sudo命令
5.1 sudo介绍
sudo 即superuser do,允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如 halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性
5.2 sudo 组成
配置文件:
/etc/sudo.conf,一般很少配置此文件,使用man 5 sudo.conf可以查看文件说明
授权规则配置文件:
/etc/sudoers文件和/etc/sudoers.d目录,我们可以将sudo配置写入/etc/sudoers文件中,也可以自定义一个sudo文件至/etc/sudoers.d目录
安全编辑授权规则文件和语法检查工具
/usr/sbin/visudo
日志文件:
/var/log/secure
范例:
#检查语法
[root@server1 .ssh]visudo -c
#检查指定配置文件语法
[root@server1 .ssh]visudo -f /etc/sudoers.d/test
#设置默认编辑器为vim
[root@server1 .ssh]# cat ~/.bashrc
export EDITOR="vim"
5.3 sudo命令
格式:
sudo [-u user] COMMAND
常用选项:
- -u user 默认为root用户
- -l 列出用户在主机上可用的和被禁止的命令
- -v 延长密码的有效期限5分钟
5.4 sudo 授权规则配置
注意:配置文件中支持使用通配符 glob
配置文件:/etc/sudoers, /etc/sudoers.d/
suduoer授权规则格式:
用户 登入主机=(代表用户) 命令
user host=(runas) command
user: 运行命令者的身份
host: 通过哪些主机
(runas):以哪个用户的身份
command: 运行哪些命令
User和runas形式:
username
#uid
%group_name
%#gid
user_alias|runas_alias
host:
ip或hostname
network(/netmask)
host_alias
command:
command name
directory
sudoedit
Cmnd_Alias
sudoers的可自定义别名:
- User_Alias
- Runas_Alias
- Host_Alias
- Cmnd_Alias
别名格式:
[A-Z]([A-Z][0-9]_)*
别名定义:
Alias_Type NAME1 = item1,item2,item3 : NAME2 = item4, item5
范例:
#允许以tom和jerry的身份执行所有命令。默认是以tom身份执行
Defaults:user1 runas_default=tom
user1 ALL=(tom,jerry) ALL
6 PAM认证机制
PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认 证相关的通用框架机制。它提供API给程序开发人员和系统管理人员,这样用户无需再自己开发一套认证模块。
6.1 PAM工作原理
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证 文件(位于/lib64/security下)进行安全认证
认证过程示例:
1.使用者执行/usr/bin/passwd 程序,并输入密码
2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是
在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入
密码或者通过验证)
6.2 PAM相关文件
-
模块文件目录:/lib64/security/*.so
-
特定模块相关的设置文件:/etc/security/
-
应用程序调用PAM模块的配置文件
主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
注意:如/etc/pam.d存在,/etc/pam.conf将失效
范例:查看程序是否支持PAM
[root@centos8 ~]#ldd `which sshd` |grep libpam
libpam.so.0 => /lib64/libpam.so.0 (0x00007fea8e70d000)
[root@centos8 ~]#ldd `which passwd` |grep pam
libpam.so.0 => /lib64/libpam.so.0 (0x00007f045b805000)
libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f045b601000)
6.3 PAM配置文件
通用配置文件/etc/pam.conf格式
application type control module-path arguments
专用配置文件/etc/pam.d/ 格式
type control module-path arguments
application:指服务名,如:telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确
配置的其它服务
type:指模块类型,即功能
control :PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现
module-path: 用来指明本模块对应的程序文件的路径名
Arguments: 用来传递给该模块的参数
帮助可以参看官方文档
官方在线文档:http://www.linux-pam.org/Linux-PAM-html/ 官方离线文档:http://www.linux-pam.org/documentation/
也可以使用man帮助
man 模块名 如:man 8 rootok
7 时间同步服务
加密和安全当前都离不开时间的同步,否则各种网络服务可能不能正常运行
7.1 时间同步服务
多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协 议,日志,集群等, 利用NTP(Network Time Protocol) 协议使网络中的各个计算机时间达到同步。 目前NTP协议属于运维基础架构中必备的基本服务之一
时间同步软件:
- ntp
- chrony
详细ntp信息可参看官网:http://www.ntp.org
7.2 chrony
7.2.1 chrony介绍
由于chrony的优势,现在chrony成为较受欢迎的时间同步软件
chrony官网:https://chrony.tuxfamily.org
chrony官方文档:https://chrony.tuxfamily.org/documentation.html
7.2.2 chrony 文件组成
两个主要程序:chronyd和chronyc
- chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算 机增减时间的比率,并对此进行补偿
- chronyc:命令行用户工具,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计 算机上工作,也可在一台不同的远程计算机上工作
服务unit 文件: /usr/lib/systemd/system/chronyd.service
监听端口: 323/udp,123/udp
配置文件: /etc/chrony.conf
7.2.3 配置文件chrony.conf
server - 可用于时钟服务器,iburst 选项当服务器可达时,发送一个八个数据包而不是通常的一个数据
包。 包间隔通常为2秒,可加快初始同步速度
driftfile - 根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中,会在重启后为系统时钟
作出补偿
rtcsync - 启用内核模式,系统时间每11分钟会拷贝到实时时钟(RTC)
allow / deny - 指定一台主机、子网,或者网络以允许或拒绝访问本服务器
cmdallow / cmddeny - 可以指定哪台主机可以通过chronyd使用控制命令
bindcmdaddress - 允许chronyd监听哪个接口来接收由chronyc执行的命令
makestep - 通常chronyd将根据需求通过减慢或加速时钟,使得系统逐步纠正所有时间偏差。在某些特定
情况下,系统时钟可能会漂移过快,导致该调整过程消耗很长的时间来纠正系统时钟。该指令强制chronyd在
调整期大于某个阀值时调整系统时钟
local stratum 10 - 即使server指令中时间服务器不可用,也允许将本地时间作为标准时间授时给其
它客户端
7.2.4 chronyc命令
help 命令可以查看更多chronyc的交互命令
accheck 检查是否对特定主机可访问当前服务器
activity 显示有多少NTP源在线/离线
sources [-v] 显示当前时间源的同步信息
sourcestats [-v]显示当前时间源的同步统计信息
add server 手动添加一台新的NTP服务器
clients 报告已访问本服务器的客户端列表
delete 手动移除NTP服务器或对等服务器
settime 手动设置守护进程时间
tracking 显示系统时间信息
7.2.5 公共NTP服务
-
阿里云公共NTP服务器
Unix/linux类:ntp.aliyun.com,ntp1-7.aliyun.com windows类: time.pool.aliyun.com
-
大学ntp服务
s1a.time.edu.cn 北京邮电大学
s1b.time.edu.cn 清华大学
s1c.time.edu.cn 北京大学
-
国家授时中心服务器:210.72.145.44
练习
1、PAM和google模块实现ssh双因子安全验证。
2、使用chrony实现内网时间同步(一台node1从外网同步时间,其余机器从node1同步时间)。
1、配置同步服务器
#安装软件包
[root@server1 .ssh]# rpm -qa | grep chrony
chrony-3.4-1.el7.x86_64
#修改配置文件
[root@server1 .ssh]# cat /etc/chrony.conf
server ntp.aliyun.com iburst
allow 0.0.0.0/24
local stratum 10
#重启服务
[root@server1 .ssh]# systemctl restart chronyd
#查看是否连上同步服务器
[root@server1 .ssh]# chronyc sources -v
210 Number of sources = 4
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 6 77 2 -1417us[+4237us] +/- 52ms
2、配置客户端
#修改配置文件服务器
[root@localhost ~]# grep server /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
server 172.16.60.238 iburst
#重启服务
[root@localhost ~]# systemctl restart chronyd
#查看是否连接成功
[root@localhost ~]# chronyc sources -v
210 Number of sources = 1
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 172.16.60.238 3 6 17 3 +7044ns[ +108us] +/- 50ms

浙公网安备 33010602011771号