伺服器架設篇 - RockyLinux 9

第一章、小型雲系統與主機安全強化流程

小型雲系統我們在第零章談過他的重要性!這一章我們真的就來建置它吧!

最近更新時間: 2023/08/04

要模擬出整個機房的環境,最省錢的作法當然就是在雲裡面透過虛擬環境來架設一番。不過,若真的要去公有雲申請帳號, 我們的情況是沒有辦法處理好想要的橋接與子網的切割,這就傷腦筋了!因此,這一章,我們使用簡易的電腦主機配備搭配一些設定, 讓我們的母機器未來可以生出好多個虛擬機器來使用。

如同 Linux 基礎學習訓練教材最後一章的內容,不是只要將系統安裝好就算了,還得要手動調整一些額外的設定, 讓我們的系統成夠越安全越好!既然我們的實體機器只是作為虛擬機器以及網路橋接的設定,因此不需要啟用其他的服務才對! 所以,沒用到的服務,當然就關閉、關閉、再關閉!

1.1、小型雲系統的安裝與基礎設定

其實...用一台具有較大容量記憶體的 PC 將它安裝好 Linux,就是一個簡易的雲系統囉!沒什麼特別的。只是你最好了解一下實體機器、 虛擬機器、虛擬機器內的作業系統的代稱等等的,這樣未來若出問題,在 google 查詢問題的所在時,比較不會莫名其妙!

1.1.1、虛擬化名詞簡介與 CPU 相關虛擬化設定

雖然我們在第 0 章稍微談過雲程序與虛擬機器,不過,相對於沒碰過虛擬機器朋友來說,可能還是覺得很模糊!所以,這裡我們先將許多 Internet 上面經常聽到的專有名詞做個簡單的解釋,讓大家未來要查資料時,比較好追蹤。查看底下的名詞時, 可以對照著圖 0.1.5 來查看!

  • Virtual machine, VM: 就是虛擬機器 (https://en.wikipedia.org/wiki/Virtual_machine) 的英文,VM 為縮寫。指的是在電腦系統中, 由實體機器的實際資源所提供的虛擬電腦系統,通常虛擬機器指的是模擬的硬體系統,而 VM guest 則指的是虛擬機器內的作業系統。 所以,一般的使用情況下,VM 指硬體機器,Guest 指 VM 內的作業系統。
  • KVM: Kernel-based Virtual Machine (https://www.linux-kvm.org) 的縮寫,直接將上述的 VM 監督器整合在 Linux 核心當中, 為目前 Linux 核心的預設虛擬化監督器。
  • KVM Host: 其實就是 host,實際的實體主機通稱為 host 母機器。
  • KVM, qemu, libvirtd: 達成虛擬化所需要的各個軟體。KVM 就是之前談到的主要的虛擬化監督器, qemu 則主要在模擬週邊硬體,包括硬碟、USB、顯示卡、主機板晶片組等等。而 libvirtd 則是提供一個管理的界面機制, 我們後續會使用到的 libvirtd 的管理工具軟體主要是 virsh 這一個指令。

上面是常見的虛擬化名詞。另外,如果你需要讓系統具有比較好的效能,則你的 CPU 最好能夠支援虛擬化指令集, 而且你的主機板 BIOS/UEFI 裡面得要將這些功能啟用才行。基本上,目前的桌上型電腦系統,應該預設都會啟動 CPU 虛擬化技術支援才對。 我們可以開機進入 UEFI 系統 (俗稱的 BIOS 環境) 查閱一下。在鳥哥這部 Asus 的系統下,(1)開機按下 [del] 進入設定畫面, 然後 (2)按下 [F7] 進入進階模式後,可以查詢得到底下的畫面:

BIOS 設定示意
圖 1.1.1、UEFI 環境下,查看/設定 CPU 虛擬化支援項目

你一定要啟用的項目是『Intel 虛擬化技術』這一個 (Enabled),至於底下還有個『 VT-d 』的項目,那個是非必備的! 除非你需要進行 PCI passthrough 的技術支援,否則該項目有沒有勾選都不會影響的。 另外,最好啟用 Intel AES-NI 這個項目,因為 AES 是使用度非常廣的加密機制,有 CPU 的硬體加速運算,效能會好很多。 下一小節會介紹 SATA 的設定,這裡先知道一下在這個項目裡面可以找到即可。

思考例題:請以『 intel i5 10500 』為關鍵字前往 google 搜尋,找到 intel 官方的 CPU 規格頁面,查看一下這個 CPU 的核心數量、快取記憶體容量、TDP 的意義與數值、最大可接受主記憶體容量、是否支援虛擬化、基礎頻率與最大超頻的意義與數值。 從而討論與理解你的主機能否升級、可能最快速度為何等等,並且嘗試回答:
  • 核心數量與執行緒數量之間的關係為何?
  • TDP 的英文全名與實際意義為何?
  • PCI Express 設定當中的『Up to 1x16, 2x8, 1x8+2x4』是什麼意思?
  • PCI Express 線道數量上限意義為何?
  • 進階技術的 VT-d 意義為何?
  • Intel AES 新增指令功能為何?
最終思考一下,既然上面說 CPU 的 Express 最多僅支援 16 線道,那為何主機板上面可以安裝多於 16x 的 PCI-E 通道? 例如很多主機板上面除了一條 16x 的 PCI-E 之外,還具有 2 條 4x 的通道呢?

1.1.2、使用硬體說明與準備 (含 RAID 設定)

老實說,前一章就提到,想要搞雲端運算,沒有大量的金援是很難有好結果的。不過,我們畢竟只是一個小型內部測試環境, 所以,搞搞小系統就好,沒關係的!但是,配備也不能太爛,否則,當 VM 多起來,整體系統會很糟糕! I/O 負載較大,基本建議使用 SSD,但是鳥哥身邊臨時找不到 SSD 啊!就拿 4 顆傳統硬碟 (HDD) 組成容錯用的 RAID! 這樣對於資料來說,基本保障才會有!本次鳥哥用來介紹的實際硬體如下:

  • CPU: Intel(R) Core(TM) i5-10500 (6 核 12 緒)
  • RAM: 32GB
  • 主機板: Asus D700TA 桌上型電腦內建主機板
  • VGA 卡:內建顯示卡 (Intel©right; UHD Graphics 630),BIOS 設定為 64M 記憶體
  • 硬碟: 1TB 傳統硬碟 x 4
  • 網卡: 主機板內建的 I219-V 網卡,使用 e1000e 模組驅動
  • RAID card:主機板內建 Intel 磁碟陣列卡 (Linux 視為軟體磁碟陣列)
再次強調,基本上,不同的系統、不同的年份、不同的 UEFI 環境,設定的界面各項目的位置都不太一樣! 底下只是個指引,詳細資料請自行參考您的主機板使用說明書喔!

上面這部主機硬體,說實在話,不是很強大!而且那個磁碟陣列是內建的,對於真實運作的環境下, 效能真的不是太好。內建的 RAID 卡,最好做成 RAID0, RAID1 或 RAID10 就好,比較高階的 RAID5 千萬不要在這種卡片上面實做! 主機板內建 raid card 的 RAID5 效能真的很糟糕!

  • 實做 RAID10

鳥哥手邊有比較多的傳統磁碟,所以打算使用 4 顆傳統磁碟組成一個 RAID10 的磁碟陣列,一方面磁碟容量會較大些, 一方面也能夠有容錯的效果。不同的系統有不同的磁碟陣列設定,鳥哥這邊主要是以 ASUS 的桌上型電腦系統為例, 這部系統要建立磁碟陣列:

  1. 先要到 UEFI 設定環境下,點擊圖 1.1.1 畫面當中的『SATA 設定』項目, 然後將『SATA 模式選擇』設定為『Intel RST Premium』,不要使用 AHCI 喔!畫面會如下:
    BIOS 設定示意
    圖 1.1.2-1、UEFI 環境下,變更 SATA 模式,準備設定 RAID
  2. 選擇完畢之後請 (1)儲存設定,之後 (2)重新開機,並 (3)再次進入 UEFI,以及進入圖 1.1.1 的設定中, 就會出現如下的畫面,你會發現畫面多了一個『Intel Rapid Storage Technology』的項目:
    BIOS 設定示意
    圖 1.1.2-2、UEFI 環境下,更新 SATA 模式,已準備進入 RAID 設定項目
  3. 點擊上面的『Intel Rapid Storage Technology』之後,就會看到有個『Create RAID Volume』的項目,同時列出目前系統裡面的磁碟裝置! 如下圖所示:
    BIOS 設定示意
    圖 1.1.2-3、UEFI 環境下,更新 SATA 模式,已準備進入 RAID 設定項目
  4. 點擊上圖的 Create RAID Volume 設定後,出現的畫面中,如下圖所示,那個 Name 只是提供一個參考資料而已, 隨便你填。RAID Level 就一定要選 RAID10 (0+1) 這個,容量小一半,但是具有容錯功能!千萬不要使用 RAID5。另外, RAID10 最少要 4 顆相同容量的磁碟,如果你只有兩顆磁碟,那就做成 RAID1 吧!因為 RAID0 沒有容錯!暫不考慮! 其他項目保留預設值即可:
    BIOS 設定示意
    圖 1.1.2-4、UEFI 環境下,更新 SATA 模式,已準備進入 RAID 設定項目
    全部都設定完畢,將游標移動到最下方,你會看到 Create Volume 的項目,點擊該項目!
    BIOS 設定示意
    圖 1.1.2-5、UEFI 環境下,更新 SATA 模式,已準備進入 RAID 設定項目
    最終回到上層畫面後,就會出現一個 kvm RAID10 的 RAID Volumes 項目了!如下所示:
    BIOS 設定示意
    圖 1.1.2-6、UEFI 環境下,更新 SATA 模式,已準備進入 RAID 設定項目
  5. 最終進行 (1)儲存設定 (2)重新開機,之後,你的系統就擁有一顆『假的硬體磁碟陣列』了!呵呵!
  • 製作可開機 USB 安裝片

接下來準備要安裝 host 母系統了。這次我們使用的是 RockyLinux 9.0 版為例,這個版本提供了好幾個不同的 ISO 檔案, 目前這種 ISO 檔案的容量越來越可怕!預設的 dvd1 檔案竟然高達 10G 左右!光是下載就嚇死人... 鳥哥建議下載 minimal 版本即可!安裝好之後,再透過網路安裝其他所需軟體即可!下載點可以到底下查閱看看:

鳥哥下載的是『Rocky-9.0-x86_64-minimal.iso』這個檔案。下載完畢後,如果你的工作環境是 Linux 系統, 請透過 dd 這個指令搭配 USB 隨身碟來進行開機片的製作。最簡單的指令方式有點像這樣 (我這裡假設你的 USB 隨身碟為 /dev/sdc !請使用 lsblk 去找出你的隨身碟檔名來取代掉即可。)

[root@cloudandvm ~]# dd if=Rocky-9.0-x86_64-minimal.iso of=/dev/sdc

如果你的工作環境是 windows 的話,那麼建議使用 rufus 這套開源軟體 (http://rufus.akeo.ie/)。這套軟體無須安裝,下載後就可以使用。啟動軟體畫面會像這樣:

rufus運作示意圖
圖 1.1.2-7、使用 rufus 軟體燒錄 RockyLinux 映像檔到 USB 磁碟中

在『裝置』的部份,請確定你的 USB 所在磁碟代號,以上圖為例,鳥哥用的 USB 是 32GB 容量!要確認喔!之後在 2 號箭頭處, 選擇好正確的 RockyLinux 映像檔,檔名會顯示到箭頭 3 的地方,之後在 4 號箭頭選擇 MBR 較佳!你也可以使用純粹的 UEFI 模式。 確認上述選擇都沒問題,就可以按下『執行』按鈕,就可以開始準備寫入 USB 開機片了。由於寫入的方式有兩種, 一種是可以繼續使用 USB 其他容量,一種則是假定為光碟片。鳥哥建議使用『 DD 模式』,似乎比較不容易出問題。 接下來稍微等待一小段時間,你的 RockyLinux 9.0 就可以燒錄妥當了。

思考例題:針對隨身碟 (USB) 的類型與速度來說,目前主流支援的接頭類型有 type A 與 type C 兩種, 其他的 type B 雖然也常見,不過都不是用在隨身碟上面。至於 USB 版本的傳輸標準,除了廣大支援的 USB2.0 之外, 還有 USB3, USB3.1 與 USB3.2 等,請查詢底下的連結,看一下 USB 各種版本的理論速度。 但上述的只是 USB 的版本理論速度,實際上能夠讀/寫的速度,還是跟隨身碟內部的快閃記憶體效能有關。 因此購買時,除了接頭界面之外,務必查看該產品標示的實際讀/寫速度喔!尤其是『寫入』的部份。

現在,請將這個可開機 USB 放在等待被安裝的 PC 上,然後開機,然後調整 BIOS 讓它可以使用 USB 開機!之後就準備進入安裝程序了。

1.1.3、簡易安裝程序與磁碟分割,及例外處理 shell

鳥哥假設大家都已經知道如何安裝 Linux 作業系統,所以僅提供一個簡易的示意圖!同時,我們使用的是 RockyLinux 9.0 的精簡映像檔, 安裝時並沒有虛擬機器的選項可以選擇~因此,直接選擇 Server 項目即可!安裝妥當後,不會出現圖形界面喔! 另外,鳥哥預計將虛擬環境需要的所有資料通通丟到 /kvm 底下,此,分割也需要留意一下的好。

  1. 開機後,選擇『 Install RockyLinux 9.0 』這個項目 (有 60 秒可以選擇)
  2. 選擇語系,當然選擇台灣的『繁體中文』語系
  3. 主選單-1:鍵盤的部份,依據語系會自動挑選,這部份暫時不用改
  4. 主選單-2:語言支援的部份,除了台灣之外,建議增加勾選美語支援較佳。
  5. 主選單-3:時區選擇『亞洲台北』
  6. 主選單-4:安裝來源位置,就是預設的光碟資料
  7. 主選單-5:軟體選擇使用預設的『最小型安裝』即可,其他不要勾選!
  8. 主選單-6:安裝目的地請選擇你的正確的硬碟,自訂分割內容大概是(全部使用標準分割):
    • /boot/efi 大約 1G (因為是 UEFI 環境,這個分割一定要有!)
    • / 大約 100G 為 XFS 檔案系統
    • /home 大約 100G 為 XFS 檔案系統
    • swap 大約 4G
    • /kvm 剩餘容量通通給這個,為 XFS 檔案系統
  9. 主選單-7:KDUMP,我是很喜歡取消 KDUMP ,所以這裡我將他取消。各位自己選擇即可。
  10. 主選單-8:網路與主機名稱,這部份暫時略過,以後處理!
  11. 主選單-9:安全政策保留預設值,暫時不動它!
  12. 主選單-10:用戶設定部份,請自行輸入你的慣用 root 密碼與建立一個平時操作的一般帳號!

在選擇磁碟與分割階段的畫面,會有點像底下這樣:

安裝過程拍照
安裝過程拍照
圖 1.1.3-1、選擇磁碟與分割結果的狀況

另外,RockyLinux 9 在系統管理員 (root) 管理上面有點不太一樣,預設的情況下,root 就無法使用 ssh 登入系統了!這是預設值。 如果你想要讓 root 在一開始的短時間內,還是可以使用 ssh 的話 (例如,你忘記建立一般帳號了!),那在『Root 密碼』的項目, 得要勾選底下的設定值才行!不然,你就得要手動修改 sshd 的設定檔了 (/etc/ssh/sshd_config)!

安裝過程拍照
圖 1.1.3-2、修改 Root 的 ssh 可使用權

至於在全部的設定都處理妥當後,整體圖示會像底下這樣。如果一切準備妥當,直接按下『開始安裝』就好了!

安裝過程拍照
圖 1.1.3-3、安裝過程的主畫面

因為虛擬主機伺服器安裝的軟體不會太多,因此差不多 10 分鐘內系統就可以安裝完畢~此時,請按下重新開機,然後拔除 USB 隨身碟吧! 在 RockyLinux 9 的環境下,安裝完畢第一次重新開機時,很有趣的是, RockyLinux 要你重新設定 UEFI 的開機選單項目耶! 鳥哥第一次遇到這個情況!相當有趣!儲存 UEFI 設定後,重新開機,就可以出現如下的畫面了:

第一次開機設定 UEFI 之後
圖 1.1.3-4、第一次開機設定 UEFI 之後

上圖中,第一個選單是正常的開機,第二個選單是進入救援模式 (rescue),第三個選單就是進入 UEFI 去修改設定喔! 而安裝完畢第一次重新開機,就只有 UEFI Firmware Settins 項目而已!相當有趣!

  • 安裝過程當中,透過 shell 處理例外狀況方式: [ctrl]+[alt]+[F2]

為了一些高階的用戶著想,安裝過程中, RockyLinux 有提供一個 shell 環境讓大家操作! 基本上,你可以有兩個比較重要的終端機,分別是 tty2 與 tty6,tty6 就是圖形安裝環境, 至於 tty2 則是 USB 開機片提供的小型作業系統,你可以在安裝途中切換到 tty2 看看!

鳥哥第一次使用內建主機板搭建成 RAID5 進行系統安裝時,安裝的速度慢到很想哭泣啊~ 因為之前鳥哥就有使用 software RAID 的經驗,知道 software RAID5 剛建立完成時,Linux 系統會主動進行 resync 的程序, 這個程序的預設值會吃掉 200Mbytes/s 的磁碟讀寫頻寬~所以,安裝過程寫入到磁碟的資料, 當然就會...比較慢。整個找到問題的情境,有點像底下的圖示:

安裝過程的困擾
圖 1.1.3-3、透過 shell 找出 software RAID 的速度問題

下次您在 BIOS 底下新建好內建主機板的 RAID 磁碟後,就立刻安裝 Linux 系統時,總是可能發現安裝過程特別慢! 那就可以透過這個 shell 環境來規範最高 resync 的速度,讓安裝流程可以變得順暢些。上面圖示鳥哥彙整一下, 進入 TTY2 之後,你可以這樣做:

# 先找到讀寫的最大頻寬限制檔案
[anaconda root@localhost /]# cd /proc/sys/dev/raid/
[anaconda root@localhost raid]# ls -l
-rw-r--r--. 1 root root 0  5月  1 00:08 speed_limit_max  <==最大讀寫限制
-rw-r--r--. 1 root root 0  5月  1 00:08 speed_limit_min

# 透過 echo 的方式,將寫入限制到 20Mbytes/s 以內
[anaconda root@localhost ~]# echo 20000 > speed_limit_max
[anaconda root@localhost ~]# cat /proc/mdstat
# 這個時候,就可以看到讀寫速度的資料了!

除了軟體磁碟陣列的資料之外,您在安裝過程中缺少某些第三方驅動程式時,也可以在這裡載入! 只是需要注意的是,這個『作業系統』是安裝流程的 Linux,跟你未來安裝好的系統並不相同! 所以,如果是『驅動程式』方面的問題,就得要更加小心!這方面問題可以參考鳥哥之前寫的一篇短文:

反正,安裝過程中,如果你覺得很無聊,也可以切換到 tty2 去瞧一瞧,看看安裝過程中,到底是哪裡出現很忙碌的情況! 趁機多學幾招這樣!

1.1.4、系統觀察與基礎設定

在安裝完畢第一次開機進入 RockyLinux 之後,就是一片黑壓壓的畫面,你可以使用一般帳號登入, 也可以使用 root 直接登入,這都沒有太大的問題!畢竟是在本機!如果是從 internet 或者是內網的其他主機登入的話, 建議還是不要使用 root 喔!接下來,讓我們先來觀察一下目前這個系統的相關功能吧!

  • CPU 指令集查詢: vmx/svm, aes 等

現階段雲伺服器的 CPU,最重要的兩個功能,可能就是虛擬化與 AES 加密機制指令集。我們可以從 /proc/cpuinfo 直接查詢, 這個是 Linux 原生紀錄的 CPU 指令集狀況,另外,如果不想要看太多的有的沒有的東西,也可以簡單的透過 lscpu 查看資訊即可!

[root@localhost ~]# lscpu
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         39 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  12
  On-line CPU(s) list:   0-11
Vendor ID:               GenuineIntel
  BIOS Vendor ID:        Intel(R) Corporation
  Model name:            Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz
    BIOS Model name:     Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz
    CPU family:          6
    Model:               165
    Thread(s) per core:  2
    Core(s) per socket:  6
    Socket(s):           1
    Stepping:            3
    CPU max MHz:         4500.0000
    CPU min MHz:         800.0000
    BogoMIPS:            6199.99
    Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge 
        mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe 
        syscall nx pdpe1 gb rdtscp lm constant_tsc art arch_perfmon pebs bts 
        rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq 
        dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm 
        pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes ....
Virtualization features:
  Virtualization:        VT-x
Caches (sum of all):
  L1d:                   192 KiB (6 instances)
  L1i:                   192 KiB (6 instances)
  L2:                    1.5 MiB (6 instances)
  L3:                    12 MiB (1 instance)
NUMA:
  NUMA node(s):          1
  NUMA node0 CPU(s):     0-11
Vulnerabilities:
  Itlb multihit:         KVM: Mitigation: VMX disabled
....

重點在看出有沒有 vmx 以及 aes 的特殊旗標,同時也能夠觀察到 CPU 的超執行緒有沒有啟用! 如上表所示, CPU(s) 雖然有 12 顆,不過實際上的核心執行緒為 2 ,實際核心數僅有 6 顆就是了。 如果是 AMD 系列的 CPU 的話,在上面的 Virtualization 部份,應該就會出現 AMD-V 才對! 而 Flags 就不會有 vmx 而是出現 svm 喔!

  • 觀察軟體磁碟陣列狀態

我們在基礎篇裡面談到的軟體磁碟陣列中,一般大多使用 /dev/md0 開始編號。不過,主機板內建的磁碟陣列, 則是大多從 /dev/md126 開始編號~很特別!因此,一開始來觀察一下安裝好的軟體磁碟陣列狀態吧!

[root@localhost ~]# cat /proc/mdstat
Personalities : [raid10]
md126 : active raid10 sda[3] sdb[2] sdc[1] sdd[0]
      1953519616 blocks super external:/md127/0 64K chunks 2 near-copies [4/4] [UUUU]
.....

重點在磁碟陣列的組成等級為 RAID10,以及目前 4 顆磁碟的狀態情況!你會發現有四個 U 的存在! 這太棒了!代表系統沒問題!另外,我們也會知道其實磁碟陣列的檔名為 /dev/md126 喔!如果想要查看更詳細的資料, 也可以使用 mdadm 指令查詢:

[root@localhost ~]# mdadm --detail /dev/md126
/dev/md126:
         Container : /dev/md/imsm, member 0
        Raid Level : raid10
        Array Size : 1953519616 (1863.02 GiB 2000.40 GB)
     Used Dev Size : 976759808 (931.51 GiB 1000.20 GB)
      Raid Devices : 4
     Total Devices : 4

             State : clean
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0

            Layout : near=2
        Chunk Size : 64K

Consistency Policy : resync

              UUID : 585291ed:cc38a802:ff454b5e:0d950ee7
    Number   Major   Minor   RaidDevice State
       3       8        0        0      active sync set-A   /dev/sda
       2       8       16        1      active sync set-B   /dev/sdb
       1       8       32        2      active sync set-A   /dev/sdc
       0       8       48        3      active sync set-B   /dev/sdd

這包括整體磁碟陣列容量 (Array Size),組成磁碟陣列的每顆磁碟容量 (Used Dev Size), 最底下則是四顆磁碟陣列的組成!清楚明瞭!

  • 基礎設定:網路參數設定

每個人的網路參數都不一樣,請自行找到您的環境來設計!我這裡使用的網路參數如下所示,不要問我為啥, 因為鳥哥的既有環境就是這樣設定的!你可以依據你的現場環境來修改底下的參數即可!

  • IP: 192.168.201.249/24
  • GW: 192.168.201.254
  • DNS: 120.114.100.1,168.95.1.1
  • hostname: cloud.vbird
# 先探索網卡的卡號:
[root@localhost ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether fc:34:97:3b:eb:86 brd ff:ff:ff:ff:ff:ff
    inet 192.168.201.249/24 brd 192.168.201.255 scope global noprefixroute eno1
       valid_lft forever preferred_lft forever
    inet6 fe80::fe34:97ff:fe3b:eb86/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
# 所以,可以知道網卡的卡號是 eno1 喔!

# 查看一下網路管理員的設定項目
[root@localhost ~]# nmcli connection show
NAME  UUID                                  TYPE      DEVICE
eno1  24199355-b3a4-3f4d-bd6e-65be1085a499  ethernet  eno1
# 所以,可以知道有個網路管理員設定的連線名稱 (NAME) 為 eno1

# 最終,就設定好網路參數即可
[root@localhost ~]# nmcli connection modify eno1 connection.autoconnect yes \
> ipv4.method manual ipv4.addresses 192.168.201.249/24 \
> ipv4.gateway 192.168.201.254 ipv4.dns 120.114.100.1,168.95.1.1

[root@localhost ~]# nmcli connection up eno1

# 設定主機名稱
[root@localhost ~]# hostnamectl set-hostname cloud.vbird

網路設定完畢之後,記得要確認一下網路是否真的可以連到 internet 上!一般來說是沒啥大問題, 只需要使用 ping 以及 dig 確認 TCP/IP 以及 DNS 設定正常即可。

# 外部 internet 有個 IP 168.95.5.1,確認一下能否連線成功
[root@localhost ~]# ping -c 3 168.95.1.1
PING 168.95.1.1 (168.95.1.1) 56(84) bytes of data.
64 bytes from 168.95.1.1: icmp_seq=1 ttl=245 time=2.06 ms
64 bytes from 168.95.1.1: icmp_seq=2 ttl=245 time=2.03 ms
64 bytes from 168.95.1.1: icmp_seq=3 ttl=245 time=1.98 ms

--- 168.95.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.979/2.022/2.057/0.061 ms

# 安裝 bind-utils 之後,確認 www.google.com 是否存在 IP
[root@localhost ~]# yum -y install bind-utils
[root@localhost ~]# dig www.google.com

; <<>> DiG 9.11.26-RedHat-9.11.26-6.el8 <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42507
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 19

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         213     IN      A       142.251.42.228

到最後有出現 IP 位址,那就是正確的了!更多詳細的網路觀念與設定,我們在後面章節再來介紹!

  • 基礎設定:日期與時間的訂正

在台灣,剛剛安裝好你的 Linux 系統時,通常可能會發生日期與時間誤差超過 8 小時的情況發生!這是由於是否使用標準時間所導致的問題。 台灣本地時間會比國際標準時間快 8 小時啊!因此,更新時間是很重要的!甚至,很多服務,如果時間不一致, 還可能會發生一些莫名其妙的問題!所以需要更新時間較佳。

新版的 RockyLinux 提供的 NTP (Network Time Protocol, 網路時間協定) 為 chrony 服務,不再提供以前批次處理的 ntpdate 指令了! 所以我們得要安裝 chrony 才行!還好,這服務預設都是安裝妥當了!你只要設定好即可。 在鳥哥的這部雲系統,放置在校園內,因此必須要使用 ntp.ksu.edu.tw 這部 NTP server, 如果在台灣,你也可以選擇如下的 NTP server:

  • tock.stdtime.gov.tw
  • time.stdtime.gov.tw
# 修改 chrony 主設定檔,註解一行,新增 3 行即可!
[root@localhost ~]# vi /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#pool 2.pool.ntp.org iburst
server ntp.ksu.edu.tw iburst
server tock.stdtime.gov.tw iburst
server time.stdtime.gov.tw iburst
....(底下省略)....

[root@localhost ~]# systemctl start chronyd
[root@localhost ~]# systemctl enable chronyd
[root@localhost ~]# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^- dns3.ksu.edu.tw               3   6    17    10   -118us[ -118us] +/-   72ms
^+ 211-22-103-157.hinet-ip.>     2   6    17    11   -112us[  +69us] +/-   31ms
^* 118-163-81-61.hinet-ip.h>     2   6    17    10   +258us[ +439us] +/-   25ms

若是出現最終有秒數 (72ms) 之類的訊息,那應該就是設定妥當了!你這時應該與 internet 的時間同步囉! 最後,確認一下整體系統時間參數:

[root@localhost ~]# timedatectl
               Local time: Thu 2023-08-03 11:49:19 CST
           Universal time: Thu 2023-08-03 03:49:19 UTC
                 RTC time: Thu 2023-08-03 03:49:19
                Time zone: Asia/Taipei (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

看起來時區 (CST) 以及網路時間同步 (synchronized: yes) 都是正確的!那應該沒啥大問題了!若有任何問題, 請自行使用 timedatectl --help 查詢處理方式囉!

  • 基礎設定:使用 tuned 調整系統效能

調整系統效能有簡單的方式了!透過 tuned 服務來處理即可!一般預設的系統,大多使用 throughput-performance 設定值,不過,未來我們這部主機要使用的雲虛擬母機器 (virtual host),所以你可以選擇 virtual-host 設定。 而因為我們使用的是 intel 的 CPU 系統,老實說,似乎也能使用 intel-sst 設定。無論如何,都請自行參考你的使用來設計! 鳥哥將以預設的 virtual-host 作為優化設定項目:

[root@localhost ~]# yum -y install tuned
[root@localhost ~]# tuned-adm profile virtual-host
[root@localhost ~]# tuned-adm list
Available profiles:
- accelerator-performance     - Throughput performance based tuning with disabled higher latency STOP states
- balanced                    - General non-specialized tuned profile
- desktop                     - Optimize for the desktop use-case
- hpc-compute                 - Optimize for HPC compute workloads
- intel-sst                   - Configure for Intel Speed Select Base Frequency
- latency-performance         - Optimize for deterministic performance at the cost of increased power consumption
- network-latency             - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput          - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- optimize-serial-console     - Optimize for serial console use.
- powersave                   - Optimize for low power consumption
- throughput-performance      - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest               - Optimize for running inside a virtual guest
- virtual-host                - Optimize for running KVM guests
Current active profile: virtual-host
  • 基礎設定:調整 software RAID 參數與網卡參數

一般 Linux 核心設定,許多參數都是針對單一主機與單一磁碟,在網路卡的許多設定值方面,這方面設定大多針對 internet 的環境來設計, 對於內網在 Gbps 或 10Gbps 的環境下,網卡參數或許調整一下會比較好。最常調整的就是 lro 與 gro 這兩個網卡參數! 不過,詳細的設定值,還是得要 case by case 的自己測試一下才好!

# 1. 確認一下網卡 (鳥哥的網卡是 eno1 喔) 相關 ring 參數
[root@localhost ~]# ethtool -g eno1
Ring parameters for eno1:
Pre-set maximums:
RX:             4096
RX Mini:        n/a
RX Jumbo:       n/a
TX:             4096
Current hardware settings:
RX:             256
RX Mini:        n/a
RX Jumbo:       n/a
TX:             256

看起來硬體設定來到 4096 而現有的設定僅為 256,所以可以將它調大一點。至於 lro 與 gro 的判斷則是:

# 2. 查看網卡參數
[root@localhost ~]# ethtool -k eno1 | grep receive-offload
generic-receive-offload: on
large-receive-offload: off [fixed]

預設的 gro 都是 on 的,至於 lro 有可能已經設定鎖定為 off 了!那就不用重新設定!因此, 針對鳥哥的這張網卡,只需要設定 gro 為 off 就好!

至於 software RAID 的優化方面,雖然網路上很多朋友建議關閉 NCQ 這東西,不過,鳥哥自己的測試中, 關閉不見得比較好,全開也不見得比較好,反而設定為 31 似乎好一些!不過,說真的,都是 case by case 啦。 另外,放大預讀效果似乎也比較好。

同時,如果擔心每個週末自動 resync 會導致系統效能的問題的話,也可以調降 software RAID 的 resync 讀寫頻寬。不過,不管是提高或降低, 都可能會影響到你的系統性能!一般來說,software RAID 的磁碟容量不要太大啦!超過 10TB 以上的話, resync 就會耗去太多時間!這點需要考慮!

# 1. 先讓 rc.local 具有可用的功能 
[root@localhost ~]# chmod +x /etc/rc.d/rc.local

# 2. 寫入一個名為 /root/bin/performance.sh 的腳本
[root@localhost ~]# vi /etc/rc.d/rc.local
....(前面省略)....
# VBird 2022/07/20
sh /root/bin/performance.sh

# 3. 開始建立開機會執行的一些設定值
[root@localhost ~]# mkdir /root/bin
[root@localhost ~]# cd /root/bin
[root@localhost bin]# vi performance.sh
#!/bin/bash

# 1. 先針對網卡設定的部份
for nic in eno1
do
    ethtool -G ${nic} rx 4096 tx 4096       # 針對 ring 的設定
    ethtool -K ${nic} gro off               # 針對 gro 的設定
done

# 2. 針對實體傳統磁碟設定部份
for hdd in sd{a,b,c,d}
do
    echo 8192       > /sys/block/${hdd}/queue/max_sectors_kb
    echo 32768      > /sys/block/${hdd}/queue/read_ahead_kb
    echo 256        > /sys/block/${hdd}/queue/nr_requests
    echo 31         > /sys/block/${hdd}/device/queue_depth
done

# 3. 針對 software raid 的部份
for md in md126
do
    echo 32768      > /sys/block/${md}/queue/read_ahead_kb
done
sysctl -w dev.raid.speed_limit_max=100000
sysctl -w dev.raid.speed_limit_min=50000


[root@localhost bin]# sh performance.sh

懶的打字的話,鳥哥也寫文字檔給大家下載~直接 wget 下載到你的系統上就可以了!

wget https://linux.vbird.org/linux_server/rocky9/0120cloudandvm/performance.sh

這樣大概就調整好了!不過,調整過後,系統能不能有更好的表現,你還是得要手動測試測試才行! 一切以數據資料的輸出為準!我們這裡僅是提供一個參考而已!

  • 基礎設定:管理員與管理員常用帳號的慣用操作環境

基本上,Rocky9 與以前的版本差異較大,包括 vim 的慣用環境,都有點不太一樣!所以, 回復一下你的慣用環境,應該是有其必要的!

# 1. 安裝常用的軟體
[root@localhost ~]# yum install vim-enhanced bash-completion net-tools bind-utils

# 2. 將 vim 的環境做個簡單的處理
[root@localhost ~]# vim ~/.vimrc
"將自動縮排、自動移動畫面的功能關閉!請自行處理!
setl noai nocin nosi inde=

一般用戶最好設計一些慣用指令能夠『安全』一些!

# 讓 cp, rm, mv 比較安全一些
[vbird@localhost ~]$ vim ~/.bashrc
....(前面省略)....
alias rm='rm -i'
alias mv='mv -i'
alias cp='cp -i'

[vbird@localhost ~]$ source ~/.bashrc

1.2、基本的軟體管理與安全強化動作

你要保護你的伺服器,最重要的就是不要讓別人使用物理接觸的方式接近你的主機硬體!我們都知道,只要能接觸到你的物理實體主機, 再透過 USB 或其他方式來重新開機,就有很大的機率可以破解你的 root 密碼,進一步去竊取你的資料。因此,你的主機當然最好就是鎖在機房, 或者是鎖在機櫃當中啊!然後透過一條網路線來連線進去操作即可。那接下來呢?要做些什麼?

1.2.1、管理軟體與更新系統軟體

我們這個小型雲系統,主要的目的是在設計與了解一個機房環境,因此虛擬化是最重要的!問題是, 從剛剛作到現在,好像最重要的虛擬化 qemu, libvirtd 等等,都還沒有管理耶!原因是,我們下載的映像檔是 minimal 的版本, 所以預設沒有虛擬化軟體喔!因此,接下來讓我們先來安裝虛擬化環境!不過,安裝之前,還是先將所有軟體更新才對!

  • 更新所有軟體

使用 yum -y update 就能全系統更新了!很簡單!只是,未來需要每天更新才可以!未來的更新,我們寫在一個維護腳本中, 暫時不要個別寫入 crontab 囉!

[root@localhost ~]# yum -y update
思考例題:是否有軟體更新的資料顯示時,就一定要重新開機呢?(自行思考完再看簡易解答)
  • 重點思考:一般來說,安裝好的軟體最好都需要重新啟動。因此,(1)如果你的軟體重新啟動會導致整個系統損毀的, 那就需要重新開機。(2)該軟體可以獨立重新啟動的,那就不需要重新開機,因為,通常軟體更新完畢後,大多會主動的重新啟動的。
  • 需要重新開機的狀況:如上所述,當 (1)核心軟體 (2)眾多軟體需要呼叫的函式庫 有更新時,最好需要重新開機。 通常情況就是核心更新、openssl 函式庫、glibc 函式庫等軟體有更新,最好短時間內重新開機的好。
  • 不需要重新開機的狀況:例如 apache 網頁伺服器軟體、 vsftpd 檔案伺服器軟體等,這些軟體都只與自己的服務有關, 因此只需要重新啟動該服務即可。而 yum 一般都可以自動幫你重新啟動該新軟體,所以無須重新啟動系統。
回想基礎篇談到的四個同心圓,硬體、核心、系統呼叫、應用程式。更新的角度只在應用程式,那就重新啟動應用程式即可! 其他的核心與系統呼叫,都需要重新開機較佳!

如果你不知道到底要不要重新開機?還有個簡單的小工具可以使用!透過 needs-restarting 來幫你自動判斷即可! 相當有趣喔!

# 先安裝所需要的工具
[root@localhost ~]# yum -y install yum-utils

# needs-restarting 指令用法
[root@localhost ~]# needs-restarting [-urs]
選項與參數:
-r : 提供是否需要重新開機的建議
-s : 提供哪些服務需要重新啟動的建議
-u : 提供操作此指令的用戶所需重新啟動的軟體

[root@localhost ~]# needs-restarting -r
Core libraries or services have been updated since boot-up:
  * glibc
  * kernel
  * linux-firmware
  * systemd

Reboot is required to fully utilize these updates.
More information: https://access.redhat.com/solutions/27943
# RockyLinux 都到 9.2 版了,所以用 9.0 的系統升級之後,會出現上述資料!

[root@localhost ~]# needs-restarting -s
# 同樣的,有出現奇怪的軟體訊息才需要重新開機,不然就不用理會了!

鳥哥原本使用的 9.0 版本比較舊,目前 (2023) 推出了 9.2 的版本,因此就會出現 glibc, kernel 等核心函式庫已經升級, 所以最好重新開機的樣式!因此,請盡快進行 reboot 的動作吧!

  • 安裝虛擬化環境

虛擬化環境的安裝也不是太困難,使用 groupinstall 即可安裝妥當!

[root@localhost ~]# LANG=C yum grouplist
Available Environment Groups:
   Server with GUI
   Server
   Workstation
   Custom Operating System
   Virtualization Host
Installed Environment Groups:
   Minimal Install
Available Groups:
   Legacy UNIX Compatibility
   Console Internet Tools
....

[root@localhost ~]# yum -y groupinstall 'Virtualization Host'

# 啟動虛擬化服務
[root@localhost ~]# systemctl start libvirtd
[root@localhost ~]# systemctl enable libvirtd

[root@localhost ~]# reboot

因為虛擬化環境帶入相當多的軟體,鳥哥個人建議,安裝虛擬化軟體之後,最好重新開機一下!讓所有的服務自動啟動。 接下來,才有辦法找到哪個服務需要調整處理一下囉。

1.2.2、減少啟動的網路服務

在網際網路上,別人想要入侵你的系統,不外乎 (1)想要竊取你的有價的機密資料 (2)想要拿你的機器當作跳板去打別人。 在我們將物理實體機器鎖在某個不為人知的地點之後 (不為人知...當然是玩笑話),再來則是要考慮,別人怎麼取得你的系統存取權!

一般來說,網路怪客想要登入你的主機,有個大前提,那就是你的作業系統某個網路服務是有啟動的~ 如果你都沒有啟動網路服務,對方想要入侵你的系統,還真是挺有難度的。因此,請先檢查你的系統上面有沒有啟動對外公開的網路服務。 最簡單的作法就是使用 netstat 這個指令即可:

[root@cloud ~]# netstat [-atulp] [-c N]
選項與參數:
-a  :列出所有的連線狀態,包括 tcp/udp/unix socket 等;
-t  :僅列出 TCP 封包的連線;
-u  :僅列出 UDP 封包的連線;
-l  :僅列出有在 Listen (監聽) 的服務之網路狀態;
-p  :列出 PID 與 Program 的檔名;
-c  :可以設定幾秒鐘後自動更新一次,例如 -c 5 每五秒更新一次網路狀態的顯示;

# 1. 列出目前系統上面正在監聽的網路埠口,僅 TCP 與 UDP 埠口
[root@cloud ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1630/dnsmasq
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1194/sshd: /usr/sbi
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd
tcp6       0      0 :::22                   :::*                    LISTEN      1194/sshd: /usr/sbi
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd
udp        0      0 192.168.122.1:53        0.0.0.0:*                           1630/dnsmasq
udp        0      0 0.0.0.0:67              0.0.0.0:*                           1630/dnsmasq
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1/systemd
udp        0      0 127.0.0.1:323           0.0.0.0:*                           1115/chronyd
udp6       0      0 :::111                  :::*                                1/systemd
udp6       0      0 ::1:323                 :::*                                1115/chronyd

在 netstat 輸出資料當中,每一個欄位的主要意義如下:

  • Proto:該連線的封包協定,主要為 TCP/UDP 等封包;
  • Recv-Q:非由使用者程式連接所複製而來的總 bytes 數;
  • Send-Q:由遠端主機所傳送而來,但不具有 ACK 標誌的總 bytes 數, 意指主動連線 SYN 或其他標誌的封包所佔的 bytes 數;
  • Local Address:本地端的位址,可以是 IP (-n 參數存在時), 也可以是完整的主機名稱。使用的格是就是『 IP:port 』只是 IP 的格式有 IPv4 及 IPv6 的差異。 如上所示,在 port 22 的介面中,使用的 :::22 就是針對 IPv6 的顯示,事實上他就相同於 0.0.0.0:22 的意思。 至於 port 323 僅針對 lo 介面開放,意指 Internet 基本上是無法連接到我本機的 323 埠口啦!
  • Foreign Address:遠端的主機 IP 與 port number
  • stat:狀態列,主要的狀態含有:
    • ESTABLISED:已建立連線的狀態;
    • SYN_SENT:發出主動連線 (SYN 標誌) 的連線封包;
    • SYN_RECV:接收到一個要求連線的主動連線封包;
    • FIN_WAIT1:該插槽服務(socket)已中斷,該連線正在斷線當中;
    • FIN_WAIT2:該連線已掛斷,但正在等待對方主機回應斷線確認的封包;
    • TIME_WAIT:該連線已掛斷,但 socket 還在網路上等待結束;
    • LISTEN:通常用在服務的監聽 port !可使用『 -l 』參數查閱。

未來我們會慢慢網路基礎,這裡你先記下來,那就是每部有網路功能的主機,幾乎都有個內部的網路卡界面稱為 lo,而這個網路界面的 IP 位址就是 127.0.0.1!這個位址原本的設計是給系統內部使用的,網際網路無法連結到這個界面。所以,如同上面的輸出結果 port 323/udp 你可以暫時不用理會它,因為外面的網際網路世界,原則上是無法連結到該埠口的。

  • 減少網際網路的連線服務

一般來說,同一個服務針對 TCP 封包 (後續章節會談,現在你先知道有這種封包格式即可) 會有 IPv4 與 IPv6 兩種協定的相同埠口號碼同時都存在的。 所以,這裡我們先暫時看一下 IPv4 的封包格即可~亦即上述表格中的 tcp 與 udp 兩種,先不要看 tcp6 與 udp6 囉 (其實會與 IPv4 相同!)

本機放行的服務所搭配使用的界面中,只要是 0.0.0.0:XX 的,那個就是針對全部界面都放行的服務,針對 127.0.0.1 的是僅有針對本機內部的放行, 而 192.168.122.1 則是針對內部虛擬設備的服務,主要是由 dnsmasq 所提供。我們先針對網路服務來處理,等等再來搞定 dnsmasq。 不考慮 dnsmasq 服務產生的埠口情況下,目前啟動的埠口有這些:

[root@cloud ~]# netstat -tulnp | grep -v dnsmasq
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1194/sshd: /usr/sbi
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd
tcp6       0      0 :::22                   :::*                    LISTEN      1194/sshd: /usr/sbi
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1/systemd
udp        0      0 127.0.0.1:323           0.0.0.0:*                           1115/chronyd
udp6       0      0 :::111                  :::*                                1/systemd
udp6       0      0 ::1:323                 :::*                                1115/chronyd

基本上, port 22 是我們可以透過遠端系統登入的一個重要埠口,千萬不要亂動!至於 port 323 則是我們上面設定 chronyd 服務之後所啟用的,這兩個 (22, 323) 請保留不要動!那麼唯一需要處理的, 就變成是 port 111 了!但是這個 port 111 很可怕啊~竟然用到 systemd !我們不能關閉 systemd 的! 那怎辦?到底該關閉 systemd 所管理的那一個子元件?不要害怕,你可以透過 /etc/services 去找到該埠口對應的服務喔!

[root@cloud ~]# grep ' 111/' /etc/services
sunrpc          111/tcp         portmapper rpcbind      # RPC 4.0 portmapper TCP
sunrpc          111/udp         portmapper rpcbind      # RPC 4.0 portmapper UDP

你可以看到 111 埠口的服務有 portmapper 與 rpcbind 這兩個!那到底我們的系統是使用那一個? 不用怕!使用 systemctl 來查詢即可!

[root@cloud ~]# systemctl list-unit-files --all | grep portmap
[root@cloud ~]# systemctl list-unit-files --all | grep rpcbind
rpcbind.service         enabled         enabled
rpcbind.socket          enabled         enabled
rpcbind.target          static          -

[root@cloud ~]# systemctl status rpcbind.socket
● rpcbind.socket - RPCbind Server Activation Socket
     Loaded: loaded (/usr/lib/systemd/system/rpcbind.socket; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-07-21 09:39:24 CST; 1h 9min ago
      Until: Thu 2022-07-21 09:39:24 CST; 1h 9min ago
   Triggers: ● rpcbind.service
     Listen: /run/rpcbind.sock (Stream)
             0.0.0.0:111 (Stream)
             0.0.0.0:111 (Datagram)
             [::]:111 (Stream)
             [::]:111 (Datagram)
      Tasks: 0 (limit: 203628)
     Memory: 16.0K
        CPU: 1ms
     CGroup: /system.slice/rpcbind.socket

果真有找到名為 rpcbind.service 與 rpcbind.socket 的服務!然後查看一下 rpcbind.socket 服務後, 確定是啟動 port 111 的主要元件啊!現在,讓我們來關閉這傢伙吧!目前用不到!未來會用到再開即可!

[root@cloud ~]# systemctl stop rpcbind.service rpcbind.socket
[root@cloud ~]# systemctl disable rpcbind.service rpcbind.socket
[root@cloud ~]# netstat -tulnp | grep -v dnsmasq
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1194/sshd: /usr/sbi
tcp6       0      0 :::22                   :::*                    LISTEN      1194/sshd: /usr/sbi
udp        0      0 127.0.0.1:323           0.0.0.0:*                           1115/chronyd
udp6       0      0 ::1:323                 :::*                                1115/chronyd

這樣,網路啟動的埠口,就變得相當簡單啊!

思考例題:明明你已經使用 netstat -tlunp 看到啟動的埠口已經變少了,但是每次重新開機後,許多的服務與埠口就又會被啟動。你覺得問題可能是什麼?
  • 最可能的問題就是,你只使用了 systemctl stop XX_server 而沒有使用 systemctl disable XX_server 的緣故!如果不知道為什麼要 disable, 回頭去瞧瞧基礎學習篇吧!
  • 另一個最可能的原因,應該是你可能安裝了新的服務,該服務預設為啟用 (enable),但是通常第一次安裝好時,系統不會主動幫你啟用, 所以下次重新開機就會開啟該服務...
  • 綜合上述兩點,因此你在系統有大量升級或者是初次使用不多久,建議要反覆重新開機過數次,確實檢查沒有遺漏關閉或啟用的服務才好。
  • 關閉來自 dnsmasq 的埠口

dnsmasq 服務是經由 qemu 的網路界面設定所主動帶起的, 直接刪除 qemu 的網路界面後,該項目會自動刪除!處理方式也挺簡單,不過,你最好要先有 virsh 這個指令支援才好! 早期的 RockyLinux 8.x 並沒有主動安裝這個軟體,RockyLinux9 則主動安裝了!你不用重新安裝喔! 不過,查詢流程還是建議可以學一學!

# 查詢 virsh 指令來源,並且安裝對應的軟體
[root@localhost ~]# yum whatprovides '*virsh'
.....
libvirt-client-8.0.0-8.el9_0.x86_64 : Client side utilities of the libvirt library
Repo        : appstream
Matched from:
Other       : *virsh
[root@localhost ~]# yum install libvirt-client

# 列出目前 libvirtd 管理的網路界面:
[root@localhost ~]# virsh net-list
 Name      State    Autostart   Persistent
--------------------------------------------
 default   active   yes         yes

# 關閉此界面,並且下次重新開機也不會自動生成此界面
[root@localhost ~]# virsh net-destroy default
Network default destroyed

[root@localhost ~]# virsh net-undefine default
Network default has been undefined

這樣就完整的將 libvirtd 管理的網路界面關閉,如此一來,透過 dnsmasq 管理的功能,也就直接關閉! 所以,當你再次下達 netstat -tlunp 時,就只會看到 port 22 與 port 323 囉!這樣就讓你的網路埠口比較乾淨啦!

1.2.3、以 nmap 觀察區域網路主機們

使用 netstat 可以查閱到本身伺服器的網路服務。不過,如果想要知道區網內的其他主機服務,又或是想要偵測自己伺服器是否有其他的埠口時, 可以透過 nmap 這個指令來處理喔!

nmap 軟體說明之名稱為:『Network exploration tool and security / port scanner』,顧名思義, 這個東西是被系統管理員用來管理系統安全性查核的工具!他的具體描述當中也提到了, nmap 可以經由程式內部自行定義的幾個 port 對應的指紋資料,來查出該 port 的服務為何,所以我們也可以藉此瞭解我們主機的 port 到底是幹嘛用的!在 RockyLinux 裡頭是有提供 nmap 的, 如果你沒有安裝,那麼就使用 yum 去安裝他吧!

[root@cloud ~]# yum install nmap
[root@cloud ~]# nmap [掃瞄類型] [掃瞄參數] [hosts 位址與範圍]
選項與參數:
[掃瞄類型]:主要的掃瞄類型有底下幾種:
    -sT:掃瞄 TCP 封包已建立的連線 connect() !
    -sS:掃瞄 TCP 封包帶有 SYN 標籤的資料
    -sP:以 ping 的方式進行掃瞄
    -sU:以 UDP 的封包格式進行掃瞄
    -sO:以 IP 的協定 (protocol) 進行主機的掃瞄
[掃瞄參數]:主要的掃瞄參數有幾種:
    -PT:使用 TCP 裡頭的 ping 的方式來進行掃瞄,可以獲知目前有幾部電腦存活(較常用)
    -PI:使用實際的 ping (帶有 ICMP 封包的) 來進行掃瞄
    -p :這個是 port range ,例如 1024-, 80-1023, 30000-60000 等等的使用方式
    -TN:指定延遲時間,可透過類似 -T4 來加快偵測速度 (約 4ms),效能會較好。
[Hosts 位址與範圍]:這個有趣多了,有幾種類似的類型
    192.168.1.100  :直接寫入 HOST IP 而已,僅檢查一部;
    192.168.1.0/24 :為 C Class 的型態,
    192.168.*.*  :嘿嘿!則變為 B Class 的型態了!掃瞄的範圍變廣了!
    192.168.1.0-50,60-100,103,200 :這種是變形的主機範圍啦!很好用吧!

nmap 的使用也很簡單,鳥哥大部分只用兩種方式來偵測而已,一種是使用 TCP 與 UDP 共同偵測的方法去看某部主機啟動的埠口, 其中由於 UDP 需要偵測的埠口比較大量,所以使用了 -sU 之後,偵測的速度會變很慢,在使用上需要注意一下。另一個方式則是使用 -sP 去看某段網域的所有電腦是否活著而已!

# 1. 查看本機啟用的 UDP 與 TCP 埠口
[root@cloud ~]# nmap -sTU localhost
Starting Nmap 7.91 ( https://nmap.org ) at 2022-07-21 10:53 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00015s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 1999 closed ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 0.17 seconds
# 上面特別說明,只針對全部放行的埠口做檢查,內網不分析。

最簡單的方法就是這樣做處理!可以針對某一個主機名稱或 IP 進行偵測。不過,要注意,不要偵測非你自己管理的設備! 不然你的網路很容易被停權!

# 2. 探索整個 class C 的區網中,哪些主機 IP 可能是活動中的 (active, alive)
[root@cloud ~]# nmap -sP 192.168.201.0/24
Starting Nmap 7.91 ( https://nmap.org ) at 2022-07-21 10:54 CST
Nmap scan report for 192.168.201.252
Host is up (0.0039s latency).
MAC Address: 94:57:A5:9C:DF:60 (Hewlett Packard)
Nmap scan report for 192.168.201.254
Host is up (0.00026s latency).
MAC Address: 18:31:BF:45:58:F2 (Asustek Computer)
Nmap scan report for 192.168.201.249
Host is up.
Nmap done: 256 IP addresses (3 hosts up) scanned in 4.46 seconds

一般針對單一主機的偵測結果輸出會有 3 行左右,如上所示,偵測 192.168.201.252 的結果中,除了探測出正確的網卡卡號 (MAC) 之外, 也從網卡卡號找到該主機可能的主機板類型哩!而且速度相當快,只花費數秒鐘就完成 256 個 IP 的偵測了。 很有趣的是,還能找到我這一台 HP 的事務機~那麼這部事務機可以提供什麼埠口讓我連線呢?來偵測一下 TCP 好了!

[root@cloud ~]# nmap -sT 192.168.201.252
Starting Nmap 7.91 ( https://nmap.org ) at 2022-07-21 10:57 CST
Nmap scan report for 192.168.201.252
Host is up (0.013s latency).
Not shown: 989 closed ports
PORT     STATE SERVICE
80/tcp   open  http
139/tcp  open  netbios-ssn
443/tcp  open  https
445/tcp  open  microsoft-ds
515/tcp  open  printer
631/tcp  open  ipp
6839/tcp open  unknown
7435/tcp open  unknown
8080/tcp open  http-proxy
9100/tcp open  jetdirect
9220/tcp open  unknown
MAC Address: 94:57:A5:9C:DF:60 (Hewlett Packard)

Nmap done: 1 IP address (1 host up) scanned in 1.41 seconds

未來你就會知道, port 631 通常就是印表機常用的埠口,而 port 9100 通常是 HP 印表機慣用的埠口~從這邊就能夠發現到, 啊!這個 IP 就是鳥哥辦公室的網路噴墨印表機!透過這個方法,你也能夠抓到自己辦公室裡面有沒有怪異的 IP 正在被使用中! 可以作為管理整個區網的重要工具之一!

  • 不要偵測別人的環境

事實上,這個 namp 是很多 cracker 喜歡使用的軟體,因為他很強大!無論是 TCP 還是 UDP 都可以偵測!偵測到某些特定的埠口之後, 就可能可以透過某些漏洞來取得該伺服器的使用權!對於網路管理員來說,對方使用 nmap 進行 port scan (埠口偵測) 時,還真是覺得很討厭! 而且,某些系統會透過類似 TCP wrapper 的功能來抓取 port scan 的偵測來源端,因此,你的 IP 可能會被紀錄喔! 所以,千萬不要使用 nmap 去偵測別人家的網域,那可能會害你吃上官司!萬萬不可!萬萬不可!

不過,如果拿 nmap 來探索與管理自己的區域網路,則是相當好用的一個工具喔!

nmap 是很多電影在進行駭客行為時的 demo 軟體!因為黑壓壓的畫面好像很厲害!呵呵!有興趣的朋友, 可以前往底下的連結去看看哪些影片曾經用過 nmap 喔!

1.2.4、每日系統檢查與回報

為什麼要做磁碟陣列?是因為擔心硬碟損毀會造成整個系統的遺失,所以使用磁碟陣列。那想一想,如果磁碟陣列做好之後不觀察, 那你怎麼知道何時出問題了?何時需要更換硬碟?另外,如果根目錄的容量被使用到 100% 了!那你當然就無法繼續操作系統... 整個變很怪~總之,系統很多狀況你至少應該一天了解一次才行。那如果要你每天都登入系統去做同樣的事情, 那也可能讓你覺得很崩潰~所以囉,寫一隻可以自動偵測的腳本,應該是不錯的好主意!

基本上,我們可能需要注意的項目有底下這些:

  • 檢查 /dev/md126
  • 檢查檔案系統
  • 檢查網路啟動的埠口
  • 檢查 ssh 登入者
  • 檢查時間是否正確
  • 檢查有沒有更新了,是否需要重新開機

假設我們的分析腳本檔名設計為 /root/bin/maintain.sh 好了,那麼依據上面的說明,我們可能可以這樣做:

[root@localhost ~]# vim /root/bin/maintain.sh
#!/bin/bash

myhost=$( hostname )
mydate=$( date +%Y-%m-%d )
mytime=$( date +%Y-%m-%d' '%H:%M )
myfile=/root/log/${mydate}-$( date +%s ).txt
[ ! -d /root/log ] && mkdir /root/log

# 0. output your host
(
echo
echo "HOSTNAME: $myhost"
echo "Analysis time: $mytime"

# 1. check software raid
if [ -b /dev/md126 ]; then
        echo
        echo "###################################"
        echo "check Software RAID /dev/md126"
        cat /proc/mdstat | sed 's/^/\t/g'
fi

# 2. check real disk
hdds=$( ls /dev/sd* 2> /dev/null )
if [ "${hdds}" != "" ]; then
        echo
        echo "###################################"
        echo "check SATA disk"
        ( for i in ${hdds}
        do
                echo "check for ${i}"
                smartctl --all ${i} | grep overall-health
        done ) | sed 's/^/\t/g'
fi

# 3. check filesystem
echo
echo "###################################"
echo "check filesystem"
df -Th -x tmpfs -x devtmpfs | sed 's/^/\t/g'

# 4. output port number
echo
echo "###################################"
echo "check network TCP/UDP listening ports"
netstat -tlnpu | sed 's/^/\t/g'

# 5. check NTP
echo
echo "###################################"
echo "check time and NTP server"
( timedatectl ; chronyc sources ) | sed 's/^/\t/g'

# 6. setup yum update and show needs restarting
echo
echo "###################################"
echo "update systems and check restarting OK!?"
( yum -y update
echo
needs-restarting -rs ) | sed 's/^/\t/g'

# 7. check ssh login user
echo
echo "###################################"
echo "check ssh login users"
( grep ssh /var/log/secure | grep Accepted | \
        sed 's/^.*Accepted password for //g'| \
        sed 's/ port.*$//g' | sort| uniq -c
) | sed 's/^/\t/g'

) | tee $myfile

[root@localhost ~]# sh /root/bin/maintain.sh

HOSTNAME: cloud.vbird
Analysis time: 2022-07-21 10:59

###################################
check Software RAID /dev/md126
        Personalities : [raid10]
        md126 : active raid10 sda[3] sdb[2] sdc[1] sdd[0]
              1953519616 blocks super external:/md127/0 64K chunks 2 near-copies [4/4] [UUUU]

        md127 : inactive sdb[3](S) sdd[2](S) sda[1](S) sdc[0](S)
              11104 blocks super external:imsm

        unused devices: 

###################################
check SATA disk
        check for /dev/sda
        SMART overall-health self-assessment test result: PASSED
        check for /dev/sdb
        SMART overall-health self-assessment test result: PASSED
        check for /dev/sdc
        SMART overall-health self-assessment test result: PASSED
        check for /dev/sdd
        SMART overall-health self-assessment test result: PASSED

###################################
check filesystem
        Filesystem     Type  Size  Used Avail Use% Mounted on
        /dev/md126p3   xfs   100G  3.9G   97G   4% /
        /dev/md126p2   vfat 1022M  6.9M 1016M   1% /boot/efi
        /dev/md126p4   xfs   100G  748M  100G   1% /home
        /dev/md126p6   xfs   1.7T   12G  1.7T   1% /kvm

###################################
check network TCP/UDP listening ports
        Active Internet connections (only servers)
        Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
        tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1194/sshd: /usr/sbi
        tcp6       0      0 :::22                   :::*                    LISTEN      1194/sshd: /usr/sbi
        udp        0      0 127.0.0.1:323           0.0.0.0:*                           1115/chronyd
        udp6       0      0 ::1:323                 :::*                                1115/chronyd

###################################
check time and NTP server
                       Local time: Thu 2022-07-21 10:59:04 CST
                   Universal time: Thu 2022-07-21 02:59:04 UTC
                         RTC time: Thu 2022-07-21 02:59:04
                        Time zone: Asia/Taipei (CST, +0800)
        System clock synchronized: yes
                      NTP service: active
                  RTC in local TZ: no
        MS Name/IP address         Stratum Poll Reach LastRx Last sample
        ===============================================================================
        ^* dns3.ksu.edu.tw               3   6   377    36    +62us[  +94us] +/-  237ms

###################################
update systems and check restarting OK!?
        Last metadata expiration check: 0:07:19 ago on Thu Jul 21 10:51:45 2022.
        Dependencies resolved.
        Nothing to do.
        Complete!

        No core libraries or services have been updated since boot-up.
        Reboot should not be necessary.

###################################
check ssh login users
              5 vbird from 192.168.201.254

[root@localhost ~]# vim /etc/crontab
20 0 * * * root sh /root/bin/maintain.sh

懶的打字的話,鳥哥也寫文字檔給大家下載~直接 wget 下載到你的系統上就可以了!

wget https://linux.vbird.org/linux_server/rocky9/0120cloudandvm/maintain.sh

有任何需要,你都可以隨時增加到 maintain.sh 裡面去,這樣管理起來就方便許多!尤其很容易修改! 看起來也很直觀~鳥哥也將每次分析的資料存放在 /root/log 裡面,方便未來的查詢。 如果你知道如何設計 mail 的話,也能夠讓該封信件直接傳送到你的外部信箱中。

  • 使用系統提供的 logwatch 軟體分析

事實上,RockyLinux 上面預設有 logwatch 登錄檔分析軟體喔!它的功能與我們要的系統偵測有點不太一樣, 這個 logwatch 可以分析 /var/log/ 裡面的登錄檔,進行進一步分析,可以取得比較好的分析結果。 定期分析則是使用 crontab。基本實施過程我們可以這樣做看看:

# 先安裝好這套軟體,然後查詢一下設定檔在哪裡?
[root@localhost ~]# yum -y install logwatch
[root@localhost ~]# rpm -qc logwatch
/etc/cron.daily/0logwatch
/etc/logwatch/conf/ignore.conf
/etc/logwatch/conf/logwatch.conf
/etc/logwatch/conf/override.conf
/usr/share/logwatch/default.conf/logwatch.conf

# 因為 logwatch 預設會使用 email 傳送,因此需要安裝 mail server
[root@localhost ~]# yum -y install postfix
[root@localhost ~]# systemctl start postfix

# 執行一下放在 /etc/cron.daily 底下的定期執行檔:
[root@localhost ~]# sh /etc/cron.daily/0logwatch

# 開始讀取 root 的 mail
[root@localhost ~]# mail
s-nail version v14.9.22.  Type `?' for help
/var/spool/mail/root: 1 message 1 new
▸N  1 logwatch@cloud.vbird  2022-07-21 11:02  616/26877 "Logwatch for cloud.vbird (Linux)"
& 1   <==這裡是說,要讀取 1 號信件的意思!底下為信件內容
[-- Message  1 -- 616 lines, 26877 bytes --]:
To: root@cloud.vbird
From: logwatch@cloud.vbird
Subject: Logwatch for cloud.vbird (Linux)
Message-Id: <20220721030241.5ACAAC051536@cloud.vbird>
Date: Thu, 21 Jul 2022 11:02:40 +0800 (CST)

 ################### Logwatch 7.5.5 (01/22/21) ####################
        Processing Initiated: Thu Jul 21 11:02:40 2022
        Date Range Processed: yesterday
                              ( 2022-Jul-20 )
                              Period is day.
        Detail Level of Output: 0
        Type of Output/Format: mail / text
        Logfiles for Host: cloud.vbird
 ##################################################################

 --------------------- Cron Begin ------------------------
 **Unmatched Entries**
 INFO (Syslog will be used instead of sendmail.)
 CMDEND (run-parts /etc/cron.hourly)
 CMDEND (run-parts /etc/cron.hourly)
 CMDEND (run-parts /etc/cron.hourly)
 CMDEND (run-parts /etc/cron.hourly)
 CMDEND (run-parts /etc/cron.hourly)
 CMDEND (run-parts /etc/cron.hourly)
 CMDEND (run-parts /etc/cron.hourly)
 ---------------------- Cron End -------------------------

 --------------------- Mdadm Begin ------------------------
 /dev/md/imsm :
 mdadm: cannot open /dev/md/kvm_0: No such file or directory
 ---------------------- Mdadm End -------------------------

 --------------------- SSHD Begin ------------------------
 SSHD Started: 2 Times

 Users logging in through sshd:
    vbird:
       192.168.201.254 (_gateway): 4 Times
 ---------------------- SSHD End -------------------------

 --------------------- Disk Space Begin ------------------------
 Filesystem      Size  Used Avail Use% Mounted on
 /dev/md126p3    100G  4.0G   97G   4% /
 /dev/md126p2   1022M  6.9M 1016M   1% /boot/efi
 /dev/md126p4    100G  748M  100G   1% /home
 /dev/md126p6    1.7T   12G  1.7T   1% /kvm
 ---------------------- Disk Space End -------------------------

 ###################### Logwatch End #########################

& exit

使用 email 做紀錄確實是很不錯的主意~logwatch 預設就是使用 email 進行傳輸。 只是,我們已經使用了 maintain.sh 自己做分析,有時候並不一定要使用 logwatch 就是了! 這邊鳥哥先將 logwatch 移除!各位夥伴有興趣就自己玩囉!

[root@localhost ~]# yum remove logwatch

1.3、管理員的管理態度

系統管的好不好有時候不只是系統的軟硬體問題而已,管理員的態度對於系統正常運作與否有很大的關係! 舉個最簡單的例子,我們都知道密碼不要設定的太簡單,但是,如果你的老闆、好朋友的帳號要求簡單的密碼時,你要怎麼辦?這就重要了吧!

1.3.1、封包進入主機的流程分析

要了解系統可能被怎麼破解,那就得要從到底攻擊者從哪個角度發起攻擊來思考。物理攻擊應該是沒有辦法避免的,所以, 將伺服器主機實際擺放在機房確實是有其必要性的~那可以避免大部分的物理攻擊行為。除了這個之外,從網路發起攻擊時, 你的伺服器總是可能會收到許多的網路連線需求的封包,這些封包很可能就有正常或不正常的連線行為。正常的連線行為就還好, 不正常的連線行為就比較困擾一下。無論如何,若你的伺服器要回應用戶端資料時,封包進入到伺服器的流程,大致上可以這樣思考:

網路封包進入主機的主要流程
圖 1.3.1、網路封包進入主機的主要流程

基本的流程就是:

  1. 先要通過 TCP/IP 的相關規範才能夠連線到本機的網路門口
  2. 要先通過防火牆的規則管制,才可以進入到本機使用本機的服務
  3. 能否取得服務與這個服務是否啟用與相關設定有關 (發生問題可以查登錄檔)
  4. 能不能存取資料,當然跟資料檔案的權限 (rwx) 有關!
  5. 如果通過權限驗證,接下來要看有沒有啟動 SELinux 這個細部權限設定項目
  6. 全部通過之後,才能夠取得實際的檔案資料!

要注意的是『要順利取得資料,每一關都要順利通過才行!』並不是找平均值,是要全部打通關! 這點非常重要!所以出錯時,每個環節都要仔細去分析探討。

  • 用戶需要取得伺服器的什麼資料?

你要先知道的是,用戶端連線到你的伺服器的目的是什麼?當然是取得你伺服器所提供的資源。若以 WWW 伺服器而言,用戶端最可能需要的, 除了靜態網頁所提供的資料之外,最重要的就是互動式動態網頁的資料庫資源!另外,如果是 FTP 伺服器的話,當然就是需要你提供的檔案囉! 無論如何,最終的結果經常與用戶端要取得你伺服器的『檔案資料』有很大的關係!不過,針對網路服務,除了一般 Linux 權限之外, 還得要考慮 SELinux 喔!

  • A. 網路通不通,跟你的網路基礎學的好不好有關

假如:(1)你的網路如果不通了,你會知道可能發生的問題在哪裡嘛?(2)你區網內的交換器或集線器突然變得很熱鬧 (全部燈號突然瘋狂閃爍),然後用戶開始抱怨網路變慢了,你有辦法偵測到問題嘛?(3)有個用戶說,他的電腦 IP 位址參數在開機時,老是回報『這個 IP 位址已經被使用了』,你有辦法抓出有問題的那個 IP 位址是誰盜用了嘛?

上述這些問題全部都跟你的網路基礎學的好不好有關,尤其是網路時通時不通的情況,最是困擾!因為很難找出實際的錯誤! 所以得要多方測試。問題是,你要測試什麼?總是得要有個目標吧!這就是重點!所以囉,後續章節的網路基礎真的很重要, 管理員若不熟悉網路基礎,很多問題會抓不到方向解決啊!

此外,有很多網路的表示方式,包括 192.168.1.0/24 這樣的表示方式,以及 IPv6 的表示方式等資料,都需要熟悉,否則未來在設定伺服器, 或者是防火牆的網路放行任務等,都會出問題!所以,趕緊加油學習吧!

  • B. 防火牆的設計思考,防火牆有沒有用啊?

很多剛剛學習架站的朋友,都會問說:『各位大大,我的伺服器防火牆已經啟用了,為什麼還是會被攻擊與入侵成功啊?』 很正常!因為防火牆『一點用處也沒有』!如果你的系統已經關閉了大部分的服務,同時你的系統也是更新到最新的狀態, 許多時候,有沒有防火牆對你來說,問題不大!為什麼呢?

  • 對於正常運作的服務而言,你的防火牆一點屁用也沒有!

如圖 1.3.1 所示,針對正常的服務來說,例如 WWW 來說,你的防火牆一定要放行人家對你伺服器的 WWW 連線吧? 也就是說:『只要連線到你的 WWW 伺服器的封包,你的防火牆是不會抵擋他進入的』,所以防火牆有用嘛?當然沒有用!所以我們才說, 對於正常的服務來說,防火牆一點屁用也沒有~不要再相信人家說的防火牆需要很強大啦!

  • 防火牆是很有用的!在限制資源使用的情況時 (例如自己的跳板後門)

不過對於某些需要給點限制的服務來說,防火牆的任務是很重要的!舉例來說,未來我們會談論到 ssh 這個指令, 這個指令會連線到伺服器的 port 22,且登入後取得的 bash 就像是在本機前操作系統一樣!所以,只要能夠使用 ssh 登入, 並且輸入正確的帳號密碼,幾乎就可以完全掌控系統的操作 (當然,還需要有 root 權限才行!)。也因為 ssh 這麼可怕, 所以,通常對於 ssh 來說,我們會建議取消 root 的登入權限,避免網路怪客以 root 來猜測密碼攻擊。

對於鳥哥來說,我的伺服器通常會對我自己的工作機放行 ssh 的 port 22 而已,其他的 IP 都會被我拒絕掉! 使用的方式就是透過防火牆的功能來達成的!因此,這個時候防火牆的任務與功能就相當強大了!此外, 你的系統也可能會偶而用到某些特定的服務,但是並不是隨時啟用的,對於這種情況來說,適時的保護這些非常規的服務也是相當重要的任務! 這就是防火牆的重要任務之一囉!保護資源限制或是不對外公開的服務!

所以說,防火牆有時候有用,有時候沒有用,還是得要分析你的服務以及封包的流向之後,你才會了解到防火牆的目的為何喔! 不要盲目的以為有了防火牆,網路就會變得很美好,假的!這點管理員的認知很重要喔!

  • C. 提供 Internet 服務的使用權限以及服務的正確性

所謂的服務就是伺服器軟體啦!你安裝了 httpd 這個軟體,並且啟用他,你的伺服器就變成 WWW 伺服器囉!這個 WWW 服務就是一隻或一組程式的意思。 那麼我們也知道服務也可以進行部份的資源限制喔!包括網路磁碟機的 samba 服務可以在自己的設定檔裡面就限制能使用的用戶來源 IP 位址呢! 甚至不需要防火牆的支援哩!

不過提供服務的軟體有沒有問題可能是個大問題!舉例來說,早期的 ssh 版本中,有一個版本之前的軟體都有個 bug, 該 bug 會讓攻擊者不需要知道伺服器的帳號密碼,只要能夠接觸到 ssh 這個埠口,就可以順利的取得 root 的權限來登入與操作系統了! 你說,可怕不可怕!所以,本章一開始才會要求大家一定要更新軟體!非常非常重要喔!

有個不可以更新軟體的特例要說明。在鳥哥服務的單位中,有幾組用來跑空氣品質模式的系統,該系統裡面安裝與編譯的軟體是固定的,不能隨變更動! 在該系統底下,最好不要隨意更新軟體~否則更新之後,反而導致系統出問題...不過,通常該系統都不會上網,而是透過一部防火牆系統來統一操作全部的系統。 也就是說,沒有連上 Internet 的系統,可能不能隨便更新啊!新接觸機房的管理員們,下達 yum 或者是升級動作之前,請先向先前的前輩問清楚才行喔!
  • D. 避免服務被入侵導致的問題,以及避免權限被亂設定導致的損失,愛用 SELinux 吧!

如果你的 httpd 這隻服務出問題,那麼當 httpd 被入侵導致被取得使用權之後,httpd 可能可以在你的系統中進行各種檔案的探索,進一步竊取你的資料。 此時,你可以透過 SELinux 的規則控制,讓你的 httpd 只能讀取某些特定目錄的資料,其他目錄的資料就不給讀寫~ 這就是 SELinux 以及某些軟體的 chroot 的功能!

常在網路上面發現很多網友問:『請教一下,如何才能夠讓使用者瀏覽到我的某個目錄底下的檔案呢?』,很多高手就會故意說, 你就設定『 chmod -R 777 / 』就好了吧?呵呵!一設定就慘了咧~你可能最終唯一的手段就是重新安裝系統了.... 好一點的會告訴你,就『 chmod -R 777 /some/dir/ 』這樣,這也會出問題~亦即 /some/dir/ 底下的任何資料,任何人都可以讀/寫/刪除!你說可怕不可怕? 為了避免這些問題,SELinux 的使用,也能夠讓 777 的權限不能被讀寫~

由於 SELinux 通常用在『避免自己的用戶做傻事』的前提之下去設計的,而這個做傻事的用戶通常就是管理員自己.... 所以,我們會在下個章節來討論討論 SELinux !管理員一定要看喔!才不會做傻事!

  • E. 檔案權限是基礎中的基礎

我某個廠商朋友常常問我:『鳥哥,有個公司的老闆,他總是有個需求,就是啊,每個人的資料他都需要可以查閱,但是不能夠修改。 因為帳號們都是不同的群組,而且還有舊有的帳號,所以似乎也不能使用群組的權限來管理,其他人的權限就更不可行了!請問, 我可以怎麼處理啊?』咦!這不就是『針對單一用戶的權限設定』嘛?會的朋友一下子就立刻想到 ACL 了!隨便搞搞就搞定了! 管理員竟然不知道什麼是 ACL ?回去瞧瞧基礎篇囉!

1.3.2、管理員的日常工作與系統安全的相關性

本章 1.2 小節的基本強化功能當中,有些事情是管理員一定要進行的!現在讓我們來搭配圖 1.3.1 討論討論這些動作之後的基本原因吧!

  • 為什麼需要全系統升級?以及關閉網路服務?

請搭配圖 1.3.1 的流程,通過防火牆之後,用戶端就可以接觸到網路服務了!前一小節我們也討論過,網路服務如果出問題,你的系統很容易被攻擊與入侵! 所以,為了避免困擾,最好當然就是關閉不必要的網路服務,讓攻擊者無從攻擊!然後將軟體整個升級到沒有問題的版本 (雖然隨時都可能會出現新的問題), 並且依據更新的軟體去判斷要不要重新開機!這樣就可以讓你的系統維持良好的狀態!即使沒有防火牆的情況下,你的伺服器也能活的好好的呢!

  • 根據不同的服務帳號,設定不同的帳號權限與屬性

一般來說,你的 email 如果是 user1@hostname.domain 的情況下,那麼攻擊者就知道你的主機名稱為 hostname.domain,然後這個主機裡面可能有個名為 user1 的帳號,因此,攻擊者就可以透過前面講的 port scan 軟體去偵測 hostname.domain 這部機器,然後根據掃描到的埠口, 去連線你的伺服器,然後嘗試使用 user1 去猜密碼!如果你的密碼是很多人喜歡設計的 123456,嘿嘿!想要取得你的資訊, 根本不需要 1 分鐘的時間!

所以,如果是 email 或純粹的 FTP 檔案伺服器的帳號,鳥哥通常不會給這些帳號的本機登入權限。不過,即使是這樣,攻擊者仍然可以透過正常的管道, 去嘗試使用 user1 以及猜密碼的方式,去探索該帳號的 email 以及 FTP 啊!此時攻擊者並不是要登入本機喔~是想要偷取 user1 的資料。 那怎辦?你有許多辦法來處理:

  • 釜底抽薪的方法,就是建立嚴格的密碼,讓使用者的密碼不容易被猜測到,提昇帳號的安全性;
  • 透過 /etc/security/limits.conf 的設定,讓帳號的可用資源在設計的範圍內;
  • 透過類似 fail2ban 等進階防火牆層級的軟體,限制攻擊者猜測密碼的次數,減少被同一個來源猜測密碼的頻率。
  • 使用 alias 的功能以假的帳號提供給 email 使用。

在多年的管理員生涯之後,鳥哥個人覺得上面第一點最難啊~難如登天...所以,能做多少算多少了!救一個是一個~至於最後一點也是很有效果的! 其實我們在前一小節裡面談到的 crontab 的 email 裡面就是透過這種方式來處理~假設我實際的帳號名稱其實是 dmtsai,但是我的 email 可以用 vbird@hostname.domain 來處理,只要在 /etc/aliases 裡面增加『 vbird: dmtsai 』就可以了!在這種情況下,攻擊者會以為帳號是 vbird ,所以會用該帳號來猜密碼! 不過,實體帳號其實是 dmtsai 啦!這樣子的隱藏帳號,也是很有效的管理方式!

思考例題:
  • 上面鳥哥談到的,要設定不給某些帳號本機登入權限,其實就是不給可互動的 shell。假設(不要實做)你要建立一個名為 mailuser 的帳號, 這個帳號只能使用 email, FTP 等服務,但是不能在本機 tty 或 ssh 登入,該如何下達指令來建立這個帳號?
  • 在基礎學習篇裡面,若要算出嚴格的密碼,可以透過 openssl 來處理。請找出該指令的參數去計算出 8 個字元的密碼。
  • 如上所述,如果增加了『 vbird: dmtsai 』之後,還要執行什麼指令之後,這個設定才能實際的讓 dmtsai 去接收 vbird 的信件?
  • 密碼記憶的可行方案之一

我們經常說,密碼不要寫在任何紙上面或是檔案裡面,否則很容易被竊取。然後我們又用 openssl 去計算出人腦記不住的密碼了! 你最好能記的起來這麼多密碼啦!不可能~所以,某些特別的密碼隱藏方式,就很需要了解一下!可以提供自己建立密碼隱藏的功能。

# 先取得某個圖檔,隨便來源皆可!我們取得本站提供的檔案好了:
[vbird@cloud ~]$ wget https://linux.vbird.org/linux_server/rocky9/0120cloudandvm/file_permission.gif

# 查看下這個檔案的細節
[vbird@cloud ~]$ file file_permission.gif
file_permission.gif: GIF image data, version 89a, 512 x 306

# 將密碼偷偷丟進去這個檔案內,然後查看檔案資訊:
[vbird@cloud ~]$ echo -e "\nsomeweb: password" >> file_permission.gif
[vbird@cloud ~]$ file file_permission.gif
file_permission.gif: GIF image data, version 89a, 512 x 306 # 完全沒變!

# 取得之前儲存的密碼
[vbird@cloud ~]$ tail -n 1 file_permission.gif
someweb: password

這個檔案未來還是可以使用瀏覽器去查閱圖檔資訊,但是該檔案後面幾行就藏了你個人的密碼!當然,這個檔案就要好好保存!不要流出去也不要被自己誤刪! 至少比起一般的文字檔來說,別人比較不容易透過這樣的方式去追蹤檢查啊!不過,也因為影像檔的後面資料很容易藏東西, 聽說某些攻擊碼也會用類似的方式來隱藏/執行。所以,現在連圖檔的內容,也是需要留意啦!

修改歷史:
  • 2018/01/26:嘗試處理新的小型系統,並將之前許多的文件彙整一下,變成一個關於管理員態度的短篇小節
  • 2022/05/03:從前一版修訂而來,增加不少資料~不過,主架構倒是沒有變動!
  • 2022/07/21:因應 RockyLinux9,所以修改了部份內容。變動幅度不是太大!
  • 2023/08/04:將資料從 RockyLinux 9.0 升級到 9.2 ,作為 needs-restarting 的用法,終於可以看出差異!
2022/05/03以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計