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生成
  • 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信

握手阶段详细过程:

这个阶段总共涉及四次通信,而且此阶段所有通信都是明文

  1. 客户端发出请求(ClientHello)

    客户端首先向服务器发出加密通信请求,称为ClientHello。

    这一步客户端提供

    • TLS协议版本

    • 一个客户端生成的随机数

    • 支持加密的方法

    • 支持压缩的方法

  2. 服务端回应(ServerHello)

    服务端向客户端发出回应,回应包含

    • 确认使用的加密通信协议版本
    • 服务器生成的随机数
    • 确认加密方法
    • 服务器证书
  3. 客户端回应

    客户端收到服务器回应后,会先验证服务器证书是否可信,不可信则会告警,接着会从证书中取出服务器公钥,再向服务器发送三项信息

    • 一个随机数,这个随机数会用服务器公钥加密
    • 编码改变通知,表示以后双方发送的信息会用协商好的加密方式发送
    • 客户端握手结束通知,这项也是前面发送所有内容的hash值,用来供服务器校验。

    整个阶段出现了三个随机数,主要是为了使得加密更安全,不容易被破解

  4. 服务器回应

    服务器收到客户端第三个随机数后,利用者三个数计算生成所用的“会话密钥”,向客户端发送信息

    • 编码改变通知
    • 服务器握手结束通知,这项也是前面发送所有内容的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协议

官方站点:https://www.openssl.org

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
posted @ 2021-03-30 22:08  bestvae  阅读(1044)  评论(1)    收藏  举报