Content One: Display all users’ password login, password deny and last-login
# lslogins
Content Two: Display a user’s password login, password deny and last-login
# lslogins <user>
# lslogins
# lslogins <user>
# service auditd restart
# auditctl -s
# chkconfig auditd on
# chkconfig --list auditd
# auditctl -l
# vi /etc/audit/audit.rules
删除里面的所有内容
# service auditd restart
或者:
# augenrules
# auditctl -D
(补充:此操作重启后失效)
# auditctl -W <policy>
(补充:此操作重启后失效)
# auditctl -d <policy>
(补充:此操作重启后失效)
# cat /var/log/audit/audit.log
# ausearch -f <file/directory>
# ausearch -k <key_name>
# aureport -k
-w <file/directory> -p <previlege> -k <key_name>
(
补充:
1) 文件名或目录名,需要绝对路径
2) 监控的权限,可以是 rwxa 其中的任意 1 个或多个,r 代表读权限、w 代表写权限,x 代表执行权限,a 代表文件类型
3) 此类日志的关键词
)
# auditctl -w <file/directory> -p <previlege> -k <key_name>
# vim /etc/audit/audit.rules
添加以下内容:
......
-w <file/directory> -p <previlege> -k <key_name>
(
注意:永久添加的规则后要重启 auditd 服务后才会生效
# service auditd restart
或者:
# augenrules
)
# auditctl -w /etc/nginx/nginx.conf
(补充:这里以临时添加监控 /etc/nginx/nginx.conf 文件的读、写、执行和文件属性变化的规则为例)
# auditctl -w /etc/nginx/nginx.conf -p rwxa -k 'nginx'
(补充:这里以临时添加监控 /etc/nginx/nginx.conf 文件的读、写、执行和文件属性变化,并设置关键词为 nginx 的规则为例)
-a <action>,<filter> -S <system_call> -F <field>=<value> -k <key_name>
(
补充:
1) 和 用于确定事件被记录, 的值可以是 always 或者 never, 的值可以是 task、exit、user 或者 exclude
2) 是系统调用,Linux 系统调用的名称在 /usr/include/asm/unistd_64.h 文件中,可以将多个系统调用放在一个规则里,例:-S <system_call> -S <system_call> ……,或者 -S <system_call>,<system_call>……
3) 和 是过略条件,可以将多个过略条件放在一个规则里,-F <field>=<value> -F <field>=<value> ……
4) 是此类日志的关键词
)
# auditctl -a <action>,<filter> -S <system_call> -F <field>=<value> -k <key_name>
# vim /etc/audit/audit.rules
添加以下内容:
......
-a <action>,<filter> -S <system_call> -F <field>=<value> -k <key_name>
(
注意:永久添加的规则后要重启 auditd 服务后才会生效
# service auditd restart
或者:
# augenrules
)
# auditctl -a always,exit -S rmdir -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=unset -F auid!=4294967295 -k delete
(补充:这里以临时监控所有 UID 大于 1000 的用户删除操作为例)
(注意:这里的 -F auid!=4294967295 是为了排除 login UID 没有被设置的用户)
# auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=unset -F auid!=4294967295 -k delete
(补充:这里以临时监控所有 UID 大于 1000 的用户删除操作为例)
(注意:这里的 -F auid!=4294967295 是为了排除 login UID 没有被设置的用户)
# auditctl -a always,exit -F arch=b64 -S socket
# auditctl -a always,exit -F arch=b64 -S connect
# auditctl -a always,exit -F arch=b64 -S sendmmsg
# auditctl -a always,exit -F arch=b64 -S sendmsg
# auditctl -a always,exit -F arch=b64 -S bind
# auditctl -a always,exit -F arch=b64 -S recvmsg
# auditctl -a always,exit -F arch=b64 -S close
(补充:这里以监控所有网络连接为例)
1) /etc/shadow 文件存储着用户的密码和与之相关的信息
2) /etc/shadow 文件以冒号 “:” 作为分隔符,分类 8 段
/etc/shadow 文件的第 1 段存储的是用户名,和 /etc/passwd 文件中的用户名是一一对应的
1) 如果是奇怪的字符串则代表是加密过的密码,格式是 $id$salt$hashed,其中 $id 是指加密算法。如果字符串:以 $1$ 开头则代表是用 MD5 加密,以 $2a$ 开头则代表是用 Blowfish 加密,以 $2y$ 开头则代表是用另一种算法长度的 Blowfish 加密,以 $5$ 开头则代表是用 SHA-256 加密,以 $6$ 开头则代表是用 SHA-512 加密
2) 如果是 2 个感叹号 “!!” 则代表从来都没有设置过密码
3) 如果为空则代表没有设置密码
4) 如果是 1 个星号 “*” 则代表用户被锁定,但是其它登陆方式不受限制,例 SSH 登陆
5) 如果是 1 个感叹号 “!” 则代表用户被锁定,但是其它登陆方式不受限制,例 SSH 登陆
6) 如果以 1 个感叹号开头 “!” 则代表用户被锁定
7) 如果以 2 个感叹号开头 “!!” 则代表用户被锁定
# cut -d: -f1,7
# passwd <user>
密码最后修改的日期于 1970 年 1 月 1 日相距的天数
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,3
或者:
# chage -l <user> | grep 'Last password change'
# chage -d <date> <user>
或者:
# chage --lastday <date> <user>
两次修改密码最短天数间隔
1) 如果是 0 则代表随时可以修改密码
2) 如果是 99999 则代表永远都不能修改密码
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,4
或者:
# chage -l <user> | grep 'Minimum number of days between password change'
# chage -m <days> <user>
或者:
# chage --mindays <days> <user>
修改密码后过多少天会过期
1) 如果是 99999 则代表永远都不会过期
2) 如果密码只是过期但是没有失效的话,则可以使用过期的密码更改密码再使用新密码登陆,如果密码失效的话则此密码不能再使用
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,5
或者:
# chage -l <user> | grep 'Maximum number of days between password change'
# chage -M <days> <user>
或者:
# chage --maxdays <days> <user>
密码过期前,提前多少天发出警告
如果为空则代表不发出警告
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,6
或者:
# chage -l <user> | grep 'Number of days of warning before password expires'
# chage -W <days> <user>
或者:
# chage --warndays <days> <user>
密码过期后过多少天会失效
1) 如果是 99999 则代表永远都不会失效
2) 如果密码只是过期但是没有失效的话,则可以使用过期的密码更改密码再使用新密码登陆,如果密码失效的话则此密码不能再使用
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,7
或者:
# chage -l <user> | grep 'Password inactive'
# chage -I <days> <user>
或者:
# chage --inactive <days> <user>
用户的失效日期于 1970 年 1 月 1 日相距的天数
# egrep ^[^:]+:[^\!*] /etc/shadow | cut -d: -f1,8
或者:
# chage -l <user> | grep 'Account expires'
# chage -E <date> <user>
或者:
# chage --expiredate <date> <user>
这是一个保留位,目前没有作用
RHEL 8 的 SSH 加密算法默认会使用来自 crypto policies 系统的全局 SSH 加密算法,而此方法将让 SSH 使用单独设置的 SSH 加密算法。
# cp /etc/sysconfig/sshd /etc/sysconfig/sshd_backup
# vim /etc/sysconfig/sshd
将以下内容:
# CRYPTO_POLICY=
修改为:
......
CRYPTO_POLICY=
......
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config_backup
# vim /etc/ssh/sshd_config
添加以下内容:
......
Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512,hmac-sha2-256
KexAlgorithms ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
(
补充:这里以使用:
1) aes256-gcm@openssh.com、aes128-gcm@openssh.com、aes256-ctr、aes192-ctr 和 aes128-ctr SSH 加密方式 (cipher)
2) hmac-sha2-512 和 hmac-sha2-256 SSH 信息验证代码 (message authentication code)
3) ecdh-sha2-nistp521、ecdh-sha2-nistp384、ecdh-sha2-nistp256 和 diffie-hellman-group-exchange-sha256 SSH 算法 (algorithm)
为例
)
# systemctl restart sshd
# ssh -vv -oCiphers=3des-cbc -oPort=22 192.168.0.1
(补充:这里以测试 IP 地址是 192.168.0.1,端口号是 22,有没有启用 3des-cbc SSH 加密方式 (cipher) 为例)
# ssh -vv -oCiphers=3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc -oPort=22 192.168.0.1
(补充:这里以测试 IP 地址是 192.168.0.1,端口号是 22,有没有启用 3des-cbc、aes128-cbc、aes192-cbc 和 aes256-cbc SSH 加密方式 (cipher) 为例)
# ssh -vv -oMACs=hmac-md5 -oPort=22 192.168.0.1
(补充:这里以测试 IP 地址是 192.168.0.1,端口号是 22,有没有启用 hmac-md5 SSH 信息验证代码 (message authentication code) 为例)
# ssh -vv -oMACs=hmac-md5,hmac-md5-96,hmac-sha1,hmac-sha1-96,hmac-md5-etm@openssh.com,hmac-md5-96-etm@openssh.com -oPort=22 192.168.0.1
(补充:这里以测试 IP 地址是 192.168.0.1,端口号是 22,有没有启用 hmac-md5、hmac-md5-96、hmac-sha1、hmac-sha1-96、hmac-md5-etm@openssh.com 和 hmac-md5-96-etm@openssh.com SSH 信息验证代码 (message authentication code) 为例)
# sshd -T | egrep -i "ciphers|macs|kexalgorithms"
# nmap --script ssh2-enum-algos -sV -p 22 127.0.0.1
(补充:这里以测试 IP 地址是 192.168.0.1,端口号是 22 为例)
https://access.redhat.com/solutions/4410591
https://access.redhat.com/solutions/4278651
在给 nftables 防火墙的策略文件添加规则前,要先使用 nftables 防火墙的策略文件:
ip saddr 192.168.0.1 tcp dport ssh accept
或者:
ip saddr 192.168.0.1 tcp dport 22 accept
(补充:这里以允许 IP 地址 192.168.0.1 访问 22 端口为例)
ip saddr 192.168.0.1 tcp dport {22,80,443,3306,100,101,102,103} accept
或者:
ip saddr 192.168.0.1 tcp dport {22,80,443,3306,100-103} accept
(补充:这里以允许 IP 地址 192.168.0.1 访问 22 端口、80 端口、443 端口、3066 端口和 100 端口到 103 端口为例)
ip saddr {192.168.0.1,192.168.0.2,192.168.0.3} tcp dport {22,80,443,3306} accept comment "accept local port"
或者:
ip saddr {192.168.0.1-192.168.0.3} tcp dport {22,80,443,3306} accept comment "accept local port"
(补充:这里以允许 IP 地址 192.168.0.1、192.168.0.2 和 192.168.0.3 访问 22 端口、80 端口、443 端口和 3066 端口并添加注释 “accept local port” 为例)
tcp dport {22,80,443,3306} drop comment "drop remote port"
(补充:这里以拒绝所有 IP 地址的 22 端口、80 端口、443 端口和 3306 端口并添加注释 “drop remote port” 为例)
tcp dport {0-65535} drop
udp dport {0-65535} drop
ip saddr 192.168.0.1 ip protocol icmp icmp type echo-request accept
(补充:这里以允许 192.168.0.1 可以通过 ICMP 协议 ping 通为例)
ct state { established, related } accept