🐧 企業級 Linux 硬化實戰:結合 SELinux 與隱身網路 (Stealth Networking) 的極致防護
企業環境的 Linux 防護,最怕兩種極端:只做表面(規則很多但不可驗證),或做太硬(策略很強但無法維運)。 本篇以「可落地、可稽核、可回滾」為目標,整合 SELinux(強制存取控制)與 隱身網路(Stealth Networking)(降低暴露面)兩條主軸, 將防護從「靠邊界」升級為「靠策略與通道」。
一、威脅模型先行:你要防的是哪一種入侵路徑?
企業常見入侵路徑可簡化成三類,你的硬化策略也應對應設計:
- 外部掃描 → 服務弱點 → 提權:攻擊面越大,越容易被撞到一次成功。
- 憑證外洩 → 直接登入 → 橫向移動:重點在通道與權限邊界。
- 供應鏈 / 程式被置換 → 進程濫權:重點在強制存取控制與可稽核性。
隱身網路負責把「入口」收斂到最少;SELinux 負責把「進程能力」切到最小。 兩者疊加後,你會得到一個非常務實的結果:就算被打進來,也很難做事;就算做了事,也更容易被抓到。
二、基礎硬化底座:先把最小暴露面做對
1) 關閉不需要的服務與埠
# 列出正在監聽的埠(先盤點攻擊面)
ss -lntup
# systemd 服務盤點(依環境調整)
systemctl --type=service --state=running
# 停用不需要的服務(示例)
sudo systemctl disable --now avahi-daemon 2>/dev/null || true
sudo systemctl disable --now cups 2>/dev/null || true
2) 更新策略:可控、可回滾、可驗證
# 建議:安全更新優先,並保留回滾路徑(快照 / 映像 / 套件版本)
# RHEL / Rocky / Alma
sudo dnf -y update
# Debian / Ubuntu
sudo apt update && sudo apt -y upgrade
3) SSH 基礎硬化(但不把它當成隱身)
# /etc/ssh/sshd_config 建議重點(示例)
# PasswordAuthentication no
# PermitRootLogin no
# PubkeyAuthentication yes
# AllowUsers your_admin_user
sudo systemctl restart sshd
注意:SSH 改埠不等於隱身;你要的是「預設不對外可見」,而非「把可見的門換到別條街」。
三、SELinux:用強制存取控制把「進程濫權」直接切斷
1) 模式策略:Enforcing / Permissive / Disabled
# 檢查狀態
getenforce
sestatus
# 立即切換為 Enforcing(不中斷服務,但可能暴露既有設定問題)
sudo setenforce 1
# 設為開機預設 Enforcing
# /etc/selinux/config
# SELINUX=enforcing
2) 事件稽核:用 AVC 記錄來定位問題,而不是「直接關 SELinux」
# 查找最近的 SELinux 拒絕事件(AVC)
sudo ausearch -m avc -ts recent
# 以可讀方式彙整(需要 setroubleshoot-server / setroubleshoot)
sudo sealert -a /var/log/audit/audit.log 2>/dev/null || true
3) 常見落地場景:Web / 反向代理 / 自建服務
以下示例以「需要開放對外服務」為例,但後續會用隱身網路把入口收斂到可信通道。
# HTTP/HTTPS 服務需要開放(SELinux boolean 依情境調整)
sudo setsebool -P httpd_can_network_connect on
# 檔案標籤(context)是落地成敗關鍵:不要只 chmod 777
# 例:把 web 根目錄套用到自定義路徑
sudo semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?"
sudo restorecon -Rv /srv/www
4) 謹慎對待 audit2allow:可以用,但不要「無腦全放」
audit2allow 的正確用法是「針對明確需求、最小化放行」,並且要把模組納入變更管理(版本控管與回滾)。 在企業環境中,這類模組應比照設定變更流程(含審核與上線窗口)。
# 只示範流程觀念:請先確認拒絕事件是否為『合理需求』
sudo grep AVC /var/log/audit/audit.log | tail -n 50
# 產出最小模組(示意,實務請先審查規則內容)
# sudo ausearch -m avc -ts recent | audit2allow -M local_fix
# sudo semodule -i local_fix.pp
四、隱身網路(Stealth Networking):讓你的服務「預設不可見」
1) 核心原則(企業版定義)
- 預設拒絕(Default Deny):所有 inbound 先封,再按需開。
- 可信通道優先:管理面與敏感服務只走 VPN / 跳板機 / mTLS。
- 可掃描面最小化:不要讓「掃得到」變成「能打」的起點。
- 可稽核:每一個開放都能對應到需求與責任人。
2) 企業常見落地架構(建議優先順序)
- VPN Overlay(例如 WireGuard):把管理面入口移到私有通道。
- Bastion / Jump Host:集中管理面,對外只留一個受控入口。
- 單封包授權(SPA):比傳統 Port Knocking 更抗重放、更易稽核。
- 微分段(主機層防火牆):用 nftables / firewalld 把東西向流量切乾淨。
3) 基礎做法:firewalld / nftables 採「只開需要」
# firewalld:預設區域規則(示例:先確認你在哪個 zone)
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --list-all
# 不要一次開太多,先以管理/必要服務為最小集合
# (示例)只開 443;SSH 改成只允許 VPN 或特定來源
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
4) 推薦做法:SSH 不對外開放,只在 VPN 上可達
這是「隱身」最直觀的落地:把 SSH 綁在 VPN 介面或內網介面;公網只留必要的業務入口(甚至只留反向代理)。
# 概念示例:讓 sshd 只監聽特定介面/IP(依你的 VPN/內網 IP 調整)
# /etc/ssh/sshd_config
# ListenAddress 10.10.10.1
sudo systemctl restart sshd
# 搭配防火牆:只允許 VPN 網段存取 22
# firewalld rich rule(示例)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.10.0/24" port port="22" protocol="tcp" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" drop'
sudo firewall-cmd --reload
5) Port Knocking vs SPA:企業建議
Port Knocking 的價值在「降低掃描暴露」,但在高對抗情境下仍可能遇到重放、規則繞行與維運困難。 若你需要更企業化的作法,建議評估 SPA(Single Packet Authorization) 類方案,把「授權」變成可稽核事件。
五、把兩者疊加:SELinux × 隱身網路的「雙層保護」
1) 典型攻擊鏈的阻斷點
- 掃描 → 找服務:隱身網路讓服務預設不可見,掃描命中率下降。
- 命中 → 打弱點:就算服務被打到,SELinux 限制進程能做的事(例如讀敏感檔、執行未授權操作)。
- 提權 → 擴大破壞:搭配最小權限與稽核(auditd),讓「可疑行為」更容易被發現與追蹤。
2) 企業維運重點:把策略做成「可驗證」
# 稽核與觀測:建議最少要做到
# 1) 可回溯的登入軌跡
last -a | head
# 2) 可回溯的權限/敏感事件(依環境擴充規則)
sudo systemctl enable --now auditd 2>/dev/null || true
sudo ausearch -ts today | tail -n 50
若你有 SIEM / 日誌平台(例如 ELK、Splunk、Wazuh),建議把 SELinux AVC、sudo、sshd、firewalld/nftables 事件集中化, 把「規則」提升成「可觀測的控制點」。
六、最小可落地方案(給真正要上線的人)
如果你希望用最短時間把防護拉到可用水位,建議先完成以下 7 件事:
✅ 1. 盤點並關閉不必要服務(以 ss/systemctl 驗證)
✅ 2. SSH 停用密碼登入、禁用 root 直登、納入金鑰與白名單
✅ 3. 防火牆改 Default Deny:公網只留必要入口(例如 443)
✅ 4. SSH 不對外可達:只允許 VPN/內網(隱身管理面)
✅ 5. SELinux 設為 Enforcing,並建立 AVC 稽核處理流程
✅ 6. auditd 啟用,關鍵事件可追溯(至少登入/提權/拒絕事件)
✅ 7. 全部變更可回滾:快照/備份/版本控管(避免硬化把自己鎖死)
七、常見踩雷與排除方向
1) 「SELinux 擋住服務」怎麼辦?
- 先查 AVC 事件,再判斷是「配置錯誤」還是「真的需要放行」。
- 優先用正確的檔案標籤(fcontext/restorecon)與 boolean,而不是直接關 SELinux。
2) 「隱身網路」把自己鎖在門外
- 上線前先設計 Break Glass:保留緊急通道(例如 out-of-band、控管好的臨時白名單)。
- 所有封鎖規則先在維護窗口套用,並做遠端回復計畫(回滾命令/快照)。
3) 只靠防火牆不夠,為何還要 SELinux?
- 防火牆解決「能不能進來」,SELinux 解決「進來後能做什麼」。
- 在容器化/多服務共存環境,SELinux 是切開服務邊界的關鍵工具之一。
延伸閱讀
- 🐧 Linux SSH 硬化實戰:MFA、Fail2ban 與風險控管指南
- 🐧 Docker 安全最佳實務:Rootless 與映像掃描落地
- 🐧 Linux sysctl × Nginx 高併發調校:效能與風險一次顧好
- 🐧 Linux 開機流程深入解析:BIOS/UEFI → GRUB → Kernel → systemd
- 🐧 Linux Proxy Server 建置教學:Squid 安裝與設定指南
— WWFandy・主題筆記
💬 留言互動|你的環境與踩雷經驗最有價值
如果你正在做 Linux 硬化或導入 SELinux / 隱身網路,歡迎在下方留言分享: 你的發行版(RHEL/Rocky/Alma/Debian/Ubuntu)、目前 SELinux 模式、你採用的 VPN/跳板機方案、 以及你遇到的 AVC 拒絕或防火牆鎖死狀況。你提供的情境,能讓這份實戰清單更接近企業現場。
前往留言區