加密和安全
1 安全机制
1.1 墨菲定律
墨菲定律:一种心理学效应,是由爱德华·墨菲(Edward A. Murphy)提出的,原话:如果有两种或两
种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会做出这种选择
主要内容:
任何事都没有表面看起来那么简单
所有的事都会比你预计的时间长
会出错的事总会出错
如果你担心某种情况发生,那么它就更有可能发生
1.2 信息安全防护的目标
保密性 Confidentiality
完整性 Integrity
可用性 Usability
可控制性 Controlability
不可否认性 Non-repudiation
1.3 安全防护环节
物理安全:各种设备/主机、机房环境
系统安全:主机或设备的操作系统
应用安全:各种网络服务、应用程序
网络安全:对网络访问的控制、防火墙规则
数据安全:信息的备份与恢复、加密解密
管理安全:各种保障性的规范、流程、方法
1.4 常见的安全攻击STRIDE
Spoofing 假冒
Tampering 篡改
Repudiation 否认
Information Disclosure 信息泄漏
Denial of Service 拒绝服务
Elevation of Privilege 提升权限
1.5 安全设计基本原则
使用成熟的安全系统
以小人之心度输入数据
外部系统是不安全的
最小授权
减少外部接口
缺省使用安全模式
安全不是似是而非
从STRIDE思考
在入口处检查
从管理上保护好你的系统
1.6 常用安全技术
认证
授权
审计
安全通信
1.7 加密算法和协议
对称加密
非对称(公钥)加密
单向加密
认证协议
1.7.1 对称加密算法
对称加密:加密和解密使用同一个密钥
特性:
加密、解密使用同一个密钥,效率高
将原始数据分割成固定大小的块,逐个进行加密
缺陷:
密钥过多
密钥分发
数据来源无法确认
常见对称加密算法:
DES:Data Encryption Standard,56bits
3DES:
AES:Advanced (128, 192, 256bits)
Blowfish,Twofish
IDEA,RC6,CAST5
1.7.2 非对称加密算法
1.7.2.1 非对称加密算法介绍
非对称加密:密钥是成对出现
公钥:public key,公开给所有人,主要给别人加密使用
私钥:secret key,private key 自己留存,必须保证其私密性,用于自已加密签名
特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
功能:
数据加密:适合加密较小数据,比如: 加密对称密钥
数字签名:主要在于让接收方确认发送方身份
缺点:
密钥长,算法复杂
加密解密效率低下
常见算法:
RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可
变的,可实现加密和数字签名
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准)
ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学,比RSA加密算法使用更小的密钥,
提供相当的或更高等级的安全
1.7.2.2 非对称加密实现加密
接收者
生成公钥/密钥对:P和S
公开公钥P,保密密钥S
发送者
使用接收者的公钥来加密消息M
将P(M)发送给接收者
接收者
使用密钥S来解密:M=S(P(M))
1.7.2.3 非对称加密实现数字签名
发送者
生成公钥/密钥对:P和S
公开公钥P,保密密钥S
使用密钥S来加密消息M
发送给接收者S(M)
接收者
使用发送者的公钥来解密M=P(S(M))
1.7.2.4 RSA和DSA
RSA:公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开
发的,RSA取名来自开发他们三者的名字,后成立RSA数据安全有限公司。RSA是目前最有影响力的公
钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算
法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极
其困难,因此可以将乘积公开作为加密密钥
DSA (Digital Signature Algorithm):1991年7月26日提交,并归属于David W. Kravitz前NSA员工,
DSA是Schnorr和ElGamal签名算法的变种,被美国NIST作为SS(DigitalSignature Standard), DSA是基
于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA只是一种算法,和RSA不同之处在于
它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多
1.7.3 使用gpg实现对称和非对称加密
1.7.3 1 实现对称加密
对称加密file文件
gpg -c file
在另一台主机上解密file
gpg -o file -d file.gpg
1.7.3.2 实现公钥加密
目标:在hostB主机上用公钥加密,在hostA主机上解密 B ---> A
在hostA主机上生成公钥/私钥对
gpg --gen-key
在hostA主机上查看公钥
gpg --list-keys
在hostA主机上导出公钥到wang.pubkey
gpg -a --export -o wang.pubkey
从hostA主机上复制公钥文件到需加密的B主机上
scp wang.pubkey hostB:
在需加密数据的hostB主机上生成公钥/私钥对
gpg --list-keys
gpg --gen-key
在hostB主机上导入公钥
gpg --import wang.pubkey
gpg --list-keys
用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.gpg
gpg -e -r wangxiaochun file
file file.gpg
复制加密文件到hostA主机
scp fstab.gpg hostA:
在hostA主机解密文件
gpg -d file.gpg
gpg -o file -d file.gpg
删除公钥和私钥
gpg --delete-keys wangxiaochun
gpg --delete-secret-keys wangxiaochun
1.7.4 单向哈希算法
哈希算法:也称为散列算法,将任意数据缩小成固定大小的“指纹”,称为digest,即摘要
特性:
任意长度输入,固定长度输出
若修改数据,指纹也会改变,且有雪崩效应,数据的一点微小改变,生成的指纹值变化非常大。
无法从指纹中重新生成数据,即不要逆,具有单向性
功能:数据完整性
常见算法
md5: 128bits、sha1: 160bits、sha224 、sha256、sha384、sha512
常用工具
md5sum | sha1sum [ --check ] file
openssl、gpg
rpm -V
数字签名
RPM 文件完整性
rpm --verify package_name (or -V)
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
rpm --checksig pakage_file_name (or -K)
1.7.5 综合应用多种加密算法
1.7.5.1 实现数据加密
实现数据加密,无法验证数据完整性和来源
1.7.5.2 实现数字签名
不加密数据,可以保证数据来源的可靠性、数据的完整性和一致性
1.7.5.3 综合加密和签名
即实现数据加密,又可以保证数据来源的可靠性、数据的完整性和一致性
1.7.6 密码交换
密钥交换:IKE( Internet Key Exchange )
公钥加密:用目标的公钥加密对称密钥
DH (Deffie-Hellman):生成对称(会话)密钥,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和
马丁·赫尔曼(Martin Edward Hellman)在1976年发表
参看:https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
1.8 CA和证书
1.8.1 中间人攻击
Man-in-the-middle,简称为 MITM,中间人
1.8.2 CA和证书
PKI:Public Key Infrastructure 公共密钥加密体系
签证机构:CA(Certificate Authority)
注册机构:RA
证书吊销列表:CRL
证书存取库:
X.509:定义了证书的结构以及认证协议标准
版本号
序列号
签名算法
颁发者
有效期限
主体名称
证书类型:
证书授权机构的证书
服务器证书
用户证书
获取证书两种方法:
自签名的证书: 自已签发自己的公钥
使用证书授权机构:
生成证书请求(csr)
将证书请求csr发送给CA
CA签名颁发证书
1.8.3 安全协议 SSL/TLS
1.8.3.1 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
功能:
机密性
认证
完整性
重放保护
1.8.3.2 SSL/TLS组成
Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密
钥交换
ChangeCipherSpec 协议:一条消息表明握手协议已经完成
Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会
直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
1.8.3.3 TLS实现过程
实现分为握手阶段和应用阶段
握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认
证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过
MasterSecret生成
应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信
目前密钥交换 + 签名有三种主流选择:
RSA 密钥交换、RSA 数字签名
ECDHE 密钥交换、RSA 数字签名
ECDHE 密钥交换、ECDSA 数字签名
实现方式1
RSA 密钥交换、RSA 数字签名
1. Visitor给出协议版本号、一个客户端随机数(Client random),以及客户端支持的加密方法
2. Server确认双方使用的加密方法,以及一个服务器生成的随机数(Server random)
3. Server发送数字证书给Visitor
4. Visitor确认数字证书有效(查看证书状态且查询证书吊销列表),并使用信任的CA的公钥解密数
字证书获得Server的公钥,然后生成一个新的46字节随机数(称为预备主密钥Pre-master
secret),并使用Server的公钥加密预备主密钥发给Server
5. Server使用自己的私钥,解密Visitor发来的预备主密钥
6. Visitor和Server双方都具有了(客户端随机数+服务端随机数+预备主密钥),它们两者都根据约定的
加密方法,使用这三个随机数生成对称密钥——主密钥(也称为对话密钥session key),用来加
密后续的对话过程
7. 在双方验证完session key的有效性之后,SSL握手机制就算结束了。之后所有的数据只需要使用
“对话密钥”(此密钥并不是的session key,而是由其通过计算得到)加密即可,不再需要多余的加密
机制
注意:
1.在SSL握手机制中,需要三个随机数(客户端随机数+服务端随机数+预备主密钥)
2.至始至终客户端和服务端只有一次非对称加密动作——客户端使用证书中获得的服务端公钥加密预备
主密钥。
3.上述SSL握手机制的前提单向验证,无需验证客户端,如果需要验证客户端则可能需要客户端的证书
或客户端提供签名等。
4.Server和Visitor通信,Server把数字证书发给Visitor,最关键的一点是Visitor要保证证书的有效性,
通过查看证书状态并去CA的吊销列表查看Server的证书是否被吊销。只有Server的证书可用了,才保证
了第一环节的安全性
5.RSA 密钥交换有一个很大的问题:没有前向安全性Forward Secrecy。这意味着攻击者可以把监听到
的加密流量先存起来,后续一旦拿到了私钥,之前所有流量都可以成功解密
实现方式2
目前大部分 HTTPS 流量用的都是 ECDHE 密钥交换。ECDHE 是使用椭圆曲线(ECC)的 DH(Diffie-
Hellman)算法
前图中的 Server DH Parameter 是用证书私钥签名的,客户端使用证书公钥就可以验证服务端合法
性。相比 RSA 密钥交换,DH 由传递 Premaster Scret 变成了传递 DH 算法所需的 Parameter,然后双
方各自算出 Premaster Secret
对于这种情况,由于 Premaster Secret 无需交换,中间人就算有私钥也无法获得 Premaster Secret 和
Master Secret。当然,使用 ECDHE 后,虽然中间人拿到私钥也无法解密之前的流量,但可以实施
MITM 攻击来解密之后的流量,所以私钥还是要保管好。
相比 RSA 既可以用于密钥交换,又可以用于数字签名;ECC 这边就分得比较清楚了:ECDHE 用于密钥
交换,ECDSA 用于数字签名
1.8.4 HTTPS
HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL 或 HTTP over TLS ,对http协
议的文本数据进行加密处理后,成为二进制形式传输
1.8.4.1 HTTPS 结构
1.8.4.2 HTTPS 工作的简化过程
1. 客户端发起HTTPS请求
用户在浏览器里输入一个https网址,然后连接到服务器的443端口
2. 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是
自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹
出提示页面。这套证书其实就是一对公钥和私钥
3. 传送服务器的证书给客户端
证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等
4. 客户端解析验证服务器证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间等
等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一
个随机值。然后用证书中公钥对该随机值进行非对称加密
5. 客户端将加密信息传送服务器
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端
的通信就可以通过这个随机值来进行加密解密了
6. 服务端解密信息
服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值
7. 服务器加密信息并发送信息
服务器将数据利用随机值进行对称加密,再发送给客户端
8. 客户端接收并解密信息
客户端用之前生成的随机值解密服务段传过来的数据,于是获取了解密后的内容
2 OpenSSL
2.1 OpenSSL 介绍
官网:https://www.openssl.org/
OpenSSL计划在1998年开始,其目标是发明一套自由的加密工具,在互联网上使用。OpenSSL以Eric
Young以及Tim Hudson两人开发的SSLeay为基础,随着两人前往RSA公司任职,SSLeay在1998年12月
停止开发。因此在1998年12月,社群另外分支出OpenSSL,继续开发下去
OpenSSL管理委员会当前由7人组成有13个开发人员[3]具有提交权限(其中许多人也是OpenSSL管理
委员会的一部分)。只有两名全职员工(研究员),其余的是志愿者
该项目每年的预算不到100万美元,主要依靠捐款。 TLS 1.3的开发由 Akamai 赞助
OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确
认另一端连线者的身份。这个包广泛被应用在互联网的网页服务器上
其主要库是以C语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。OpenSSL可以运行在
OpenVMS、 Microsoft Windows以及绝大多数类Unix操作系统上(包括Solaris,Linux,Mac OS X与
各种版本的开放源代码BSD操作系统)
心脏出血漏洞:OpenSSL 1.0.1版本(不含1.0.1g)含有一个严重漏洞,可允许攻击者读取服务器的内
存信息。该漏洞于2014年4月被公诸于世,影响三分之二的活跃网站
包括三个组件:
libcrypto:用于实现加密和解密的库
libssl:用于实现ssl通信协议的安全库
openssl:多用途命令行工具
2.2 Base64 编码
Base64是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64就是一种基于64个可打印字符
来表示二进制数据的方法
base64的编码过程如下:
将每3个字节放入一个24位的缓冲区中,最后不足3个字节的,缓冲区的剩余部分用0来填补。然后每次
取出6位(2的6次方为64,使用64个字符即可表示所有),将高2位用0来填充,组成一个新的字节,计
算出这个新字节的十进制值,对应上面的编码表,输出相应的字符。这样不断地进行下去,就可完成对
所有数据的编码工作。
按照以上规则对文本Man编码如下:
范例:
[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命令
两种运行模式:
交互模式
批处理模式
三种子命令:
标准命令
消息摘要命令
加密命令
2.3.1 openssl命令对称加密
工具:openssl enc, gpg
算法:3des, aes, blowfish, twofish
enc命令:帮助:man enc
加密:
openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
解密:
openssl enc -d -des3 -a -salt -in testfile.cipher -out testfile
2.3.2 openssl命令单向哈希加密
工具:openssl dgst
算法:md5sum, sha1sum, sha224sum,sha256sum…
dgst命令:帮助:man dgst
openssl dgst -md5 [-hex默认] /PATH/SOMEFILE
openssl dgst -md5 testfile
md5sum /PATH/TO/SOMEFILE
[root@centos8 data]#openssl md5 fstab
MD5(fstab)= 8f8e3b0d0c17f1b29d404544c7b310da
[root@centos8 data]#openssl sha512 fstab
SHA512(fstab)=
81f67107026a43bf60fff2cdd6ebe93f49ad3bf48e3645912aa0e8d27eec8d9647121f608c7b6ad1
94856318f0381db21f6961db862e99644126b64c38a5eeb6
[root@centos8 data]#sha512sum fstab
81f67107026a43bf60fff2cdd6ebe93f49ad3bf48e3645912aa0e8d27eec8d9647121f608c7b6ad1
94856318f0381db21f6961db862e99644126b64c38a5eeb6 fstab
补充知识:
MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现网络通信中保证所传输数
据的完整性机制
HMAC:hash-based MAC,使用md5或sha1算法
2.3.3 openssl命令生成用户密码
[root@centos8 ~]#getent shadow wang
wang:$6$Y16DiwuVQtL6XCQK$DAQO4BhVbfQmaUMFWKR61hVwFvxk7J9U4pZaFcwf6nBwERUN6bL3wAL
PonDRebk3CgooupeXHfRuFKRciUe6q.:18373:0:99999:7:::
[root@centos8 ~]#echo magedu | openssl passwd -6 -salt Y16DiwuVQtL6XCQK -stdin
$6$Y16DiwuVQtL6XCQK$DAQO4BhVbfQmaUMFWKR61hVwFvxk7J9U4pZaFcwf6nBwERUN6bL3wALPonDR
ebk3CgooupeXHfRuFKRciUe6q.
[root@ubuntu ~]#openssl passwd -6 -salt Y16DiwuVQtL6XCQK magedu
$6$Y16DiwuVQtL6XCQK$DAQO4BhVbfQmaUMFWKR61hVwFvxk7J9U4pZaFcwf6nBwERUN6bL3wALPonDR
ebk3CgooupeXHfRuFKRciUe6q.
范例:创建新用户同时指定密码,在CentOS和Ubuntu都通用
[root@centos8 ~]#useradd -p `echo magedu | openssl passwd -6 -salt
Y16DiwuVQtL6XCQK -stdin` zhang
[root@centos8 ~]#getent shadow zhang
zhang:$6$Y16DiwuVQtL6XCQK$DAQO4BhVbfQmaUMFWKR61hVwFvxk7J9U4pZaFcwf6nBwERUN6bL3wA
LPonDRebk3CgooupeXHfRuFKRciUe6q.:18402:0:99999:7:::
[root@centos8 ~]#getent shadow zhang wang
zhang:$6$Y16DiwuVQtL6XCQK$DAQO4BhVbfQmaUMFWKR61hVwFvxk7J9U4pZaFcwf6nBwERUN6bL3wA
LPonDRebk3CgooupeXHfRuFKRciUe6q.:18402:0:99999:7:::
wang:$6$Y16DiwuVQtL6XCQK$DAQO4BhVbfQmaUMFWKR61hVwFvxk7J9U4pZaFcwf6nBwERUN6bL3wAL
PonDRebk3CgooupeXHfRuFKRciUe6q.:18373:0:99999:7:::
2.3.4 openssl命令生成随机数
随机数生成器:伪随机数字,利用键盘和鼠标,块设备中断生成随机数
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
范例:生成随机10位长度密码
[root@centos8 ~]#openssl rand -base64 9 |head -c10
ip97t6qQes[root@centos8 ~]#
[root@centos8 ~]#tr -dc ‘[:alnum:]‘ < /dev/urandom |head -c10
DO2mDp3eZu[root@centos8 ~]#
2.3.5 openssl命令实现 PKI
公钥加密:
算法:RSA, ELGamal
工具:gpg, openssl rsautl(man rsautl)
数字签名:
算法:RSA, DSA, ELGamal
密钥交换:
算法:dh
DSA:Digital Signature Algorithm
DSS:Digital Signature Standard
RSA:
openssl命令生成密钥对儿:man genrsa
#生成对称秘钥加密的私钥,通过设置严格的权限实现安全,应用更广泛
[root@centos8 ~]#(umask 077; openssl genrsa –out app.key 2048)
#将加密对称秘钥key解密,此方式更安全,但是不方便
[root@centos8 ~]#openssl genrsa -out /data/app2.key -des3 2048
2.4 建立私有CA实现证书申请颁发
建立私有CA:
OpenCA:OpenCA开源组织使用Perl对OpenSSL进行二次开发而成的一套完善的PKI免费软件
openssl:相关包 openssl和openssl-libs
证书申请及签署步骤:
1、生成证书申请请求
2、RA核验
3、CA签署
4、获取证书
openssl的配置文件:
/etc/pki/tls/openssl.cnf
三种策略:match匹配、optional可选、supplied提供
match:要求申请填写的信息跟CA设置信息必须一致
optional:可有可无,跟CA设置信息可不一致
supplied:必须填写这项申请信息
2.4.1 创建私有CA
1、创建CA所需要的文件
#生成证书索引数据库文件
touch /etc/pki/CA/index.txt
#指定第一个颁发证书的序列号
echo 01 > /etc/pki/CA/serial
2、 生成CA私钥
cd /etc/pki/CA/
(umask 066; openssl genrsa -out private/cakey.pem 2048)
3、生成CA自签名证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out ?
/etc/pki/CA/cacert.pem
-new:生成新证书签署请求
-x509:专用于CA生成自签证书
-key:生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径
国家代码:https://country-code.cl/
范例:生成自签名证书
[root@centos8 ~]#openssl req -utf8 -newkey rsa:1024 -subj "/CN=www.magedu.org" -
keyout app.key -nodes -x509 -out app.crt
Generating a RSA private key
...........................+++++
...+++++
writing new private key to ‘app.key‘
-----
[root@centos8 ~]#openssl x509 -in app.crt -noout -text
2.4.2 申请证书并颁发证书
1、为需要使用证书的主机生成生成私钥
(umask 066; openssl genrsa -out ?/data/test.key 2048)
2、为需要使用证书的主机生成证书申请文件
openssl req -new -key /data/test.key -out /data/test.csr
3、在CA签署证书并将证书颁发给请求者
openssl ca -in /tmp/test.csr -out ?/etc/pki/CA/certs/test.crt -days 100
注意:默认要求 国家,省,公司名称三项必须和CA一致
4、查看证书中的信息:
openssl x509 -in /PATH/FROM/CERT_FILE -noout ?-text|issuer|subject|serial|dates
#查看指定编号的证书状态
openssl ca -status SERIAL
2.4.3 吊销证书
在客户端获取要吊销的证书的serial
openssl x509 -in /PATH/FROM/CERT_FILE ?-noout ?-serial -subject
在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证
书:
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber
更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem
查看crl文件:
openssl crl -in /etc/pki/CA/crl.pem -noout -text
2.4.4 CentOS 7 创建自签名证书
[root@centos7 ~]#cd /etc/pki/tls/certs
[root@centos7 certs]#make
[root@centos7 certs]#make app.crt
[root@centos7 certs]#openssl x509 -in app.crt -noout -text
2.4.5 实战案例:在CentOS8上实现私有CA和证书申请
2.4.5.1 创建CA相关目录和文件
[root@centos8 ~]#mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private}
[root@centos8 ~]#tree /etc/pki/CA/
/etc/pki/CA/
├── certs
├── crl
├── newcerts
└── private
4 directories, 0 files
[root@centos8 ~]#touch /etc/pki/CA/index.txt
[root@centos8 ~]#echo 0F > /etc/pki/CA/serial
index.txt和serial文件在颁发证书时需要使用,如果不存在,会出现以下错误提示
[root@centos8 ~]#openssl ca -in /data/app1/app1.csr -out
/etc/pki/CA/certs/app1.crt -days 1000
Using configuration from /etc/pki/tls/openssl.cnf
140040142845760:error:02001002:system library:fopen:No such file or
directory:crypto/bio/bss_file.c:72:fopen(‘/etc/pki/CA/index.txt‘,‘r‘)
140040142845760:error:2006D080:BIO routines:BIO_new_file:no such
file:crypto/bio/bss_file.c:79:
[root@centos8 ~]#openssl ca -in /data/app1/app1.csr -out
/etc/pki/CA/certs/app1.crt -days 1000
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/serial: No such file or directory
error while loading serial number
140240559408960:error:02001002:system library:fopen:No such file or
directory:crypto/bio/bss_file.c:72:fopen(‘/etc/pki/CA/serial‘,‘r‘)
140240559408960:error:2006D080:BIO routines:BIO_new_file:no such
file:crypto/bio/bss_file.c:79:
2.4.5.2 创建CA的私钥
[root@centos8 ~]#cd /etc/pki/CA/
[root@centos8 CA]#(umask 066; openssl genrsa -out private/cakey.pem 2048)
[root@centos8 CA]#tree
.
├── certs
├── crl
├── newcerts
└── private
?└── cakey.pem
4 directories, 1 file
2.4.5.3 给CA颁发自签名证书
[root@centos8 ~]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days
3650 -out ??/etc/pki/CA/cacert.pem
[root@centos8 ~]#tree /etc/pki/CA
/etc/pki/CA
├── cacert.pem
├── certs
├── crl
├── newcerts
└── private
?└── cakey.pem
4 directories, 2 files
[root@centos8 ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -text
[root@centos8 ~]#sz /etc/pki/CA/cacert.pem
#将文件cacert.pem传到windows上,修改文件名为cacert.pem.crt,双击可以看到下面显示
2.4.5.4 用户生成私钥和证书申请
[root@centos8 ~]#mkdir /data/app1
[root@centos8 ~]#(umask 066; openssl genrsa -out ?/data/app1/app1.key 2048)
[root@centos8 ~]#cat /data/app1/app1.key
[root@centos8 ~]#openssl req -new -key /data/app1/app1.key -out
/data/app1/app1.csr
[root@centos8 ~]#ll /data/app1/
total 8
-rw-r--r-- 1 root root 1045 May 20 14:11 app1.csr
-rw------- 1 root root 1679 May 20 14:06 app1.key
默认有三项内容必须和CA一致:国家,省份,组织,如果不同,会出现下面的提示
[root@centos8 ~]#openssl ca -in /data/app2/app2.csr -out
/etc/pki/CA/certs/app2.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
The stateOrProvinceName field is different between
CA certificate (beijing) and the request (hubei)
2.4.5.5 CA颁发证书
[root@centos8 ~]#openssl ca -in /data/app1/app1.csr -out
/etc/pki/CA/certs/app1.crt -days 1000
[root@centos8 ~]#tree /etc/pki/CA
/etc/pki/CA
├── cacert.pem
├── certs
│??└── app1.crt
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts
│??└── 0F.pem
├── private
│??└── cakey.pem
├── serial
└── serial.old
4 directories, 9 files
2.4.5.6 查看证书
[root@centos8 ~]#cat /etc/pki/CA/certs/app1.crt
[root@centos8 ~]#openssl x509 -in /etc/pki/CA/certs/app1.crt -noout -text
[root@centos8 ~]#openssl x509 -in /etc/pki/CA/certs/app1.crt -noout -issuer
issuer=C = CN, ST = beijing, L = beijing, O = magedu, OU = devops, CN =
ca.magedu.org, emailAddress = admin@magedu.org
[root@centos8 ~]#openssl x509 -in /etc/pki/CA/certs/app1.crt -noout -subject
subject=C = CN, ST = beijing, O = magedu, OU = it, CN = app1.magedu.org,
emailAddress = root@magedu.org
[root@centos8 ~]#openssl x509 -in /etc/pki/CA/certs/app1.crt -noout -dates
notBefore=May 20 06:21:01 2020 GMT
notAfter=Feb 14 06:21:01 2023 GMT
[root@centos8 ~]#openssl x509 -in /etc/pki/CA/certs/app1.crt -noout -serial
serial=0F
#验证指定编号对应证书的有效性
[root@centos8 ~]#openssl ca -status 0F
Using configuration from /etc/pki/tls/openssl.cnf
0F=Valid (V)
[root@centos8 ~]#cat /etc/pki/CA/index.txt
V 230214062101Z 0F unknown
/C=CN/ST=beijing/O=magedu/OU=it/CN=app1.magedu.org/emailAddress=root@magedu.org
[root@centos8 ~]#cat /etc/pki/CA/index.txt.old
[root@centos8 ~]#cat /etc/pki/CA/serial
10
[root@centos8 ~]#cat /etc/pki/CA/serial.old
0F
2.4.5.7 将证书相关文件发送到用户端使用
[root@centos8 ~]#cp /etc/pki/CA/certs/app1.crt /data/app1/
[root@centos8 ~]#tree /data/app1/
/data/app1/
├── app1.crt
├── app1.csr
└── app1.key
0 directories, 3 files
2.4.5.8 证书的信任
默认生成的证书,在windows上是不被信任的,可以通过下面的操作实现信任
打开internet属性
2.4.5.9 证书的吊销
[root@centos8 ~]#openssl ca -revoke /etc/pki/CA/newcerts/11.pem
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 11.
Data Base Updated
[root@centos8 ~]#openssl ca -status 11
Using configuration from /etc/pki/tls/openssl.cnf
11=Revoked (R)
[root@centos8 ~]#cat /etc/pki/CA/index.txt
V 230214062101Z 0F unknown
/C=CN/ST=beijing/O=magedu/OU=it/CN=app1.magedu.org/emailAddress=root@magedu.org
V 210520064452Z 10 unknown
/C=CN/ST=hubei/L=wuhan/O=wangedu/OU=sales/CN=app2.wangedu.org/emailAddress=admin
@wangedu.org
R 210520065000Z 200520065821Z 11 unknown
/C=CN/ST=hubei/L=wuhan/O=wangedu/OU=sales/CN=app2.wangedu.org/emailAddress=admin
@wangedu.org
2.4.5.10 生成证书吊销列表文件
[root@centos8 ~]#openssl ca -gencrl -out /etc/pki/CA/crl.pem
[root@centos8 ~]#echo 01 > /etc/pki/CA/crlnumber
[root@centos8 ~]#openssl ca -gencrl -out /etc/pki/CA/crl.pem
[root@centos8 ~]#cat /etc/pki/CA/crlnumber
02
[root@centos8 ~]#cat /etc/pki/CA/crl.pem
[root@centos8 ~]#openssl crl -in /etc/pki/CA/crl.pem -noout -text
[root@centos8 ~]#sz /etc/pki/CA/crl.pem
#将此文件crl.pem传到windows上并改后缀为crl.pem.crl,双击可以查看以下显示
3 ssh服务
3.1 ssh服务介绍
ssh: secure shell, protocol, 22/tcp, 安全的远程登录,实现加密通信,代替传统的 telnet 协议
具体的软件实现:
OpenSSH:ssh协议的开源实现,CentOS 默认安装
dropbear:另一个ssh协议的开源项目的实现
SSH 协议版本
v1:基于CRC-32做MAC,不安全;man-in-middle
v2:双方主机协议选择安全的MAC方式,基于DH算法做密钥交换,基于RSA或DSA实现身份认证
3.1.1 公钥交换原理
客户端发起链接请求
服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
客户端生成密钥对
客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都
会被加密
3.1.2 ssh加密通讯原理
3.2 openssh 服务
OpenSSH是SSH (Secure SHell) 协议的免费开源实现,一般在各种Linux版本中会默认安装,基于
C/S结构
Openssh软件相关包:
openssh
openssh-clients
openssh-server
3.2.1 客户端ssh命令
ssh命令是ssh客户端,允许实现对远程系统经验证地加密安全访问
当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub文件中的公钥到客户机的
~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接
ssh客户端配置文件:/etc/ssh/ssh_config
范例:禁止首次连接的询问过程
[root@centos7 ~]#sed -i.bak ‘/StrictHostKeyChecking/s/.*/StrictHostKeyChecking
no/‘ /etc/ssh/ssh_config
-p port:远程服务器监听的端口
-b 指定连接的源IP
-v 调试模式
-C 压缩方式
-X 支持x11转发
-t 强制伪tty分配,如:ssh -t remoteserver1 ssh -t remoteserver2 ?ssh
remoteserver3
-o option ?如:-o StrictHostKeyChecking=no
-i <file> 指定私钥文件路径,实现基于key验证,默认使用文件: ~/.ssh/id_dsa,
~/.ssh/id_ecdsa, ~/.ssh/id_ed25519,~/.ssh/id_rsa等
[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@centos6 ~]#
范例:远程执行命令
[root@centos6 ~]#ssh 10.0.0.8 "sed -i.bak
‘/StrictHostKeyChecking/s/.*/StrictHostKeyChecking no/‘ /etc/ssh/ssh_config"
root@10.0.0.8‘s password:
[root@centos6 ~]#
范例:在远程主机运行本地shell脚本
[root@centos8 ~]#hostname -I
10.0.0.8
[root@centos8 ~]#cat test.sh
#!/bin/bash
hostname -I
[root@centos8 ~]#ssh 10.0.0.18 /bin/bash < test.sh
root@10.0.0.18‘s password:
10.0.0.18
范例失败登录次数
[root@centos8 ~]#lastb -f btmp-test | awk ‘{print $3}‘|sort |uniq -c|sort -
nr|head
?86294 58.218.92.37
?43148 58.218.92.26
?18036 112.85.42.201
?10501 111.26.195.101
?10501 111.231.235.49
?10501 111.204.186.207
?10501 111.11.29.199
?10499 118.26.23.225
?6288 42.7.26.142
?4236 58.218.92.30
[root@centos8 ~]#lastb -f btmp-test | awk ‘{ip[$3]++}END{for(i in ip){print
ip[i],i}}‘|sort -nr|head
86294 58.218.92.37
43148 58.218.92.26
18036 112.85.42.201
10501 111.26.195.101
10501 111.231.235.49
10501 111.204.186.207
10501 111.11.29.199
10499 118.26.23.225
6288 42.7.26.142
4236 58.218.92.30
3.2.2 ssh登录验证方式介绍
ssh服务登录的常用验证方式
用户/口令
基于密钥
基于用户和口令登录验证
1. 客户端发起ssh请求,服务器会把自己的公钥发送给用户
2. 用户会根据服务器发来的公钥对密码进行加密
3. 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
基于密钥的登录方式
1. 首先在客户端生成一对密钥(ssh-keygen)
2. 并将客户端的公钥ssh-copy-id 拷贝到服务端
3. 当客户端再次发送一个连接请求,包括ip、用户名
4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生
成一个字符串,例如:magedu
5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
3.2.3 实现基于密钥的登录方式
范例:实现基于 key 验证
[root@centos8 ~]#ssh-keygen
[root@centos8 ~]#ssh-copy-id root@10.0.0.7
[root@centos7 ~]#ll .ssh
total 4
-rw------- 1 root root 583 May 22 09:52 authorized_keys
[root@centos7 ~]#cat .ssh/authorized_keys
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABgQDEIP+dPPpgsvL+RdPbHvv5w88jOiRTO8Jz2aMcnRDE5UCbBjjg
b/qqOuNEaQDk+RFfCRtxdm4o+B1NqBmFBCXVDJIy/dNzF/XyoQC1JzyBo9/sfggpeE5w3tQpJKQAIeQK
rBZ6VD/otAHB/MO9NfQP21yZsgB1qXyY+3vvM8Hrk6mJf+J4+shyLnLYfDH6m93f7fMXcgiz2h0IuG5W
85vuMUK5XQKQNnB1Ev9QSkQWtRbhzJ2LRgyBPLeifGzeO9fsiNz9k9TWVPgx6WxaW3xZe/byipEBBs49
tMRFw/5E73H90g0lzBBzw5hUmDK1uieG6wU4/b/alJzqRsXSvm7s8ompfv9Cqigvy14H4ev79Ywi2aSe
YacJ25MCmAHtwYMS5/Q25aTobpQF2DM57nlRxHF+biVjYgaJzZ+6eOIUjLzobFLqBzPsMC7DggJWjzRY
y2MY1NJX97xjrkTP6zNPdWTnRieTo6d+BaHzj92uVJp3FfbkTg5pNqlguXdEMYU=
root@centos8.wangxiaochun.com
[root@centos8 ~]#ssh 10.0.0.7
Last login: Fri May 22 08:43:50 2020 from 10.0.0.1
[root@centos7 ~]#exit
logout
Connection to 10.0.0.7 closed.
[root@centos8 ~]#scp /etc/fstab 10.0.0.7:/data
fstab
#对私钥加密
[root@centos8 ~]#ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa):
Key has comment ‘root@centos8.wangxiaochun.com‘
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
[root@centos8 ~]#ssh 10.0.0.7
Enter passphrase for key ‘/root/.ssh/id_rsa‘: #输入私钥的密码
Last login: Fri May 22 08:47:50 2020 from 10.0.0.8
[root@centos7 ~]#exit
logout
Connection to 10.0.0.7 closed.
#启用ssh代理
[root@centos8 ~]#ssh-agent bash
[root@centos8 ~]#ps aux|grep agent
root ???1972 ?0.0 ?0.0 ?29440 ?548 ? ???Ss ?10:18 ?0:00 ssh-agent bash
root ???1992 ?0.0 ?0.1 ?12108 ?964 pts/0 ?S+ ?10:18 ?0:00 grep --
color=auto agent
[root@centos8 ~]#ssh-add
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (root@centos8.wangxiaochun.com)
[root@centos8 ~]#ssh 10.0.0.7
Last login: Fri May 22 08:48:55 2020 from 10.0.0.8
范例:基于key验证实现批量主机管理
[root@centos8 ~]#cat hosts.txt
10.0.0.7
10.0.0.6
[root@centos8 ~]#for i in `cat hosts.txt`;do ssh $i hostname -I ;done
10.0.0.7
10.0.0.6
范例:实现xshell的基于key验证
[root@centos8 ~]#rz -E
rz waiting to receive.
[root@centos8 ~]#ls
anaconda-ks.cfg id_rsa_1024(xshell).pub
[root@centos8 ~]#ls .ssh/
id_rsa id_rsa.pub known_hosts
[root@centos8 ~]#cat id_rsa_1024(xshell).pub > .ssh/authorized_keys
[root@centos8 ~]#ll .ssh/authorized_keys
-rw-r--r-- 1 root root 208 May 22 10:29 .ssh/authorized_keys
[root@centos8
[root@centos8 ~]#
[root@centos8 ~]#
[root@centos8 ~]#
[root@centos8 ~]#chmod 600 .ssh/authorized_keys
[root@centos8 ~]#cat .ssh/authorized_keys
ssh-rsa
AAAAB3NzaC1yc2EAAAABIwAAAIEApx77jXHjGHbFdvN/B0CrnLj/JVqXqk/pHA3MvopoYPn2My5BmnE2
alig16mjnFOr3cittPrWeR66leziHvPfGrejqgrIU9dP9RMO586GvTRufnNUGZwyqosHUjFOzvK0KDW9
xZ3FEiTobMhE12k+vPGKA+jdW1gcLdHOHhmTT+s=[root@centos8 ~]#
范例:expect实现批量基于ssh的key部署
[root@centos8 ~]#cat push_ssh_key.sh
#!/bin/bash
PASS=magedu
rpm -q expect &> /dev/null || yum -y install expect &> /dev/null
ssh-keygen ?-t rsa -P "" -f /root/.ssh/id_rsa &> /dev/null && echo "ssh key is
created"
while read IP ;do
expect &> /dev/null <<EOF ?#或者expect <<EOF ?&> /dev/null
set timeout 20
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$IP
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$PASS\n" }
}
expect eof
EOF
echo $IP is ready
done < hosts.txt
[root@centos8 ~]#cat hosts.txt
10.0.0.7
10.0.0.6
[root@centos8 ~]#bash push_ssh_key.sh
ssh key is created
10.0.0.7 is ready
10.0.0.6 is ready
[root@centos8 ~]#ssh 10.0.0.7
Last login: Fri May 22 10:19:35 2020 from 10.0.0.8
[root@centos7 ~]#exit
logout
Connection to 10.0.0.7 closed.
[root@centos8 ~]#ssh 10.0.0.6
Last login: Fri May 22 10:19:39 2020 from 10.0.0.8
[root@centos6 ~]#exit
logout
Connection to 10.0.0.6 closed.
3.3.4 其它ssh客户端工具
3.3.4.1 scp命令
-C 压缩数据流
-r 递归复制
-p 保持原文件的属性信息
-q 静默模式
-P PORT 指明remote host的监听的端口
3.3.4.2 rsync 命令
rsync工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传
输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包
注意:通信两端主机都需要安装 rsync软件
rsync ?-av /etc server1:/tmp #复制目录和目录下文件
rsync ?-av /etc/ server1:/tmp #只复制目录下文件
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留修改时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-u 如果接收者的文件比发送者的文件较新,将忽略同步
-z 压缩,节约网络带宽
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
--delete 源数据删除,目标数据也自动同步删除
3.3.4.3 sftp命令
3.3.5 ssh 高级应用
3.3.5.1 SSH 本地端口转发
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他 TCP 端口
的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”
(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,
Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传
输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,也能
够通过将 TCP 端口转发来使用 SSH 进行通讯
SSH 端口转发能够提供两大功能:
加密 SSH Client 端至 SSH Server 端之间的通讯数据
突破防火墙的限制完成一些之前无法建立的 TCP 连接
SSH本地端口转发
ssh -L localport:remotehost:remotehostport ?sshserver
-f 后台启用
-N 不打开远程shell,处于等待状态
-g 启用网关功能
范例:本地端口转发
[root@centos8 ~]#ssh -fNL 9527:10.0.0.28:80 10.0.0.18
[root@centos8 ~]#curl 127.0.0.1:9527
3.3.5.2 SSH远程端口转发
ssh -R sshserverport:remotehost:remotehostport sshserver
范例:远程端口转发并实现网关功能
[root@lan-server ~]#yum -y install httpd;systemctl start httpd;echo website On
10.0.0.28 > /var/www/html/index.html
[root@ssh-server ~]#vim /etc/ssh/sshd_config
GatewayPorts yes
root@ssh-server ~]#systemctl restart sshd
[root@ssh-client ~]#ssh -fNgR 9527:10.0.0.28:80 10.0.0.8
root@10.0.0.8‘s password:
[root@centos6 ~]#curl 10.0.0.8:9527
website On 10.0.0.28
[root@centos7 ~]#curl 10.0.0.8:9527
website On 10.0.0.28
3.3.5.3 SSH动态端口转发
#当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到
sshserver上,由sshserver替之访问internet
ssh -D 1080 root@sshserver ?-fNg
#在本机firefox设置代理socket proxy:127.0.0.1:1080
curl ?--socks5 127.0.0.1:1080 http://www.google.com
范例:动态端口转发实现上网方式1
[root@centos8 ~]#ssh -fND 9527 10.0.0.18
范例:动态端口转发实现上网方式2
[root@vps ~]#ssh -gfND 9527 10.0.0.18
[root@centos6 ~]#curl --socks5 10.0.0.18:9527 http://10.0.0.28
google On 10.0.0.28
[root@centos7 ~]#curl --socks5 10.0.0.18:9527 http://10.0.0.28
google On 10.0.0.28
3.3.5.4 X 协议转发
范例:在windows上使用mobaXtrem的X server 显示 Linux 的图形工具
[root@centos ~]#yum install xorg-x11-xauth xorg-x11-fonts-* xorg-x11-font-utils
xorg-x11-fonts-Type1 firefox
[root@centos ~]#exit
[root@centos ~]#firefox
范例:在windows上使用xshell的X server 显示 Linux 的图形工具
[root@centos ~]# export DISPLAY=10.0.0.1:0.0
[root@centos ~]# yum -y install xclock
3.3.6 ssh服务器配置
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 空闲60s 自动注销
Vim /etc/ssh/sshd_config
ClientAliveInterval ??60
ClientAliveCountMax ?0
Service sshd restart
#注意:新开一个连接才有效
范例:解决ssh登录缓慢的问题
vim /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication no
systemctl restart sshd
范例:在 ubuntu 上启用root 远程ssh登录
#修改sshd服务配置文件
vim /etc/ssh/sshd_config
#PermitRootLogin prohibit-password 注释掉此行
PermitRootLogin yes 修改为下面形式
systemctl restart sshd
ssh服务的最佳实践
建议使用非默认端口
禁止使用protocol version 1
限制可登录用户
设定空闲会话超时时长
利用防火墙设置ssh访问策略
仅监听特定的IP地址
基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12|
xargs
使用基于密钥的认证
禁止使用空密码
禁止root用户直接登录
限制ssh的访问频度和并发在线数
经常分析日志
3.4 ssh 其它相关工具
3.4.1 挂载远程ssh目录 sshfs
由EPEL源提供,目前CentOS8 还没有提供,可以利用ssh协议挂载远程目录
[root@centos7 ~]#yum install fuse-sshfs
[root@centos7 ~]#sshfs 10.0.0.8:/data /mnt
[root@centos7 ~]#df /mnt
Filesystem ??1K-blocks ?Used Available Use% Mounted on
10.0.0.8:/data ?52403200 398576 ?52004624 ?1% /mnt
3.4.2 自动登录ssh工具sshpass
由EPEL源提供,ssh登陆不能在命令行中指定密码。sshpass的出现,解决了这一问题。sshpass用于非
交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码(本机known_hosts文件中有的主机才能
生效)。它允许你用 -p 参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、
环境变量中读取。
-p password #后跟密码它允许你用 -p 参数指定明文密码,然后直接登录远程服务器
-f filename #后跟保存密码的文件名,密码是文件内容的第一行。
-e #将环境变量SSHPASS作为密码
[root@centos8 ~]# sshpass -p 123456 ssh -o StrictHostKeyChecking=no
root@10.0.0.8
[root@centos8 ~]#sshpass -p 123456 ssh -o StrictHostKeyChecking=no 10.0.0.7
hostname -I
Warning: Permanently added ‘10.0.0.7‘ (ECDSA) to the list of known hosts.
10.0.0.7
[root@centos8 ~]#sshpass -p 123456 ssh -o StrictHostKeyChecking=no 10.0.0.6
hostname -I
Warning: Permanently added ‘10.0.0.6‘ (RSA) to the list of known hosts.
10.0.0.6
[root@centos8 ~]# cat pass.txt
123456
[root@centos8 ~]# sshpass -f pass.txt ssh root@10.0.0.8
[root@centos8 ~]# export SSHPASS=123456
[root@centos8 ~]# sshpass -e ssh root@10.0.0.8
范例:批量修改多台主机的root密码为随机密码
cat change_root_password.sh
#!/bin/bash
rpm -q sshpass &> /dev/null || yum -y install sshpass
export SSHPASS=123456
NET=10.0.0
for i in {1..254};do
{
PASS=`openssl rand -base64 9`
sshpass -e ssh $NET.$i "echo $PASS|passwd --stdin root &> /dev/null"
echo $NET.$i:$PASS >> host.txt
}&
done
wait
范例:批量部署多台主机基于key验证脚本1
#!/bin/bash
NET=10.0.0
PASS=magedu
ssh-keygen ?-P "" ?-f /root/.ssh/id_rsa &> /dev/null
rpm -q sshpass &> /dev/null || yum -y install sshpass &> /dev/null
for i in {1..100};do
{
sshpass ?-p $PASS ssh-copy-id -o ?StrictHostKeyChecking=no -i
/root/.ssh/id_rsa.pub $NET.$i &> /dev/null
}&
done
wait
范例:批量部署多台主机基于key验证脚本2
[root@centos8 ~]#cat sshpass.sh
#!/bin/bash
HOSTS="
10.0.0.6
10.0.0.7
10.0.0.18
10.0.0.28
"
PASS=magedu
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
3.4.3 轻量级自动化运维工具 pssh
EPEL源中提供了多个自动化运维工具
pssh:基于python编写,可在多台服务器上执行命令的工具,也可实现文件复制,提供了基于
ssh和scp的多个并行工具,项目:http://code.google.com/p/parallel-ssh/, CentOS8上目前没提
供
pdsh:Parallel remote shell program,是一个多线程远程shell客户端,可以并行执行多个远程
主机上的命令。 可使用几种不同的远程shell服务,包括rsh,Kerberos IV和ssh,项目: https://
pdsh.googlecode.com/
mussh:Multihost SSH wrapper,是一个shell脚本,允许使用命令在多个主机上通过ssh执行命
令。 可使用ssh-agent和RSA/DSA密钥,以减少输入密码,项目:http://www.sourceforge.net/p
rojects/mussh
pssh 命令选项如下:
-H:主机字符串,内容格式”[user@]host[:port]”
-h file:主机列表文件,内容格式”[user@]host[:port]”
-A:手动输入密码模式
-i:每个服务器内部处理信息输出
-l:登录使用的用户名
-p:并发的线程数【可选】
-o:输出的文件目录【可选】
-e:错误输出文件【可选】
-t:TIMEOUT 超时时间设置,0无限制【可选】
-O:SSH的选项
-P:打印出服务器返回信息
-v:详细模式
--version:查看版本
#默认使用ssh的key认证,通过 -A选项,使用密码认证批量执行指令
pssh -H "192.168.1.10" ?-A ?hostname
#输出信息
pssh -H wang@192.168.1.10 ?-A -i hostname
#通过pssh批量关闭seLinux
pssh -H root@192.168.1.10 ?-i ‘sed -i "s/^SELINUX=.*/SELINUX=disabled/"
/etc/selinux/config’
#多台主机
pssh -H "192.168.1.10 192.168.1.20" ?-i ?hostname
??????????
#多台主机
cat hosts.txt
10.0.0.8
10.0.0.6
pssh -h hosts.txt ?-i ?hostname
#将标准错误和标准正确重定向分别保存至本地主机的/data/stdout和/data/stderr目录下
pssh -H 192.168.1.10 -o /data/stdout -e /data/stderr ?-i “hostname”
#变量需要加单引号引起来
[root@centos7 ~]#cat hosts.txt
10.0.0.8
10.0.0.6
[root@centos7 ~]#pssh -h hosts.txt -i echo $HOSTNAME
[1] 16:47:00 [SUCCESS] 10.0.0.6
centos7.wangxiaochun.com
[2] 16:47:01 [SUCCESS] 10.0.0.8
centos7.wangxiaochun.com
[root@centos7 ~]#pssh -h hosts.txt -i ‘echo $HOSTNAME‘
[1] 16:48:05 [SUCCESS] 10.0.0.6
centos6.localdomain
[2] 16:48:05 [SUCCESS] 10.0.0.8
centos8.localdomain
#*需要用双或单引号引起来
[root@centos7 ~]#pssh -h hosts.txt -i ls /data/*
[1] 16:48:29 [FAILURE] 10.0.0.6 Exited with error code 2
Stderr: ls: cannot access /data/10.0.0.6: No such file or directory
ls: cannot access /data/10.0.0.8: No such file or directory
[2] 16:48:29 [FAILURE] 10.0.0.8 Exited with error code 2
Stderr: ls: cannot access ‘/data/10.0.0.6‘: No such file or directory
ls: cannot access ‘/data/10.0.0.8‘: No such file or directory
[root@centos7 ~]#pssh -h hosts.txt -i ‘ls /data/*‘
[1] 16:48:47 [SUCCESS] 10.0.0.6
[2] 16:48:47 [SUCCESS] 10.0.0.8
/data/centos7.log
/data/f1.txt
/data/f2.txt
/data/host_pass.txt
pscp.pssh命令
pscp.pssh功能是将本地文件批量复制到远程主机
pscp-pssh选项
-v 显示复制过程
-r 递归复制目录
#将本地curl.sh 复制到/app/目录
pscp.pssh -H 192.168.1.10 /root/test/curl.sh ?/app/
pscp.pssh -h host.txt /root/test/curl.sh ?/app/
#将本地多个文件批量复制到/app/目录
pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh ?/app/
#将本地目录批量复制到/app/目录
pscp.pssh -H 192.168.1.10 ?-r /root/test/ ?/app/
pslurp命令
pslurp功能是将远程主机的文件批量复制到本地
-L 指定从远程主机下载到本机的存储的目录,local是下载到本地后的名称
-r 递归复制目录
#批量下载目标服务器的passwd文件至/app下,并更名为user
pslurp -H 192.168.1.10 -L /app /etc/passwd user
[root@centos7 ~]#pslurp -h hosts.txt -L /data/ /etc/redhat-release version
[1] 17:50:57 [SUCCESS] 10.0.0.6
[2] 17:50:57 [SUCCESS] 10.0.0.8
[root@centos7 ~]#tree /data
/data
├── 10.0.0.6
│??└── version
└── 10.0.0.8
?└── version
2 directories, 2 files
3.5 dropbear
由Matt Johnston所开发的Secure Shell软件。Dropbear是一个相对较小的SSH服务器和客户端。它运
行在一个基于POSIX的各种平台。 Dropbear是开源软件,在麻省理工学院式的许可证。 Dropbear是特
别有用的“嵌入”式的Linux(或其他Unix)系统,如无线路由器,期望在存储器与运算能力有限的情况
下取代OpenSSH,尤其是嵌入式系统
官网:http://matt.ucc.asn.au/dropbear/dropbear.html
范例:编译安装dropbear
#安装相关包:
[root@centos8 ~]#yum install gcc zlib-devel
#下载
[root@centos8 ~]#wget http://matt.ucc.asn.au/dropbear/releases/dropbear-
2019.78.tar.bz2
[root@centos8 ~]#tar xf dropbear-2019.78.tar.bz2
#编译安装
[root@centos8 ~]#cd dropbear-2019.78/
[root@centos8 dropbear-2019.78]#less INSTALL README
[root@centos8 dropbear-2019.78]#./configure --prefix=/apps/dropbear --
sysconfdir=/etc/dropbear
[root@centos8 dropbear-2019.78]#make PROGRAMS="dropbear dbclient dropbearkey
dropbearconvert scp"
[root@centos8 dropbear-2019.78]#make PROGRAMS="dropbear dbclient dropbearkey
dropbearconvert scp" install
[root@centos8 dropbear-2019.78]#tree /apps/
/apps/
└── dropbear
?├── bin
?│??├── dbclient
?│??├── dropbearconvert
?│??├── dropbearkey
?│??└── scp
?├── sbin
?│??└── dropbear
?└── share
???└── man
?????├── man1
?????│??├── dbclient.1
?????│??├── dropbearconvert.1
?????│??└── dropbearkey.1
?????└── man8
???????└── dropbear.8
7 directories, 9 files
#配置PATH变量
[root@centos8 ~]#echo ‘PATH=/apps/dropbear/sbin:/apps/dropbear/bin:$PATH‘ >
/etc/profile.d/dropbear.sh
#生成私钥
[root@centos8 ~]#/apps/dropbear/sbin -h
[root@centos8 ~]#mkdir /etc/dropbear
[root@centos8 ~]#dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s
2048
[root@centos8 ~]#dropbearkey -t dss -f /etc/dropbear/dropbear_dsa_host_key
#启动ssh服务:
[root@centos8 ~]#dropbear -p :2222 -FE ?#前台运行,相当于sshd
[root@centos8 ~]#dropbear -p :2222 #后台运行
客户端访问:
[root@centos8 ~]#ssh -p 2222 root@127.0.0.1
[root@centos8 ~]#dbclient -p 2222 root@127.0.0.1 #相当于ssh
4 文件完整性检查AIDE(Advanced Intrusion Detection Environment)
目前就系统完整性检查的工具用的比较多的有两款:Tripwire和AIDE,前者是一款商业软件,后者是一款免费的但功
能也很强大的工具
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
配置范例:
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的库:
aide -i | --init
生成检查数据库(建议初始数据库存放到安全的地方)
cd /var/lib/aide
mv aide.db.new.gz aide.db.gz
检测
aide -C | --check
更新数据库
aide -u | --update
5 利用 sudo 实现授权
5.1 sudo 介绍
sudo特性:
sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系
管理员
sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志
服务器
sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得
了一张存活期为5分钟的票
sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。
它所存放的位置默认是在/etc/sudoers,属性必须为0440
5.2 sudo 组成
配置文件:/etc/sudo.conf
授权规则配置文件:
/etc/sudoers
/etc/sudoers.d
安全编辑授权规则文件和语法检查工具
#检查语法
visudo -c
#检查指定配置文件语法
visudo -f /etc/sudoers.d/test
授权编辑规则文件的工具:/usr/bin/sudoedit
执行授权命令:/usr/bin/sudo
时间戳文件:/var/db/sudo
日志文件:/var/log/secure
5.3 sudo 命令
sudo命令
ls -l /usr/bin/sudo
sudo –i –u wang 切换身份
sudo [-u user] COMMAND
-V 显示版本信息等配置信息
-u user 默认为root
-l,ll 列出用户在主机上可用的和被禁止的命令
-v 再延长密码有效期限5分钟,更新时间戳
-k 清除时间戳(1970-01-01),下次需要重新输密码
-K 与-k类似,还要删除时间戳文件
-b 在后台执行指令
-p 改变询问密码的提示符号
示例:-p "password on %h for user %p: "
5.4 sudo 授权规则配置
配置文件格式说明:/etc/sudoers, /etc/sudoers.d/
配置文件中支持使用通配符 glob
? 任意单一字符
* 匹配任意长度字符
[wxc] 匹配其中一个字符
[!wxc] 除了这三个字符的其它字符
\x 转义
[[alpha]] 字母
配置文件规则有两类
1、别名定义:不是必须的
2、授权规则:必须的
sudoers 授权规则格式:
用户 登入主机=(代表用户) 命令
user host=(runas) command
user: 运行命令者的身份
host: 通过哪些主机
(runas):以哪个用户的身份
command: 运行哪些命令
5.5 实战案例
案例10:修改验证密码间隔为2分钟
[root@centos8 ~]#vim /etc/sudoers
Defaults ?env_reset , timestamp_timeout=2
[root@centos8 ~]#sudo -V
......
Authentication timestamp timeout: 2.0 minutes......
范例11:ubuntu 默认用户具有sudo权限
root@ubuntu1804:~# grep %sudo /etc/sudoers
%sudo ALL=(ALL:ALL) ALL
root@ubuntu1804:~# id wang
uid=1000(wang) gid=1000(wang)
groups=1000(wang),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd),113(lpa
dmin),114(sambashare)
#默认的用户wang 属于此sudo组,所以wang有所有权限
范例12: 修改ubuntu的visudo的默认编辑器
root@ubuntu1804:~# export EDITOR=vim
root@ubuntu1804:~# visudo
范例:删除时间戳文件
[root@centos8 ~]#su - wang
Last login: Mon May 25 10:28:14 CST 2020 on pts/1
[wang@centos8 ~]$sudo -K
[wang@centos8 ~]$exit
logout
[root@centos8 ~]#ll /run/sudo/ts
total 4
-rw------- 1 root mage 112 May 25 10:11 mage
范例:修改sudo 提示符格式
[wang@centos8 ~]$sudo cat /var/log/messages
[sudo] password for wang:
[wang@centos8 ~]$sudo -p "password on %h for user %p: " cat /var/log/messages
password on centos8 for user wang:
6 PAM认证机制
6.1 PAM 介绍
认证库:文本文件,MySQL,NIS,LDAP等
PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认
证相关的通用框架机制。PAM 只关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一
的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服
务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证
6.2 PAM架构
PAM提供了对所有服务进行认证的中央机制,适用于本地登录,远程登录,如:telnet,rlogin,fsh,ftp,点
对点协议PPP,su等应用程序中,系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;
应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模
块的开发者则利用PAM SPI来编写模块(主要调用函数pam_sm_xxxx( )供PAM接口库调用,将不同的认
证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联
系起来
6.3 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.4 PAM工作原理
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
PAM认证首先要确定那一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证
文件(位于/lib64/security下)进行安全认证
PAM认证过程示例:
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.5 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: 用来传递给该模块的参数
模块类型(module-type)
Auth 账号的认证和授权
Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务
的访问时间,限制用户的位置(例如:root用户只能从控制台登录)
Password 用户修改密码时密码复杂度检查机制等功能
Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等
-type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有
用
Control:
required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败
结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,=再将失败结果返回
给应用程序,即为必要条件
requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执
行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其
它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的required和requisite
optional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽
略
include: 调用其他的配置文件中定义的配置信息
module-path:
模块文件所在绝对路径:
模块文件所在相对路径:/lib64/security目录下的模块可使用相对路径,如:pam_shells.so、
pam_limits.so
有些模块有自已的专有配置文件,在/etc/security/*.conf目 录下
Arguments
debug :该模块应当用syslog( )将调试信息写入到系统日志文件中
no_warn :表明该模块不应把警告信息发送给应用程序
use_first_pass :该模块不能提示用户输入密码,只能从前一个模块得到输入密码
try_first_pass :该模块首先用前一个模块从用户得到密码,如果该密码验证不通过,再提示用户
输入新密码
use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码
expose_account 允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏
用户名会对安全造成一定程度的威胁
注意:修改PAM配置文件将马上生效
建议:编辑pam规则时,保持至少打开一个root会话,以防止root身份验证错误
6.6 PAM模块帮助
官方在线文档:http://www.linux-pam.org/Linux-PAM-html/
官方离线文档:http://www.linux-pam.org/documentation/
pam模块文档说明:/user/share/doc/pam-*
rpm -qd pam
man –k pam_
man 模块名 如:man 8 rootok
6.7 常用PAM模块
6.7.1 pam_shells 模块
案例:不允许使用/bin/csh的用户本地登录
[root@centos8 ~]#yum -y install csh
[root@centos8 ~]#vim /etc/pam.d/login
auth required pam_shells.so
[root@centos8 ~]#vim /etc/shells
去掉 /bin/csh
[root@centos8 ~]#useradd –s /bin/csh testuser
#testuser将不可登录
[root@centos8 ~]#tail /var/log/secure
6.7.2 pam_securetty.so模块
功能:只允许root用户在/etc/securetty列出的安全终端上登陆
案例:CentOS7 允许root在telnet登陆
注意:CentOS8没有调用此模块,所以默认允许root远程登录telnet
vi /etc/pam.d/remote
#将下面一行加上注释
#auth required pam_securetty.so
#或者/etc/securetty文件中加入
pts/0,pts/1…pts/n
#测试用root telnet登录
案例:在CentOS8上实现pam_securetty.so模块禁止root远程登录telnet服务
#默认CentOS8 允许root远程telnet登录
[root@centos7 ~]#telnet 10.0.0.8
Trying 10.0.0.8...
Connected to 10.0.0.8.
Escape character is ‘^]‘.
Kernel 4.18.0-147.el8.x86_64 on an x86_64
centos8 login: root
Password:
Last login: Mon May 25 11:51:08 from 10.0.0.1
[root@centos8 ~]#
#修改配置不允许root远程telnet登录
[root@centos8 ~]#vim /etc/pam.d/remote
#%PAM-1.0
auth ???required ??pam_securetty.so
[root@centos7 ~]#scp /etc/securetty 10.0.0.8:/etc
#测试
[root@centos7 ~]#telnet 10.0.0.8
Trying 10.0.0.8...
Connected to 10.0.0.8.
Escape character is ‘^]‘.
Kernel 4.18.0-147.el8.x86_64 on an x86_64
centos8 login: wang
Password:
Last login: Mon May 25 12:06:21 from ::ffff:10.0.0.6
[wang@centos8 ~]$exit
logout
Connection closed by foreign host.
[root@centos7 ~]#telnet 10.0.0.8
Trying 10.0.0.8...
Connected to 10.0.0.8.
Escape character is ‘^]‘.
Kernel 4.18.0-147.el8.x86_64 on an x86_64
centos8 login: root
Password:
Login incorrect
centos8 login:
6.7.3 pam_nologin.so 模块
功能:如果/etc/nologin文件存在,将导致非root用户不能登陆,当该用户登陆时,会显示/etc/nologin文
件内容,并拒绝登陆
6.7.4 pam_limits.so模块
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用
内存空间
修改限制的实现方式:
(1) ulimit命令,立即生效,但无法保存
-n ?每个进程最多的打开的文件描述符个数
-u ?最大用户进程数
-S ?使用 soft(软)资源限制
-H ?使用 hard(硬)资源限制
(2) 配置文件:
/etc/security/limits.conf
/etc/security/limits.d/*.conf
配置文件格式:
#每行一个定义
<domain> ???<type> <item> <value>
应用于哪些对象
Username 单个用户
@group 组内所有用户
* 所有用户
% 仅用于限制 maxlogins limit , 可以使用 %group 语法. 只用 % 相当于 * 对所有用户
maxsyslogins limit限制. %group 表示限制此组中的所有用户总的最大登录数
限制的类型
Soft 软限制,普通用户自己可以修改
Hard 硬限制,由root用户设定,且通过kernel强制生效
- 二者同时限定
限制的资源
nofile 所能够同时打开的最大文件数量,默认为1024
nproc 所能够同时运行的进程的最大数量,默认为1024
案例:ulimit命令修改用户打开的文件个数
[root@centos8 ~]#ulimit -n
1024
[root@centos8 ~]#ulimit -n 1048577
-bash: ulimit: open files: cannot modify limit: Operation not permitted
[root@centos8 ~]#ulimit -n 1048576
[root@centos8 ~]#ulimit -a
[root@centos8 ~]#echo 2^20|bc
1048576
案例:限制用户最多打开的文件数和运行进程数,并持久保存
cat /etc/pam.d/system-auth
session ??required ??pam_limits.so
vim /etc/security/limits.conf
#用户apache可打开10240个文件
apache – nofile 10240
#用户student不能运行超过20个进程
student hard nproc 10
#用student登录多次运行bash,观察结果
[root@centos8 ~]#vim /etc/security/limits.conf
wang ?????- ??nofile 66666
wang ?????- ??nproc ?5
mage ?????- ??nofile 88888
[root@centos8 ~]#su - wang
Last login: Mon May 25 14:40:38 CST 2020 on pts/0
[wang@centos8 ~]$ulimit ?-n
66666
案例:限制mage用户最大的同时登录次数
[root@centos8 ~]#tail -n1 /etc/security/limits.conf
mage ????- ??maxlogins ?2
[root@centos8 ~]#who
mage ??tty1 ????2020-05-25 14:35
root ??pts/0 ???2020-05-25 14:35 (10.0.0.1)
root ??pts/3 ???2020-05-25 14:06 (10.0.0.1)
mage ??tty3 ????2020-05-25 14:35
生产案例
vim /etc/security/limits.conf
* ??- ?core ???unlimited
* ??- ?nproc ???1000000
* ??- ?nofile ???1000000
* ??- ?memlock ??32000
* ??- ?msgqueue ??8192000
6.7.5 pam_succeed_if 模块
功能:根据参数中的所有条件都满足才返回成功
案例:ubuntu默认不允许root登录桌面图形
用root登录桌面失败,查看日志,可看到Pam原因
Vim /etc/pam.d/gdm-passwd
#将下面行注释
#auth requried pam_succeed_if.so user !=root quiet_success
6.8.6 pam_google_authenticator模块
功能:实现SSH登录的两次身份验证,先验证APP的数字码,再验证root用户的密码,都通过才可以登
录。目前只支持口令验证,不支持基于key验证
官方网站:https://github.com/google/google-authenticator-android
范例:
1. 在手机应用市场搜索:身份验证器或authenticator,并安装APP
2. 运行脚本(需要联网EPEL源),本质是修改了/etc/pam.d/sshd文件,将google的PAM模块加入进去实
现
[root@centos8 ~]#dnf info google-authenticator
[root@centos8 ~]#bash google-authenticator.sh
3. 访问生成的url(需要上网):
https://www.google.com/chart?
chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/root@centos8.localdomain%3Fsecret
%3D7YTAL4GW3TND7BICUMJGJLIFVE%26issuer%3Dcentos8.localdomain
4. 打开用身份验证器APP,扫网页上的二维码,进行绑定手机
5. 继续上面的安装配置向导,输入手机APP上的数字,后续都回答 y 即可
Failed to use libqrencode to show QR code visually for scanning.
Consider typing the OTP secret into your app manually.
Your new secret key is: 7YTAL4GW3TND7BICUMJGJLIFVE
Enter code from app (-1 to skip): 224421 ?#手机APP上的数字
Code confirmed
Your emergency scratch codes are:
?68820657
?77385307
?50928320
?41000243
?54628309
6. ssh 当前主机,可看到提示,输入手机APP上显示的数字码和root密码,可以登录,否则失败
[root@centos7 ~]#ssh 10.0.0.8
Verification code:
Password:
Last failed login: Fri Feb ?7 12:11:12 CST 2020 from 10.0.0.7 on ssh:notty
There were 6 failed login attempts since the last successful login.
Last login: Fri Feb ?7 12:09:47 2020 from 10.0.0.7
[root@centos8 ~]#
7. 临时口令存放在/root/.google_authenticator中,用一次删除一个,可手动加入使用
[root@centos8 ~]#cat .google_authenticator
7YTAL4GW3TND7BICUMJGJLIFVE
" RATE_LIMIT 3 30
" WINDOW_SIZE 17
" DISALLOW_REUSE
" TOTP_AUTH
68820657
77385307
50928320
41000243
54628309
[root@centos8 ~]#
范例:安装配置脚本
cat google-authenticator.sh
#安装epel
yum install -y epel-release.noarch
yum makecache
#安装google authenticator
yum install -y google-authenticator.x86_64
echo -e "\033[31mDo you want me to update your "/root/.google_authenticator"
file? (y/n) y"
echo -e "\033[31m你希望我更新你的“/root/.google_authenticator”文件吗(y/n)?\033[0m"
echo -e "\033[31mDo you want to disallow multiple uses of the same
authentication"
echo -e "\033[31mtoken? This restricts you to one login about every 30s, but it
increases"
echo -e "\033[31myour chances to notice or even prevent man-in-the-middle
attacks (y/n) y"
echo -e "\033[31m你希望禁止多次使用同一个验证令牌吗?这限制你每次登录的时间大约是30秒, 但是
这加大了发现或甚至防止中间人攻击的可能性(y/n)?\033[0m"
echo -e "\033[31mBy default, a new token is generated every 30 seconds by the
mobile app."
echo -e "\033[31mIn order to compensate for possible time-skew between the
client and the server,"
echo -e "\033[31mwe allow an extra token before and after the current time. This
allows for a"
echo -e "\033[31mtime skew of up to 30 seconds between authentication server and
client. If you"
echo -e "\033[31mexperience problems with poor time synchronization, you can
increase the window"
echo -e "\033[31mfrom its default size of 3 permitted codes (one previous code,
the current"
echo -e "\033[31mcode, the next code) to 17 permitted codes (the 8 previous
codes, the current"
echo -e "\033[31mcode, and the 8 next codes). This will permit for a time skew
of up to 4 minutes"
echo -e "\033[31mbetween client and server."
echo -e "\033[31mDo you want to do so? (y/n) y"
echo -e "\033[31m默认情况下,令牌保持30秒有效;为了补偿客户机与服务器之间可能存在的时滞,
\033[0m"
echo -e "\033[31m我们允许在当前时间前后有一个额外令牌。如果你在时间同步方面遇到了问题, 可以
增加窗口从默认的3个可通过验证码增加到17个可通过验证码,\033[0m"
echo -e "\033[31m这将允许客户机与服务器之间的时差增加到4分钟。你希望这么做吗(y/n)?\033[0m"
echo -e "\033[31mIf the computer that you are logging into isn‘t hardened
against brute-force"
echo -e "\033[31mlogin attempts, you can enable rate-limiting for the
authentication module."
echo -e "\033[31mBy default, this limits attackers to no more than 3 login
attempts every 30s."
echo -e "\033[31mDo you want to enable rate-limiting? (y/n) y"
echo -e "\033[31m如果你登录的那台计算机没有经过固化,以防范运用蛮力的登录企图,可以对验证模块
\033[0m"
echo -e "\033[31m启用尝试次数限制。默认情况下,这限制攻击者每30秒试图登录的次数只有3次。 你
希望启用尝试次数限制吗(y/n)?\033[0m"
echo -e "\033[32m 在App Store 搜索Google Authenticator 进行App安装 \033[0m"
google-authenticator
#/etc/pam.d/sshd文件,修改或添加下行保存
#auth required pam_google_authenticator.so
sed -i ‘1a\auth ???required ??pam_google_authenticator.so‘ /etc/pam.d/sshd
#编辑/etc/ssh/sshd_config找到下行
#ChallengeResponseAuthentication no
#更改为
#ChallengeResponseAuthentication yes
sed -i ‘s/.*ChallengeResponseAuthentication.*/ChallengeResponseAuthentication
yes/‘ /etc/ssh/sshd_config
#重启SSH服务
service sshd restart
7 时间同步服务
加密和安全当前都离不开时间的同步,否则各种网络服务可能不能正常运行
7.1 计时方式
7.1.1 古代计时方式
7.1.2 现代计时方式
范例:一次性的同步
[root@centos7 ~]#date -s ‘-1 year‘
Sat May 25 16:26:13 CST 2019
[root@centos7 ~]#date
Sat May 25 16:26:14 CST 2019
[root@centos7 ~]#ping ntp.aliyun.com
PING ntp.aliyun.com (203.107.6.88) 56(84) bytes of data.
64 bytes from 203.107.6.88 (203.107.6.88): icmp_seq=1 ttl=128 time=16.6 ms
64 bytes from 203.107.6.88 (203.107.6.88): icmp_seq=2 ttl=128 time=16.8 ms
^C
--- ntp.aliyun.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 16.607/16.706/16.806/0.163 ms
[root@centos7 ~]#ntpdate ntp.aliyun.com
25 May 16:26:30 ntpdate[24545]: step time server 203.107.6.88 offset
31622399.992886 sec
[root@centos7 ~]#date
Mon May 25 16:26:34 CST 2020
[root@centos7 ~]#ntpdate time.windows.com
25 May 16:32:34 ntpdate[24565]: step time server 52.231.114.183 offset
31622399.981666 sec
[root@centos7 ~]#date
Mon May 25 16:32:39 CST 202
7.2 时间同步服务
时间同步服务
多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协
议,日志,集群等, 利用NTP(Network Time Protocol) 协议使网络中的各个计算机时间达到同步。
目前NTP协议属于运维基础架构中必备的基本服务之一
时间同步软件实现:
ntp
chrony
ntp:
将系统时钟和世界协调时UTC同步,精度在局域网内可达0.1ms,在互联网上绝大多数的地方精度可以
达到1-50ms
项目官网:http://www.ntp.org
chrony:
实现NTP协议的的自由软件。可使系统时钟与NTP服务器,参考时钟(例如GPS接收器)以及使用手表
和键盘的手动输入进行同步。还可以作为NTPv4(RFC 5905)服务器和对等体运行,为网络中的计算机
提供时间服务。设计用于在各种条件下良好运行,包括间歇性和高度拥挤的网络连接,温度变化(计算
机时钟对温度敏感),以及不能连续运行或在虚拟机上运行的系统。
通过Internet同步的两台机器之间的典型精度在几毫秒之内,在LAN上,精度通常为几十微秒。利用硬
件时间戳或硬件参考时钟,可实现亚微秒的精度
7.3 chrony
7.3.1 chrony介绍
chrony 的优势:
更快的同步只需要数分钟而非数小时时间,从而最大程度减少了时间和频率误差,对于并非全天
24 小时运行的虚拟计算机而言非常有用
能够更好地响应时钟频率的快速变化,对于具备不稳定时钟的虚拟机或导致时钟频率发生变化的节
能技术而言非常有用
在初始同步后,它不会停止时钟,以防对需要系统时间保持单调的应用程序造成影响
在应对临时非对称延迟时(例如,在大规模下载造成链接饱和时)提供了更好的稳定性
无需对服务器进行定期轮询,因此具备间歇性网络连接的系统仍然可以快速同步时钟
chrony官网:https://chrony.tuxfamily.org
chrony官方文档:https://chrony.tuxfamily.org/documentation.html
7.3.2 chrony 文件组成
两个主要程序:chronyd和chronyc
chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算
机增减时间的比率,并对此进行补偿
chronyc:命令行用户工具,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计
算机上工作,也可在一台不同的远程计算机上工作
服务unit 文件: /usr/lib/systemd/system/chronyd.service
监听端口: 323/udp,123/udp
配置文件: /etc/chrony.conf
7.3.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.3.4 chronyc命令
help 命令可以查看更多chronyc的交互命令
accheck 检查是否对特定主机可访问当前服务器
activity 显示有多少NTP源在线/离线
sources [-v] ?显示当前时间源的同步信息
sourcestats [-v]显示当前时间源的同步统计信息
add server 手动添加一台新的NTP服务器
clients 报告已访问本服务器的客户端列表
delete 手动移除NTP服务器或对等服务器
settime 手动设置守护进程时间
tracking 显示系统时间信息
7.3.5 公共NTP服务
pool.ntp.org:项目是一个提供可靠易用的NTP服务的虚拟集群cn.pool.ntp.org,0-
3.cn.pool.ntp.org
阿里云公共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
7.3.6 时间工具
timedatectl 时间和时区管理
查看日期时间、时区及NTP状态:timedatectl
查看时区列表:timedatectl list-timezones
修改时区:timedatectl set-timezone Asia/Shanghai
修改日期时间:timedatectl set-time "2017-01-23 10:30:00"
开启NTP: timedatectl set-ntp true/false
ntpdate 时间同步命令
system-config-date:图形化配置chrony服务的工具
8 TCP Warpper
8.1 TCP_Wrappers介绍
8.2 TCP_Wrappers的使用
8.3 测试工具tcpdmatch
9 SELinux
9.1 SELinux 介绍和工作原理
9.1.1 SELinux 介绍
9.1.2 SELinux 相关概念
9.1.3 SELinux有四种工作类型
9.1.4 SELinux安全上下文
9.2 启用和禁用SELinux
9.3 管理文件安全标签
9.4 管理端口标签
9.5 管理SELinux布尔值开关
9.6 管理日志
9.7 查看SELinux帮助
原文:https://www.cnblogs.com/zhaihongyu/p/12996834.html