故障现象
云主机突然cpu使用率上升了很多,发现日志文件/var/log/auth.log(ubuntu)或者/var/log/secure(centos),存在好多尝试破解用户密码的现象,如下脚本通过获取到日志文件的IP地址,加入到/etc/hosts.deny文件中,拒绝该IP地址的尝试登陆服务器。
#1.定义变量,获取日志中刷选的IP地址#DIR_file=/var/log/auth.logDIR_file=/var/log/secureIP_list=`awk '/Failed/{print $(NF-3)}' $DIR_file|sort|uniq -c|sort -nr|sed 's/ /,/g'|sed -e 's/^,*//g'`#2.导出当前hosts.deny文件中的IP地址,导入到hosts.deny.ip中grep -v "^#\|^$" /etc/hosts.deny|awk -F "sshd:" '{print $2}'|sort -nr|uniq -u >/etc/hosts.deny.ip#3.将IP地址追加到/etc/hosts.deny.ip文件中for i in $IP_listdoconn=`echo $i|awk -F, '{print $1}'`ip=`echo $i|awk -F, '{print $2}'`if test $conn -gt 20;thenecho $ip >>/etc/hosts.deny.ip#else# echo $conn"小于20,不满足基本条件"fidone#4.去除/etc/hosts.deny.ip文件中重复的IP地址,生成/etc/hosts.deny.bak文件cat /etc/hosts.deny.ip|sort -nr|uniq -u|awk '{print "sshd:"$1}'>/etc/hosts.deny.bak#5.去除/etc/hosts.deny.bak文件重复的值,导入到/etc/hosts.deny中,生成新的列表grep -v "^#\|^$" /etc/hosts.deny.bak|uniq -u >>/etc/hosts.deny\rm -rf /etc/hosts.deny.ip\mv /etc/hosts.deny.bak /tmp/hosts.deny.bak
可以使用此脚本来拒绝网络中的IP多次尝试暴力破解,脚本中的条件可以根据实际情况来设定,目前默认的是20次。很适合大多数使用公有云平台的centOS 系列云主机设置该计划任务,提高安全性。
主机安全配置
1. SSH安全加固
修改默认ssh远程登录端口
# 编辑配置文件sudo vim /etc/ssh/sshd_config# 修改或添加Port 22000 # 建议 >10000,避开常见扫描端口
禁用root远程登录,强制使用普通用户+sudo提权登录,降低防暴力破解的风险
PermitRootLogin no仅允许密钥登录,拒绝密码登录。提前在客户端生成密钥对,将公钥录入到服务端,完成客户端到服务端的免密登录。尽量不要使用通用密钥对,保持一机一钥,防止私钥泄露。
PasswordAuthentication noPubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys
限制ssh登录的用户和ip,一般都是按照白名单方式配置(拒绝所有,允许部分ip)。
AllowUsers alice bob# 或AllowGroups sshusers# 限制来源 IP(配合 Fail2ban 更佳)Match Address 192.168.1.0/24PermitRootLogin no
2. 防火墙与网络访问控制
启用系统防火墙,拒绝常见的风险端口和ip。
#REHL和centos系列sudo firewall-cmd --permanent --add-port=22000/tcpsudo firewall-cmd --reload#ubuntu/Dabian系列sudo ufw allow 22000/tcpsudo ufw enable
严格配置云平台安全组,只开放业务必需端口(如 80/443、自定义 SSH 端口),仅允许公司公网 IP 或跳板机 IP 访问
3. 账户与权限配置
删除和禁用无用的系统用户
# 删除高危账户(根据实际需求)sudo userdel -r syncsudo userdel -r shutdownsudo userdel -r halt
设置强密码策略,如果还是需要密码登录,必须设置密码复杂度要求。
#编辑 /etc/login.defsPASS_MAX_DAYS 90 # 密码有效期 ≤90 天PASS_MIN_DAYS 7 # 最短修改间隔PASS_MIN_LEN 12 # 最小长度(部分系统由 pam 控制)
锁定关键系统文件,涉及到更新用户需要用chattr -i解锁。
#文件加锁sudo chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow#文件解锁sudo chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
4. 入侵检测和日志监控
安装fail2ban自动封禁暴力破解ip
sudo yum install fail2ban # CentOSsudo apt install fail2ban # Ubuntu# 配置 jail.local,针对 SSH 封禁[sshd]enabled = truemaxretry = 3bantime = 86400 # 封1天
启用并监控系统日志
关注 /var/log/secure(CentOS)或 /var/log/auth.log(Ubuntu)中的异常登录。使用 journalctl -u sshd 实时查看 SSH 日志。
定期检查登录记录
last # 成功登录历史lastb # 失败登录尝试(需 root)who # 当前在线用户
设置journalctl日志留存时间,定期清理journal记录的日志,默认重启systemd-journald服务会清除所有。
#立即清理180天以前的日志journalctl --vacuum-time 30#journal日志持久化配置,满足合规性要求,7-30天即可,编辑/etc/systemd/journald.conf[Journal]Storage=persistentSystemMaxUse=1GMaxRetentionSec=30day#查看journal日志占用情况journalctl --disk-usage#查看最近180秒的日志journalctl --since "180 seconds ago"#查看最近3小时的日志journalctl --since "180 minutes ago"
# CentOS/RHELsudo yum update -y# Ubuntu/Debiansudo apt update && sudo apt upgrade -y
systemctl list-units --type=service --state=running# 禁用如 telnet、ftp、nfs 等高风险服务sudo systemctl disable <unnecessary-service>
echo "net.ipv4.icmp_echo_ignore_all = 1" >> /etc/sysctl.confsysctl -p
根据公司内部安全需求,安装对应安全agent,或者云平台默认提供的主机安全服务。使用快照功能,或者数据同步rsync备份/etc/、数据库、网站目录等业务重要数据。基线加固
基线自查
#查看密码复杂度和加密算法sha512cat /etc/pam.d/system-authcat /etc/pam.d/password-authcat /etc/login.defs#查看系统的登录超时时间cat /etc/profile #查看TMOUT超时时间,和历史记录的条数(需要完全清除历史记录)#查看root用户是否关闭远程登录cat /etc/ssh/sshd_config|grep "ermitRootLogin without-password"#selinux默认需要关闭more /etc/selinux/config#确认audit服务,外部审计策略也是可以的,外部有审计功能,并且日志保留6个月的时间。systemctl status auditd#业务配置文件是否有备份功能
基线整改
整理一些等保基线要求的配置方案,根据需求设置具体的配置和限制。
一、用户口令过期配置cp /etc/login.defs /etc/login.defs_bak_$(date +%Y%m%d)sed -i.bak -e 's/^\(PASS_MAX_DAYS\).*/\1 30/' /etc/login.defssed -i 's/^\(PASS_MIN_DAYS\).*/\1 15/' /etc/login.defssed -i 's/^\(PASS_MIN_LEN\).*/\1 12/' /etc/login.defssed -i 's/^\(PASS_WARN_AGE\).*/\1 3/' /etc/login.defs二、用户登录限制&口令复杂度配置cp /etc/pam.d/system-auth /etc/pam.d/system-auth_bak_$(date +%Y%m%d)sed -i "21i\password requisite pam_cracklib.so difok=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=1" /etc/pam.d/system-authsed -i "22i\auth required pam_tally.so onerr=fail deny=10 unlock_time=300" /etc/pam.d/system-auth#密码复杂度策略参数新口令与旧口令字符不同数,建议设置3:difok=3最小口令长度,建议设置8:minlen=8口令中最少包含数字,建议设置-1:dcreditr=-1口令中最少包含大写字母 ,建议设置-1:ucredit=-1口令中最少包含小写字母 ,建议设置-1:lcredit=-1口令中最少包含特殊字符,建议设置-1:ocredit=-1确保即使是root用户设置密码,也应强制执行复杂性策略:enforce_for_root#用户登录超时时间配置参数onerr: 连续失败deny: 为失败次数lock_time: 为锁定时间,单位为秒even_deny_root:即便是root账号,登录失败多次也要锁定root_unlock_time: root账号锁定时间#实例vi /etc/pam.d/system-auth和/etc/pam.d/password-authauth required pam_tally.so onerr=fail deny=10 unlock_time=300password requisite pam_cracklib.so retry=5 difok=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 enforce_for_root三、用户远程登录限制echo "#defaults" >>/etc/hosts.allowecho "sshd:10.65.3.* 10.4.3.* 10.65.14.* 10.4.14.* 192.168.112.195 10.64.6.58 10.70.58.84 10.64.121.* 10.70.121.*" >>/etc/hosts.allowecho "#openstack" >>/etc/hosts.allowecho "sshd:10.51.1.*" >>/etc/hosts.allow#cp /etc/ssh/sshd_config /etc/ssh/sshd_config_bak_$(date +%Y%m%d)#sed -i "49i\PermitRootLogin no" /etc/ssh/sshd_config#systemctl restart sshd四、用户超时连接限制echo "TMOUT=300" >>/etc/profileecho "export TMOUT" >>/etc/profilesource /etc/profileecho "set autologout=15" >> /etc/csh.cshrc#echo "TMOUT=300" >>/etc/profile五、去除无关用户userdel syncuserdel lpuserdel shutdownuserdel haltuserdel operatorgroupdel games六、设置关键路径权限chmod 600 /etc/shadowchmod 644 /etc/passwdchmod 644 /etc/groupchattr +a /var/log/messageschattr +i /etc/shadowchattr +i /etc/passwdchattr +i /etc/group七、指定用户组wheel可切换root1.修改/etc/pam.d/su配置:auth required pam_wheel.so use_uidsed -i "7i auth required pam_wheel.so use_uid" /etc/pam.d/su2.修改/etc/login.defs文件:SU_WHEEL_ONLY yesecho "SU_WHEEL_ONLY yes" >> /etc/login.defs#八、设置审计员#useradd -d /var/log/auditor -m auditor -s/sbin/nologin九、清理用户历史命令#echo "HISTFILESIZE=10" >>/etc/profileecho "HISTSIZE=10" >>/etc/profilesource /etc/profile#sed -i 's/\(HISTSIZE\).*/HISTSIZE=10/' /etc/profile十、调整审计服务,并保留审计日志180天sed -i 's/\(num_logs =\).*/\1 180/' /etc/audit/auditd.confservice auditd restart十一、调整日志服务,保留日志180天vi /etc/logrotate.conf将week修改为monthly将rotate 4修改为rotate 6添加:create 0660 audit audit
持续分享了 Linux 运维中的实用技巧和工具,希望能为你的日常工作带来帮助。
系统稳定,始于细节;运维之道,贵在积累。
🔹 欢迎点赞 + 在看 + 转发,让更多同行看到!
🔹 关注本号,持续更新 Linux、Shell、云计算等技术干货。
🔹 留言区开放:你在实践中遇到过哪些运维问题?欢迎交流!