Linux服务器安全加固实战:SSH防护到内核参数的全链路配置方案

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/

(0)
小编小编
上一篇 2026年7月30日
下一篇 2026年7月30日

相关推荐

Linux服务器安全加固实战:SSH防护到内核参数调优完整方案

Linux服务器安全加固的第一道防线在哪里

服务器安全加固从来不是装个防火墙就完事的工作。攻击者进入系统最常见的入口是SSH暴力破解、Web应用漏洞和内核提权。本文从SSH防护、用户权限管控、内核参数调优三个维度,给出一套可直接落地的服务器安全加固方案。

SSH防护:堵住最常被攻击的入口

SSH是Linux服务器暴露面最大的服务。2025年全年的攻击数据显示,超过78%的自动化攻击从SSH端口22发起。

禁用密码认证,强制密钥登录

暴力破解密码是最低成本的攻击方式。直接禁用密码认证:

# /etc/ssh/sshd_config 修改
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
PubkeyAuthentication yes

# 生成密钥对(推荐ed25519,比RSA更快更安全)
ssh-keygen -t ed25519 -C "admin@production-2026" -f ~/.ssh/id_ed25519

# 将公钥部署到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server-ip

# 重启sshd前先测试配置语法
sshd -t && systemctl restart sshd

密钥长度对比:ED25519密钥仅44字节,RSA 4096位密钥约3.2KB。ED25519在签名验证速度上比RSA快100倍以上。

修改默认端口并配置Fail2Ban

改端口不是安全措施,但能过滤掉90%的自动化扫描脚本:

# /etc/ssh/sshd_config
Port 29722
ListenAddress 0.0.0.0

# Fail2Ban安装与配置
apt install fail2ban -y

# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 29722
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 300
bantime = 3600
action = iptables-multiport[name=sshd, port="29722", protocol=tcp]

systemctl enable fail2ban && systemctl start fail2ban

# 查看当前封禁IP
fail2ban-client status sshd

生产环境中建议bantime设为86400(24小时),对于持续性攻击可启用recidive jail对重复违规IP延长封禁时间。

用户权限管控:最小权限原则落地

root直接操作生产服务器是严重的安全风险。权限管控的核心是:普通用户执行日常操作,需要提权时通过sudo审计。

# 创建运维用户并加入sudo组
useradd -m -s /bin/bash ops-admin
usermod -aG sudo ops-admin

# 配置sudo规则:限制可执行的命令
# /etc/sudoers.d/ops-admin
ops-admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
ops-admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart php-fpm
ops-admin ALL=(ALL) NOPASSWD: /usr/bin/journalctl -u *
ops-admin ALL=(ALL) /usr/bin/apt update, /usr/bin/apt upgrade

# 禁止root直接SSH登录
# /etc/ssh/sshd_config
PermitRootLogin no
AllowUsers ops-admin@10.0.* ops-admin@192.168.1.*

AllowUsers指令同时限制了来源IP段,只有内网运维跳板机能连接SSH。这是网络层的第二道防线。

文件系统关键权限修复

# 检查SUID文件——攻击者提权的常见路径
find / -perm -4000 -type f 2>/dev/null

# 移除不必要的SUID权限(根据业务评估)
chmod u-s /usr/bin/passwd      # 如果使用集中认证
chmod u-s /usr/bin/mount       # 非物理机不需要
chmod u-s /usr/bin/umount
chmod u-s /usr/bin/su          # 禁止本地su切换

# 关键目录权限收紧
chmod 700 /root
chmod 600 /etc/shadow
chmod 640 /etc/ssh/sshd_config

# 检查全局可写目录
find / -xdev -type d -perm -0002 2>/dev/null

内核参数调优:从系统层面封堵攻击面

Linux内核的sysctl参数直接影响网络层的攻击防御能力。以下配置针对网络层加固:

# /etc/sysctl.d/99-security.conf

# 禁止IP转发(非路由器场景)
net.ipv4.ip_forward = 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.all.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# 禁止源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# 反向路径过滤——防止IP欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 连接跟踪优化
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 7200

# 禁止核心转储
fs.suid_dumpable = 0

# 应用配置
sysctl -p /etc/sysctl.d/99-security.conf

SYN Cookie是最有效的SYN Flood防御手段,开启后内核不再为半连接分配资源,而是通过加密Cookie验证客户端合法性。实测可在万级SYN Flood攻击下保持服务可用。

iptables防火墙规则:白名单模式

防火墙策略的核心原则是:默认拒绝,显式放行。

# 清空已有规则
iptables -F
iptables -X

# 默认策略:拒绝所有入站
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 放行回包
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 放行lo接口
iptables -A INPUT -i lo -j ACCEPT

# 放行SSH(仅限内网)
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 29722 -j ACCEPT

# 放行Web服务
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 放行监控Agent
iptables -A INPUT -s 10.0.0.50 -p tcp --dport 9100 -j ACCEPT

# 记录被拒绝的连接
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4

# 持久化规则
apt install iptables-persistent -y
netfilter-persistent save

安全加固检查清单

加固完成后,用以下命令验证关键配置:

#!/bin/bash
# 服务器安全加固验证脚本
echo "=== SSH配置检查 ==="
grep -E "^(PasswordAuthentication|PermitRootLogin|Port)" /etc/ssh/sshd_config
echo ""
echo "=== 监听端口检查 ==="
ss -tlnp | grep -v "127.0.0"
echo ""
echo "=== SUID文件检查 ==="
find / -perm -4000 -type f 2>/dev/null | wc -l
echo ""
echo "=== 失败登录统计 ==="
grep "Failed password" /var/log/auth.log | tail -5
echo ""
echo "=== 内核参数验证 ==="
sysctl net.ipv4.tcp_syncookies net.ipv4.conf.all.rp_filter

安全加固不是一次性工作。建议配合auditd记录关键文件变更、AIDE做文件完整性校验,并定期用Lynis做系统级安全审计。每季度review一次sudo规则和防火墙策略,清理不再需要的放行规则。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-an-quan-jia-gu-shi-zhan-ssh-fang-hu-dao-nei/

(0)
小编小编
上一篇 2026年7月29日
下一篇 2026年7月29日

相关推荐