Linux 服务器安全加固完全指南

安全指南

为什么 Linux 服务器安全加固至关重要

在云原生时代,Linux 服务器是互联网基础设施的核心。未加固的服务器如同敞开的大门,随时可能被暴力破解、提权攻击、数据窃取或沦为肉鸡。

威胁类型 未加固风险 加固后效果
暴力破解 SSH 密码爆破成功率极高 密钥认证 + fail2ban,破解近乎不可能
提权攻击 普通用户可提权至 root 最小权限原则 + sudo 审计
数据泄露 敏感文件可被任意读取 权限控制 + 加密 + 不可变属性
横向移动 内网无隔离,一台沦陷全部沦陷 防火墙白名单 + 网络隔离
供应链攻击 任意软件包可安装 自动安全更新 + 完整性校验

安全加固不是一次性工作,而是持续运营的安全基线。本文将覆盖从初始评估到持续监控的完整加固流程。


安全基线评估

使用自动化工具扫描现状

在加固之前,必须先了解服务器的当前安全状态。推荐使用以下工具进行基线评估:

# 安装 Lynis —— 开源安全审计工具
sudo apt install lynis

# 执行完整安全审计
sudo lynis audit system

# 查看审计报告
sudo lynis audit system --report-file /var/log/lynis-report.txt

# 仅审计特定模块
sudo lynis audit system --tests-from-group "authentication"
sudo lynis audit system --tests-from-group "firewall"

手动基线检查清单

# 检查开放端口
ss -tlnp
netstat -tlnp

# 检查运行中的服务
systemctl list-units --type=service --state=running

# 检查已安装软件包的安全更新
apt list --upgradable 2>/dev/null | grep -i security

# 检查 SUID/SGID 文件
find / -perm -4000 -type f 2>/dev/null
find / -perm -2000 -type f 2>/dev/null

# 检查世界可写文件
find / -perm -o+w -type f 2>/dev/null | grep -v '/proc\|/sys\|/dev'

# 检查空密码账户
awk -F: '$2 == "" {print $1}' /etc/shadow

# 检查 root 可远程登录
grep "^PermitRootLogin" /etc/ssh/sshd_config

使用 OpenSCAP 进行合规检查

# 安装 OpenSCAP
sudo apt install openscap-scanner scap-security-guide

# 使用 DISA STIG 配置文件评估
sudo oscap xccdf eval \
  --profile xccdf_org.ssgproject.content_profile_stig \
  /usr/share/xml/scap/ssg/content/ssg-ubuntu2204-ds.xml \
  --report /var/log/oscap-report.html

SSH 加固

SSH 是远程管理 Linux 服务器的核心通道,也是攻击者的首要目标。SSH 加固是安全防护的第一道防线。

禁用密码认证,仅使用密钥登录

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

# 或生成 RSA 4096 位密钥(兼容性更好)
ssh-keygen -t rsa -b 4096 -C "admin@server-01" -f ~/.ssh/id_rsa_4096

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

# 修改 sshd 配置
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# /etc/ssh/sshd_config —— SSH 安全加固配置

# 禁用密码认证
PasswordAuthentication no
ChallengeResponseAuthentication no
KbdInteractiveAuthentication no

# 禁用 root 登录
PermitRootLogin no

# 仅允许密钥认证
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 修改默认端口(避免自动扫描)
Port 2222

# 限制认证尝试次数
MaxAuthTries 3

# 缩短登录超时
LoginGraceTime 30

# 禁用空密码
PermitEmptyPasswords no

# 限制可登录用户
AllowUsers deploy admin@10.0.1.0/24

# 禁用不必要的认证方式
HostbasedAuthentication no
GSSAPIAuthentication no
KerberosAuthentication no

# 使用强加密算法
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

# 禁用 X11 转发和端口转发(如不需要)
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no

# 客户端存活检测
ClientAliveInterval 300
ClientAliveCountMax 2
# 验证配置语法后重启
sudo sshd -t && sudo systemctl restart sshd

配置 fail2ban 防暴力破解

sudo apt install fail2ban -y
# /etc/fail2ban/jail.local

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = iptables-multiport
action = %(action_mwl)s

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 7200

[sshd-ddos]
enabled = true
port = 2222
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 5
bantime = 86400
sudo systemctl enable --now fail2ban

# 查看被封禁的 IP
sudo fail2ban-client status sshd

# 手动解封 IP
sudo fail2ban-client set sshd unbanip 192.168.1.100

防火墙配置

使用 UFW(Ubuntu 简易防火墙)

sudo apt install ufw -y

# 默认拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 允许 SSH(注意端口要和 sshd 配置一致)
sudo ufw allow 2222/tcp comment 'SSH'

# 允许 HTTP/HTTPS
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# 允许特定 IP 访问特定端口
sudo ufw allow from 10.0.1.0/24 to any port 5432 proto tcp comment 'PostgreSQL from internal'

# 启用防火墙
sudo ufw enable

# 查看状态和规则
sudo ufw status verbose
sudo ufw show added

# 删除规则
sudo ufw delete allow 80/tcp

使用 nftables(推荐替代 iptables)

sudo apt install nftables -y
# /etc/nftables.conf

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

        ct state established,related accept
        ct state invalid drop

        iif lo accept

        ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply } accept
        ip protocol icmp icmp type { destination-unreachable, time-exceeded, parameter-problem, echo-request, echo-reply } accept

        tcp dport 2222 accept comment "SSH"
        tcp dport { 80, 443 } accept comment "HTTP/HTTPS"

        tcp dport 5432 ip saddr 10.0.1.0/24 accept comment "PostgreSQL internal"
    }

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

    chain output {
        type filter hook output priority 0; policy accept;
    }
}
sudo systemctl enable --now nftables
sudo nft list ruleset

iptables 规则示例

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

# 默认策略
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

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

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

# 允许 SSH
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

# 允许 HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 保存规则
sudo apt install iptables-persistent -y
sudo netfilter-persistent save

用户与权限管理

使用 sudo 替代 root 直接操作

# 安装 sudo
sudo apt install sudo -y

# 创建新用户并加入 sudo 组
sudo adduser deploy
sudo usermod -aG sudo deploy

# 配置 sudo 免密(仅限特定命令)
sudo visudo -f /etc/sudoers.d/deploy
# /etc/sudoers.d/deploy —— 最小权限 sudo 配置

# 允许 deploy 用户重启特定服务
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart postgresql

# 允许查看日志
deploy ALL=(ALL) NOPASSWD: /usr/bin/journalctl

# 禁止使用 sudo su 或 sudo bash 提权
deploy ALL=(ALL) !/bin/su, !/bin/bash, !/bin/sh

用户组与权限分离

# 创建功能组
sudo groupadd webadmin
sudo groupadd dbadmin
sudo groupadd logreader

# 将用户加入对应组
sudo usermod -aG webadmin deploy
sudo usermod -aG dbadmin dbuser

# 设置组所有权
sudo chgrp -R webadmin /var/www
sudo chmod -R 2775 /var/www

# 设置数据库目录权限
sudo chgrp -R dbadmin /var/lib/postgresql
sudo chmod -R 750 /var/lib/postgresql

PAM 认证模块加固

# /etc/pam.d/common-password —— 密码复杂度要求

password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
  minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
password requisite pam_pwhistory.so remember=5 enforce_for_root
# /etc/pam.d/common-auth —— 登录失败锁定

auth required pam_faillock.so preauth silent deny=5 unlock_time=900
auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900
auth sufficient pam_faillock.so authsucc deny=5 unlock_time=900
# 设置密码过期策略
sudo chage -M 90 -m 7 -W 14 deploy

# 查看用户密码策略
sudo chage -l deploy

文件系统安全

关键权限设置

# /etc/shadow 和 /etc/gshadow 必须仅 root 可读
sudo chmod 600 /etc/shadow /etc/gshadow

# /etc/passwd 和 /etc/group 必须所有人可读但仅 root 可写
sudo chmod 644 /etc/passwd /etc/group

# SSH 目录权限
sudo chmod 700 ~/.ssh
sudo chmod 600 ~/.ssh/authorized_keys
sudo chmod 600 ~/.ssh/id_*
sudo chmod 644 ~/.ssh/id_*.pub

# 限制 crontab 访问
sudo touch /etc/cron.allow
sudo chmod 600 /etc/cron.allow
echo "root" | sudo tee -a /etc/cron.allow
echo "deploy" | sudo tee -a /etc/cron.allow

使用不可变属性保护关键文件

# 设置不可变属性(防止任何修改,包括 root)
sudo chattr +i /etc/passwd
sudo chattr +i /etc/shadow
sudo chattr +i /etc/group
sudo chattr +i /etc/gshadow
sudo chattr +i /etc/sudoers
sudo chattr +i /etc/ssh/sshd_config

# 查看属性
lsattr /etc/passwd

# 需要修改时先解除
sudo chattr -i /etc/passwd
# 修改完成后重新设置
sudo chattr +i /etc/passwd

磁盘加密

# 使用 LUKS 加密数据分区
sudo apt install cryptsetup -y

# 加密分区(注意:会清除分区数据!)
sudo cryptsetup luksFormat /dev/sdb1

# 打开加密分区
sudo cryptsetup luksOpen /dev/sdb1 encrypted_data

# 创建文件系统
sudo mkfs.ext4 /dev/mapper/encrypted_data

# 挂载
sudo mount /dev/mapper/encrypted_data /mnt/secure-data

# 开机自动挂载(/etc/crypttab)
echo "encrypted_data /dev/sdb1 none luks" | sudo tee -a /etc/crypttab

内核参数调优(sysctl)

网络安全参数

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

# 禁用 IP 转发(非路由器)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

# 禁用源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.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
net.ipv6.conf.all.accept_redirects = 0

# 忽略 ICMP 广播请求
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 忽略虚假的 ICMP 错误响应
net.ipv4.icmp_ignore_bogus_error_responses = 1

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

# 限制连接队列
net.ipv4.tcp_max_tw_buckets = 14400

文件系统与内存保护

# /etc/sysctl.d/99-security.conf(续)

# 禁止 ptrace 跟踪(防调试提权)
kernel.yama.ptrace_scope = 2

# 启用 ASLR(地址空间随机化)
kernel.randomize_va_space = 2

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

# 限制 dmesg 输出仅 root 可见
kernel.dmesg_restrict = 1

# 限制 kexec 加载
kernel.kexec_load_restrict = 1

# 保护硬链接和符号链接
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_fifos = 2
fs.protected_regular = 2
# 应用配置
sudo sysctl --system

# 验证关键参数
sysctl net.ipv4.tcp_syncookies
sysctl kernel.randomize_va_space

系统审计(auditd)

安装与配置

sudo apt install auditd audispd-plugins -y
# /etc/audit/auditd.conf

log_file = /var/log/audit/audit.log
log_format = ENRICHED
max_log_file = 50
num_logs = 5
max_log_file_action = ROTATE
space_left = 100
space_left_action = EMAIL
admin_space_left = 50
admin_space_left_action = SUSPEND
action_mail_acct = root

审计规则

# /etc/audit/rules.d/audit.rules

# 删除所有已有规则
-D

# 缓冲区大小
-b 8192

# 失败模式
-f 1

# 监控特权命令
-a always,exit -F arch=b64 -S execve -C uid!=euid -F euid=0 -k priv_escalation
-a always,exit -F arch=b64 -S chown,chmod -F auid>=1000 -F auid!=4294967295 -k perm_change

# 监控关键文件修改
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k sshd_config

# 监控系统调用
-a always,exit -F arch=b64 -S mount -F auid>=1000 -F auid!=4294967295 -k mounts
-a always,exit -F arch=b64 -S unlink,unlinkat,rename,renameat -F auid>=1000 -F auid!=4294967295 -k file_delete

# 监控网络连接
-a always,exit -F arch=b64 -S connect -F auid>=1000 -F auid!=4294967295 -k network_connect
# 重启审计服务
sudo systemctl restart auditd

# 查看审计日志
sudo ausearch -k sshd_config -ts today
sudo ausearch -k priv_escalation -ts recent

# 生成审计报告
sudo aureport -x
sudo aureport -k

日志管理与监控

journalctl 持久化配置

# 创建日志持久化目录
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
# /etc/systemd/journald.conf

[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=2G
SystemMaxFileSize=100M
MaxRetentionSec=30day
RateLimitIntervalSec=30s
RateLimitBurst=1000
# 查看日志
sudo journalctl -u sshd --since "1 hour ago"
sudo journalctl -p err --since today
sudo journalctl -f  # 实时跟踪

rsyslog 集中日志

# /etc/rsyslog.d/50-remote.conf —— 发送日志到远程服务器

*.* @@log-server.example.com:514;RSYSLOG_TraditionalFileFormat
# /etc/rsyslog.d/99-security.conf —— 安全相关日志单独存储

auth,authpriv.*                 /var/log/auth.log
kern.*                          /var/log/kern.log
mail.*                          -/var/log/mail.log
*.emerg                         :omusrmsg:*

使用 Logwatch 生成日志摘要

sudo apt install logwatch -y

# 生成今日日志摘要
sudo logwatch --output stdout --range today --detail high

# 每日自动邮件报告
sudo logwatch --output mail --mailto admin@example.com --range yesterday --detail med

自动安全更新

sudo apt install unattended-upgrades apt-listchanges -y
# /etc/apt/apt.conf.d/50unattended-upgrades

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESMApps:${distro_codename}-apps-security";
    "${distro_id}ESMInfrastructure:${distro_codename}-infra-security";
};

Unattended-Upgrade::Package-Blacklist {
};

Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";

Unattended-Upgrade::Mail "admin@example.com";
Unattended-Upgrade::MailOnlyOnError "true";
# /etc/apt/apt.conf.d/20auto-upgrades

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
# 验证自动更新状态
sudo unattended-upgrade --dry-run --verbose

容器安全基础

Docker 安全加固

# /etc/docker/daemon.json

{
  "icc": false,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "userns-remap": "default",
  "no-new-privileges": true,
  "seccomp-profile": "/etc/docker/seccomp.json",
  "bip": "172.17.0.1/16",
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 65536,
      "Soft": 1024
    }
  }
}
# 容器运行安全最佳实践
docker run -d \
  --name webapp \
  --read-only \
  --tmpfs /tmp:noexec,nosuid,size=100m \
  --tmpfs /run:noexec,nosuid,size=10m \
  --pids-limit 100 \
  --memory 512m \
  --cpus 1.0 \
  --security-opt no-new-privileges \
  --security-opt apparmor=docker-default \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  --user 1000:1000 \
  myapp:latest

Podman 无守护进程容器

# Podman 默认 rootless 运行,更安全
podman run -d \
  --read-only \
  --pids-limit 100 \
  --memory 512m \
  --cap-drop ALL \
  --security-opt no-new-privileges \
  myapp:latest

入侵检测

AIDE 文件完整性检测

sudo apt install aide -y

# 初始化数据库
sudo aideinit

# 将初始数据库移为生产数据库
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# 执行完整性检查
sudo aide --check

# 更新数据库(在合法变更后)
sudo aide --update
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# /etc/aide/aide.conf —— 自定义检测规则

# 关键目录严格检测
/etc p+i+n+u+g+s+b+m+c+sha512
/root p+i+n+u+g+s+b+m+c+sha512

# 忽略频繁变化的目录
!/var/log
!/var/run
!/proc
!/sys
!/dev
!/tmp

Rootkit 检测

# 安装 rkhunter 和 chkrootkit
sudo apt install rkhunter chkrootkit -y

# rkhunter 配置
# /etc/rkhunter.conf

UPDATE_MIRRORS=1
MIRRORS_MODE=0
WEB_CMD=curl
ALLOW_SSH_ROOT_USER=no
ALLOW_SSH_PROT_V1=no
DISABLE_TESTS=apps
# 更新 rkhunter 数据库
sudo rkhunter --update

# 执行系统检查
sudo rkhunter --check --skip-keypress

# chkrootkit 检测
sudo chkrootkit

# 设置每日自动检查
echo "0 3 * * * root /usr/bin/rkhunter --check --skip-keypress --report-warnings-only" | \
  sudo tee /etc/cron.d/rkhunter

SSL/TLS 加固

Nginx SSL 配置

# /etc/nginx/snippets/ssl-hardening.conf

ssl_protocol TLSv1.2 TLSv1.3;
ssl_cipher TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy strict-origin-when-cross-origin always;

生成强 DH 参数

openssl dhparam -out /etc/nginx/dhparam.pem 2048

常见攻击向量与防御

防御 DDoS 攻击

# 使用 sysctl 缓解 SYN Flood
sudo sysctl -w net.ipv4.tcp_syncookies=1
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sudo sysctl -w net.core.somaxconn=65535

# 使用 iptables 限制连接速率
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP

防御缓冲区溢出

# 启用 ASLR
sudo sysctl -w kernel.randomize_va_space=2

# 启用 NX 位(No-eXecute,现代 CPU 默认启用)
# 编译时使用 -fstack-protector-strong

# 禁用核心转储
echo "* hard core 0" | sudo tee -a /etc/security/limits.conf

防御 DNS 劫持

# /etc/systemd/resolved.conf

[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=9.9.9.9
DNSOverTLS=opportunistic
DNSSEC=allow-downgrade
Cache=yes
CacheFromNetwork=no

安全加固检查清单

类别 检查项 状态
SSH 禁用密码认证 ☐
SSH 禁用 root 登录 ☐
SSH 修改默认端口 ☐
SSH 配置 fail2ban ☐
SSH 使用强加密算法 ☐
防火墙 默认拒绝入站 ☐
防火墙 仅开放必要端口 ☐
防火墙 出站规则限制 ☐
用户 删除不必要的账户 ☐
用户 配置最小权限 sudo ☐
用户 密码复杂度策略 ☐
用户 账户锁定策略 ☐
文件系统 关键文件权限正确 ☐
文件系统 设置不可变属性 ☐
文件系统 敏感分区加密 ☐
内核 禁用 IP 转发 ☐
内核 启用 SYN Cookies ☐
内核 启用 ASLR ☐
审计 auditd 规则配置 ☐
日志 日志持久化 ☐
日志 集中日志收集 ☐
更新 自动安全更新 ☐
入侵检测 AIDE 基线建立 ☐
入侵检测 rkhunter 定期扫描 ☐
SSL/TLS 禁用弱协议 ☐
SSL/TLS HSTS 启用 ☐

常见问题 FAQ

Q: 加固后无法 SSH 登录怎么办?

确保在禁用密码认证前,已成功部署公钥并测试密钥登录。建议保持一个已登录的会话,在另一个终端测试新配置。如果被锁定,可通过云服务商的 VNC 控制台登录修复。

Q: 修改 SSH 端口后连接失败?

检查防火墙是否放行了新端口。UFW 和 iptables 都需要同步更新规则。同时确认 SELinux/AppArmor 允许新端口(RHEL/CentOS 系统需要 semanage port -a -t ssh_port_t -p tcp 2222)。

Q: chattr +i 后无法修改文件怎么办?

使用 chattr -i 解除不可变属性,修改完成后重新 chattr +i。注意:root 也不能绕过不可变属性,必须先解除。

Q: 自动安全更新会导致服务中断吗?

安全更新通常不重启服务,仅打补丁。但内核更新需要重启才生效。建议配置 Automatic-Reboot "false",手动安排重启窗口。

Q: 如何在不影响业务的情况下测试加固措施?

  1. 在测试环境先行验证所有配置
  2. 使用蓝绿部署或金丝雀发布逐步应用
  3. 保持回滚方案(备份所有配置文件)
  4. 分阶段加固:先 SSH → 再防火墙 → 再内核参数

Q: AIDE 报告大量变更怎么办?

检查变更是否为合法操作(如包更新、配置修改)。合法变更后需要更新 AIDE 数据库。如果是未授权变更,立即启动应急响应流程。


本文涵盖的加固措施可根据实际业务需求裁剪。建议参考 CIS Benchmarks 和 DISA STIG 获取更详细的合规标准。配合 工具库的 Hash 加密工具 和 SSH 密钥生成器 可以更高效地完成服务器安全加固。

#Linux#安全加固#服务器#运维#教程