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: 如何在不影響業務的情況下測試加固措施?

  1. 在測試環境先行驗證所有配置
  2. 使用藍綠部署或金絲雀發布逐步套用
  3. 保持回滾方案(備份所有配置檔案)
  4. 分階段加固:先 SSH → 再防火牆 → 再核心參數

Q: AIDE 報告大量變更怎麼辦?

檢查變更是否為合法操作(如套件更新、配置修改)。合法變更後需要更新 AIDE 資料庫。如果是未授權變更,立即啟動應急響應流程。


本文涵蓋的加固措施可根據實際業務需求裁剪。建議參考 CIS Benchmarks 和 DISA STIG 取得更詳細的合規標準。搭配 工具庫的 Hash 加密工具 和 SSH 金鑰產生器 可以更高效地完成伺服器安全加固。

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