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:
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
在 /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
参数说明
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 个字符不相同
注意
dcredit
、 ucredit
、 lcredit
、 ocredit
为信用度字符, 如果 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.
通过以下命令可以查看用户登录失败次数, Command Format:
pam_tally2 -u [userName]
For Example:
解锁已经锁定的用户
- 自动解锁
-- 如果配置了 unlock_time
或 root_unlock_time
(针对 root
用户)参数, 则等待超过这个时长后, 帐户会自动解锁
- 手动解锁:
-- 只能以 root
用户通过命令 pam_tally2 -u [userName] -r
可以手动解锁因登录错误次数达到最大限制后自动锁定的用户, 同时登录错误次数会被重置为 0
登录超时
对于 bash 用户, 修改 /etc/profile
或 /etc/bashrc
, 所有使用 bash 的用户都会继承, For Example:
对于 csh 用户, 修改 /etc/csh.cshrc
, 所有使用 csh 的用户都会继承, For Example:
对于 bash 用户, 修改 /etc/profile
或 /etc/bashrc
, 所有使用 bash 的用户都会继承, For Example:
对于 csh 用户, 修改 /etc/csh.cshrc
, 所有使用 csh 的用户都会继承, For Example:
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
当然只去除红框中的 #
也是 ok 的
这样以来只有 wheel 组的用户可以 su 作为 root
指定可以 su 到 root 的用户
指定某个用户可以 su 到 root 用户, 需要将该用户加入到 wheel 组中
usermod -G wheel [username]
注意
如果禁止 root 用户直接登录, 也不存在 wheel 组的用户, 就无法进入 root 用户了