本章概要
安全机制
关于数据安全
安全算法
对称加密算法
非对称加密算法
非对称加密详解
总结:
数据传输无外乎两方面内容:1、数据的安全传输 2、数据的来源可靠
假设A和B进行通信,A用B的公钥加密数据,该数据只能由B用自己的私钥机密,这就确定了数据的安全传输。
而数据签名是A用自己的私钥加密数据,B如果能用A的公钥解密,即可确定数据来源为A,这就确保了数据来源的可信度。
单项散列(哈希算法)
应用程序:RPM
使用gpg实现对称加密
使用gpg工具实现公钥加密
中间人攻击流程
client端向server端请求公钥,中间人截获该请求,向server端请求公钥
server端把真公钥发送给CLIENT端,中间人截获真公钥,把自己的假公钥发送给client端
client端使用假公钥加密数据发送给server端,中间人截获由假公钥加密的数据,用自己的私钥解密数据并篡改,再用真公钥加密把假的数据发送给server端
server端使用真公钥加密加密数据再次发送给client端,中间人截获数据后进行篡改,然后使用自己的假公钥加密数据,发送给client端,而此时client端看到的数据则为中间人篡改后的数据
这样,中间人就获取到了A和B通信的信息
存在问题:此过程说明了公钥的传输仍然存在着漏洞
解决方法:采用权威认证机构发布的CA认证证书传递公钥
采用CA公钥传递过程
A和B通讯,寻找可信的权威机构
A把自己的公钥发送给CA,CA拥有自己的公钥和私钥,通过审核后,CA用自己的私钥对A的公钥做数字签名(除了数字签名还包括CA信息,A的信息、有效期),这些信息就是所谓的CA证书,CA把此证书颁发给A;
此时,假设B已经获取CA的公钥信息,那么通过解密证书文件,即可获取A的公钥信息;以此类推,A通过CA证书获取B的公钥信息最权威的CA证书颁发机构根CA(顶层CA)有自己的公钥和私钥;子CA通过向根CA申请获取证书,在上述过程中,假设B获得CA公钥信息,此时A和B获取的CA公钥为根CA颁发的公钥,此公钥是必须可信的,因此确保了CA公钥的可信度
在安装windows系统时,知名机构的公钥已经被安装在系统中,即获取了根CA的公钥,那么子CA颁发的证书也就确保了可信度
CA和证书
证书获取
安全协议
重放:不解密数据,把数据截取下来重新发送该数据,利用截取的数据假冒数据发送方把数据发送给接收方以获取其信息
https工作过程
openssl
opensll命令实现加密
[root@centos7-1 data]#md5sum fstab
961c41cf7e266c35a8acb08022c3fd0a fstab
[root@centos7-1 data]#openssl dgst -md5 fstab
MD5(fstab)= 961c41cf7e266c35a8acb08022c3fd0a
算法一致,结果也一致
[root@centos7-1 data]#openssl dgst -sha fstab
SHA(fstab)= 732fb007d706f6410b3b9e6189ebf5c4053e4102
[root@centos7-1 data]#openssl dgst -sha1 fstab
SHA1(fstab)= 6de655ee1b0a7cbfce29d244dba56a990b7b79df
注意sha算法中,sha算法和sha1算法不同
openssl passwd -l 输入密码,生成加密的随机字符,由于加的盐不同,即使密码相同,生成的字符串也不相同
[root@centos7-1 data]#openssl passwd -1
Password:
Verifying - Password:
$1$6xpH2Wqj$i7MsvvvrzmAZrVG1tfd8K1
[root@centos7-1 data]#openssl passwd -1
Password:
Verifying - Password:
$1$2rhWY8eg$PUrw57YH.8ifw9g1tFykQ0
可以通过指定盐,相同的密码会生成相同的随机字符串
[root@centos7-1 data]#openssl passwd -1 -salt 1$2rhWY8eg
Password:
$1$1rhWY8eg$Xr3rR0UjxAthuQtJwdVp/.
[root@centos7-1 data]#openssl passwd -1 -salt 1$2rhWY8eg
Password:
$1$1rhWY8eg$Xr3rR0UjxAthuQtJwdVp/.
base64编码详解:
openssl rand -base64 N 生成N字节的随机数
基于base64生成的随机数,64为2^6
一个字节占8位,如果N*8能够被6整除,那么生成的随机数后不带=号(当随机数不够时,会使用=号占位),如果N*8不能被6整除,则生成的随机数后会有=号补全
[root@centos7-1 data]#openssl rand -base64 3 3*8=24,能够被6整除
1hBC
[root@centos7-1 data]#openssl rand -base64 6 6*8=48,能够被6整除
CWXZ8A7Z
[root@centos7-1 data]#openssl rand -base64 5 5*8=40,不能够被6整除
l6y7GxA=
[root@centos7-1 data]#openssl rand -base64 11
ghFJ452U9n2kV6k=
base64编码,使用64个字符表示系统中的二进制
64字符 对应二进制(这里用十进制表示,方便理解)
A-Z 0-25
a-z 26-51
0-9 52-61
+ 62
/ 63
[root@centos7-1 data]#echo -n "ab"|base64
YWI=
如a,十进制为97,二进制为01100001
如b 98 01100010
64为2^6,即使用6位表示
二进制: 011000 01 0110 0010 00 以6位分割,最后缺少两位用00补齐
十进制: 24 22 8
base64编码: Y W I= 根据64字符与二进制对应表得出
由于二进制最后两位没有,是补出来的,因此base64编码中在I后加上=号,即YWI=
[root@centos7-1 data]#echo -n "abc"|base64
YWJj
二进制: 011000 01 0110 0010 011 00011 00
十进制: 24 22 9 35
base64编码: Y W J j
abc,一个字符占8位,三个字符24位,能够被6整除,因此base64编码中没有=号,而YWJj用同样的计算方法可以计算得出
openssl
搭建私有CA需要用到关键配置文件/etc/pki/tls/openssl.cnf
####################################################################
[ ca ]
default_ca = CA_default # The default ca section CA没有明确指定的情况下,使用CA_default
####################################################################
[ CA_default ] CA_default中的各选项定义
dir = /etc/pki/CA # Where everything is kept CA的工作目录,由openssl软件包生成
certs = $dir/certs # Where the issued certs are kept 保存发布的证书列表
crl_dir = $dir/crl # Where the issued crl are kept 保存吊销的证书列表
database = $dir/index.txt # database index file. 证书的索引数据库,存放已颁发证书的相关信息,该文件默认不存在,需要手动创建,CA颁发证书后,会自动在该文件写入数据
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs. 存放新颁发的证书
certificate = $dir/cacert.pem # The CA certificate 保存根CA证书,即自签名证书
serial = $dir/serial # The current serial number 保存下一个要颁发证书的编号
crlnumber = $dir/crlnumber # the current crl number 保存下一个被吊销证书的编号
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL 保存证书吊销列表
private_key = $dir/private/cakey.pem# The private key 保存私钥文件,且该文件必须被命名为cakey.pem
default_days = 365 # how long to certify for 证书默认有效期
default_crl_days= 30 # how long before next CRL 吊销证书列表每30天发布一次
default_md = sha256 # use SHA-256 by default 默认使用算法
preserve = no # keep passed DN ordering
policy = policy_match 策略默认使用policy_match
# For the CA policy
[ policy_match ]
countryName = match 国家
stateOrProvinceName = match 省
organizationName = match 公司名称
organizationalUnitName = optional 组织部门
commonName = supplied 证书用途(给哪个网站使用),必须提供
emailAddress = optional 邮箱
注意:policy_match策略要求国家、省、公司名称必须相同,其他项可以不同
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ] policy_anything策略允许每项都不相同
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied 该选项必须提供
emailAddress = optional
注意:policy_anything策略各选项不必相同
创建CA和申请证书
知识扩展:
如果再次申请CA证书,申请证书填写的信息(国家、省、公司名称)与根CA证书信息不一致,将出现以下错误信息:
The stateOrProvinceName field needed to be the same in the
CA certificate (xxxx) and the request (xxxx)
解决方法:
更改/etc/pki/tls/openssl.cnf配置文件
方法1:把policy_match策略更改为policy_anything,任意匹配
81 policy = policy_match
方法2:把国家、省、公司名称后的match更改为optional
84 [ policy_match ]
85 countryName = match
86 stateOrProvinceName = match
87 organizationName = match
88 organizationalUnitName = optional
89 commonName = supplied
90 emailAddress = optional
知识扩展:
远程执行命令,无需登录到目标主机,适用于查看目标主机的简单信息
[root@centos7-1 ~]#ssh [email protected] 'hostname'
[email protected]'s password:
centos6
openssh软件组成
ssh客户端
-X 支持x11转发
即nm-connection-editor 图形界面
ssh -X 192.168.32.6 让远程主机图形界面在本机显示,无论目标主机是否为图形界面,本机调用目标主机的图形界面不受影响
底层通过X协议实现通过图形程序让客户端和服务器端的通讯
对于X协议来说,客户端与服务器端与ssh协议正好相反,本机充当服务器,远程主机相当于客户端
windows通过远程连接linux,并显示图形界面,使用xmanager中的xstart软件可以实现,退出当前用户登录即可退出xstart远程连接
-t 强制伪终端分配
多台设备通过逐个跳转,远程连接到远端主机
如ABCDE五台主机,A连接到E,只能通过A-->B-->C-->D-->E的方式实现远程
可以通过ssh -t实现,命令如下:
ssh -t 192.168.32.7 ssh -t 192.168.32.17 ssh 192.168.32.27
需要逐个输入每台主机的登录密码
最后一个终端可以不用加-t选项
ssh服务登录验证
ssh命令实现基于key认证
ssh-keygen -t rsa
ssh-copy-id 192.168.32.128(目标ip地址)
直接远程登录即可,无需输入口令
ssh 192.168.32.128(目标ip地址)
(4)重设私钥口令:
ssh-keygen –p
(5)验证代理(authentication agent)保密解密后的密钥
这样口令就只需要输入一次
在GNOME中,代理被自动提供给root用户
否则运行ssh-agent bash
(6)钥匙通过命令添加给代理
ssh-add
排错小结:
ssh是基于key连接通讯双方,如果有主机通过冒充ip地址以及mac地址连接某主机是行不通的,会有警告信息出现,因此基于key的验证方法相对更为安全
hostA向hostB发起连接请求,
第一次通讯时,hostA把hostB的公钥/etc/ssh/ssh_host_rsa_key.pub复制到自己主机/root/.ssh/know_hosts文件下
主机hostB用自己的私钥进行签名加密数据发送给主机hostA,而此时主机hostA已经存有hostB的公钥,如果可以解密,说明hostB是原来的设备,如果无法解密,则说明是另外的设备
注意:如果hostB的私钥被窃取,那么获取hostB私钥的设备可以冒充hostB与之前和hostB验证过的设备通信,因此对于私钥要做好保密措施
复制私钥到其他主机时,注意文件的用户、组以及权限问题
如果使用新设备代替旧设备,而新设备的地址改为旧地址的ip,此时,新设备的key与老设备不同,此时想通过该ip地址连接到新设备时,会提示错误信息:提示目标主机的key发生变化
解决方法:删除本机记录的旧设备的key信息,再次连接新设备即可
rm -rf /root/.ssh
如何确认第一次连接的目标主机为可信的目标主机
拿到目标主机的公钥信息/etc/ssh/ssh_host_rsa_key.pub与当前显示的key进行比较,如果一致,则表示目标可信
[root@centos6 ~]#ssh 192.168.32.129
The authenticity of host '192.168.32.129 (192.168.32.129)' can't be established.
RSA key fingerprint is 3a:19:e1:94:56:01:ed:08:15:7c:1c:30:9d:93:d7:28.
Are you sure you want to continue connecting (yes/no)?
计算方法:
cp ssh_host_rsa_key.pub(目标主机公钥) /data
base64 -d /data/ssh_host_rsa_key.pub >pubkey
[root@centos7-1 data]# md5sum pubkey centos7中出来md5运算,还有sha256运算得出的值
3a19e1945601ed08157c1c309d93d728 pubkey
发现与RSA key fingerprint is 3a:19:e1:94:56:01:ed:08:15:7c:1c:30:9d:93:d7:28.中的key一致,说明目标主机可信
实现100台设备批量导入公钥信息:
使用expect工具
vim ssh_push_key.sh
#!/bin/bash
pass="magedu"
rpm -q expect &> /dev/null || yum -y install expect
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
while read ip ;do
expect <
scp命令
rsync命令
该命令基于增量型复制,只复制发生变化文件,未发生变化的文件不会复制,节约流量带宽,很好的解决了scp的问题
sftp命令
pssh工具
通过pssh批量关闭seLinux
pssh -H [email protected] -i "sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config"
pssh -H [email protected] -i setenforce 0
将标准错误和标准正确重定向都保存至/app目录下
pssh -H 192.168.32.130 -o /app -e /app -i "hostname"
pssh -H 192.168.32.130 -i hostname
当不支持ssh的key认证时,通过 -A选项,使用密码认证批量执行指令
[root@centos7-1 ~]#pssh -H 192.168.32.130 -A -i hostname
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 输入密码
[1] 21:46:44 [SUCCESS] 192.168.32.130
centos7-2.magedu.com
管理多台主机时,需要输入多个密码(假设密码不一致)
[root@centos7-1 ~]#pssh -H 192.168.32.130 -H 192.168.32.128 -A -i hostname
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password: 输入密码
[1] 21:46:44 [SUCCESS] 192.168.32.130
centos7-2.magedu.com
输入第一个密码,则第二个主机命令执行失败
解决方法:使用基于key验证管理多台主机(无需输入密码),前提时主机之间已经实现基于key的验证
pssh命令默认基于key验证
[root@centos7-1 .ssh]#pssh -H 192.168.32.130 -H 192.168.32.128 -i hostname
[1] 21:53:05 [SUCCESS] 192.168.32.128
centos6
[2] 21:53:05 [SUCCESS] 192.168.32.130
centos7-2.magedu.com
管理大批量主机时,可以把ip地址存入文本中,调用该文本即可
-h 调用主机文件列表
[root@centos7-1 ~]#cat iplist.txt
192.168.32.128
192.168.32.130
[root@centos7-1 ~]#pssh -h iplist.txt -i hostname
[1] 21:56:07 [SUCCESS] 192.168.32.128
centos6
[2] 21:56:07 [SUCCESS] 192.168.32.130
centos7-2.magedu.com
批量创建账号
[root@centos7-1 ~]#pssh -h iplist.txt -i "useradd testuser"
[1] 21:57:07 [SUCCESS] 192.168.32.130
[2] 21:57:08 [SUCCESS] 192.168.32.128
[root@centos7-1 ~]#pssh -h iplist.txt -i "getent passwd testuser"
[1] 21:57:18 [SUCCESS] 192.168.32.128
testuser:x:501:501::/home/testuser:/bin/bash
[2] 21:57:18 [SUCCESS] 192.168.32.130
testuser:x:1001:1001::/home/testuser:/bin/bash
PSCP.PSSH命令
PSLURP命令
如果拉取多个文件,该命令把文件拉取过来以后,会自动创建以对方主机ip为命名的目录存放拉取过来的文件,用以区分文件
[root@centos7-1 ~]pslurp -H 192.168.32.130 -L /data/ /etc/fstab f1
[root@centos7-1 data]#tree
.
├── 192.168.32.128
│ └── f1
├── 192.168.32.130
└── f1
SSH端口转发
实验1:本地转发
A B C 三台主机,A在互联网(外网),B和C在同一局域网
A:192.168.32.6
B:192.168.32.7
C:192.168.32.17
主机B只能通过ssh访问,主机C只能通过telnet访问,主机A不能够直接访问主机C
A---->C A到C使用telnet连接不安全
可以通过A--->B--->C实现
A---->B 通过ssh连接,该阶段A相当于ssh客户端,B相当于ssh服务端。主机A会开启一个随机端口号,通过22端口连接主机B
B---->C 通过telnet连接,该阶段B相当于telnet客户端,C相当于telnet服务端。主机B也会开启一个随机端口号,通过23端口连接主机C
由于B和C在公司内网,实现了A到C的安全访问
在主机A上进行配置,开启一个端口9527
当连接主机A的9527端口时,就会被ssh协议封装起来,传到主机B,主机B收到以后解封装,再通过telnet连接到主机C
模拟实验:
三台主机分别安装telnet、telnet-server,相互之间测试通过telnet访问
systemctl start telnet.socket 开启telnet服务
ss -ntl 查看telnet23端口是否开启
在主机C上进行防火墙设置:C拒绝A的访问
iptables -A INPUT -s 192.168.32.6(拒绝访问的ip地址) -j REJECT
在主机A进行操作:
ssh -L 9527:192.168.32.17:23 -Nf 192.168.32.7
192.168.32.17 目标服务器地址(telnet server)
192.168.32.7 主机B地址(ssh server)
ss -nt 在主机A执行命令查看9527端口是否已开启
在主机A上进行远程连接
telnet 127.0.0.1 9527
关闭隧道 killall ssh
一般情况下,公司内部不允许外部主机连接内部主机
因此可以通过从公司内部主机B主动连接外部主机A(公司防火墙一般情况下不会进制从内往外连接),建立连接后,在通过ssh隧道封装telnet等其他协议与公司内部主机C(telnet server)通信
实验2:远程转发:反向ssh端口转发
B--->A B充当ssh客户端,A充当ssh服务端
A--->B 此过程直接完成
B--->C B充当telnet客户端,C充当telnet服务端
A:192.168.32.6
B:192.168.32.7
C:192.168.32.17
在主机B上进行配置
ssh -R 9527:192.168.32.17:23 192.168.32.6
192.168.32.17 目标主机(telnet server)在实际应用中配置,192.168.32.17应配置为公网地址
192.168.32.6 主机A的地址
ss -nt 在主机A执行命令查看9527端口是否已开启
在主机A上远程连接
telnet 127.0.0.1 9527
实验3:A B C D四台主机
A B在同一局域网,C D在同一局域网
B C可以通过ssh转发数据
实现主机A与主机D通过互联网进行通信
两种方法:
方法1:本地转发
主机B充当ssh客户端,主机C充当ssh服务端
命令:ssh -L
方法2:远程转发
主机B充当ssh服务端,主机C充当ssh客户端
命令:ssh -R
这两种方法最终实现效果一样
使用smtp协议模拟实验,端口号为25
该协议不支持远程连接,要在配置文件中更改
vim /etc/postfix/main.cf
inet_interfaces = all 把该行前的注释符号去掉
在主机B上进行配置
先关闭防火墙iptables -F,再添加策略
iptables -A -s 192.168.32.6 -j REJECT
iptables -A -s 192.168.32.7 -j REJECT
A:192.168.32.6
B:192.168.32.7
C:192.168.32.17
D:192.168.32.27
本地转发:在主机B上进行操作
ssh -L 9527:192.168.32.27:25 -Nfg 192.168.32.17
查看9527端口是否存在,此时9527端口为*:9527,而不是127.0.0.1:9527,说明任意ip地址都可以使用该端口
在主机A上进行以下操作:
telnet 192.168.32.7 9527
远程转发:在主机C上进行操作
ssh -L 9527:192.168.32.27:25 -Nfg 192.168.32.7
查看9527端口是否存在
在主机A上进行以下操作:
telnet 192.168.32.7 9527
动态端口转发
A:192.168.32.6 谷歌网站
B:192.168.32.7 虚拟主机VPS
C:192.168.32.17 上网主机client
模拟实验
在主机A上执行命令
iptables -A INPUT -s 192.168.32.17 -j REJECT
在主机C上进行操作
ssh -D 9527 192.168.32.7 -fN
192.168.32.7 虚拟主机vps ip地址(跳板机)
此时仍然无法连接谷歌网站,需要配置浏览器的代理服务器地址192.168.32.17 端口:9527
浏览器设置:preferences--高级--network--setting--手工指定代理服务器地址(manual proxy configuration)--SOCKS Host 127.0.0.1 port 9527
只能在本机上使用,而且本机必须是linux系统
第四台主机D:192.168.32.27
通过上网主机client连接谷歌网站
在主机C上进行操作
ssh -D 9527 192.168.32.7 -fNg
此时要配置浏览器的代理服务器地址192.168.32.17 端口:9527
或curl --socks5 192.168.32.17:9527 http://192.168.32.6,使用该命令无需为浏览器配置代理地址
X协议转发
ssh服务器
man sshd_config 查看配置文件帮助
sshd_config参数介绍:
17 #Port 22 端口号,一般情况下要连接到互联网要更改为非标准端口号
18 #AddressFamily any any指支持ipv4和ipv6地址
19 #ListenAddress 0.0.0.0 哪个ip地址监听服务端口号,默认所有ip地址都可以访问22端口,可以指定22端口被本地某个ip地址监听,如:listenaddress 192.168.32.7
22 HostKey /etc/ssh/ssh_host_rsa_key
23 #HostKey /etc/ssh/ssh_host_dsa_key
24 HostKey /etc/ssh/ssh_host_ecdsa_key
25 HostKey /etc/ssh/ssh_host_ed25519_key 主机之间相互连接使用的key,基于不同算法生成,centos7连接使用ecdsa算法生成的key,centos6连接使用rsa算法生成的key
37 #LoginGraceTime 2m 连接等待时间,默认为2分钟(即连接时输入密码之前状态的等待时间)
38 #PermitRootLogin yes 允许root登录,默认为yes,如果为no,则root不允许登录,可以先登录普通用户再切换root用户登录
39 #StrictModes yes 严格模式,是否检查必要文件的权限
40 #MaxAuthTries 6 最大验证尝试次数为6,但验证时默认为3次
41 #MaxSessions 10 指每个网络连接开启的会话次数,每个网络连接是指在同一个连接窗口下克隆该窗口的次数最大为10次,
43 #PubkeyAuthentication yes 基于密码验证
47 AuthorizedKeysFile .ssh/authorized_keys 基于key验证文件存放位置
65 PasswordAuthentication yes 支持用户名密码验证
79 GSSAPIAuthentication no
115 UseDNS no
以上两项建议更改为no,系统连接速度会变快
98 #AllowAgentForwarding yes 允许代理转发
99 #AllowTcpForwarding yes 允许tcp转发
117 #MaxStartups 10:30:100 限制并发连接数
当最大连接数不超过10次时,不受影响;当连接数超过10次时开始随机拒绝最大连接数的30%主机连接,70%不受影响;当连接数达到100时,拒绝全部主机连接
112 #ClientAliveInterval 0 客户端存活间隔,默认一直存活,不做检查;如果为其他数字,表示每隔多少秒探测一次客户端是否存活
113 #ClientAliveCountMax 3 默认探测三次
Banner /path/file 用户登录时的登录提示,可以在文件中写入提示语句,登录时显示该提示语句
ssh服务的最佳实践
建议使用非默认端口
禁止使用protocol version 1
限制可登录用户
设定空闲会话超时时长
利用防火墙设置ssh访问策略
仅监听特定的IP地址
基于口令认证时,使用强密码策略
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30| xargs
使用基于密钥的认证
禁止使用空密码
禁止root用户直接登录
限制ssh的访问频度和并发在线数
经常分析日志
知识扩展:
分析日志/var/log/secure,把失败连接次数过多的ip地址扔到防火墙
awk '/Failed password for root from/{ip[$(NF-3)]++}END{for (i in ip){if(ip[i]>=3)system("iptables -A INPUT -s "i" -j REJECT")}}' /var/log/secure
TCP_Wrappers介绍
TCP_Wrappers的使用
示例:
vsftpd: 172.16. EXCEPT 172.16.100.0/24 EXCEPT 172.16.100.1
示例:
只允许192.168.1.0/24的主机访问sshd
/etc/hosts.allow
sshd: 192.168.1.
/etc/hosts.deny
sshd :ALL
只允许192.168.1.0/24的主机访问telnet和vsftpd服务
/etc/hosts.allow
vsftpd,in.telnetd: 192.168.1.
/etc/host.deny
vsftpd,in.telnetd: ALL
示例:
sshd: ALL :spawn echo "$(date +%%F) login attempt from %c to %s,%d" >>/var/log/sshd.log 当ssh登录所有主机时,执行记录日志动作
说明:
在/etc/hosts.allow中添加,允许登录,并记录日志
在/etc/hosts.deny中添加,拒绝登录,并记录日志
%c 客户端信息
%s 服务器端信息
%d 服务名
%p 守护进程的PID
%% 表示%
vsftpd: 172.16. :twist /bin/echo "connection prohibited" 拒绝172.16.0.0网段访问,并提示connection prohibited
PAM认证机制
PAM认证原理
PAM配置文件与模块
[root@centos7-1 ~]#cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth substack system-auth
auth include postlogin
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
/etc/pam.d/* 格式
PAM文档说明
PAM模块
示例:不允许使用/bin/csh的用户本地登录
vim /etc/pam.d/login
添加以下内容
auth required pam_shells.so
vim /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
#/bin/csh
useradd –s /bin/csh yuan
yuan用户将不可登录
tail /var/log/secure 查看日志
但此时,仍然可以通过su切换到yuan用户
因此可以在/etc/pam.d/su文件下
vim /etc/pam.d/su
auth required pam_shells.so
此时,通过su也无法切换到yuan用户
示例:允许root在telnet登陆
vi /etc/pam.d/remote
#auth required pam_securetty.so #将这一行加上注释
或者/etc/securetty文件中加入
pts/0,pts/1…pts/n
模块:pam_nologin.so
功能:
如果/etc/nologin文件存在,将导致非root用户不能登陆
如果用户shell是/sbin/nologin 时,当该用户登陆时,会显示/etc/nologin文件内容,并拒绝登陆
注意:/etc/nologin文件默认不存在,需要手动创建
模块:pam_limits.so
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间
修改限制的实现方式:
(1) ulimit命令,立即生效,但无法保存
-n 最多的打开的文件描述符个数
-u 最大用户进程数
-S 使用 soft(软)资源限制
-H 使用 hard(硬)资源限制
(2) 配置文件:/etc/security/limits.conf, /etc/security/limits.d/*.conf
配置文件:每行一个定义;
应用于哪些对象
Username 单个用户
@group 组内所有用户
* 所有用户
限制的类型
Soft 软限制,普通用户自己可以修改
Hard 硬限制,由root用户设定,且通过kernel强制生效
- 二者同时限定
限制的资源
nofile 所能够同时打开的最大文件数量,默认为1024
nproc 所能够同时运行的进程的最大数量,默认为1024
指定具体值
示例:
限制用户最多打开的文件数和运行进程数
vim /etc/pam.d/system-auth
session required pam_limits.so
vim /etc/security/limits.conf
apache – nofile 10240 用户apache可打开10240个文件
student hard nproc 20 用户student不能运行超过20个进程