Linux安全策略加固(01)
ssh服务配置
SSH单次连接最大认证次数
如果MaxAuthTries不是大于0且小于等于4,则编辑/etc/ssh/sshd_config文件,设置 MaxAuthTries 参数为4:
MaxAuthTries 3
禁用基于主机的认证方式
编辑/etc/ssh/sshd_config文件,添加或修改:
HostbasedAuthentication no
禁止root通过ssh直接登录
建议:
编辑/etc/ssh/sshd_config文件,添加或修改:PermitRootLogin no
禁用空口令登录
编辑/etc/ssh/sshd_config文件,添加或修改:PermitEmptyPasswords no
禁用root用户通过SSH设置环境变量
编辑/etc/ssh/sshd_config文件,添加或修改:PermitUserEnvironment no
检查加密算法
[注意事项]执行了该加固项后,可能会导致部分低版本的远程连接工具不能连接主机。目前经过测试可以使用的远程连接工具和版本有:putty 0.6、putty 0.63、SecureCRT 6.5.0和SecureCRT 7.0.0
编辑/etc/ssh/sshd_config和/etc/ssh/ssh_config文件,添加或修改:
Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
(其中aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr为可配置参数)
会话闲置超时间隔
[注意事项]红线问题,要求ssh和sftp具有超时断开连接功能,该项加固ClientAliveCountMax参数必须设置为0,且ClientAliveInterval设置为大于0,才能达到ssh和sftp超时断开连接效果,其中300指定超时时间为300秒
编辑/etc/ssh/sshd_config文件,添加或修改:
ClientAliveInterval 300
ClientAliveCountMax 0
预加固:
ClientAliveInterval 1800
SSH服务用户访问控制
编辑/etc/ssh/sshd_config文件,设置一个或多个以下参数:
AllowUsers <userlist>
AllowGroups <grouplist>
DenyUsers <userlist>
DenyGroups <grouplist>
其中<userlist> <grouplist> <userlist> <grouplist>为可配置参数,且list中的user或者group以空格分隔
最大并行认证连接数
[注意事项]到达限制后,将不再接受新连接,除非先前的连接认证成功或超出 LoginGraceTime 的限制
编辑/etc/ssh/sshd_config文件:
MaxStartups 10:5:20
最大并行认证连接数
编辑/etc/ssh/sshd_config文件:
MaxStartups 5
口令尝试失败锁定账户
编辑
/etc/pam.d/login文件
/etc/pam.d/vsftpd文件
/etc/pam.d/su文件
/etc/pam.d/su-l文件
/etc/pam.d/sudo文件,
添加:
auth required pam_tally2.so onerr=fail audit silent deny=10 unlock_time=900 even_deny_root serialize
编辑/etc/pam.d/sshd文件,添加:
auth required pam_tally2.so onerr=fail audit silent deny=10 unlock_time=900 even_deny_root serialize
account required pam_tally2.so serialize
其中:
deny从参数AUTH_deny获取
unlock_time从参数AUTH_unlock_time获取
密码HASH算法
编辑/etc/login.defs文件,设置:
ENCRYPT_METHOD sha512
PAM设置
口令策略
[注意事项]加固该项后,用户输入口令失败一定次数(由AUTH_deny指定)后,会将该用户锁定一段时间(由AUTH_unlock_time指定),一段时间过后将自动解锁(这种锁定不能通过passwd -u或者usermod -U来解锁,必须通过 pam_tally2命令将用户的失败登录次数清零才可解锁)
1) 检查/etc/pam.d/system-auth和/etc/pam.d/password-auth文件内容,是否包含以下参数:
password requisite pam_cracklib.so try_first_pass retry=3 minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 maxsequence=5 difok=5 minclass=4 enforce_for_root reject_username
password required pam_pwhistory.so use_authtok remember=5 enforce_for_root
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
2)检查/etc/pam.d/system-auth和/etc/pam.d/password-auth文件内容,是否包含以下参数:
auth required pam_faillock.so preauth audit deny=10 even_deny_root unlock_time=900
auth sufficient pam_unix.so nullok try_first_pass
auth [default=die] pam_faillock.so authfail audit deny=10 even_deny_root unlock_time=900
auth sufficient pam_faillock.so authsucc audit deny=10 even_deny_root unlock_time=900
默认密码规则。
minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1
minlen=N:N为大于0的整数。表示密码中最少包含N个字符。
lcredit=N:如果N为大于0的整数,表示密码中最多包含N个小写字母。如果N为小于或等于0的整数,表示最少包含“-N”个小写字母。
ucredit=N:如果N为大于0的整数,表示密码中最多包含N个大写字母。如果N为小于或等于0的整数,表示最少包含“-N”个大写字母。
dcredit=N:如果N为大于0的整数,表示密码中最多包含N个数字。如果N为小于或等于0的整数,表示最少包含“-N”个数字。
ocredit=N:如果N为大于0的整数,表示密码中最多包含N个特殊字符。如果N为小于或等于0的整数,表示最少包含“-N”个特殊字符。
限制root登录系统控制台
[注意事项]The file /etc/securetty contains a list of valid terminals that may be logged in directly as root.
执行:
# echo "" > /etc/securetty
for sectty in `echo "$SECURETTY" | awk -F,`;do
echo $sectty >> /etc/securetty
done
SECURETTY从配置参数中获取
限制普通用户su到root
[注意事项]加固之后只有SU_GROUP组内的用户可以su到root
加固前先检查SU_GROUP组内是否存在非root用户,
如果SU_GROUP组内没有非root用户且SU_USERS内也没有非root用户,则该项不加固,直接返回加固失败,并提示用户设置SU_USERS参数
1.编辑/etc/pam.d/su文件,添加下面一行内容:
auth required pam_wheel.so use_uid root_only group=SU_GROUP
2.将SU_USERS里的用户添加到SU_GROUP组内
for suusers in `echo "$SU_USERS" | awk -F,`;do
usermod -a -G $SU_GROUP $suusers
done
用户账号与环境
口令有效期
[注意事项]口令失效之后,用户依然可以登录系统,只是在登录系统时需要修改口令才能登录
加固时,必须设置MAX_APPLICATION_USERS或MAX_MAINTENANCE_USERS参数,该项才会加固
1.编辑/etc/login.defs文件,修改PASS_MAX_DAYS的值为90(或更小,但要大于等于0)
PASS_MAX_DAYS 90
(此处90为PASS_MAX_DAYS_newuser参数)
2.修改系统内业务用户的最大修改口令期
# chage -d `date +%G-%m-%d` --maxdays 90 <application_user>
(此处90为PASS_MAX_DAYS_appuser参数,application_user为MAX_APPLICATION_USERS参数中指定的每个用户)
3.修改系统内维护用户的最大修改口令期限
# chage -d `date +%G-%m-%d` --maxdays 90 <maintenance_user>
(此处90为PASS_MAX_DAYS_mtcuser参数,maintenance_user为MAX_MAINTENANCE_USERS参数中指定的每个用户)
4.设置root用户口令有效期
# chage -d `date +%G-%m-%d` --maxdays 90 root
(此处90为PASS_MAX_DAYS_root参数)
口令修改最小时间间隔
[注意事项]修改口令成功后必须经过一段的时间才能再次修改
1.编辑/etc/login.defs文件,修改PASS_MIN_DAYS的值为7(或更大,但要小于PASS_MAX_DAYS)
PASS_MIN_DAYS 7
(此处7为PASS_MIN_DAYS_newuser参数)
2.修改系统内业务用户修改口令的最小时间间隔
# chage --mindays 7 <application_user>
(此处7为PASS_MIN_DAYS_appuser参数,application_user为MIN_APPLICATION_USERS参数中指定的每个用户)
3.修改系统内维护用户修改口令的最小时间间隔
# chage --mindays 7 <maintenance_user>
(此处7为PASS_MIN_DAYS_mtcuser参数,maintenance_user为MIN_MAINTENANCE_USERS参数中指定的每个用户)
4.设置root用户修改口令的最小时间间隔为7
# chage --mindays 7 root
(此处7为PASS_MIN_DAYS_root参数)
口令过期前提醒
1.编辑/etc/login.defs文件,修改PASS_WARN_AGE的值为7(或更大但要小于PASS_MAX_DAYS的值)
PASS_WARN_AGE 7
(此处7为PASS_WARN_AGE_newuser参数)
2.修改系统内业务用户修改口令的最小时间间隔
# chage --warndays 7 <application_user>
(此处7为PASS_WARN_AGE_appuser参数,application_user为WARN_APPLICATION_USERS参数中指定的每个用户)
3.修改系统内维护用户修改口令的最小时间间隔
# chage --warndays 7 <maintenance_user>
(此处7为PASS_WARN_AGE_mtcuser参数,maintenance_user为WARN_MAINTENANCE_USERS参数中指定的每个用户)
4.设置root用户提醒口令过期的时间为7
# chage --warndays 7 root
(此处7为PASS_WARN_AGE_root参数)
禁用系统功能账户
[注意事项]加固该项后uid<500系统账户将无法登录系统(root,oracle,grid除外)
1.排除IGNORE_ACCOUNTS参数中的用户
cp /etc/passwd /etc/passwd.secbak
for TMPUSR in `echo $IGNORE_ACCOUNTS | sed 's/,/ /g'`;do
sed -i "/^$TMPUSR:.*$/d" /etc/passwd.secbak
done
2.确保系统账户不能被访问,执行:
for user in `awk -F: '($3 < 500) {print $1 }' /etc/passwd.secbak`; do
if [ $user != "root" -a $user != "oracle" -a $user != "grid" ];then
/usr/sbin/usermod -L $user
if [ $user != "sync" -a $user != "shutdown" -a $user != "halt" ];then
/usr/sbin/usermod -s /sbin/nologin $user
fi
fi
done
rm -f /etc/passwd.secbak
root账户默认组
执行:
# usermod -g 0 root
锁定长期不活动的用户(对新建用户生效)
[注意事项]加固后,用户不能无限制的修改口令;如果设置了口令有效期,同时加固了该项,则用户口令失效天数达到INACTIVE指定的参数,则该用户将不可用;该加固只对加固后新建的用户生效
执行:
useradd -D -f 35
(35从参数INACTIVE_DAYS处获取)
设置单次登录最大认证次数(login方式)
编辑/etc/login.defs文件,添加或修改:
LOGIN_RETRIES 4
检查认证超时时间(login方式)
编辑/etc/login.defs文件,添加或修改:
LOGIN_TIMEOUT 60
检查是否关闭未知用户登录失败记录(login方式)
编辑/etc/login.defs文件,添加或修改:
LOG_UNKFAIL_ENAB no
检查会话超时时间
[注意事项]请输入会话超时时间(单位:秒)。在设定的时间之内没有响应则超时。置空则不做任何设置。
设定会话超时时间,增加(或修改)/etc/profile和/etc/bash.bashrc文件中(对Bash/mksh有效)
TMOUT=1800
设定会话超时时间,增加(或修改)/etc/csh.cshrc文件中(仅对Csh有效,文件不存在则跳过)
set autologout=30
其中:
Bash/mksh中的TMOUT=1800表示用户1800秒无操作则断开连接。测试验证时需要断开当前连接,重新登录超时设置有效。
Csh中的autologout=30表示用户1800秒(即30分钟)无操作则断开连接。测试验证时需要断开当前连接,重新登录超时设置有效。
禁用nobody用户
执行:
usermod -L nobody
usermod -s /bin/false nobody
sudo认证超时时间
[注意事项]设置sudo认证超时时间,避免用户长时间不输入密码
编辑/etc/sudoers文件,设置:
Defaults passwd_timeout = 1
参数值从SUDO_PASSWD_TIMEOUT获取
显示上次登录信息(login方式)
编辑/etc/login.defs文件,添加或修改:
LASTLOG_ENAB yes
记录失败登录信息(login方式)
编辑/etc/login.defs文件,添加或修改:
FAILLOG_ENAB yes
禁止通过键盘(CTRL+ALT+DEL)重启系统
执行:
systemctl mask ctrl-alt-del.target
关闭上下键查询操作命令
[注意事项]输入history或使用上下键可以查询到历史命令,存在安全风险
1、设定会话超时时间,编辑/etc/profile文件,添加或修改:
export HISTSIZE=0
2、执行如下命令使修改后的文件生效。
source /etc/profile