網站伺服器建置與管理上課補充教材


Chapter 05:伺服器/主機的簡易安全概念與管理
  1. 一個封包要進入本機基本上需要通過如下圖示的相關流程才行:
    1. 先要通過 TCP/IP 的相關規範才能夠連線到本機的網路門口
    2. 要先通過防火牆的規則管制,才可以進入到本機使用本機的服務
    3. 能否取得服務與這個服務是否啟用與相關設定有關 (發生問題可以查登錄檔)
    4. 能否實際存取資料,首先要看有沒有啟動 SELinux 這個細部權限設定項目?
    5. 全部都放行後,最後能不能存取資料,還是跟資料檔案的權限 (rwx) 有關!
  2. 防火牆有沒有用?軟體升級有沒有用?設定 chmod 777 會不會出事?
    1. 從前一個項目的圖示來看,如果你是 WWW 伺服器,那一定就是要放行 port 80,因此,若 port 80 出問題, 那你的防火牆當然一點用處也沒有。
    2. 但,如果你的服務中,例如 ssh 的服務,僅放行給部份的來源 IP 位址,則此時防火牆保護危險的服務,就很有用處了!
    3. 一般來說,軟體如果沒有問題,或沒有加入新功能,是不會隨意升級的。因此,如果官網有公告最新的軟體升級資訊, 當然最好就是一定要升級到最新!至少能夠預防一大堆可能的系統漏洞
    4. 如果你的網路服務僅提供讀取的功能,那麼即使你的檔案權限放行 777 可能都還不會出事。但是如果你的這個服務設定錯誤呢? 如果你的這個服務因為漏洞所以被攻破呢?那麼你的檔案如果是 777 ,很好!那就是完全的被拿走了...
    5. SELinux 可以管理網路程序 (本機程序通常不管理),讓這個網路程序僅能在某些目錄內工作,而且只能進行某些行為, 因此,即使你的這個網路軟體被攻破,而且權限還是 root 時,它還是無法完整的操控你的系統!
  3. 伺服器本機的防護:升級到官方最新的軟體版本
    1. 找到最近的官網 mirror 網站,崑山校內最簡單的就是 http://ftp.ksu.edu.tw 這個網站了!
    2. 修改 /etc/yum.repos.d/ 這個目錄,可以的話,只加上 base 及 updates 這兩個就好,其他的沒用到暫時不用也無所謂。
    3. 使用 yum -y update 自動進行全系統升級
    4. 若有升級到核心或重要的函式庫,最好重新開機,才能使用到最新的核心與函式庫功能。
    5. 練習:
      • 修改 /etc/yum.repos.d/*.repo 檔案,讓系統支援崑山校內的 CentOS 7 來源
      • 建立一隻每天 2 點會執行的腳本,該腳本會每天持續更新系統
      • 假設你需要加入某些核心功能,例如在 /proc/cmdline 加入 intel_iommu=on 要如何處理與觀察?
  4. 伺服器本機的防護:減少網路服務
    1. 如果對方想要連接到你的 port 80,但是你的 port 80 根本就沒有啟用埠口在監聽,那麼對方無論如何是無法連接到你的服務的! 所以減少網路服務是很重要的!
    2. 可使用 netstat -utlnp 來查詢自己本機所啟動的服務
    3. 可使用 nmap IP 來查詢某個 IP 有啟動的 TCP 埠口有哪些 (不可隨意攻打別人)
    4. 可使用 nmap -sTU IP 來查詢某個 IP 啟動的 TCP/UDP 埠口
    5. 可使用 nmap -sP network/netmask 來查詢整個網域有啟動的 IP 位址共有哪些
    6. 練習:
      • 先用 netstat 檢查一下本機有啟動的網路埠口共有哪些?
      • 先自己分析一下,哪些是需要的埠口?哪些是不需要的埠口?
      • 透過 systemctl 關閉不要的埠口,且下次開機,這些埠口也不會啟用!
    7. 練習:
      • 使用 nmap 搭配 icmp (-sP) 的功能,來找到你的外部網域的區網有哪些 IP 是開機著的!
  5. 伺服器本機的防護:透過管理 SELinux
    1. SELinux 的管理主體是網路服務那個『程序』,而不是『啟動該程序的身份』喔!
    2. 整個程序與相關的SELinux模式可由下圖來理解:
    3. 第一關:SELinux 的三種模式與每種模式的功能
      • Disable:完整關閉不使用 SELinux,核心不會啟用 SELinux
      • Enforcing:完整啟動 SELinux 的功能,會分析、管制網路程序能夠存取的目錄與檔案
      • Permissive:寬容模式,事實上有啟動 SELinux 的功能,但是僅進行分析與紀錄,並不會實際抵擋網路程序的運作。
    4. 練習:
      • 使用 getenforce 觀察目前你的系統使用哪種 SELinux 的模式?
      • 使用 setenforce [0|1] 搭配 getenforce 來觀察 SELinux 的模式變化!
      • 觀察 /etc/selinux/config 這個檔案的內容,看如何設定預設的 SELinux 模式。
      • 觀察 /boot/grub2/grub.cfg 裡面的設定,若有 selinux=0 亦代表預設關閉 SELinux 的模式,而成為 disable 喔!
      • 讀者須注意,最好不要 Disable 與其他兩種模式交互切換,因此切換成 disable 後,系統內的每個檔案的 inode 內容會被修改,可能造成無法預知的問題!
    5. 第二關:每種網路程序要能提供某些服務時,需要透過一些規則與政策
      • 可以使用『 sestatus 』觀察目前的 SELinux 狀態
      • 可以使用『 getsebool -a 』查詢現階段 SELinux 所支援的各項規則與放行否
      • 可以使用『 semanage boolean --list 』查詢每個 SELinux 規則的簡易說明
      • 可以使用『 setsebool -P rule=[0|1] 』修改設定檔並直接啟用某個規則
    6. 練習:
      • 透過 semanage boolean --list 找出所有跟 FTP 有關的規則有哪些?
      • 讓 FTP 可以完整的存取 (full access) 系統資訊
    7. 第三關:每個程序要讀取檔案,程序的安全本文與檔案的安全本文要能夠搭配
      • 可以透過『 ps -Z 』觀察到每一種程序使用的安全本文為何
      • 可以透過『 ls -Z 』觀察每一個檔案的安全本文為何
      • 可以透過『 semanage fcontext --list 』觀察每個檔案的預設安全本文為何
      • 可以透過『 chcon -t type 檔名 』修改檔案的安全本文
      • 可以透過『 restorecon -Rv 目錄 』修改目錄下的檔案恢復原本的安全本文
      • 可以透過觀察『 /var/log/messages 』的內容了解如何修改 SELinux 的錯誤
    8. 練習:
      • 讓你的系統安裝 vsftpd 這個 FTP 伺服器軟體
      • 啟動這個伺服器軟體
      • 請打開瀏覽器,用 ftp://localhost 登入瀏覽看看
      • 用 student 身份登入,簡單的方法為: ftp://student@localhost 提示視窗中輸入 stduent 的密碼
      • 若無法登入,請觀察 /var/log/messages 的內容寫些什麼?
      • 若依舊沒有紀錄資料,讓 SELinux 變成 permissive 後,再次登入,看看情況如何?
      • 如何改善這個情況?
      • 在 /root 底下建立一個檔案,內容填寫你的學號與姓名,然後將檔案移動到 /var/ftp/pub 底下, 在以匿名登入瀏覽,能否看到這個檔案?能否讀取這個檔案?為什麼?
      • 如何改善上面的情況?
    9. 全系統的 SELinux 更新方式:
      若在沒有 SELinux 的環境下更動到檔案的 inode 內容,則原本紀錄在 inode 內的 SELinux 將會被清空。 例如在基礎訓練篇裡面的關於 root 救援進入 rescue 的模式中,就是一個最基本的案例。此時你可以這樣做:
      • 在離開救援模式前,使用 touch /.autorelable ,則下次重新開機後,系統會重新根據預設定義重建 SELinux 對每個檔案的安全本文!重新定義完畢會再次的重新開機就正常了
      • 離開救援模式之前,將 /etc/selinux/config 修改成為 permissive 的模式,正常進入系統後, 使用 root 下達 restorecon -Rv / 來處理全系統的 SELinux 復原,之後修改 /etc/selinux/config 成為 Enforcing 再重開機。 或直接 setenforce 1 而不用重新開機也行。
Top
HOME