Linux服务器安全加固的核心思路
服务器安全加固不是装个防火墙就完事,而是一套从网络入口到内核参数的多层防线体系。攻击者突破一层后,下一层继续阻挡。这套方案覆盖SSH访问控制、端口管理、内核参数调优、审计日志、入侵检测五个维度,适用于CentOS 8/9和Ubuntu 22.04/24.04生产环境。
SSH访问控制:90%的暴力破解在这里被拦住
SSH是服务器最暴露的攻击面,默认配置几乎等于裸奔。加固顺序:
第一步:禁用密码登录,只允许密钥认证
# /etc/ssh/sshd_config 修改以下配置
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin prohibit-password # 允许root用密钥登录,禁止密码
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3 # 3次失败断开
LoginGraceTime 30 # 30秒内必须完成认证
修改后重启SSH服务:systemctl restart sshd。确保你的公钥已经部署到~/.ssh/authorized_keys再重启,否则会被锁在外面。
第二步:更换SSH端口并限制来源IP
# 修改默认端口(避开扫描器常用端口列表)
Port 29722
# 用iptables限制只允许跳板机IP访问SSH
iptables -A INPUT -p tcp --dport 29722 -s 10.0.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 29722 -j DROP
iptables-save > /etc/iptables/rules.v4
第三步:部署fail2ban自动封禁暴力破解IP
# 安装fail2ban
apt install fail2ban -y # Ubuntu
yum install fail2ban -y # CentOS
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 29722
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 86400
action = iptables-multiport[name=sshd, port="29722", protocol=tcp]
3次失败10分钟内封禁24小时。线上环境观察到单个IP被封后,来自同一C段的扫描通常在1小时内停止。
端口与防火墙:最小暴露原则
运行中的服务如果不需要外部访问,就不应该监听公网IP。先查清楚谁在监听:
# 查看所有监听端口和进程
ss -tlnp | grep LISTEN
# 常见需要关注的危险端口
# 6379 Redis - 默认无认证,必须限制本地或VPN
# 27017 MongoDB - 默认无认证
# 9200 Elasticsearch - 默认无认证
# 2375 Docker API - 远程访问未加密
配置UFW或firewalld,只开放业务必需端口:
# UFW配置示例(Ubuntu)
ufw default deny incoming
ufw default allow outgoing
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow from 10.0.0.0/8 to any port 29722 # SSH仅内网
ufw enable
内核参数加固:sysctl层面的安全策略
内核参数是安全加固中最容易被忽略的一层,但效果显著:
# /etc/sysctl.d/99-security.conf
# 禁止IP转发(除非你是路由器)
net.ipv4.ip_forward = 0
# 禁止源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# SYN Flood防护
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_synack_retries = 2
# 禁止ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# 禁止IP时间戳
net.ipv4.tcp_timestamps = 0
# 连接跟踪表增大(高并发场景)
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 7200
# 核心转储限制
fs.suid_dumpable = 0
# 禁止ptrace调试(防提权)
kernel.yama.ptrace_scope = 2
应用配置:sysctl -p /etc/sysctl.d/99-security.conf。ptrace_scope设为2后,只有root能ptrace其他进程,有效阻止低权限用户通过ptrace提权。
审计与入侵检测:发现异常的最后一道防线
加固完成不等于安全。持续监控和审计才能发现0day和内鬼。两个工具必须部署:
auditd审计系统
# 安装auditd
apt install auditd -y
# 监控关键文件变更
auditctl -w /etc/passwd -p wa -k identity_changes
auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config_changes
auditctl -w /etc/sudoers -p wa -k sudoers_changes
auditctl -w /var/log/auth.log -p wa -k auth_log_changes
# 监控特权命令执行
auditctl -a always,exit -F arch=b64 -S execve -F uid=0 -k root_commands
# 查看审计日志
ausearch -k identity_changes | ausearch -ts recent
Rootkit检测
# 安装rkhunter和chkrootkit
apt install rkhunter chkrootkit -y
# 更新rkhunter数据库并扫描
rkhunter --update
rkhunter --check --skip-keypress
# chkrootkit扫描
chkrootkit
建议将rkhunter加入cron,每天凌晨自动扫描并发送报告:0 3 * * * /usr/bin/rkhunter --check --skip-keypress --report-warnings-only | mail -s "RKHunter Report" admin@example.com
安全加固自查清单
上线前的服务器必须逐项检查:
– SSH已禁用密码登录,只允许密钥认证
– SSH端口已更换且限制来源IP
– fail2ban已部署且规则生效
– 防火墙已启用,仅开放业务端口
– 内核sysctl参数已按安全策略调优
– auditd已部署且监控关键文件
– rootkit检测工具已安装并配置定时扫描
– 所有默认账户密码已修改
– 无用服务已关闭(avahi-daemon, cups等)
– 自动安全更新已启用
# 自动安全更新配置(Ubuntu)
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
# 选择 "Yes" 启用自动安全更新
安全加固不是一次性的工作,是持续的过程。每季度做一次安全审计,每半年更新一次加固策略,才能跟上不断演进的攻击手段。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-an-quan-jia-gu-shi-zhan-ssh-fang-hu-dao-nei/