Linux安全策略

零、 说明

仅在 CentOS7 下测试, 理论上适用RHEL系列
适用于 二级等保, 三级等保, 阿里云安全基线检查

一、 系统用户密码策略相关

Linux对应的密码策略模块有:pam_passwdqc.sopam_pwquality.so
密码复杂度: pam_pwquality.so 模块对应文件的是 /etc/security/pwquality.conf
密码有效期: pam_passwdqc.so 模块对应文件的是 /etc/login.defs

针对密码复杂度, 推荐编辑pam配置文件/etc/pam.d/system-auth-ac去引用pam_pwquality.so
也可以直接编辑 /etc/security/pwquality.conf
“禁止使用最近三次使用过的密码” 就无法在 pwquality.conf 配置

1.1 密码复杂度

示例: 要求所有用户密码复杂度达到

  • 至少15个字符
  • 至少包含一个大写字符
  • 至少包含一个数字
  • 至少包含一个小写字母
  • 至少包含一个特殊字符
  • 拒绝包含连续相同字符超过5个
  • 允许与原密码相同的字符不超过3个
  • 禁止使用最近24次使用过的密码

方法一: 编辑配置文件: /etc/pam.d/system-auth-ac
注释15行, 并添加如下两行
line16:

password    requisite     pam_pwquality.so try_first_pass local_users_only enforce_for_root minlen=15 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 maxrepeat=5 retry=3 difok=3 

password    requisite     pam_pwquality.so try_first_pass local_users_only enforce_for_root minlen=15 minclass=4 maxrepeat=5 retry=3 difok=3 

line17:

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=24

方法二: 编辑配置文件 /etc/security/pwquality.conf
修改下面参数

  • retry=3: 定义登录 / 修改密码失败时,可以重试的次数
  • minlen=8: 密码最小长度为 8 个字符
  • lcredit=-1: 密码应包含的小写字母的至少1个
  • ucredit=-1: 密码应包含的大写字母至少1个
  • dcredit=-1: 将密码包含的数字至少为1个
  • ocredit=-1: 设置其他符号的最小数量,例如 @,#、! $%等,至少要有1个
  • minclass=3: 所需字符类最小数量(大写, 小写, 数字, 其他)
  • enforce_for_root: 即使是 root 用户设置密码,也应强制执行复杂性策略检查
  • maxrepeat=5: 拒绝包含超过相同连续字符个数
  • difok=3 : 允许不超过与原密码相同的字符个数
  • remember=24: 禁止使用最近24次使用过的密码

注意关于上述参数的负数解释, 详见引用

引用: pam_pwquality(8) - Linux man page

pam_pwquality.so相关错误日志: /var/log/secure

1.2 密码有效期

修改配置文件: /etc/login.defs
注意: 该配置文件对所有用户生效, 若只想针对某个用户生效, 使用命令 chage

一般设置如下:
PASS_MAX_DAYS 90 对应命令为: chage --maxdays 90 root
PASS_MIN_LEN 12
PASS_MIN_DAYS 7 对应命令为: chage --mindays 7 root
PASS_WARN_AGE 30 对应命令为: chage --warndays 7 root
UMASK 077

推荐修改/etc/login.defs后, 再使用chage执行相应的命令

参数 含义
MAIL_DIR /var/spool/mail 创建用户时,系统会在目录 /var/spool/mail 中创建一个用户邮箱,比如 lamp 用户的邮箱是 /var/spool/mail/lamp
PASS_MAX_DAYS 99999 密码有效期,99999 是自 1970 年 1 月 1 日起密码有效的天数,相当于 273 年,可理解为密码始终有效
PASS_MIN_DAYS 0 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0
PASS_MIN_LEN 5 指定密码的最小长度,默认不小于 5 位,但是现在用户登录时验证已经被 PAM 模块取代,所以这个选项并不生效
PASS_WARN_AGE 7 指定在密码到期前多少天,系统就开始通过用户密码即将到期,默认为 7 天
UID_MIN 500 指定最小 UID 为 500,也就是说,添加用户时,默认 UID 从 500 开始。注意,如果手工指定了一个用户的 UID 是 550,那么下一个创建的用户的 UID 就会从551 开始,哪怕 500~549 之间的 UID 没有使用
UID_MAX 60000 指定用户最大的 UID 为 60000
GID_MIN 500 指定最小 GID 为 500,也就是在添加组时,组的 GID 从 500 开始
GID_MAX 60000 用户 GID 最大为 60000
CREATE_HOME yes 指定在创建用户时,是否同时创建用户主目录,yes 表示创建,no 则不创建,默认是 yes
UMASK 077 用户主目录的权限默认设置为 077
USERGROUPS_ENAB yes 指定删除用户的时候是否同时删除用户组,准备地说,这里指的是删除用户的初始组,此项的默认值为 yes
ENCRYPT_METHOD SHA512 指定用户密码采用的加密规则,默认采用 SHA512,这是新的密码加密模式,原先的 Linux 只能用 DES 或 MD5 加密

引用: pam_passwdqc(8) - Linux man page

1.3 空密码账户

查找空密码账户: awk -F: '($2 == "") {print $1}' /etc/shadow
锁定该账户: passwd -l 用户名

1.4 UID 为0的账户

查找 UID为0的账户: awk -F: '$3 == 0' /etc/passwd

Linux 系统中 UID为0的账户为root, 如果发现UID为0而不是root账户, 应该立即删除此账户或者修改该账户的UID不为0

删除用户: userdel 用户名

二、 SSH 服务相关策略

编辑配置文件: /etc/ssh/sshd_config

ClientAliveInterval = 600     服务器向客户端发送请求以确认客户端是否仍然活跃的时间间隔(单位:秒)
ClientAliveCountMax = 2 服务器终止连接之前,允许服务器向客户端发送请求的次数
PermitEmptyPasswords = no 是否允许空密码登录
MaxAuthTries = 4 允许最大登陆失败尝试次数
LogLevel INFO 日志等级: 信息

三、 安全审计

3.1 开启日志审计

systemctl enable rsyslog --now
systemctl enable auditd --now

四、 权限相关

4.1 敏感文件及目录

chown root:root /etc/hosts.allow 
chown root:root /etc/hosts.deny
chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow

chmod 644 /etc/hosts.deny
chmod 644 /etc/hosts.allow
chmod 0644 /etc/group
chmod 0644 /etc/passwd
chmod 0400 /etc/shadow
chmod 0400 /etc/gshadow

4.2 系统账户三权分立

普通用户: ordinary

useradd ordinary
passwd ordinary
chmod 750 /home/ordinary

审计用户: auditors

useradd auditors
passwd auditors
chmod 750 /home/auditors

安全用户: security

useradd security
passwd security
chmod 750 /home/security

注意: 三个用户的密码应符合1.1和1.2这两条策略

五、 入侵防范

5.1 开启地址空间布局随机化

编辑配置文件
/etc/sysctl.conf
添加参数: kernel.randomize_va_space = 2
使其生效: sysctl -p