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
# /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#安全加固#服务器#运维#教程