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: 如何在不影响业务的情况下测试加固措施?
- 在测试环境先行验证所有配置
- 使用蓝绿部署或金丝雀发布逐步应用
- 保持回滚方案(备份所有配置文件)
- 分阶段加固:先 SSH → 再防火墙 → 再内核参数
Q: AIDE 报告大量变更怎么办?
检查变更是否为合法操作(如包更新、配置修改)。合法变更后需要更新 AIDE 数据库。如果是未授权变更,立即启动应急响应流程。
本文涵盖的加固措施可根据实际业务需求裁剪。建议参考 CIS Benchmarks 和 DISA STIG 获取更详细的合规标准。配合 工具库的 Hash 加密工具 和 SSH 密钥生成器 可以更高效地完成服务器安全加固。
本站提供浏览器本地工具,免注册即可试用 →
#Linux#安全加固#服务器#运维#教程