ACL访问控制
// ACL:Access Control List 访问控制列表
// -p :以原始格式显示 ACL
[root@zbx ~]# getfacl -p /root/ // 查看ACL策略
# file: /root/
# owner: root
# group: root
user::r-x
group::r-x
other::---
设置ACL策略
// -m : 修改文件的ACL
// -b : 表示删除所有的 ACL
// mask: 限制其他用户和用户组的权限上限
[root@zbx ~]# ls -ld /root
dr-xr-x---. 5 root root 4096 4月 23 14:54 /root
[root@zbx ~]#
[root@zbx ~]# setfacl -m u:student:rw /root/ // 给student用户单独设置rw权限
[root@zbx ~]#
[root@zbx ~]# getfacl -p /root/
# file: /root/
# owner: root
# group: root
user::r-x
user:student:rw-
group::r-x
mask::rwx
other::---
[root@zbx ~]# su - student
[student@zbx ~]$ touch /root/a.txt // 提示权限不够(因为创建文件需要w+x权限)
touch: 无法创建 '/root/a.txt': 权限不够
[student@zbx ~]$ getfacl -p /root/
# file: /root/
# owner: root
# group: root
user::r-x
user:student:rw- // 没有执行权限,只有w权限也创建不了(创建文件需要w+x权限)
group::r-x
mask::rwx
other::---
[student@zbx ~]$ exit
注销
[root@zbx ~]# setfacl -m u:student:rwx /root/ // 添加执行权限
[root@zbx ~]# getfacl -p /root/
# file: /root/
# owner: root
# group: root
user::r-x
user:student:rwx
group::r-x
mask::rwx
other::---
[root@zbx ~]# su - student
[student@zbx ~]$ touch /root/a.txt
// getfacl -c : -c 代表在显示内容时不显示注释头
[student@zbx ~]$ getfacl -pc /root/
user::r-x
user:student:rwx
group::r-x
mask::rwx
other::---
删除ACL策略
[root@zbx ~]# getfacl -p /root/
# file: /root/
# owner: root
# group: root
user::r-x
user:student:rwx
group::r-x
mask::rwx
other::---
[root@zbx ~]# setfacl -x u:student /root/ //删除acl策略
[root@zbx ~]# getfacl -p /root/
# file: /root/
# owner: root
# group: root
user::r-x
group::r-x
mask::r-x
other::---
密码复杂性要求
设置密码长度、密码复杂性、密码历史等,防止黑客密码爆破
/* PAM: Pluggable Authentication Modules 可插拔身份验证模块
作用:
认证(Authentication):验证用户的身份。例如,通过比较用户提供的密码和系统中存储的密码进行认证。
账号管理(Account Management):检查用户的访问权限,例如检查用户是否在访问时间范围内,账户是否过期等。
密码管理(Password Management):负责密码的更新和管理。
会话管理(Session Management):进行登录后的各种初始化工作,例如记录登录信息、挂载用户的家目录等。
*/
[root@zbx ~]# vim /etc/pam.d/system-auth //系统认证配置文件(一般做本地认证)
// 修改此行
password requisite pam_pwquality.so minlen=8 minclass=3 retry=3 enforce_for_root
// 添加此行
password required pam_pwhistory.so use_authtok remember=5 enforce_for_root
[root@zbx ~]# vim /etc/pam.d/password-auth //密码认证配置文件(一般做远程认证)
// 修改此行
password requisite pam_pwquality.so minlen=8 minclass=3 retry=3 enforce_for_root
// 添加此行
password required pam_pwhistory.so use_authtok remember=5 enforce_for_root
测试:
[root@zbx ~]# passwd student
更改用户 student 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
新的密码:
无效的密码: 密码少于 8 个字符
新的密码:
无效的密码: 密码少于 8 个字符
passwd: 已经超出服务重试的最多次数
密码有效期
密码有效期信息包括密码的有效天数、允许修改密码的间隔天数、密码过期前的警告天数等
[root@zbx ~]# vim /etc/login.defs
PASS_MAX_DAYS 99999 // 密码最长的使用天数
PASS_MIN_DAYS 0 // 密码最小的使用天数
PASS_MIN_LEN 5 // 密码最小长度
PASS_WARN_AGE 7 // 密码过期警告天数
通过chage修改和查看密码有效期:
chage:用于更改用户账户和密码的过期信息
[root@zbx ~]# chage -M 180 root
[root@zbx ~]# chage -l root
最近一次密码修改时间 :从不
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :180
在密码过期之前警告的天数 :7
登错锁定时间
登录时输错密码达3次,将会被锁定禁止再登录。延长锁定时间,可以提高密码的安全性,防止被人恶意猜测。
[root@zbx ~]# vim /etc/pam.d/system-auth
auth required pam_faillock.so preauth audit deny=3 unlock_time=900 even_deny_root
auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=900 even_deny_root
auth sufficient pam_faillock.so authsucc audit deny=3 unlock_time=900 even_deny_root
/*
preauth行是在用户提供密码之前运行的,用于检查用户是否已经因为过去的失败尝试而被锁定。
authfail行是在用户提供了无效密码之后运行的,用于增加失败尝试的计数器。
authsucc行是在用户成功认证之后运行的,用于重置失败尝试的计数器
deny=3 表示如果一个用户在一段时间内连续认证失败3次,那么该用户账户将被锁定。
unlock_time=900 是一个参数,表示锁定的用户账户在多少秒后将被自动解锁。在这个例子中,用户账户将在900秒(即15分钟)后自动解锁。
even_deny_root 表示这个规则甚至对 root 用户也有效。也就是说,如果 root 用户连续3次登录失败,那么 root 用户也会被锁定 900 秒。
required:这意味着此模块必须成功执行。如果此模块失败,那么即使其他模块成功,整个认证过程也会在所有模块执行完后被标记为失败。然而,即使这个模块失败,其他模块还会继续执行。
[default=die]:这是一个更复杂的选项,其中"die"是对模块失败的处理方式。如果模块失败,那么不会执行后面的任何模块,整个认证过程立即结束,并返回失败。这在你希望一旦某个关键模块失败就立即停止认证的场景中非常有用。
sufficient:如果此模块成功,并且到目前为止没有其他模块失败,那么整个认证过程被标记为成功,并且跳过剩余的模块。如果此模块失败,那么PAM会忽略这个失败,继续执行后续的模块。
举个例子,你可能希望首先执行一个检查用户密码的模块,标记为 required,然后执行一个检查一次性密码(如OTP)的模块,标记为 sufficient。这样,如果用户提供了正确的一次性密码,那么他们可以跳过其他认证步骤。然后,你可能有一个检查是否是在工作时间登录的模块,如果标记为 [default=die],那么如果这个模块检查失败(也就是说,用户在非工作时间尝试登录),那么整个认证过程立即失败,不再执行任何其他模块。
登错锁定时间
登录时输错密码达3次,将会被锁定禁止再登录。延长锁定时间,可以提高密码的安全性,防止被人恶意猜测
[root@zbx ~]# vim /etc/pam.d/system-auth
auth required pam_faillock.so preauth audit deny=3 unlock_time=900 even_deny_root
auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=900 even_deny_root
auth sufficient pam_faillock.so authsucc audit deny=3 unlock_time=900 even_deny_root
/*
preauth行是在用户提供密码之前运行的,用于检查用户是否已经因为过去的失败尝试而被锁定。
authfail行是在用户提供了无效密码之后运行的,用于增加失败尝试的计数器。
authsucc行是在用户成功认证之后运行的,用于重置失败尝试的计数器
deny=3 表示如果一个用户在一段时间内连续认证失败3次,那么该用户账户将被锁定。
unlock_time=900 是一个参数,表示锁定的用户账户在多少秒后将被自动解锁。在这个例子中,用户账户将在900秒(即15分钟)后自动解锁。
even_deny_root 表示这个规则甚至对 root 用户也有效。也就是说,如果 root 用户连续3次登录失败,那么 root 用户也会被锁定 900 秒。
required:这意味着此模块必须成功执行。如果此模块失败,那么即使其他模块成功,整个认证过程也会在所有模块执行完后被标记为失败。然而,即使这个模块失败,其他模块还会继续执行。
[default=die]:这是一个更复杂的选项,其中"die"是对模块失败的处理方式。如果模块失败,那么不会执行后面的任何模块,整个认证过程立即结束,并返回失败。这在你希望一旦某个关键模块失败就立即停止认证的场景中非常有用。
sufficient:如果此模块成功,并且到目前为止没有其他模块失败,那么整个认证过程被标记为成功,并且跳过剩余的模块。如果此模块失败,那么PAM会忽略这个失败,继续执行后续的模块。
举个例子,你可能希望首先执行一个检查用户密码的模块,标记为 required,然后执行一个检查一次性密码(如OTP)的模块,标记为 sufficient。这样,如果用户提供了正确的一次性密码,那么他们可以跳过其他认证步骤。然后,你可能有一个检查是否是在工作时间登录的模块,如果标记为 [default=die],那么如果这个模块检查失败(也就是说,用户在非工作时间尝试登录),那么整个认证过程立即失败,不再执行任何其他模块。
测试:
C:\Users\tedu>ssh student@192.168.10.223
Authorized users only. All activities may be monitored and reported.
student@192.168.10.223's password:
Connection closed by 192.168.10.223 port 22 // 3次 锁定