熱門分類
載入中…
目錄0%

🐧 企業級 Linux 硬化實戰:結合 SELinux 與隱身網路 (Stealth Networking) 的極致防護

    🐧 企業級 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) 企業常見落地架構(建議優先順序)

    1. VPN Overlay(例如 WireGuard):把管理面入口移到私有通道。
    2. Bastion / Jump Host:集中管理面,對外只留一個受控入口。
    3. 單封包授權(SPA):比傳統 Port Knocking 更抗重放、更易稽核。
    4. 微分段(主機層防火牆):用 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 硬化或導入 SELinux / 隱身網路,歡迎在下方留言分享: 你的發行版(RHEL/Rocky/Alma/Debian/Ubuntu)、目前 SELinux 模式、你採用的 VPN/跳板機方案、 以及你遇到的 AVC 拒絕或防火牆鎖死狀況。你提供的情境,能讓這份實戰清單更接近企業現場。

    前往留言區

    延伸閱讀

    — WWFandy・主題筆記

    🔗 分享這篇 LINE Facebook X

    沒有留言:

    字級