简单说明
讨厌做安全加固!讨厌做安全加固!讨厌做安全加固!
然后花了将近两天时间整理实验了最近几年做过的安全加固项
还有很多可以做的安全加固项没有整理出来,以后逐步添加吧…
本篇博文是为了应付检查的加固项汇集,关键词是应付检查
系统密码相关的加固策略
1° 系统密码加固策略:
cp -av /etc/login.defs{,.source}
# 原文件备份
sed -i 's/^PASS_MAX_DAYS.*$/PASS_MAX_DAYS 90/' /etc/login.defs
sed -i 's/^PASS_MIN_DAYS.*$/PASS_MIN_DAYS 7/' /etc/login.defs
sed -i 's/^PASS_MIN_LEN.*$/PASS_MIN_LEN 8/' /etc/login.defs
sed -i 's/^PASS_WARN_AGE.*$/PASS_WARN_AGE 30/' /etc/login.defs
# 设置密码最小长度为8位,密码最长生命周期为90天,密码最短更换周期为7天
# 密码过期警告信息在过期前30天开始
2° 该文件加固后策略对已经存在的用户不会生效,修复方法:
grep bash /etc/passwd|awk -F':' '{print $1}'
# 查看目前可以登录系统的用户
for user in $(grep bash /etc/passwd|awk -F':' '{print $1}')
do chage -l ${user};done
# 查看目前可以登录系统的用户的密码生命周期策略
ChangeDateStr=$(date +%F)
ExpireDateStr=$(date -d'90 days' +%F)
for user in $(grep bash /etc/passwd|awk -F':' '{print $1}')
do chage -m 7 -M 90 -W 30 -d ${ChangeDateStr} -E ${ExpireDateStr} ${user};done
# 将目前可以登录的系统用户的密码生存周期策略改掉
# 最后一次修改密码的日期为当前日期,过期策略为90天后
3° 使用pam策略加固系统密码:
cp -av /etc/pam.d/system-auth-ac{,.source}
sed -i '/^password *requisite *pam_cracklib.so/a\password required pam_pwhistory.so use_authtok remember=3 enforce_for_root' /etc/pam.d/system-auth-ac
# 设置密码历史,无法使用3次以内的历史密码,当前密码在内3个历史密码,对root生效
# 密码历史记录在文件/etc/security/opasswd中,清空该文件删除密码历史
sed -i 's/^password *requisite *pam_cracklib.so/& minlen=8 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1 enforce_for_root/g' /etc/pam.d/system-auth-ac
# 密码复杂度策略:
# 至少包含:数字(dcredit)1位,大写字母(ucredit)1位
# 小写字母(lcredit)1位,特殊符号(ocredit)1位,最小长度(minlen)8位
# 该策略需要相应的pam模块pam_cracklib.so
# 正常情况下可以在/lib64/security/目录中找到
4° 错误密码登录尝试:
echo 'LOGIN_RETRIES 6'>>/etc/login.defs
# 错误密码登录尝试为6次
# 错误密码登录尝试策略会被pam策略覆盖
cp -av /etc/pam.d/sshd{,.source}
sed -i '1aauth required pam_tally2.so even_deny_root deny=4 unlock_time=120 root_unlock_time=600' /etc/pam.d/sshd
# 添加配置:
# auth required pam_tally2.so even_deny_root deny=4 unlock_time=120 root_unlock_time=600
# 该行必需在第二行,使用ssh登录的用户,连续密码错误4次后会锁定,对root也生效
# 账号锁定后,等待解锁时间或者使用pam_tally2命令手动清空掉锁定状态,否则正确密码也无法登陆
# 该策略需要相应的pam模块pam_tally2.so
# 正常情况下可以在/lib64/security/目录中找到
# 登录错误锁定的维护
pam_tally2 -u root
#查看root用户失败次数
pam_tally2 -r -u root
#清空root用户失败次数
5° 规避策略:
cat >/root/checkOS/userPass.sh<<EOF
#!/bin/bash
source ~/.bash_profile
ChangeDateStr=\$(date +%F)
ExpireDateStr=\$(date -d'90 days' +%F)
for user in \$(grep bash /etc/passwd|awk -F':' '{print \$1}')
do chage -d \${ChangeDateStr} -E \${ExpireDateStr} \${user};done
EOF
chmod +x /root/checkOS/userPass.sh
chattr +i /root/checkOS/userPass.sh
crontab -l>/tmp/crontab.tmp
echo -e "\n# User Pass">>/tmp/crontab.tmp
echo "0 0 * * * /root/checkOS/userPass.sh">>/tmp/crontab.tmp
cat /tmp/crontab.tmp|crontab
rm -rf /tmp/crontab.tmp
6° 回滚策略:
/bin/cp -av /etc/login.defs{.source,}
for user in $(grep bash /etc/passwd|awk -F':' '{print $1}');
do chage -m 0 -M 99999 -W 7 ${user};done
/bin/cp -av /etc/pam.d/system-auth-ac{.source,}
/bin/cp -av /etc/pam.d/sshd{.source,}
7° 规避策略回滚:
chattr -i /root/checkOS/userPass.sh
rm -rf /root/checkOS/userPass.sh
crontab -l>/tmp/crontab.tmp
sed -i '/^# User Pass$/d' /tmp/crontab.tmp
sed -i '/^.*userPass.sh$/d' /tmp/crontab.tmp
cat /tmp/crontab.tmp|crontab
rm -rf /tmp/crontab.tmp
关闭用户创建、删除、修改密码权限
chattr +i /etc/passwd /etc/shadow /etc/group
# 对这三个文件加锁,使之无法修改
# 那么用户的添加和删除以及修改密码操作就无法完成了
# 受到影响的命令:useradd、userdel、chage、chgrp
# 存在的问题:
# 当用户密码过期需要修改时无法自主修改
# 需要使用root权限回滚该操作才可以
# 回滚:
chattr -i /etc/passwd /etc/shadow /etc/group
指定su权限账号,限制root远程登录
限制root账号的ssh登录
限制非root账号的su命令使用权限
设置专门用于su到root用户的账号
useradd sudoler
PASS=sudoler
echo ${PASS}|passwd --stdin sudoler
usermod -G sudoler,wheel sudoler
# 用户密码,可以根据需求改变
# 添加专门用于使用su命令的用户
# 将该用户添加到wheel组
cp -av /etc/pam.d/su{,.source}
sed -i 's/^#auth\t\trequired\tpam_wheel.so.*$/auth\t\trequired\tpam_wheel.so use_uid/g' /etc/pam.d/su
# 去掉su的pam文件的该行注释,使之生效
# auth required pam_wheel.so use_uid
# 只有wheel组的用户才可以使用su命令
# 该配置项对root用户无效
echo 'PermitRootLogin no'>>/etc/ssh/sshd_config
/etc/init.d/sshd restart
# 限制root,不能直接使用ssh登录
# 回滚
userdel -r sudoler
/bin/cp -av /etc/pam.d/su{.source,}
sed -i 's/^PermitRootLogin no/# &/g' /etc/ssh/sshd_config
/etc/init.d/sshd restart
设置grub密码
PASS=$(echo -e "vincent\nvincent"|grub-md5-crypt|tail -1)
# 使用grub-md5-crypt命令 生成grub的密码
sed -i "/hiddenmenu/ipassword --md5 ${PASS}" /boot/grub/grub.conf
# 修改grub.conf,设置grub密码
# 回滚:
sed -i 's/^password/# &/g' /boot/grub/grub.conf
# 当重启主机,进入单用户模式修改root密码的时候
# 需要输入grub密码,才能设置进入单用户模式
配置用户同时登录的会话数,系统最多会话数
cp -av /etc/security/limits.conf{,.source}
UserName=vincent
echo "${UserName} - maxlogins 5">>/etc/security/limits.conf
# 限制用户同时登录的会话数,此限制对root用户无效
echo "* - maxsyslogins 3">>/etc/security/limits.conf
# 非root用户的系统最多会话数,此限制依然对root用户无效
# 当vincent可以有5个会话,系统最多会话小于5个时
# 用户vincent可以有5个会话,但不能再有其他会话登录了
# 因此一般系统最多会话要大于所有的用户会话数的和
# 回滚:
/bin/cp -av /etc/security/limits.conf{.source,}
会话超时自动退出
echo "export TMOUT=180">>/etc/profile
# 会话空闲3分钟会自动退出,需要重新登录该用户
# 回滚:
sed -i '/^export TMOUT.*$/d' /etc/profile
Ctrl-Alt-Delete 功能关闭
sed -i 's/^start on control-alt/# &/g' /etc/init/control-alt-delete.conf
sed -i 's|^exec /sbin/shutdown|# &|g' /etc/init/control-alt-delete.conf
# 关闭Ctrl-Alt-Delete三个组合键重启主机的功能
# 虚拟机可以在管理面板发送Ctrl-Alt-Delete组合键进行测试
# 回滚:
sed -i 's/# start /start /g' /etc/init/control-alt-delete.conf
sed -i 's|# exec |exec |g' /etc/init/control-alt-delete.conf
# 5版本的关闭方法:
# 注释掉/etc/inittab文件中的相关行:
# ca::ctrlaltdel:/sbin/shutdown -t3 -r now
限定root用户只能从某些上登录
该加固和限制root远程登录冲突
# 如果做了sshd的连续密码错误锁定加固策略,则为:
sed -i 's|^\(auth required \)\(pam_tally2.so.*\)$|\1pam_access.so accessfile=/etc/sshd_deny \2|g' /etc/pam.d/sshd
# 否则为:
sed -i '1aauth required pam_access.so accessfile=/etc/sshd_deny' /etc/pam.d/sshd
# 策略文件:
echo '-:root:ALL EXCEPT 192.168.77.245'>/etc/sshd_deny
# 限定某个IP
echo '-:root:ALL EXCEPT 192.168.77.245,192.168.77.77'>/etc/sshd_deny
# 限定多个IP
echo '-:root:ALL EXCEPT 192.168.77.0/24'>/etc/sshd_deny
# 限定一个网段
系统守护进程启动目录权限加固
chmod -R 700 /etc/rc.d/init.d/
# 该目录下的所有系统守护进程脚本只有root用户具有读取和操作的权限
# 回滚:
chmod -R 755 /etc/rc.d/init.d/
缩小命令历史记录数
sed -i 's/^HISTSIZE.*/HISTSIZE=0/g' /etc/profile
# 将命令历史从默认的1000改为0,关闭命令历史记录
# 回滚:
sed -i 's/^HISTSIZE.*/HISTSIZE=1000/g' /etc/profile
修改ssh登录时的最近一次登录信息、欢迎信息
echo 'PrintLastLog no'>>/etc/ssh/sshd_config
/etc/init.d/sshd restart
# 剔除ssh登录时候的Last login信息
echo -e '\n\n\n\tWelcome...\n\n\n'>/etc/motd
# 该文件默认为空
# 填充相关的文本信息后ssh登录会显示这些信息
# 无需重启sshd服务
echo 'Banner /etc/ssh/sshbanner'>>/etc/ssh/sshd_config
echo 'sshbanner'>/etc/ssh/sshbanner
/etc/init.d/sshd restart
# 该方法首先打开sshd的Banner配置
# 该操作需要重启sshd服务
# Banner文件信息更换无需再次重启sshd服务
# 该方法设置的标语信息处于/etc/motd信息之上
# 回滚:
rm -rf /etc/motd
rm -rf /etc/ssh/sshbanner
sed -i 's/^PrintLastLog no/# &/g' /etc/ssh/sshd_config
sed -i 's|^Banner /etc/ssh/sshbanner|# &|g' /etc/ssh/sshd_config
/etc/init.d/sshd restart
系统不回应ping命令
echo 'net.ipv4.icmp_echo_ignore_all = 1'>>/etc/sysctl.conf
sysctl -p
# 所有ping本主机得到一个超时回应
# 也就是直接将接到的ping命令请求丢弃
# 回滚:
sed -i 's/^net.ipv4.icmp_echo_ignore_all = 1$/net.ipv4.icmp_echo_ignore_all = 0/' /etc/sysctl.conf
sysctl -p
命令历史全记录
这应该是一些命令历史相关的技巧性的项,而非加固项
echo 'shopt -s histappend'>>/etc/profile
# 相同用户打开多个会话时,命令历史不会互相覆盖
# 退出shell时,命令历史添加到文件中,而非覆盖原文件
echo "export PROMPT_COMMAND='history -a'">>/etc/profile
# 在显示命令提示符时,保存 history
echo "export HISTTIMEFORMAT='%F %T '">>/etc/profile
# 命令历史中加入命令执行的时间
echo "export HISTSIZE=100000">>/etc/profile
echo "export HISTFILESIZE=100000">>/etc/profile
# 增加命令历史的记录数量,默认是1000
echo "export HISTCONTROL=ignoredups">>/etc/profile
# 剔除连续重复的条目,连续的重复被剔除,只保留连续的第一条
host.conf 配置文件锁定
cat /etc/host.conf
order hosts,bind
multi on
nospoof on
# order 指定DNS解析顺序,一般是先hosts后resolv.conf指定的DNS服务器
# multi 指定主机能不能有多个IP地址,ON代表允许
# nospoof 指定不允许IP伪装,此参数必须设置为ON
chattr +i /etc/host.conf
# 将文件锁定,防止误删、误该
# 回滚:
chattr -i /etc/host.conf
禁用icmp源路由选项 accept_source_route
echo 'net.ipv4.conf.all.accept_source_route = 0'>>/etc/sysctl.conf
echo 'net.ipv4.conf.default.accept_source_route = 0'>>/etc/sysctl.conf
echo 'net.ipv4.conf.lo.accept_source_route = 0'>>/etc/sysctl.conf
echo 'net.ipv4.conf.eth0.accept_source_route = 0'>>/etc/sysctl.conf
echo 'net.ipv6.conf.all.accept_source_route = 0'>>/etc/sysctl.conf
echo 'net.ipv6.conf.default.accept_source_route = 0'>>/etc/sysctl.conf
echo 'net.ipv6.conf.lo.accept_source_route = 0'>>/etc/sysctl.conf
echo 'net.ipv6.conf.eth0.accept_source_route = 0'>>/etc/sysctl.conf
sysctl -p
# 禁用icmp源路由选项,防止黑客欺骗,截取信息包
# 系统默认就是全部禁用的
禁用不使用的suid/sgid程序
find / -type f \( -perm -04000 -o -perm -02000 \) 2>/dev/null|sort|uniq
# 参数-perm -4000查出包含suid的文件
# 参数-perm -2000查出包含sgid的文件
for i in $(find / -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null|sort|uniq)
do ls -l $i;done|column -t
# 这些程序查出来之后的处理很困难
# 比mount命令,本身就是只有root才可以执行的,但却不能卸载,否则系统无法重启
# 比如su命令,我们可以做加固处理
# 使用 chmod a-s XXX 做加固
# 因为不同系统的使用情况,包含的命令多少会不同,加固是否会造成影响需要自己验证
文件和目录权限相关
find / -type f \( -perm -2 -o -perm -20 \) -exec ls -l {} \;
find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ld {} \;
# 查询任何人可以写的文件和目录
find / -nouser -o -nogroup
# 查询没有所属人或者所属组的文件或者目录
find / \( -type b -o -type c \) | grep -v '^/dev/'
# 查询/dev目录外的特殊的块文件
用户密码加密算法
# 显示当前密码加密算法:
authconfig --test | grep hashing
# 设置使用sha512算法(算法不能大写):
authconfig --passalgo=sha512 --update
# 所有用户都需要重新设置密码才能生效
# 可以使用 chage -d 0 userName 强制所有用户下次登录修改密码
# 可以使用的密码加密算法有:descrypt,bigcrypt,md5,sha256,sha512
未完…待续…
[TOC]