Linux服务器安全加固实战:从SSH防护到内核级防御的完整方案

服务器安全加固不是装个防火墙就完事

Linux服务器安全加固是一项系统性工程,从网络入口到内核参数,每一层都有独立的攻击面和对应的防御策略。本文按照攻击链从外到内的顺序,逐层拆解SSH防护、权限管控、文件完整性、内核加固的实战配置方案。所有操作均在CentOS 8/Ubuntu 22.04 LTS环境验证通过。

SSH访问安全:暴力破解防护与密钥认证

SSH是服务器最暴露的攻击面。一条公网SSH端口每天可能承受上千次暴力破解尝试。

第一步:密钥认证+禁用密码登录

# 生成ED25519密钥对(比RSA更安全更短)
ssh-keygen -t ed25519 -C "admin@yunthe-server-01" -f ~/.ssh/id_server01

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

# 修改sshd配置
cat >> /etc/ssh/sshd_config << 'EOF'
# 禁用密码认证
PasswordAuthentication no
PubkeyAuthentication yes

# 禁用root密码登录但允许密钥登录
PermitRootLogin prohibit-password

# 限制登录尝试次数
MaxAuthTries 3

# 设置登录超时
LoginGraceTime 30

# 仅允许特定用户组SSH登录
AllowGroups ssh-users
EOF

systemctl restart sshd

第二步:Fail2Ban自动封禁

# Ubuntu安装
apt install fail2ban -y

# 自定义配置
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600
action = iptables-multiport[name=sshd, port="2222", protocol=tcp]
EOF

systemctl enable fail2ban && systemctl start fail2ban

# 查看封禁状态
fail2ban-client status sshd

第三步:更换默认端口+端口敲门

# 更改SSH端口
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config

# 配置端口敲门(knockd)
apt install knockd -y
cat > /etc/knockd.conf << 'EOF'
[openSSH]
    sequence = 7000,8000,9000
    seq_timeout = 15
    command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
    tcpflags = syn

[closeSSH]
    sequence = 9000,8000,7000
    seq_timeout = 15
    command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
    tcpflags = syn
EOF

端口敲门的效果:SSH端口在防火墙层面默认拒绝所有连接,只有按照正确顺序”敲击”预设端口序列后,才会临时开放SSH访问。

权限最小化:用户与sudo管控

生产服务器不应该让所有人都用root操作。权限管控的核心原则是最小权限:

# 创建受限运维用户
useradd -m -s /bin/bash ops-admin

# 配置sudoers白名单
cat > /etc/sudoers.d/ops-admin << 'EOF'
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 nginx
ops-admin ALL=(ALL) NOPASSWD: /usr/bin/tail /var/log/nginx/*
# 禁止root shell和编辑sudoers
ops-admin ALL=(ALL) !/bin/su, !/usr/bin/visudo
EOF

chmod 440 /etc/sudoers.d/ops-admin

# SSH用户组管控
groupadd ssh-users
usermod -aG ssh-users ops-admin

文件完整性监控:AIDE部署

入侵检测的重要一环是监控关键系统文件是否被篡改:

# 安装AIDE
apt install aide -y

# 初始化数据库
aideinit

# 将初始数据库移到正式位置
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# 执行检查
aide --check

# 日常Cron检查脚本
cat > /etc/cron.daily/aide-check << 'EOF'
#!/bin/bash
REPORT=/var/log/aide/aide-$(date +%Y%m%d).log
mkdir -p /var/log/aide
aide --check > "$REPORT" 2>&1

# 有变更时发邮件告警
if ! grep -q "No differences" "$REPORT"; then
    mail -s "AIDE Alert: File integrity violation on $(hostname)" \
         security@yourcompany.com < "$REPORT"
fi
EOF
chmod +x /etc/cron.daily/aide-check

内核级安全参数调优

sysctl参数是Linux安全加固中容易被忽视但效果显著的层面:

cat > /etc/sysctl.d/99-security.conf << 'EOF'
# 禁用IP转发(非路由器场景)
net.ipv4.ip_forward = 0

# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# 启用SYN Cookie防SYN Flood
net.ipv4.tcp_syncookies = 1

# 禁用ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# 禁用IP源路由
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# 限制内核指针泄露
kernel.kptr_restrict = 2

# 限制dmesg输出
kernel.dmesg_restrict = 1

# 限制unprivileged BPF
kernel.unprivileged_bpf_disabled = 1

# ASLR强度调到最高
kernel.randomize_va_space = 2

# 限制core dump
fs.suid_dumpable = 0
EOF

sysctl --system

防火墙配置:iptables/nftables白名单策略

安全策略的核心原则是”默认拒绝,显式允许”:

# nftables配置(Ubuntu 22.04+)
cat > /etc/nftables.conf << 'EOF'
#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;

        # 允许已建立的连接
        ct state established,related accept
        ct state invalid drop

        # 允许loopback
        iif lo accept

        # ICMP限速
        icmp type echo-request limit rate 5/second accept

        # 仅允许特定IP段访问SSH
        tcp dport 2222 ip saddr {10.0.0.0/8, 172.16.0.0/12} accept

        # HTTP/HTTPS开放
        tcp dport {80, 443} accept

        # 记录被拒绝的连接
        log prefix "nft-drop: " drop
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}
EOF

systemctl enable nftables && systemctl restart nftables

安全加固自检清单

完成以上配置后,用以下命令快速自检:

#!/bin/bash
echo "=== SSH配置检查 ==="
grep -E "^(PasswordAuthentication|PermitRootLogin|Port)" /etc/ssh/sshd_config

echo "=== 开放端口检查 ==="
ss -tlnp | grep -v "127.0.0"

echo "=== 运行中的特权服务 ==="
ps aux | awk '$11 ~ /^S/ && $1 == "root"'

echo "=== SUID文件检查 ==="
find / -perm -4000 -type f 2>/dev/null | grep -v -E "(sudo|passwd|ping|su|mount)"

echo "=== 内核安全参数检查 ==="
sysctl net.ipv4.tcp_syncookies kernel.kptr_restrict kernel.dmesg_restrict

echo "=== 防火墙状态 ==="
nft list ruleset | head -20

安全加固没有终点,而是一个持续迭代的过程。定期审计配置、更新补丁、监控异常行为,才能让服务器在公网环境中保持安全。

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

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

相关推荐

Linux服务器安全加固实战:从SSH防护到高可用集群的硬核运维指南

服务器安全加固为什么是运维的底线工程

一台暴露在公网的Linux服务器,平均在上线后15分钟内就会遭遇第一次自动化扫描攻击。不做好安全加固,再精妙的业务架构也只是空中楼阁。服务器安全加固不是一次性操作,而是一套持续执行的防御体系。本文从SSH防护、系统加固、网络安全、高可用集群四个维度,逐层构建服务器的纵深防御。

SSH访问控制:第一道防线的正确配置姿势

SSH是服务器管理的主要入口,也是最常被暴力破解的目标。安全配置的核心原则:禁止密码登录,只允许密钥认证,限制可登录用户和来源IP。

# /etc/ssh/sshd_config 关键配置项
Port 2222                          # 改掉默认22端口
PermitRootLogin no                  # 禁止root直接登录
PasswordAuthentication no           # 禁用密码认证
PubkeyAuthentication yes            # 启用密钥认证
AllowUsers deploy@10.0.0.0/8       # 限制来源网段
MaxAuthTries 3                      # 最大认证尝试次数
LoginGraceTime 30                   # 登录超时30秒
ClientAliveInterval 300             # 空闲检测间隔
ClientAliveCountMax 2               # 最大无响应次数

密钥管理要遵循最小权限原则。每个运维人员单独生成密钥对,服务器只存放公钥,私钥加 passphrase 保护:

# 生成ED25519密钥(比RSA更安全更快)
ssh-keygen -t ed25519 -C "deploy@prod-cluster-01" -f ~/.ssh/prod_deploy

# 将公钥部署到服务器
ssh-copy-id -i ~/.ssh/prod_deploy.pub -p 2222 deploy@server-ip

# 本地SSH配置
Host prod-*
    IdentityFile ~/.ssh/prod_deploy
    Port 2222
    User deploy
    ServerAliveInterval 60
    ServerAliveCountMax 3

对于必须开放外网SSH的场景,加装fail2ban做暴力破解防护:

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

系统层面加固:内核参数与权限收敛

系统加固的目标是把攻击面缩到最小。核心操作包括禁用不必要服务、收紧文件权限、配置内核安全参数。

# 禁用不需要的服务
systemctl disable --now avahi-daemon cups bluetooth rpcbind
systemctl mask --now systemd-resolved  # 自建DNS时禁用

# 关键文件权限
chmod 700 /root
chmod 600 /etc/shadow
chmod 600 /etc/gshadow
chmod 644 /etc/passwd /etc/group

# 内核安全参数 /etc/sysctl.d/99-security.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
kernel.exec-shield = 1
kernel.randomize_va_space = 2
fs.suid_dumpable = 0

用户权限收敛是常被忽略的环节。生产环境应禁用直接root登录,通过sudo提权并记录审计日志:

# /etc/sudoers.d/deploy
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart php-fpm
deploy ALL=(ALL) NOPASSWD: /usr/bin/journalctl -u nginx

# 审计日志配置 /etc/audit/rules.d/audit.rules
-w /etc/passwd -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k ssh_config
-a always,exit -F arch=b64 -S chmod,chown -F auid>=1000 -k perm_change

网络层防御:防火墙规则与DDoS缓解

防火墙策略遵循默认拒绝原则——只放行已知合法流量:

# iptables基础规则集
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# 允许回环接口
-A INPUT -i lo -j ACCEPT

# 允许已建立的连接
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH(限速)
-A INPUT -p tcp --dport 2222 -m state --state NEW -m recent --set --name ssh
-A INPUT -p tcp --dport 2222 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name ssh -j DROP
-A INPUT -p tcp --dport 2222 -m state --state NEW -j ACCEPT

# HTTP/HTTPS
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# ICMP限速
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 3 -j ACCEPT

# 记录被拒绝的连接
-A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
COMMIT

对于遭遇DDoS攻击的场景,在应用层做限流之前,先在网络层设置SYN Cookie防护和连接数限制:

# /etc/sysctl.d/99-ddos.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 5000

高可用集群:故障自动切换的服务器保障方案

单机安全加固只解决可用性的半程问题,真正的业务连续性需要高可用架构支撑。Keepalived + HAProxy是当前最成熟的轻量级方案:

# /etc/keepalived/keepalived.conf (主节点)
global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_haproxy {
    script "/usr/bin/killall -0 haproxy"
    interval 2
    weight -5
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass SecureP@ss2026
    }
    virtual_ipaddress {
        10.0.0.100/24 dev eth0
    }
    track_script {
        chk_haproxy
    }
}

健康检查脚本要检测业务层可用性而非仅进程存活:

#!/bin/bash
# /etc/keepalived/check_app.sh
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080/health)
if [ "$HTTP_CODE" != "200" ]; then
    exit 1
fi
exit 0

服务器安全加固是一个持续迭代的过程。定期做漏洞扫描(OpenVAS)、日志审计(ELK)、入侵检测(OSSEC),形成发现-修复-验证的闭环,才能在攻防对抗中保持防线稳固。

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

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

相关推荐

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

SSH访问控制加固

SSH是Linux服务器最核心的入口,也是最容易被攻击的入口。默认配置的sshd几乎是给扫描器送目标。

第一步,禁用root远程登录和密码认证:

# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3
LoginGraceTime 30
PermitEmptyPasswords no

改完之后别急着重启sshd。先在另一个终端验证配置语法没错:

sshd -t && systemctl restart sshd

sshd -t是很多人忽略的关键步骤。配置文件一行写错,sshd重启失败,你就被锁在外面了。

第二步,配置fail2ban防止暴力破解:

# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600

三次失败尝试就封IP一小时。对于公网暴露的服务器,这个策略是最低配置。生产环境建议bantime设86400(24小时)甚至更长。

第三步,改掉默认端口不能防住专业攻击者,但能挡掉90%的自动化扫描脚本:

Port 2222

改完端口后别忘了更新防火墙规则和fail2ban的端口配置。

防火墙策略:默认拒绝+白名单

很多服务器的防火墙策略是”默认允许,只拒绝危险端口”,这和正确的做法完全相反。安全的原则是默认拒绝,只开放必需端口。

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

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

# 允许回环接口
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 开放SSH(改过端口的话用新端口)
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

# 开放HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 保存规则
iptables-save > /etc/iptables/rules.v4

如果用firewalld,逻辑相同,语法不同:

firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

内核参数安全调优

sysctl参数是很多人忽略的加固层面。默认的Linux内核参数是为通用场景设计的,对于公网服务器来说,不少参数偏保守甚至不安全。

# /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洪水防护
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2

# 禁止ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# 禁止IP欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 限制核心转储
fs.suid_dumpable = 0

# 进程地址空间随机化
kernel.randomize_va_space = 2

生效:

sysctl --system

SYN cookies是防SYN洪水攻击的关键参数。开启后,当SYN队列满时,内核会用加密方式验证连接而不是分配资源,能有效缓解小规模SYN Flood。

文件系统与权限审计

SUID/SGID文件是提权攻击的常见跳板。定期扫描异常的SUID文件:

# 查找所有SUID文件
find / -perm -4000 -type f 2>/dev/null

# 查找所有SGID文件
find / -perm -2000 -type f 2>/dev/null

# 查找任何人可写的文件
find / -xdev -type f -perm -0002 2>/dev/null

常见的需要SUID的程序:sudo、passwd、su、ping、mount。除此之外的SUID文件都应该逐一审查。不需要的SUID权限果断去掉:

chmod u-s /path/to/suspicious/binary

关键目录权限检查清单:

# /etc/shadow 只允许root读取
chmod 600 /etc/shadow

# SSH密钥目录
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# 临时目录设置粘滞位
chmod 1777 /tmp
chmod 1777 /var/tmp

自动更新与漏洞修补

安全补丁拖延安装是服务器被入侵的第一大原因。配置自动安全更新:

# Debian/Ubuntu
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

# /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};

RHEL/CentOS系列:

dnf install dnf-automatic

# /etc/dnf/automatic.conf
[commands]
upgrade_type = security
apply_updates = yes

[emitters]
emit_via = stdio

systemctl enable --now dnf-automatic.timer

自动更新只打安全补丁,不升级大版本,风险可控。配合一个监控脚本,每天检查是否有待安装的安全更新并通知管理员,这个闭环就完整了。

日志审计与入侵检测

开通日志审计不等于装个logwatch收邮件。对于安全审计,需要关注的是特权操作和异常行为。

# 安装auditd
apt install auditd

# 监控关键文件变更
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /etc/shadow -p wa -k shadow_changes
auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config
auditctl -w /etc/sudoers -p wa -k sudoers_changes

# 监控sudo使用
auditctl -a always,exit -F path=/usr/bin/sudo -F perm=x -k sudo_usage

# 查看审计日志
ausearch -k passwd_changes | aureport -f

auditd的规则在重启后需要持久化,写入/etc/audit/rules.d/目录即可。

服务器安全加固不是一锤子买卖。配置做完后,用Lynis做一次全面扫描:

apt install lynis
lynis audit system

Lynis会给每个检查项打分并输出建议。照着建议逐条修补,再配合定期的漏洞扫描和补丁管理,服务器的安全基线就能维持在较高水平。安全从来不是做一次就完的事,而是持续运营的过程。

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

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

相关推荐

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

SSH访问控制加固

SSH是Linux服务器最核心的入口,也是最容易被攻击的入口。默认配置的sshd几乎是给扫描器送目标。

第一步,禁用root远程登录和密码认证:

# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3
LoginGraceTime 30
PermitEmptyPasswords no

改完之后别急着重启sshd。先在另一个终端验证配置语法没错:

sshd -t && systemctl restart sshd

sshd -t是很多人忽略的关键步骤。配置文件一行写错,sshd重启失败,你就被锁在外面了。

第二步,配置fail2ban防止暴力破解:

# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600

三次失败尝试就封IP一小时。对于公网暴露的服务器,这个策略是最低配置。生产环境建议bantime设86400(24小时)甚至更长。

第三步,改掉默认端口不能防住专业攻击者,但能挡掉90%的自动化扫描脚本:

Port 2222

改完端口后别忘了更新防火墙规则和fail2ban的端口配置。

防火墙策略:默认拒绝+白名单

很多服务器的防火墙策略是”默认允许,只拒绝危险端口”,这和正确的做法完全相反。安全的原则是默认拒绝,只开放必需端口。

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

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

# 允许回环接口
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 开放SSH(改过端口的话用新端口)
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

# 开放HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 保存规则
iptables-save > /etc/iptables/rules.v4

如果用firewalld,逻辑相同,语法不同:

firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

内核参数安全调优

sysctl参数是很多人忽略的加固层面。默认的Linux内核参数是为通用场景设计的,对于公网服务器来说,不少参数偏保守甚至不安全。

# /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洪水防护
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2

# 禁止ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# 禁止IP欺骗
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 限制核心转储
fs.suid_dumpable = 0

# 进程地址空间随机化
kernel.randomize_va_space = 2

生效:

sysctl --system

SYN cookies是防SYN洪水攻击的关键参数。开启后,当SYN队列满时,内核会用加密方式验证连接而不是分配资源,能有效缓解小规模SYN Flood。

文件系统与权限审计

SUID/SGID文件是提权攻击的常见跳板。定期扫描异常的SUID文件:

# 查找所有SUID文件
find / -perm -4000 -type f 2>/dev/null

# 查找所有SGID文件
find / -perm -2000 -type f 2>/dev/null

# 查找任何人可写的文件
find / -xdev -type f -perm -0002 2>/dev/null

常见的需要SUID的程序:sudo、passwd、su、ping、mount。除此之外的SUID文件都应该逐一审查。不需要的SUID权限果断去掉:

chmod u-s /path/to/suspicious/binary

关键目录权限检查清单:

# /etc/shadow 只允许root读取
chmod 600 /etc/shadow

# SSH密钥目录
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# 临时目录设置粘滞位
chmod 1777 /tmp
chmod 1777 /var/tmp

自动更新与漏洞修补

安全补丁拖延安装是服务器被入侵的第一大原因。配置自动安全更新:

# Debian/Ubuntu
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

# /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};

RHEL/CentOS系列:

dnf install dnf-automatic

# /etc/dnf/automatic.conf
[commands]
upgrade_type = security
apply_updates = yes

[emitters]
emit_via = stdio

systemctl enable --now dnf-automatic.timer

自动更新只打安全补丁,不升级大版本,风险可控。配合一个监控脚本,每天检查是否有待安装的安全更新并通知管理员,这个闭环就完整了。

日志审计与入侵检测

开通日志审计不等于装个logwatch收邮件。对于安全审计,需要关注的是特权操作和异常行为。

# 安装auditd
apt install auditd

# 监控关键文件变更
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /etc/shadow -p wa -k shadow_changes
auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config
auditctl -w /etc/sudoers -p wa -k sudoers_changes

# 监控sudo使用
auditctl -a always,exit -F path=/usr/bin/sudo -F perm=x -k sudo_usage

# 查看审计日志
ausearch -k passwd_changes | aureport -f

auditd的规则在重启后需要持久化,写入/etc/audit/rules.d/目录即可。

服务器安全加固不是一锤子买卖。配置做完后,用Lynis做一次全面扫描:

apt install lynis
lynis audit system

Lynis会给每个检查项打分并输出建议。照着建议逐条修补,再配合定期的漏洞扫描和补丁管理,服务器的安全基线就能维持在较高水平。安全从来不是做一次就完的事,而是持续运营的过程。

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

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

相关推荐

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

服务器安全加固为什么不能靠单一手段

服务器安全加固从来不是装个防火墙、改个SSH端口就完事的工作。生产环境中,一次完整的加固需要覆盖网络层、系统层、应用层和审计层四个维度。本文以CentOS 8/Ubuntu 22.04为例,给出一套可直接执行的服务器安全加固Checklist,每项操作都附带配置示例和验证方法。

SSH访问安全:第一道防线

SSH是服务器最常被攻击的入口。暴力破解和凭证窃取是两种主要攻击方式。

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

# /etc/ssh/sshd_config 关键配置
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin no
PermitEmptyPasswords no
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2

修改后执行 systemctl restart sshd 生效。切换前务必确认密钥登录已可用,否则会锁死自己。

修改默认端口并配置Fail2Ban

将SSH端口从22改为非标准端口(如29722),同时部署Fail2Ban自动封禁暴力破解IP:

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

双因子认证(2FA)

安装libpam-google-authenticator,在SSH登录时要求输入动态验证码:

# 安装
apt install libpam-google-authenticator -y

# /etc/pam.d/sshd 添加
auth required pam_google_authenticator.so nullok

# /etc/ssh/sshd_config 添加
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

防火墙策略:最小暴露原则

生产服务器只开放业务必需端口。使用iptables或firewalld实现白名单策略:

# firewalld 配置示例
# 只允许特定IP段访问SSH
firewall-cmd --permanent --zone=public --add-rich-rule='
  rule family="ipv4"
  source address="10.0.1.0/24"
  port port="29722" protocol="tcp" accept'

# 开放Web服务端口
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --permanent --zone=public --add-port=80/tcp

# 禁止所有其他入站
firewall-cmd --permanent --zone=public --set-target=DROP
firewall-cmd --reload

内核参数安全调优

通过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

# 启用反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 禁用ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# SYN Flood防护
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2

# 禁用SACK
net.ipv4.tcp_sack = 0

# 内核地址空间随机化
kernel.randomize_va_space = 2

# 禁止ptrace权限提升
kernel.yama.ptrace_scope = 2

执行 sysctl -p /etc/sysctl.d/99-security.conf 生效。

文件系统与权限加固

关键目录权限

# 设置敏感目录权限
chmod 700 /root
chmod 600 /etc/shadow
chmod 644 /etc/passwd
chmod 700 /home/*/

# 查找SUID/SGID文件(可能被利用提权)
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

# 移除不必要的SUID权限
chmod u-s /usr/bin/chsh
chmod u-s /usr/bin/newgrp
chmod u-s /usr/bin/chfn
chmod u-s /usr/bin/gpasswd

禁用不必要的文件系统

# /etc/fstab 添加
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0

自动更新与漏洞管理

安全补丁的延迟部署是服务器被入侵的常见原因。配置自动安全更新:

# CentOS
dnf install dnf-automatic -y
# /etc/dnf/automatic.conf
# [commands]
# apply_updates = yes
# [emitters]
# emit_via = motd

systemctl enable --now dnf-automatic.timer

# Ubuntu
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades

审计与入侵检测

Auditd系统审计

# /etc/audit/rules.d/audit.rules 关键规则
# 监控sudoers文件变更
-w /etc/sudoers -p wa -k sudoers_change
# 监控SSH配置变更
-w /etc/ssh/sshd_config -p wa -k sshd_config_change
# 监控用户切换
-a always,exit -F arch=b64 -S execve -F path=/usr/bin/su -F auid>=1000 -k su_exec
# 监控密码文件修改
-w /etc/passwd -p wa -k passwd_change
-w /etc/shadow -p wa -k shadow_change

Rootkit检测

安装rkhunter和chkrootkit,配置每日扫描:

# 每日自动扫描
echo "0 3 * * * root /usr/bin/rkhunter --cronjob --update --skip-keypress" >> /etc/crontab

加固验证与持续巡检

加固完成后,使用开源审计工具验证:

# 使用Lynis进行安全审计
apt install lynis -y
lynis audit system --quick

# 使用OpenSCAP扫描
apt install openscap-scanner ssg-debian -y
oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_server   /usr/share/xml/scap/ssg/content/ssg-ubuntu2204-ds.xml

将Lynis扫描结果纳入CI/CD流水线,每次服务器配置变更后自动执行安全审计。加固不是一次性工作,而是持续巡检和改进的过程。关键在于建立可重复的加固流程和自动化验证机制,确保任何配置漂移都能被及时发现和修正。

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

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

相关推荐

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

Linux服务器安全加固的核心思路

服务器暴露在公网上的每一秒都在承受扫描和攻击尝试。安全加固不是一次性操作,而是建立纵深防御体系:网络层限制访问入口,系统层减少攻击面,应用层控制权限边界,审计层留存操作痕迹。这套组合策略远比依赖单一防火墙规则可靠。

SSH安全加固:堵住最大的攻击入口

SSH是Linux服务器被暴力破解最多的服务。加固SSH需要从认证方式和访问控制两个维度同时入手:

# /etc/ssh/sshd_config 安全配置
Port 2222                          # 修改默认端口,规避自动化扫描
PermitRootLogin no                 # 禁止root直接登录
PasswordAuthentication no          # 禁用密码认证
PubkeyAuthentication yes           # 启用密钥认证
MaxAuthTries 3                     # 最大认证尝试次数
LoginGraceTime 30                  # 登录超时时间
AllowUsers deploy admin            # 白名单用户
AllowGroups ssh-users              # 白名单用户组

# 重启sshd生效
systemctl restart sshd

密钥认证配置中,ed25519算法比RSA更安全且密钥更短:

# 客户端生成ed25519密钥
ssh-keygen -t ed25519 -C "deploy@prod-01" -f ~/.ssh/id_ed25519

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

# 服务器端确认authorized_keys权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

fail2ban自动封禁暴力破解IP

SSH加固后仍需应对分布式暴力破解。fail2ban通过解析日志自动识别并封禁异常IP:

# 安装fail2ban
apt install fail2ban -y   # Debian/Ubuntu
yum install fail2ban -y   # CentOS/RHEL

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

[sshd-aggressive]
enabled = true
port = 2222
filter = sshd[mode=aggressive]
logpath = /var/log/auth.log
maxretry = 2
findtime = 300
bantime = 604800

systemctl enable fail2ban
systemctl start fail2ban

# 查看封禁状态
fail2ban-client status sshd

iptables/nftables防火墙规则配置

防火墙规则遵循最小暴露原则:只开放业务必需的端口,拒绝一切默认入站流量:

# nftables配置 (/etc/nftables.conf)
table inet firewall {
    chain input {
        type filter hook input priority 0; policy drop;

        # 允许回环
        iif lo accept

        # 允许已建立连接
        ct state established,related accept

        # 允许ICMP (限速)
        ip protocol icmp limit rate 5/second accept

        # SSH - 仅允许管理网段
        ip saddr 10.0.1.0/24 tcp dport 2222 accept

        # HTTP/HTTPS
        tcp dport { 80, 443 } accept

        # 记录被拒绝的连接
        log prefix "nftables-drop: " drop
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

systemctl enable nftables
systemctl restart nftables

内核参数安全调优

内核参数调优是容易被忽略的加固层,通过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

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

# 禁用核心转储(防止信息泄露)
fs.suid_dumpable = 0

# ASLR增强
kernel.randomize_va_space = 2

# 生效
sysctl --system

文件系统权限与敏感目录防护

权限控制是纵深防御的最后一道屏障。关键目录和文件的权限必须严格限制:

# 关键文件权限设置
chmod 600 /etc/shadow
chmod 600 /etc/gshadow
chmod 644 /etc/passwd
chmod 644 /etc/group
chmod 700 /root
chmod 700 /home/deploy

# 禁用不必要的SUID/SGID二进制
find / -perm -4000 -type f 2>/dev/null > /root/suid_files.txt

# 移除常见被利用的SUID权限(谨慎操作)
chmod u-s /usr/bin/chsh
chmod u-s /usr/bin/chfn

# 设置不可变属性保护关键文件
chattr +i /etc/passwd
chattr +i /etc/shadow
# 需要修改时先 chattr -i 解除

# /tmp安全挂载选项(/etc/fstab)
# tmpfs /tmp tmpfs defaults,nosuid,nodev,noexec 0 0

审计日志与入侵检测

审计系统记录所有敏感操作,是事后追溯和实时告警的基础:

# 安装auditd
apt install auditd -y

# 关键审计规则 /etc/audit/rules.d/audit.rules
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /etc/sudoers -p wa -k sudoers
-a always,exit -F arch=b64 -S mount -k mount
-a always,exit -F arch=b64 -S init_module -k kernel_module
-a always,exit -F arch=b64 -S delete_module -k kernel_module

# 搜索审计日志
ausearch -k sshd_config -ts recent
aureport -f

# 安装rkhunter做根kit检测
apt install rkhunter -y
rkhunter --update
rkhunter --check --skip-keypress

安全加固完成后,定期检查是保持安全状态的关键。建议建立cron任务,每周自动运行安全扫描,审计日志转发到集中式日志平台做实时分析。服务器安全不是配置完成就结束,而是一个持续的对抗过程。

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

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

相关推荐