RedHat 系统安全加固(一): 帐号安全

本系列笔记又是 Liunx 学习系列教程的一大步, 本系列学习笔记记录 RedHat 系统的安全加固。 本篇主要介绍相关于帐号安全的加固策略, 加强系统的防御能力

密码规则

密码长度和有效期

/etc/login.defs 文件是当创建用户时的一些规划, 比如创建用户时, 是否需要家目录, UID 和 GID 的范围; 用户的期限等等, 这个文件是可以通过 root 来定义的

Default Configuration:

PASS_MAX_DAYS 99999# 两次改变密码之间相距的最大天数, 密码有效最大天数
PASS_MIN_DAYS 0# 两次改变密码之间相距的最小天数, 为零时代表任何时候都可以更改密码
PASS_MIN_LEN 5# 密码最小长度
PASS_WARN_AGE 7# 在密码过期之前警告的天数

注意: 以上只对之后新增的用户有效, 如果要修改已存在的用户密码规则, 需要使用 chage 命令

使用以下命令, 可以查看用户的密码规则, Command Format:

chage -l [userName]

For Examlpe:

RedHat 系统安全加固

chage 命令

设置最大最小使用天数, 以及警告天数, For Examlpe:

chage -M 90 -m 6 -W 30 [userName]

注意: 不要用该命令给 root 用户加上有效期, 如果密码过期, 再加上后文说的 /etc/shadow 文件加锁禁止修改, 会导致 root 提示修改密码, 无法成功修改密码, 从而无法登陆。

chage 选项解释

  • -m => 密码可更改的最小天数。 为零时代表任何时候都可以更改密码。
  • -M => 密码保持有效的最大天数。
  • -w => 用户密码到期前, 提前收到警告信息的天数。
  • -E => 帐号到期的日期。 过了这天, 此帐号将不可用。
  • -d => 上一次更改的日期。
  • -i => 停滞时期。 如果一个密码已过期这些天, 那么此帐号将不可用。
  • -l => 例出当前的设置。 由非特权用户来确定他们的密码或帐号何时过期。

如果要修改密码过期时间为 “从不” , For Examlpe:

chage -M 99999 [userName]

空密码检查

/etc/shadow 文件中的记录行与 /etc/passwd 中的一一对应, 是记录系统中用户的密码的, 此文件只有 root 用户可以对其进行修改

使用 awk 命令可以检查是否存在空密码, For Examlpe:

awk -F ':' '($2==""){print $1}' /etc/shadow

没密码检查

空密码跟没有密码是俩回事, 体现于 /etc/shadow 中的密码那一列, 空密码是显示空, 没有密码是显示 ! !

使用 awk 命令可以检查是否存在空密码, For Examlpe:

awk -F ':' '($2=="! ! "){print $1}' /etc/shadow

awk 命令

查询 UID 为 0 的用户, For Examlpe:

awk -F ':' '($3==0){print $1}' /etc/passwd

UID 为 0 的任何用户都拥有系统的最高特权, 保证只有 root 用户的 UID 为 0

awk 选项解释

  • -F fs => fs 指定输入分隔符, fs 可以是字符串或正则表达式, 如 -F:
  • -v var=value => 赋值一个用户定义变量, 将外部变量传递给 awk
  • -f scripfile => 从脚本文件中读取 awk 命令
  • -m[fr] val => 对 val 值设置内在限制, -mf 选项限制分配给 val 的最大块数目; -mr 选项限制记录的最大数目。 这两个功能是 Bell 实验室版 awk 的扩展功能, 在标准 awk 中不适用。

密码复杂度

redhat 公司专门开发了 cracklib 这个安装包来判断密码的复杂度。

检查是否安装了 cracklib 模块

rpm -qa | grep cracklib

RedHat 系统安全加固

/etc/pam.d/system-auth 中修改

password requisite pam_cracklib.so try_first_pass retry = 3 difok = 3 minlen = 8 dcredit = -1 ucredit = -1 lcredit = -1 ocredit = -1
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok remember = 5

RedHat 系统安全加固

参数说明

  • retry=N => 改变输入密码的次数, 默认值是 1, 一般设置为 3。 就是说, 如果用户输入的密码强度不够可以重复输入的次数。
  • minlen=N => 密码最小长度(除了 credit 信用度的字符长度以外)
  • dcredit=N => 密码中至少 (N<0) 或至多 (N>=0) 有几个数字
  • ucredit=N => 密码中至少 (N<0) 或至多 (N>=0) 有几个大写字母
  • lcredit=N => 密码中至少 (N<0) 或至多 (N>=0) 有几个小写字母
  • ocredit=N => 密码中至少 (N<0) 或至多 (N>=0) 有几个特殊字符
  • difok=M => 新密码与前一个旧密码之间至少有 M 个字符不相同

注意: dcreditucreditlcreditocredit 为信用度字符, 如果 N<0 , 表示至少, 则新密码长度最小长度就等于 minlen.。 而当 N>0 时, 表示至多, 比如 ocredit=1 , 至多有一个特殊字符, 这样的话, 即使没有特殊字符也会允许设置新密码。 还有, 此时新密码长度会大于 minlen。 算法交复杂, 这里不赘述。 因此, 通常情况下推荐使用 N<0 来做密码复杂度限制。 另外, 此密码规则对 root 用户无效, 只针对普通用户修改自身密码

登录验证规则

记录普通用户登录失败次数并锁定用户

`/etc/pam.d/system-auth“#%PAM-1.0”下面一行加入,For Example:`

auth required pam_tally2.so deny = 3 unlock_time = 300

注意: 一定要加在 #%PAM-1.0 下面一行

参数说明

  • deny[=n] => 用户连续错误登陆的最大次数, 超过则锁定
  • unlock_time => 设定普通用户锁定后, 多少时间后解锁, 单位是秒
  • even_deny_root => 也限制 root 用户
  • root_unlock_time[=n] => 设定 root 用户锁定后, 多少时间后解锁, 单位是秒
  • quiet => 不对已锁定的用户发出提示信息

注意: 以上参数根据实际需要取舍, 如果使用了 even_deny_root 参数限制 root 用户登录错误次数, 而没有配置 root_unlock_time 的话, 一旦 root 用户被锁, 解锁将很麻烦。

查看用户登录失败次数

当登录错误次数达到最大限制后, 用户再次登录时, 会提示

Your account is locked.Maximum amount of failed attempts was reached.

RedHat 系统安全加固

通过以下命令可以查看用户登录失败次数, Command Format:

pam_tally2 -u [userName]

For Example:

RedHat 系统安全加固

解锁已经锁定的用户

  • 自动解锁

— 如果配置了 unlock_timeroot_unlock_time (针对 root 用户)参数, 则等待超过这个时长后, 帐户会自动解锁

  • 手动解锁:

— 只能以 root 用户通过命令 pam_tally2 -u [userName] -r 可以手动解锁因登录错误次数达到最大限制后自动锁定的用户, 同时登录错误次数会被重置为 0

登录超时

对于 bash 用户, 修改 /etc/profile/etc/bashrc , 所有使用 bash 的用户都会继承, For Example:

RedHat 系统安全加固

对于 csh 用户, 修改 /etc/csh.cshrc , 所有使用 csh 的用户都会继承, For Example:

RedHat 系统安全加固

对于 bash 用户, 修改 /etc/profile/etc/bashrc , 所有使用 bash 的用户都会继承, For Example:

RedHat 系统安全加固

对于 csh 用户, 修改 /etc/csh.cshrc , 所有使用 csh 的用户都会继承, For Example:

RedHat 系统安全加固

访问控制

SSH

禁止 root 用户远程 ssh 登录

由于之前的笔记已经记录过了, 这里就不再重复了

ssh 的黑白名单(指定用户或组)

由于之前的笔记已经记录过了, 这里就不再重复了

ssh 的黑白名单(指定 IP)

由于之前的笔记已经记录过了, 这里就不再重复了

Telnet

禁止 root 用户远程 telnet 登录

系统安装 telnet-server 服务后, 默认就是禁止 root 用户直接远程 telnet 登录的。 确认只要存在 /etc/securetty 文件, 就可以限制 root 直接远程 telnet 登录。

telnet 的黑白名单(指定用户或组)

系统不支持限制普通用户 telnet 远程登录

telnet 的黑白名单(指定 IP)

SSH 中的相差无几, 同样是在 /etc/hosts.allow 里添加白名单, 在 /etc/hosts.deny 里添加黑名单, For Example:

in .telnetd: 192.168 .1 .10 192.168 .1 .11# / etc / hosts.allow in .telnetd: ALL# / etc / hosts.deny

禁止普通用户登录 shell

使用 usermod 命令修改用户的登录 shell 就好, Command Format:

usermod -s /sbin/nologin [userName]

避免普通用户 su 到 root 用户

`/etc/pam.d/su“#%PAM-1.0”` 下面一行加入

auth sufficient pam_rootok.so debug
auth required pam_wheel.so group = wheel

RedHat 系统安全加固

当然只去除红框中的 # 也是 ok 的

RedHat 系统安全加固

这样以来只有 wheel 组的用户可以 su 作为 root

指定可以 su 到 root 的用户

指定某个用户可以 su 到 root 用户, 需要将该用户加入到 wheel 组中

usermod -G wheel [username]

注意, 如果禁止 root 用户直接登录, 也不存在 wheel 组的用户, 就无法进入 root 用户了

RedHat 系统安全加固

亲!!! 听说给作者打赏一杯咖啡钱,会给自己带来好运哦!