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 BenchmarksDISA STIG 取得更詳細的合規標準。搭配 工具庫的 Hash 加密工具SSH 金鑰產生器 可以更高效地完成伺服器安全加固。

本站提供瀏覽器本地工具,免註冊即可試用 →

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