加密和安全

安全机制

信息安全防护的目标

目标 En 说明
真实性 Authenticity 对信息的来源进行判断,能对伪造来源的信息予以鉴别
保密性 Confidentiality 保证机密信息不被窃取,或窃取者不能了解信息的真实含义
完整性 Integrity 保证数据一致性,防止数据被非法用户篡改
可用性 Usability 保证合法用户对信息和资源的使用不会被不正当拒绝
不可抵赖性 Non-repudiation 建立有效责任机制,防止用户否认其行为
可控性 Controlability 对信息的传播及内容具有控制能力

安全防护环节

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

常见的安全攻击 STRIDE

攻击方式 En 说明
假冒,钓鱼网站 Spoofing 与真实网站界面相同,欺骗浏览者提交敏感信息
篡改 Tampering 修改网络中的数据包以达到某种目的
否认 Repudiation 一种欺骗手段
信息泄露 Information Disclosure 有意或无意的将非公开信息暴露给无权限者
拒绝服务 Denial of Service 使计算机或网络无法提供正常的服务
提升权限 Elevation of Privilege 将用户权限通过非法手段提高,以到达执行敏感操作 的目的

安全设计基本原则

  • 使用成熟的安全系统

  • 以小人之心度输入数据

  • 外部系统是不安全的

  • 最小授权

  • 减少外部接口

  • 缺省使用安全模式

  • 安全不是似是而非

  • 从STRIDE思考

  • 在入口处检查

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

常用安全技术

  • 认证

  • 授权

  • 审计

  • 安全通讯

认证,授权,审计俗称3A认证

加密算法和协议

常用的加密算法包括:对称加密,非对称加密,单向加密

对称加密算法

对称加密:加密和解密使用同一个密钥

特性:

  • 加密、解密使用同一个密钥,效率高;

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

缺陷:

  • 密钥过多

  • 密钥分发

  • 数据来源无法确认

常见对称加密算法:

  • DES:Data Encryption Standard,56bits

  • 3DES:

  • AES:Advanced (128, 192, 256bits)

  • Blowfish,Twofish

  • IDEA,RC6,CAST5

非对称加密算法

非对称加密:密钥是成对出现

  • 公钥:public key,公开给所有人,主要给别人加密使用

  • 私钥:secret key,private key 自己留存,必须保证其私密性,用于自已加密签名

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

功能:

  • 数据加密:适合加密较小数据,比如: 加密对称密钥

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

缺点:

  • 密钥长,算法复杂

  • 加密解密效率低下

常见算法:

  • RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变 的,可实现加密和数字签名

  • DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准)

  • ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学,比RSA加密算法使用更小的密钥, 提供相当的或更高等级的安全

非对称加密实现加密

数据传输过程

顺序 角色 过程
1 接收者 生成公钥/密钥对:P和S,公开公钥P,保密密钥S
2 发送者 使用接收者的公钥来加密消息M,将P(M)发送给接收者
3 接收者 使用密钥S来解密:M=S(P(M))

非对称加密实现数字签名

数据传输过程

顺序 角色 过程
1 发送者 生成公钥/密钥对:P和S,公开公钥P,保密密钥S,使用密钥S来加密消息M,发 送给接收者S(M)
2 接收者 使用发送者的公钥来解密M=P(S(M))s

单向哈希算法

哈希算法:也称为散列算法,将任意数据缩小成固定大小的 "指纹",称为digest,即摘要

特性:

  • 任意长度输入,固定长度输出。

  • 若修改数据,指纹也会改变,且有雪崩效应,数据的一点微小改变,生成的指纹值变化非常大。

  • 无法从指纹中重新生成数据,即不可逆,具有单向性。

功能:数据完整性

常见算法:

算法不一样,得到的摘要长度也不一样

md5: (128bits),sha1: (160bits),sha224,sha256,sha384,sha512

综合应用多种加密算法

实现数据加密

实现数据加密,无法验证数据完整性和来源

Key(data)+Pb(key)

实现数字签名

不加密数据,可以保证数据来源的可靠性、数据的完整性和一致性

data+Sa(hash(data))

综合加密和签名

即实现数据加密,又可以保证数据来源的可靠性、数据的完整性和一致性

方法1:Bpk{Ask[hash(data)]+data}

方法2:对称key{Ask[hash(data)]+data}+Bpk(对称key)

密码交换

密钥交换:IKE( Internet Key Exchange )

  • 公钥加密:用目标的公钥加密对称密钥

  • DH (Deffie-Hellman):生成对称(会话)密钥

DH 介绍

  • 这个密钥交换方法,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)在1976年发表

  • 它是一种安全协议,让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密 钥,这个密钥一般作为"对称加密"的密钥而被双方在后续数据传输中使用。

  • DH数学原理是base离散对数问题。做类似事情的还有非对称加密类算法,如:RSA。

  • 其应用非常广泛,在SSH、VPN、Https...都有应用,勘称现代密码基石

DH 特点

泄密风险:私密数据a,b在生成K后将被丢弃,因此不存在a,b过长时间存在导致增加泄密风险。

中间人攻击:由于DH在传输p,g时并无身份验证,所以有机会被实施中间人攻击,替换双方传输时的 数据

CA和证书

中间人攻击

Man-in-the-middle,简称为 MITM,中间人

CA和证书

证书类型

  • 证书授权机构的证书

  • 服务器证书

  • 用户证书

获取证书两种方法

自签名的证书: 自已签发自己的公钥

使用证书授权机构:1 生成证书请求 csr;2 将证书请求csr 发送给CA;3 CA 颁发签名证书

安全协议 SSL/TLS

发展历史

SSL:Secure Socket Layer,TLS: Transport Layer Security

1994年,NetScape 公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布

1995:SSL 2.0 Netscape 开发

1996:SSL 3.0

1999:TLS 1.0

2006:TLS 1.1 IETF(Internet工程任务组) RFC 4346,从2020年3月起,停止支持TLS 1.1及TLS 1.0版本 安全协议,谷歌(Chrome)Mozilla(Firefox)、微软(IE和Edge) 、苹果(Safari) 都会发布新版浏 览器执行这个策略

2008:TLS 1.2 当前主要使用

2018:TLS 1.3

主要功能

  • 机密性

  • 认证

  • 完整性

  • 重放保护

HTTPS

HTTPS 协议:就是"HTTP 协议"和"SSL/TLS 协议"的组合。HTTP over SSL 或 HTTP over TLS ,对http协 议的文本数据进行加密处理后,成为二进制形式传输

HTTPS 工作的简化过程

  1. 客户端发起HTTPS请求

    用户在浏览器里输入一个https网址,然后连接到服务器的443端口。

  2. 服务端的配置

    采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是 自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹 出提示页面。这套证书其实就是一对公钥和私钥。

  3. 传送服务器的证书给客户端

    证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等。

  4. 客户端解析验证服务器证书

    这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间 等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成 一个随机值。然后用证书中公钥对该随机值进行非对称加密。

  5. 客户端将加密信息传送服务器

    这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务 端的通信就可以通过这个随机值来进行加密解密了。

  6. 服务端解密信息

    服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值。这个 随机值,就是对称加密的密钥,至此,完成了对称加密密钥的协商。

  7. 服务器加密信息并发送信息

    服务器将数据利用随机值进行对称加密,再发送给客户端。

  8. 客户端接收并解密信息

    客户端用之前生成的随机值解密服务端传过来的数据,于是获取了解密后的内容。

https再简化

客户端发起请求

服务端传送证书

客户端验证证书,没有问题,生成一个随机字符串,用服务端的公钥加密此随机串,再传级服务端

服务端用私钥解密,得到随机串,再用此串加密数据传给客户端

客户端解密得到数据

OpenSSL

Openssl功能主要包括对称加密(DES、3DES、AES等),非对称加密(RSA),散列(MD5、SHA1 等)以及证书的相关操作(创建、申请、颁发、吊销等)。

包括三个组件:

  • libcrypto:用于实现加密和解密的库

  • libssl:用于实现ssl通信协议的安全库

  • openssl:多用途命令行工具

Base64 编码

Base64是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64就是一种基于64个可打印字符 来表示二进制数据的方法

将每3个字节放入一个24位的缓冲区中,最后不足3个字节的,缓冲区的剩余部分用0来填补。然后每次 取出6位(2的6次方为64,使用64个字符即可表示所有),将高2位用0来填充,组成一个新的字节,计 算出这个新字节的十进制值,对应上面的编码表,输出相应的字符。这样不断地进行下去,就可完成对 所有数据的编码工作。

按照以上规则对文本Man编码如下:

bash 复制代码
[root@ubuntu ~]# echo Man | base64
TWFuCg==

Cg== 是怎么来的 ?

echo Man 实际上 Man 后面跟了一个换行符

换行符在 ascii 中对应的10进制数刚好是10,10换成8位二进制是 00001010,但 base64 以6位二进制 来定义一个字符

所以 00001010 会被分为 000010 10,两部份,

第一部份从低位开始算,对应10进制就是 2,则 base64 中就是 C

第二部份会被算成高位,后面补4个0,就变成 100000,对应10进制是32,则base64中就是g,由于后面补了4 个0,所以再标记两个==(不足六位补零,每两个零用一个=号标记)

openssl 命令

openssl 有两种运行方式,分别是 交互模式 和 批处理模式,在新版中己经去掉了交互模式

openssl将子命令分为三类

子命令类型 En 备注
标准命令 Standard commands
消息摘要命令 Message Digest commands 配合不同算法
加密命令 Cipher commands 配合不同算法
bash 复制代码
openssl command [ command_opts ] [ command_args ]

openssl list [ standard-commands | digest-commands | cipher-commands | cipheralgorithms | digest-algorithms | public-key-algorithms]

openssl no-XXX [ arbitrary options ]

#分类列出所有命令与算法
#列出所有标准命令
[root@ubuntu ~]# openssl list --commands
......
......
#列出所有摘要命令
[root@ubuntu ~]# openssl list -digest-commands
......
......
#列出所有摘要算法
[root@ubuntu ~]# openssl list -digest-algorithms 
......
......
#列出所有加密命令
[root@ubuntu ~]# openssl list -cipher-commands
......
......
#列出所有加密算法
[root@ubuntu ~]# openssl list -cipher-algorithms 
......
......
openssl 单向哈希加密

查看所有摘要命令和摘要算法:

bash 复制代码
[root@ubuntu ~]# openssl list -digest-commands
blake2b512       blake2s256       md5               sha1
sha224           sha256           sha3-224         sha3-256          
sha3-384         sha3-512         sha384           sha512            
sha512-224       sha512-256       shake128         shake256          
sm3

[root@ubuntu ~]# openssl list -digest-algorithms
Legacy:
 RSA-MD4 => MD4
 RSA-MD5 => MD5
 RSA-RIPEMD160 => RIPEMD160
 RSA-SHA1 => SHA1
 
 #摘要命令两种格式
 openssl digest-commands [options] [file...]
 openssl dgst -commands [options] [file...]
openssl passwd 生成用户密码
bash 复制代码
openssl passwd [options...] STRING
#常用选项
-help 				#获取帮助信息
-in infile         	#从文件读取要加密的内容
-noverify           #从标准输入接收密码时,不用输两次
-quiet             	#不输出告警信息
-table             	#以表格形式输出
-salt val           #手动指定盐值,默认每次自动随机生成
-stdin             	#从标准输入接收要加密的内容
-6                 	#使用SHA512 算法加密
-5                 	#使用SHA256 算法加密
-apr1               #使用 apache 特有的MD5 算法加密
-1                 	#使用MD5 加密算法
-aixmd5           	#使用AIX MD5 加密算法
-rand val           #将文件加到随机数生成器
-writerand outfile 	#将此过程中产生的随机数写到指定文件
-crypt             	#标准unix密码加密算法,旧版中默认项

#示例
#默认 md5
[root@ubuntu ~]# openssl passwd 123456
$1$adSDXWzj$suPyLHtqSypYr.qRcF1pD/

#交互式
[root@ubuntu ~]# openssl passwd
Password: 
Verifying - Password: 
$1$RGQk8rTH$bqyCahWAPOFmwuCT07Mi0/

[root@ubuntu ~]# openssl passwd -1 123456
$1$aZrTZA69$RU2qV735HhypCR62OFdgF/

#SHA512
[root@ubuntu ~]# openssl passwd -6 123456
$6$4TenFlrlaeY668qi$AvHZSwfMXH1q87bnO5bzzfNRRmZNVot9nQN1bfNFCW0ul6HSJCyZrG4ZS2kaYwXkG2ZxOnNqyEmDEKvgZq.kI/

#从标准输入读取
[root@ubuntu ~]# echo 123456 | openssl passwd -stdin
$1$2b626GRH$mY5SAZYhOMadVjJyY52.n.

#指定盐值
[root@ubuntu ~]# openssl passwd -1 -salt abcd1234 123456
$1$abcd1234$flW8OGJjRMMEgtyb4lbLN0
[root@ubuntu ~]# openssl passwd -1 -salt abcd1234 123456
$1$abcd1234$flW8OGJjRMMEgtyb4lbLN0
openssl 生成随机数

随机数生成器:伪随机数字,利用键盘和鼠标,块设备中断生成随机数

bash 复制代码
/dev/random #仅从熵池返回随机数;随机数用尽,阻塞

/dev/urandom #从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
bash 复制代码
openssl rand [options...] NUMNUM #字符个数 
-help 				#获取帮助信息
-out outfile       	#输出到指定文件
-rand val           #将文件加到随机数生成器
-writerand outfile 	#将此过程中产生的随机数写到指定文件
-base64             #base64编码后显示
-hex               	#16进制显示
-engine val         #指定随机数发生设备

#生成随机10位长度密码
[root@ubuntu ~]# openssl rand -base64 10 | head -c10
NYtiSIFhI5
[root@ubuntu ~]# tr -dc '[:alnum:]' < /dev/urandom |head -c10
x9NknwOILD
openssl 实现密钥对

生成私钥,再从私钥中提取公钥

bash 复制代码
#私钥文件
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
#公钥文件
-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----
#RSA公钥文件
-----BEGIN RSA PUBLIC KEY-----
-----END RSA PUBLIC KEY-----
bash 复制代码
#生成私钥,私钥包含公钥信息
openssl genrsa [options...] [NUM]
#常用选项
NUM 					#指定密钥长度,单位bit,默认2048
-help               	#获取帮助信息
-out outfile       		#输出到指定文件
-rand val           	#以文件作随机数种子
-writerand outfile 		#将此过程中产生的随机数写到指定文件
-passout val       		#输出文件的保护口令
-*   					#加密算法

#从私钥提取公钥
openssl rsa [options...]
#常用选项
-help     				#获取帮助信息       
  
-inform format     		#显示指定输入文件格式DEM|PEM,默认PEM
-outform format   		#指定输出文件模式DER|PEM,默认PEM
-in val           		#指定输入的文件,通常是私钥
-out outfile       		#指定要输出的文件,不指定就是标准输出
-pubin             		#从输入文件中读取公钥值,默认是读取私钥值
-pubout           		#指定导出公钥,默认输出私钥
-passout val       		#输出文件的保护口令
-passin val       		#输入文件的保护口令
-RSAPublicKey_in   		#输入文件格式为RSAPublicKey
-RSAPublicKey_out 		#输出文件格式为RSAPublicKey
-noout             		#不输出任何内容
-text             		#输出所有信息
-modulus           		#输出公钥信息
-check             		#检查公钥是否匹配
-*                 		#指定私钥的保护加密算法

#加密算法
aes128|aes192|aes256|aria128|aria192|aria256|camellia128|camellia192|camellia256|des|des3|idea

示例

bash 复制代码
#生成私钥
[root@ubuntu ~]# openssl genrsa -out test.key
#从指定私钥提取出公钥
[root@ubuntu ~]# openssl rsa -in test.key -pubout -out test.pubkey
writing RSA key
[root@ubuntu ~]# ls -al test*
-rw------- 1 root root 1704 May 21 16:03 test.key
-rw-r--r-- 1 root root  451 May 21 16:07 test.pubkey

#生成私钥时加密
#指定加密算法,指定口令
[root@ubuntu ~]# openssl genrsa -out test2.key -des3 -passout pass:"123456"
#解密加密的私钥
[root@ubuntu ~]# openssl rsa -in test2.key -out test2.key2
Enter pass phrase for test2.key:
writing RSA key

#提取公钥要求输入密码
[root@ubuntu ~]# openssl rsa -in test2.key -pubout -out test2.pubkey
Enter pass phrase for test2.key:
writing RSA key

[root@ubuntu ~]# ll test2*
-rw------- 1 root root 1854 May 21 16:09 test2.key
-rw------- 1 root root 1704 May 21 16:09 test2.key2
-rw-r--r-- 1 root root  451 May 21 16:12 test2.pubkey

#密钥文件要保证权限,在CentOS8及以后,己经是600权限了,为了保证其它版本CentOS中的权限问题
[root@rocky86 ~]# (umask 666;openssl genrsa -out test.key)

建立私有CA实现证书申请颁发

建立私有CA:

  • OpenCA:OpenCA开源组织使用Perl对OpenSSL进行二次开发而成的一套完善的PKI免费软件

  • openssl:相关包 openssl和openssl-libs

证书申请及签署步骤:

  1. 生成证书申请请求

  2. RA核验

  3. CA签署

  4. 获取证书

前置操作

bash 复制代码
#Rock
#安装包
[root@rocky86 ~]# yum install openssl-libs 
#查看配置文件
[root@rocky86 ~]# cat /etc/pki/tls/openssl.cnf

#ubuntu
#安装包
[root@ubuntu ~]# apt install libssl-dev
#查看配置文件
[root@ubuntu ~]# cat /etc/ssl/openssl.cnf

配置文件部分内容说明

bash 复制代码
[ CA_default ]
dir = ./demoCA 				#所有与证书相关的文件目录,在实际使用时此处要进行修改
certs = $dir/certs 			#颁发的证书文件目录
crl_dir = $dir/crl 			#吊销的证书文件
database = $dir/index.txt 	#证书索引文件
new_certs_dir = $dir/newcerts 	#新颁发的证书目录
certificate = $dir/cacert.pem 	#CA机构自己的证书
serial = $dir/serial 		#证书编号文件,下一个证书编号,16进制
crlnumber = $dir/crlnumber 	#存放当前CRL编号的文件
crl = $dir/crl.pem 			#CA证书吊销列表文件
private_key = $dir/private/cakey.pem 	#CA证书的私钥

[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

匹配策略,指用此CA颁发证书时,证书的相关字段与CA的值的匹配规则

匹配规则 说明
match 要求申请填写的信息跟CA设置信息必须一致
optional 可有可无,跟CA设置信息可不一致
supplied 必须填写这项申请信息
创建私有CA

1.创建CA所需要的文件

bash 复制代码
#创建相关目录
[root@ubuntu ~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private}
[root@ubuntu ~]# tree /etc/pki/CA/
/etc/pki/CA/
├── certs			# (d) 存放发布的证书
├── crl				# (d) 证书的吊销列表
├── newcerts		# (d)颁发的新证书备份到这里
└── private			# (d)自己的私钥
4 directories, 0 files	#全都是文件夹

2.生成CA私钥

bash 复制代码
[root@ubuntu ~]# cd /etc/pki/CA/
[root@ubuntu CA]# openssl genrsa -out private/cakey.pem 2048

3.生成CA自签名证书

bash 复制代码
[root@ubuntu 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) [AU]:CN 								#国家代码
State or Province Name (full name) [Some-State]:beijing 			#省/州
Locality Name (eg, city) []:beijing 								#城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:taodu 	#公司/单位
Organizational Unit Name (eg, section) []:a3						#部门
Common Name (e.g. server FQDN or YOUR name) []:www.taodu.com 		#域名
Email Address []: 													#邮箱

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

#查看证书
[root@ubuntu CA]# cat /etc/pki/CA/cacert.pem
-----BEGIN CERTIFICATE-----
MIIDrTCCApWgAwIBAgIUBGE0kQVXCFUwNyO4Fhh9CzXd6lUwDQYJKoZIhvcNAQEL
BQAwZjELMAkGA1UEBhMCQ04xEDAOBgNVBAgMB2JlaWppbmcxEDAOBgNVBAcMB2Jl
aWppbmcxDjAMBgNVBAoMBXRhb2R1MQswCQYDVQQLDAJhMzEWMBQGA1UEAwwNd3d3
LnRhb2R1LmNvbTAeFw0yNDA5MDUwMTQ0NDBaFw0zNDA5MDMwMTQ0NDBaMGYxCzAJ
BgNVBAYTAkNOMRAwDgYDVQQIDAdiZWlqaW5nMRAwDgYDVQQHDAdiZWlqaW5nMQ4w
DAYDVQQKDAV0YW9kdTELMAkGA1UECwwCYTMxFjAUBgNVBAMMDXd3dy50YW9kdS5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgWgtvJEIKV7UmYlVo
/VvS9Lfyt8lJ5uohhBJadmLVr8rsHhD0xXIFfUrXoMe94NDVaRbu5OHCPEY67g79
syGIO+s7fNE47B4F4iwkJW/tTWh4nyNYc3t3YW/nLFHx/JKPbX92uPnA5f2Uy3JU
iyyAblogT8SmE0RrUkJY8dbuqYq5o4WYSMTROVc+WPWk8g2s/9QmLyrtojvPq5uq
Mv5Lc/LTSc1sSlI8+//5ik//83iCwPrKsNmMsAYG/wneq6JsocnXOt7gkohpDvBj
dy+bIvdiAZag4ENWDV83zJzQEeIqciZKDbVm2IMG7kI1Gc2IsKfiPIcaRdkJ06H3
43ZJAgMBAAGjUzBRMB0GA1UdDgQWBBQwHQ6pfocBTMx7mAZn/zDlUzCjrTAfBgNV
HSMEGDAWgBQwHQ6pfocBTMx7mAZn/zDlUzCjrTAPBgNVHRMBAf8EBTADAQH/MA0G
CSqGSIb3DQEBCwUAA4IBAQB682rN6JVU6o7iEwN+rYoelVllWmniWqktnxIVxxPv
/sCNElx2n3t7uE26Ri0wv34EBdrfxXwhS78eVZ9mNS0chm3SE92jebAGqVEJut6u
LWUgV743GejWbMpCWGuc9Tef/1NouZ23pomOT9dpKowG8PoniGYT66xG/z8WFb2z
No0OTV1yzR9GDZ4wiAGPTPk5n+mgBWRbp5XWhD0hn/QfYAZt6rIGiBf6F6kfysUE
iOW7P91zvXsFobNl7Tt2Wmc+kHd76GIR2wsC5aWY81uzXjiqA1gY0APdnRBPPgFp
iatdKrJd5xyyX0X1vhjnc5rpyWFm1vQ28BW7zAZgEHwc
-----END CERTIFICATE-----

#查看证书
[root@ubuntu CA]# openssl x509 -in /etc/pki/CA/cacert.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            04:61:34:91:05:57:08:55:30:37:23:b8:16:18:7d:0b:35:dd:ea:55
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = beijing, L = beijing, O = taodu, OU = a3, CN = www.taodu.com
        Validity
            Not Before: Sep  5 01:44:40 2024 GMT
            Not After : Sep  3 01:44:40 2034 GMT
        Subject: C = CN, ST = beijing, L = beijing, O = taodu, OU = a3, CN = www.taodu.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:a0:5a:0b:6f:24:42:0a:57:b5:26:62:55:68:fd:
                    5b:d2:f4:b7:f2:b7:c9:49:e6:ea:21:84:12:5a:76:
                    62:d5:af:ca:ec:1e:10:f4:c5:72:05:7d:4a:d7:a0:
                    c7:bd:e0:d0:d5:69:16:ee:e4:e1:c2:3c:46:3a:ee:
                    0e:fd:b3:21:88:3b:eb:3b:7c:d1:38:ec:1e:05:e2:
                    2c:24:25:6f:ed:4d:68:78:9f:23:58:73:7b:77:61:
                    6f:e7:2c:51:f1:fc:92:8f:6d:7f:76:b8:f9:c0:e5:
                    fd:94:cb:72:54:8b:2c:80:6e:5a:20:4f:c4:a6:13:
                    44:6b:52:42:58:f1:d6:ee:a9:8a:b9:a3:85:98:48:
                    c4:d1:39:57:3e:58:f5:a4:f2:0d:ac:ff:d4:26:2f:
                    2a:ed:a2:3b:cf:ab:9b:aa:32:fe:4b:73:f2:d3:49:
                    cd:6c:4a:52:3c:fb:ff:f9:8a:4f:ff:f3:78:82:c0:
                    fa:ca:b0:d9:8c:b0:06:06:ff:09:de:ab:a2:6c:a1:
                    c9:d7:3a:de:e0:92:88:69:0e:f0:63:77:2f:9b:22:
                    f7:62:01:96:a0:e0:43:56:0d:5f:37:cc:9c:d0:11:
                    e2:2a:72:26:4a:0d:b5:66:d8:83:06:ee:42:35:19:
                    cd:88:b0:a7:e2:3c:87:1a:45:d9:09:d3:a1:f7:e3:
                    76:49
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                30:1D:0E:A9:7E:87:01:4C:CC:7B:98:06:67:FF:30:E5:53:30:A3:AD
            X509v3 Authority Key Identifier:
                30:1D:0E:A9:7E:87:01:4C:CC:7B:98:06:67:FF:30:E5:53:30:A3:AD
            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        7a:f3:6a:cd:e8:95:54:ea:8e:e2:13:03:7e:ad:8a:1e:95:59:
        65:5a:69:e2:5a:a9:2d:9f:12:15:c7:13:ef:fe:c0:8d:12:5c:
        76:9f:7b:7b:b8:4d:ba:46:2d:30:bf:7e:04:05:da:df:c5:7c:
        21:4b:bf:1e:55:9f:66:35:2d:1c:86:6d:d2:13:dd:a3:79:b0:
        06:a9:51:09:ba:de:ae:2d:65:20:57:be:37:19:e8:d6:6c:ca:
        42:58:6b:9c:f5:37:9f:ff:53:68:b9:9d:b7:a6:89:8e:4f:d7:
        69:2a:8c:06:f0:fa:27:88:66:13:eb:ac:46:ff:3f:16:15:bd:
        b3:36:8d:0e:4d:5d:72:cd:1f:46:0d:9e:30:88:01:8f:4c:f9:
        39:9f:e9:a0:05:64:5b:a7:95:d6:84:3d:21:9f:f4:1f:60:06:
        6d:ea:b2:06:88:17:fa:17:a9:1f:ca:c5:04:88:e5:bb:3f:dd:
        73:bd:7b:05:a1:b3:65:ed:3b:76:5a:67:3e:90:77:7b:e8:62:
        11:db:0b:02:e5:a5:98:f3:5b:b3:5e:38:aa:03:58:18:d0:03:
        dd:9d:10:4f:3e:01:69:89:ab:5d:2a:b2:5d:e7:1c:b2:5f:45:
        f5:be:18:e7:73:9a:e9:c9:61:66:d6:f4:36:f0:15:bb:cc:06:
        60:10:7c:1c

#导到WINDOWS中查看
[root@ubuntu CA]# sz /etc/pki/CA/cacert.pem
申请证书并颁发证书

1.为需要使用证书的主机生成生成私钥

bash 复制代码
[root@ubuntu24 ~]# openssl genrsa -out /root/test.key 2048

2.为需要使用证书的主机生成证书申请文件

bash 复制代码
#注意:默认要求国家,省,公司名称三项必须和CA一致
[root@ubuntu24 ~]# openssl req -new -key /root/test.key -out /root/test.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) [AU]:CN
State or Province Name (full name) [Some-State]:beijing
Locality Name (eg, city) []:beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:taodu
Organizational Unit Name (eg, section) []:a3
Common Name (e.g. server FQDN or YOUR name) []:www.taodu.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

3.用CA签署证书并将证书颁发给请求者

bash 复制代码
#创建索引文件
[root@ubuntu CA]# touch /etc/pki/CA/index.txt
#创建序号文件
[root@ubuntu CA]# echo 0F > /etc/pki/CA/serial
#签发证书
[root@ubuntu24 ssl]# openssl ca -in /root/test.csr -out /etc/pki/CA/certs/test.crt -days 100
Using configuration from /usr/lib/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 15 (0xf)
        Validity
            Not Before: Sep  5 02:05:05 2024 GMT
            Not After : Dec 14 02:05:05 2024 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = beijing
            organizationName          = taodu
            organizationalUnitName    = a3
            commonName                = www.taodu.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Subject Key Identifier:
                30:E9:20:E7:E7:43:8C:70:30:AB:23:6E:F2:7F:04:44:E8:C2:C5:B6
            X509v3 Authority Key Identifier:
                30:1D:0E:A9:7E:87:01:4C:CC:7B:98:06:67:FF:30:E5:53:30:A3:AD
Certificate is to be certified until Dec 14 02:05:05 2024 GMT (100 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
Database updated
#V 表示有效,241214 表示2024年12月14日过期,0F 表示证书编号
[root@ubuntu24 ssl]# cat /etc/pki/CA/index.txt
V	241214020505Z		0F	unknown	/C=CN/ST=beijing/O=taodu/OU=a3/CN=www.taodu.com

#原来是0F,加1后变成10
[root@ubuntu24 CA]# cat /etc/pki/CA/serial
10

4.查看证书中的信息

bash 复制代码
#根据编号查看状态
[root@ubuntu24 ~]# openssl ca -status 0F
Using configuration from /usr/lib/ssl/openssl.cnf
0F=Valid (V)

[root@ubuntu24 ~]# openssl x509 -in /etc/pki/CA/certs/test.crt -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 15 (0xf)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = beijing, L = beijing, O = taodu, OU = a3, CN = www.taodu.com
        Validity
            Not Before: Sep  5 02:05:05 2024 GMT
            Not After : Dec 14 02:05:05 2024 GMT
        Subject: C = CN, ST = beijing, O = taodu, OU = a3, CN = www.taodu.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
....

如果证书申请文件中的配置项与CA机构的匹配规则不一致,将无法签发证书

吊销证书

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

bash 复制代码
#在客户端获取要吊销的证书的 serial
[root@ubuntu24 ~]# openssl x509 -in /etc/pki/CA/certs/test.crt -noout -serial -subject
serial=0F
subject=C = CN, ST = beijing, O = taodu, OU = a3, CN = www.taodu.com

#在CA上,根据客户提交的 serial 与 subject 信息,对比检验是否与 index.txt 文件中的信息一致,吊销证书:
[root@ubuntu24 ~]# openssl ca -revoke /etc/pki/CA/certs/test.crt
Using configuration from /usr/lib/ssl/openssl.cnf
Revoking Certificate 0F.
Database updated

[root@ubuntu24 ~]# cat /etc/pki/CA/index.txt
R	241214020505Z	240905022450Z	0F	unknown	/C=CN/ST=beijing/O=taodu/OU=a3/CN=www.taodu.com

#指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
[root@ubuntu24 ~]# echo 01 > /etc/pki/CA/crlnumber

#更新证书吊销列表
[root@ubuntu24 ~]# openssl ca -gencrl -out /etc/pki/CA/crl.pem
Using configuration from /usr/lib/ssl/openssl.cnf

#查看crl文件:
[root@ubuntu24 ~]# openssl crl -in /etc/pki/CA/crl.pem -noout -text
Certificate Revocation List (CRL):
        Version 2 (0x1)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = CN, ST = beijing, L = beijing, O = taodu, OU = a3, CN = www.taodu.com
        Last Update: Sep  5 02:27:26 2024 GMT
        Next Update: Oct  5 02:27:26 2024 GMT
        CRL extensions:
            X509v3 CRL Number:
                1
Revoked Certificates:
    Serial Number: 0F
        Revocation Date: Sep  5 02:24:50 2024 GMT
    Signature Algorithm: sha256WithRSAEncryption
....

ssh服务

ssh服务介绍

SSH:Secure Shell Protocol ,安全的shell协议

SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程 管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。

SSH服务默认使用TCP的22端口

具体的软件实现

OpenSSH:ssh协议的开源实现,CentOS 默认安装

dropbear:另一个ssh协议的开源项目的实现

SSH 协议版本

v1:基于CRC-32做MAC,不安全;man-in-middle

v2:双方主机协议选择安全的MAC方式,基于DH算法做密钥交换,基于RSA或DSA实现身份认证

公钥交换原理

  1. 客户端发起链接请求

  2. 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)

  3. 客户端生成密钥对 ----- 没有实体文件

  4. 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密

  5. 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res

  6. 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)

  7. 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

ssh加密通讯原理

openssh 服务

OpenSSH是SSH (Secure SHell) 协议的免费开源实现,一般在各种Linux版本中会默认安装,基于 C/S 结构

(Windows 中安装了 openssh 的客户端,没有安装服务端)

客户端ssh命令

ssh命令是ssh客户端,允许实现对远程系统经验证地加密安全访问

当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub文件中的公钥到客户机的 ~/.ssh/know_hosts中。下次连接时,会自动匹配相对应的私钥,不能匹配,将拒绝连接。

首次连接

bash 复制代码
#首次连接,会显示目标主机的指纹信息,并提示是否继续
#敲yes后会将目标主机的公钥保存在当前用户的~/.ssh/know_hosts 文件中
root@ubuntu24:~# ssh root@10.0.0.206
The authenticity of host '10.0.0.206 (10.0.0.206)' can't be established.
ED25519 key fingerprint is SHA256:+CC49Sra7GzLnNYn4QqcT0QyDEwS+osEpcbQ5e1zCc8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.0.206' (ED25519) to the list of known hosts.
root@10.0.0.206's password:

#在客户端机器上可以看到远端主机的公钥
root@ubuntu24:~# ls -l .ssh/
total 8
-rw------- 1 root root 978 May 23 02:08 known_hosts
-rw-r--r-- 1 root root 142 May 23 02:08 known_hosts.old

#该文件中保存的内容,在远程主机上都能找到对应的
[root@ubuntu24 .ssh]# cat known_hosts
|1|LMtIwY75orqcK96IjX4z3gbFs5k=|nrfydRhzeYpdHNSO2UDcalTzpUg= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGDgBdhgZ0hZhuA342MwuAgI3s2Rhaqo3cF3degisq2i
|1|iXvflk7k2kPJz5dsnGk4S3U5q1Y=|+li3LoBEnAgFbWg+ZptpbFKPZg8= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDD0hf5w17ZjGKQ0zsD9n3Xaiu4hMDYtKF+usucHkZWRDM7en8UIKrj2iwcrQT9pv9kvhAW0uxwxlascpqzRKRyCAksrQJnQ2wyxxmSh/5vYgxaXtURim9EG1BOxiCCSF38Q0Dp35XECaKsn7XYy8vgAjvNaKiH9aZrWbif4yM9XLtT+FSFI0meD/5ykLg+vU1731xt96TmqHgZMY0zme2c95rcySdljBCVFILam1BkeUZhsRKJmwQyRZdolQ8XdzBU0uaVviZn5jnNcuO+bC1D7mBCHD03J2tsocvFgQ2ohAmQ0O1fheUbuGPXHMX1iHzK63HeJ4xCz9RUf4BXOFEwk4bDUB1MubND9lqfLkR0+KhgxQxqmCfaZ3PGZ+g4VVyjnTmfNPFkkzqrGfZgu9DTVS+9y9ocfBBqvf2i7IbL+BtwPsOGlEs1aauKQCDdeT9gYOoMZqviH+Rq+6kkG8UQMy4VSYJyyM7MGhAAAx/H2GDoSo5Aho8DMmkko7M/2JE=
|1|XSmEhhrrxKmAoarB909leCRbtPQ=|hOVVygClYBd9GeF5iLgtjD5vrKQ= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOTo4CxtAXCkchPlSFXpwcse/Zt3znLgwmQDe6C1H+rbeESZPWzXVBMlPYp51MMi4MUaeevH6wrssluJWCloqqA=


[root@ubuntu24 .ssh]# ls -l /etc/ssh/*pub
-rw-r--r-- 1 root root 175 Aug 15 09:57 /etc/ssh/ssh_host_ecdsa_key.pub
-rw-r--r-- 1 root root  95 Aug 15 09:57 /etc/ssh/ssh_host_ed25519_key.pub
-rw-r--r-- 1 root root 567 Aug 15 09:57 /etc/ssh/ssh_host_rsa_key.pub

#首次连接时并不能确定远端主机的真伪,但是下载公钥之前可以查看远端的指纹信息
#在连接前,可以先自己连自己,查看一下指纹
[root@ubuntu24 .ssh]# ssh 127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:5NQ5jgbU/yc4lIfGxy8Q1DRHrhfPIdHGuXFjzjCZF+U.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?


#首次连接之后,如果保存了远程主机的公钥,后续远程主机发生了改变,则会提示
#如果远程主机确实发生了改变,则可以删除本地~.ssh/know_host中的对应的公钥
#不然会触发中间人警告
bash 复制代码
ssh [options...] destination [command]
#常用选项
-p PORT 		#指定远程服务器的端口,默认22
-b IP 			#指定本地主机此次连接使用的IP
-v 				#调试模式,可以追踪此次连接的过程
-C 				#开启压缩
-F configfile 	#指定客户端配置文件
-t 				#强制伪终端分配,可用于在远程系统上执行任意基于屏幕的程序
-o option 		#以K=V格式指定选项
-i <file> 		#指定私钥文件路径,实现基于key验证

示例

bash 复制代码
#首次连接会下载远程主机公钥
#如果不指定用户名,默认使用当前用户去登录远程主机

#先连接到206,再从206连接210
[root@rocky ~]# ssh -t 10.0.0.206 ssh -t 10.0.0.210
root@10.0.0.206's password: 
root@10.0.0.210's password:

#在210主机上查看,有个206的远程连接
root@ubuntu2204:~# ss -tn
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 52 10.0.0.210:22 10.0.0.1:55845
ESTAB 0 0 10.0.0.210:22 10.0.0.206:38826

#断开,先断开210,再断开206
root@ubuntu2204:~# exit
logout
Connection to 10.0.0.210 closed.
Connection to 10.0.0.206 closed.
[root@rocky ~]#

#在远程主机执行完命令后就断开
[root@ubuntu ~]# ssh 10.0.0.210 "ip a s ens33"
root@10.0.0.210's password:

#在远程主机运行本地脚本
#在本机执行
[root@ubuntu ~]# ./test.sh 
10.0.0.206 192.168.10.100

#ssh 连到 210上执行
[root@ubuntu ~]# ssh 10.0.0.210 /bin/bash < test.sh
root@10.0.0.210's password: 
10.0.0.210 10.0.0.220

#首次连接需要手动回答yes
#加选项,不询问,自动下载公钥
[root@ubuntu ~]# ssh -o StrictHostKeyChecking=no 10.0.0.210
#修改客户端配置,首次连接自动回答为yes
vim /etc/ssh/ssh_config
#   StrictHostKeyChecking ask
   StrictHostKeyChecking no

客户端scp命令

scp 命令利用ssh协议在两台主机之间复制文件

bash 复制代码
scp [options] SRC... DEST/
#常用选项
-C #压缩数据流
-r #递归复制
-p #保持原文件的属性信息
-q #静默模式
-P PORT #指定远程服务器的端口,默认22

#示例
#将本地文件复制到远程
#将当前主机/root/test.sh 复制到远程主机 mage 的家目录下
[root@ubuntu ~]# scp /root/test.sh mage@10.0.0.210:
mage@10.0.0.210's password: 
test.sh 100%   25     2.6KB/s   00:00 
#远程主机上查看
root@ubuntu2204:~# ls -l /home/mage/
total 4
-rwxr-xr-x 1 mage mage 25 May 23 07:17 test.sh

#将远程主机文件复制到本地
[root@rocky86 ~]# scp root@10.0.0.157:/home/jose/test.sh .
root@10.0.0.157's password: 
test.sh                                                 100%   25    10.0KB/s   00:00

#源和目标都不是本机
[root@rocky86 ~]# scp jose@10.0.0.157:test.sh root@10.0.0.154:
jose@10.0.0.157's password: 
root@10.0.0.154's password: 
test.sh                                                 100%   25    12.9KB/s   
00:00    
Connection to 10.0.0.157 closed

#复制目录
[root@ubuntu ~]# scp -r /var/log/ root@10.0.0.161:/tmp/
root@10.0.0.161's password: 
syslog 100% 1575KB  15.4MB/s   00:00    
sysinfo.log 100%    0     0.0KB/s   00:00    
kern.log.2.gz 100% 281KB  45.9MB/s   00:00  
.....

scp -r dir dest/ #复制整个目录
scp -r dir/dest/ #复制整个目录
scp -r dir/* dest/ #复制目录下所有文件

rsync命令

scp 命令在复制文件时是全量复制,不管文件有没有改动,都是复制,速度慢,消耗资源

rsync工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传 输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包

注意:通信两端主机都需要安装 rsync 软件

bash 复制代码
rsync [OPTION]... SRC [SRC]... DEST
#常用选项
-n|--dry-run #只测试,不执行
-v|--verbose #显示详细过程
-r|--recursive #递归复制
-p|--perms #保留权限属性
-t|--times #保留修改时间戳
-g|--group #保留组信息
-o|--owner #保留所有者信息
-l|--links #将软链接文件本身进行复制(默认)
-L|--copy-links #将软链接文件指向的文件复制
-u|--update #如果接收者的文件比发送者的文件较新,将忽略同步
-z|--compress #压缩,节约网络带宽
-a|--archive #保留所有属性,但不包括acl和selinux
--delete #如果源数据中的文件被删除,则目标中的对应文件也要被删除,配合-r使用
--progress #显示进度
--bwlimit=5120 #限速以KB为单位,5120表示5MB


rsync -av dir dest/ #复制整个目录
rsync -av dir/dest/ #复制目录下所有文件,这一项跟scp不同
rsync -av dir/* dest/ #复制目录下所有文件


#rsync命令可以增量复制而scp只能全量复制
#增量复制
[root@ubuntu ~]# cp /var/log/syslog ./0525
[root@ubuntu ~]# ls -l ./0525
total 1584
-rw-r--r-- 1  123  456     657 May 25 15:46 fstab
-rw-r--r-- 1  123  456      24 May 25 15:46 issue
-rw-r----- 1 root root 1612718 May 25 15:55 syslog
#这次只复制了新增的syslog 文件
[root@ubuntu ~]# rsync -av /root/0525 root@10.0.0.161:/tmp/
root@10.0.0.161's password: 
sending incremental file list
0525/
0525/syslog
sent 1,613,291 bytes received 39 bytes  460,951.43 bytes/sec
total size is 1,613,399 speedup is 1.00

#查看目标机,0918这个目录属性更新了
root@ubuntu:~# ls -l /tmp/0525/
total 1584
-rw-r--r-- 1  123  456     657 May 25 15:46 fstab
-rw-r--r-- 1  123  456      24 May 25 15:46 issue
-rw-r----- 1 root root 1612718 May 25 15:55 syslog

自动登录 ssh工具 sshpass

由EPEL源提供,ssh登陆不能在命令行中指定密码。sshpass 的出现,解决了这一问题。sshpass用于非 交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码(本机known_hosts文件中有的主机才能 生效)。它允许你用 -p 参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、环 境变量中读取。

bash 复制代码
apt install sshpass
bash 复制代码
sshpass [option] command parameters
#常用选项
-p password #指定明文密码
-f filename #从文件中读取密码,文件的第一行为密码
-e 			#将环境变量SSHPASS作为密码

#示例
[root@ubuntu24 ~]# sshpass -p 123456 ssh root@10.0.0.158

ssh登录验证方式介绍

ssh服务登录的常用验证方式有两种,分别是基于用户/口令的方式验证和基于密钥的方式验证

基于用户和口令登录验证

  1. 客户端发起ssh请求,服务器会把自己的公钥发送给用户

  2. 用户会根据服务器发来的公钥对密码进行加密

  3. 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功

基于密钥的登录方式

  1. 首先在客户端生成一对密钥(ssh-keygen)

  2. 并将客户端的公钥ssh-copy-id 拷贝到服务端

  3. 当客户端再次发送一个连接请求,包括ip、用户名

  4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生 成一个字符串,例如:magedu

  5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

  6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端

  7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

实现基于密钥的登录方式

在客户端生成密钥对

bash 复制代码
ssh-keygen -t rsa [-P 'password'] [-f "~/.ssh/id_rsa"]

#示例
[root@ubuntu24 ~]# ls .ssh/
known_hosts known_hosts.old
[root@ubuntu24 ~]# ssh-keygen
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):	#密钥保存的位置
Created directory '/root/.ssh'.									
Enter passphrase (empty for no passphrase):						#输入密码,可以不输入密码
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:S6ADoK7hgASBOUuHzQKnkBuNj6ydnFJXmjW9Dbl38+Q root@ubuntu24
The key's randomart image is:
+--[ED25519 256]--+
|O*=    . .       |
|@B.+  + +        |
|=O+  =.. =       |
|B.o.+. .o o o .  |
|== +o   S. . =   |
|*.=  . . .    E  |
|.o      .        |
|                 |
|                 |
+----[SHA256]-----+

[root@ubuntu24 .ssh]# ls
id_ed25519  id_ed25519.pub  known_hosts  known_hosts.old

把公钥文件传输至远程服务器对应用户的家目录

bash 复制代码
ssh-copy-id [-i [identity_file]] [user@]host

#示例
#先查看目标机
root@ubuntu:~# ls -l .ssh/
total 8
-rw------- 1 root root 2934 May 25 15:18 known_hosts
-rw------- 1 root root 2098 May 25 15:18 known_hosts.old

#将本机公钥上传给远程主机
[root@ubuntu ~]# ssh-copy-id root@10.0.0.161

#再次查看目标主机,
root@ubuntu:~# ls -l .ssh/
total 12
-rw------- 1 root root  565 May 25 19:55 authorized_keys
-rw------- 1 root root 2934 May 25 15:18 known_hosts
-rw------- 1 root root 2098 May 25 15:18 known_hosts.old

#测试免密登录
[root@ubuntu24 ~]# ssh root@10.0.0.161

用脚本实现公钥批量部署

bash 复制代码
[root@ubuntu ~]# cat ssh_push.sh 
#!/bin/bash
HOST="
10.0.0.161
10.0.0.210
"
PASS=123456
ssh-keygen -P "" -f /root/.ssh/id_rsa &>/dev/null
dpkg -l sshpass &>/dev/null || apt install -y sshpass &>/dev/null
for i in $HOST;do
{
 sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $i &>/dev/null
}&
done

wait

多机互相打通

bash 复制代码
#先生成密钥对
[root@ubuntu ~]# ls .ssh/
[root@ubuntu ~]# ssh-keygen
......
......
[root@ubuntu ~]# ls .ssh/
id_rsa id_rsa.pub
#然后将公钥复制到本机
[root@ubuntu ~]# ssh-copy-id 127.1
......
......
[root@ubuntu ~]# ls .ssh/
authorized_keys id_rsa id_rsa.pub known_hosts known_hosts.old
#将 .ssh 目录整体复制到其它主机,这样表示多机共用密钥对
[root@ubuntu ~]# rsync -a .ssh 10.0.0.157:/root/
[root@ubuntu ~]# rsync -a .ssh 10.0.0.154:/root/

ssh服务器配置

ssh 服务端常用配置

bash 复制代码
[root@ubuntu ~]# cat /etc/ssh/sshd_config

Port  22     		#远程端口,生产建议修改
ListenAddress ip
LoginGraceTime 2m
PermitRootLogin yes #默认ubuntu不允许root远程ssh登录
StrictModes yes   	#检查.ssh/文件的所有者,权限等
MaxAuthTries 6     	#一次连接,最多可以输错6次密码
MaxSessions 10         			#同一个连接最大会话,就是xshell上的复制ssh隧道,修改后对新连接生效
PubkeyAuthentication yes     	#开启基于key验证
PermitEmptyPasswords no     	#不允许空密码连接
PasswordAuthentication yes   	#开启基于用户名和密码连接
MaxStartups 10:30:100   		#未认证连接最大值,默认值10
PrintMotd no 					#是否输出motd信息,改成yes 则motd 会输出两次
PrintLastLog yes 				#是否输出上次登录信息
UseDNS yes 						#是否需要解析主机名,no可加快连接速度
GSSAPIAuthentication yes 		#是否开启客户端对IP反解析,提高速度可改为no
Banner /path/file 				#远程连接时的登录前提示

#以下可以限制可登录用户的办法:
AllowUsers user1 user2 user3 #用户名白名单
DenyUsers user1 user2 user3 #用户名黑名单
AllowGroups g1 g2 #用户组白名单
DenyGroups g1 g2 #用户组黑名单

PubkeyAcceptedAlgorithms +ssh-rsa #支持旧版的rsa密钥认证

#设置ssh服务超时断开连接
#10s如果没有互动,则断开链接,永久生效可以写配置文件,例如可以写在 /etc/profile 里面
[root@ubuntu ~]# export TMOUT=10

ssh 服务的最佳实践

  1. 建议使用非默认端口

  2. 禁止使用protocol version 1

  3. 限制可登录用户

  4. 设定空闲会话超时时长

  5. 利用防火墙设置ssh访问策略

  6. 仅监听特定的IP地址

  7. 基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs

  8. 使用基于密钥的认证

  9. 禁止使用空密码

  10. 禁止root用户直接登录

  11. 限制ssh的访问频度和并发在线数

  12. 经常分析日志

利用 sudo 实现授权

sudo:superuser do

sudo 是允许普通用户执行一些或全部的root命令的一个工具,如halt,reboot,su等。

这样可以减少系统对root账户的依赖,使root不必经常在线,从而可以提高系统安全性,在最早之前, 一般用户管理系统的方式是利用su切换成为超级管理员,但是,使用su切换,必须要先知道root用户的 密码。

首先,root用户将普通用户的名字,可以执行的特定命令,按照哪种用户或用户组的身份执行等信息, 登记在特殊文件中(通常是 /etc/sudoers),即完成对该用户的授权(此时此用户被称为 sudoer ),在一般 用户需要取得特殊权限时,其可在命令前加上 sudo,此时sudo会询问该用户自己的密码(以确定是当前 用户在操作),回答后系统即会将该命令的进程以root用户的权限运行,之后的一段时间内(默认5分钟 (redhat 系列),可在/etc/sudoers 中自定义),使用sudo 不需要再次输入密码,由于不需要root 用户密 码,部份unix 系统甚至利用 sudo 使一般用户取代root用户作为管理员账号,例如 Ubuntu, Mac OS X 等。

sudo特性

sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系 管理员

sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服 务器

sudo使用时间戳文件来执行类似的"检票"系统。当用户调用sudo并且输入它的密码时,用户获得 了一张存活期为5分钟的票

sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它 所存放的位置默认是在**/etc/sudoers**,属性必须为0440

配置文件

bash 复制代码
#主配置文件
/etc/sudo.conf
#授权规则配置文件
/etc/sudoers
/etc/sudoers.d/*

审计文件

bash 复制代码
/var/db/sudo
/var/log/auth.log

工具命令

bash 复制代码
#安全编辑授权规则文件和语法检查工具
/usr/sbin/visudo
#授权编辑规则文件的工具
/usr/bin/sudoedit
#执行授权命令
/usr/bin/sudo
#范例,语法检查
visudo -c
visudo -f /etc/sudoers.d/test

sudo 命令

bash 复制代码
sudo [options...] [command]
sudo [options...] file...
#常用选项
-b|--background     		#在后台执行         
-B|--bell 					#响铃                    
-E|--preserve-env           #继承当前环境变量
-e|--edit filename...           #编辑文件     
-g|--group=group       		#以指定组执行     
-H|--set-home               #指定切换用户的家目录
-h|--host=host 				#在指定主机上执行               
-i|--login                   #直接登录
-K|--remove-timestamp       #删除时间戳文件,则下次执行要重新输入密码
-k|--reset-timestamp     	#清除时间戳,则下次执行要重新输入密码   
-l|--list         			#列出指定用户己配置的sudo规则,不指定用户则是查看当前登录用户          
-p|--prompt=prompt   		#改变密码询问时的提示语句        
-s|--shell   				#以指定shell来执行                   
-U|--other-user=user         #配合-l使用,指定要查看的用户
-u|--user=user               #指定要代表的用户,默认root
-V|--version 				#显示版本   
-h|--help 				#显示帮助
-v|--validate 			#再延长密码有效期5分钟 

sudo 授权规则配置

bash 复制代码
user host=(runas) [TAG:]command #授权user用户可以在host主机上以runas的身份执行
command,TAG可为空
#可使用通配符
? 			#任意单个字符 
* 			#任意长度字符
[abc] 		#匹配abc中的一个字符
[!abc] 		#匹配任意一个除abc之外的字符
\x 			#转义
[[alpha]] 	#字母

#user 和 runnas
userName #用户名
#uid #用户ID
%groupName #组名
%#gid #组ID
User_Alias #user别名
Runas_Alias #runas别名


#host
ip #ip地址
hostname #主机名
network/netmask #网段/子网掩码
Host_Alias #别名


#command
cmmand #具体命令
directory/* #某个目录下所有命令
sudoedit #sudoedit命令,有此命令就可以编辑sudo规则
Cmnd_Alias #命令别名



#示例
#指定IP或网段的写法,要求在对应主机上也有该配置
jose    10.0.0.158=(root) /bin/ls /root/
jose    10.0.0.0/24=(root) /bin/touch /root/from-jose
jose    10.0.0.157=(root) /sbin/shutdown -h now



#别名
#类型
User_Alias|Runas_Alias|Host_Alias|Cmnd_Alias

#格式
Alias_Type NAME = item1, item2, ...

#别名名称由大写字母开始,后面接大写字母,数字,下划线
NAME = [A-Z]([A-Z][0-9]_)*

示例

bash 复制代码
#查看配置
#在10.0.0.158主机上查看配置
[root@ubuntu ~]# sudo -l
......
User root may run the following commands on rocky86:
   (ALL) ALL
#查看指定用户
jose@ubuntu:~$ sudo -l -U jose
......
User jose may run the following commands on rocky86:
   (root) /bin/ls /root/
   (root) /bin/touch /root/from-jose
   
#该用户没有配置sudo 规则
tom@ubuntu:~$ sudo -l
[sudo] password for tom: 
Sorry, user tom may not run sudo on ubuntu.
#在10.0.0.157主机上查看
[root@ubuntu ~]# sudo -l -U jose
......
User jose may run the following commands on rocky86:
   (root) /bin/touch /root/from-jose
   (root) /sbin/shutdown -h now
   
#查看指定用户,mage 是初始用户,属于sudo 组
mage@ubuntu:~$ sudo -l
[sudo] password for mage: 
Matching Defaults entries for mage on ubuntu:
   env_reset, mail_badpass, 
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/
snap/bin, use_pty
User mage may run the following commands on ubuntu:
   (ALL : ALL) ALL
   
   
#id配置写法
#1011,#1012,%#1013,u2   ALL=(#0)       /bin/cat /etc/shadow
%#1013,tom             ALL=(%#0)       /bin/cat /var/log/secure
tom@ubuntu:~$ id
uid=1012(tom) gid=1012(tom) groups=1012(tom)
tom@ubuntu:~$ sudo -l
......
......
User tom may run the following commands on ubuntu:
   (#0) /bin/cat /etc/shadow #来源于用户ID配置
   (%#0) /bin/cat /var/log/auth.log #来源于用户名配置
#组ID
u1@ubuntu:~$ id
uid=1013(u1) gid=1013(u1) groups=1013(u1)
u1@ubuntu:~$ sudo -l
[sudo] password for u1: 
......
......
User u1 may run the following commands on ubuntu:
   (#0) /bin/cat /etc/shadow #来源于用户组ID配置
   (%#0) /bin/cat /var/log/auth.log #来源于用户组ID配置
   
#别名写法
User_Alias ANLMAL=tom,jerry,%jose,#1013,%#1014
Runas_Alias ROOT=root
Host_Alias LOCAL=rocky86,10.0.0.158
Cmnd_Alias CMD=/sbin/init *,/usr/bin/yum update
Cmnd_Alias SHUTDOWN=/sbin/shutdown -h now
ANLMAL LOCAL=(ROOT) CMD,SHUTDOWN

#来源于用户名 tom
tom@ubuntu:~$ id
uid=1012(tom) gid=1012(tom) groups=1012(tom)
tom@ubuntu:~$ sudo -l
[sudo] password for tom: 
......
......
User tom may run the following commands on ubuntu:
   (root) /sbin/init *, /usr/bin/yum update, /sbin/shutdown -h now
   
#来源于组名 jose
jose@ubuntu:~$ id
uid=1010(jose) gid=1010(jose) groups=1010(jose)
jose@ubuntu:~$ sudo -l
[sudo] password for jose: 
......
......
User jose may run the following commands on ubuntu:
   (root) /sbin/init *, /usr/bin/yum update, /sbin/shutdown -h now
   
   
#配置中转规则
jose@ubuntu:~$ vim /etc/sudoers
tom    ALL=(root)     /usr/bin/cat /etc/shadow
jose   ALL=(tom)     /usr/bin/sudo /usr/bin/cat /etc/shadow
#执行
jose@ubuntu:~$ sudo -u tom sudo /usr/bin/cat /etc/shadow
相关推荐
冰红茶兑滴水3 分钟前
Linux 线程控制
linux·c++·算法
IT良15 分钟前
while循环及简单案例
linux·服务器
码哝小鱼26 分钟前
iptables限制网速
linux·服务器·网络
Persistence is gold29 分钟前
cassandra指定配置文件的docker启动方法
运维·docker·容器
leaoleao沄35 分钟前
linux-IO-进程-线程(相关函数)
linux·运维·服务器
月临水1 小时前
JavaEE:网络编程(UDP)
java·网络·udp·java-ee
Coremail邮件安全1 小时前
武汉大学:如何做好高校电子邮件账号安全防护
网络·安全·邮件安全·双因素认证·敏感信息
frank00600711 小时前
linux 使用mdadm 创建raid0 nvme 磁盘
linux·运维
绿白尼1 小时前
进程与线程
linux
iangyu1 小时前
linux命令之pwdx
linux·运维·服务器