鳥哥的 Linux 私房菜

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

最近更新日期:2018/01/26

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

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

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

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

1.1.1、虛擬化名詞簡介

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

  • 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 裡面得要將這些功能啟用才行。鳥哥以自己的一部伺服器等級的 BIOS 設定為例,你可能得要在系統管理或者是進階設定裡面找到如下的圖示, 並且啟動 (Enabled) 該設定才行。

BIOS 設定示意
圖 1.1.1、BIOS 設定示意 (取自 Intel 官網)

你需要啟用的是『 Intel Virtualization Technology 』這個項目,至於那個『 Intel VT for Directed I/O 』則非必備! 除非你需要進行 PCI passthrough 的技術支援,否則該項目有沒有勾選都不會影響的。 一般來說,啟動該設定後,你的 CPU 就有支援虛擬化了。如果不太有信心,那麼當你安裝好 Linux 之後,再次的觀察 CPU 的指令集就好了。

思考例題:請以『 intel i7 7700 』為關鍵字前往 google 搜尋,找到 intel 官方的 CPU 規格頁面,查看一下這個 CPU 的核心數量、快取記憶體容量、TDP 的意義與數值、最大可接受主記憶體容量、是否支援虛擬化、基礎頻率與最大超頻的意義與數值。 從而討論與理解你的主機能否升級、可能最快速度為何等等。



1.1.2、使用硬體說明與準備

鳥哥這次使用的硬體配備中,真的是拿以前舊的電腦來用的!使用的配備為:

  • CPU: i7 2600, 3.4GHz (4 核 8 緒)
  • RAM: 32GB
  • 主機板:
  • VGA 卡:內建顯示卡 (i7 2600 的顯卡 Intel HD Graphics 2000),BIOS 設定為 32M 記憶體
  • 硬碟: 160GB 傳統硬碟
  • 網卡: 主機板內建

這個硬體除了 CPU 支援虛擬化,記憶體還算不小之外,其他的硬體對於 2018 年的環境來說,是真的不很好的配備了。 因為我們的目的是在學習而已,所以這樣的配備拿來作為機房的環境底層小雲,應該是划算的投資。 至於硬體的可用性方面,跟前面一樣,首先CPU 的虛擬化功能需要啟用才行!我們進 BIOS 去調整一下:

BIOS 設定示意
圖 1.1.2、BIOS 設定示意 (鳥哥舊主機板 BIOS)
  • 可開機 USB 安裝片

接下來準備要安裝 host 母系統了。目前網路上大致還是以提供 DVD 光碟的模式來釋出可安裝套件,那我們知道 DVD 光碟未來可能存在的機率不高了! 畢竟現在 USB 隨身碟速度又快、又可以重複利用,當然也比較環保!因此,請準備一顆 16GB 左右的 USB 隨身碟, 這個隨身碟內的資料會被整個刪除,所以不要拿你的資料碟來使用,請拿一顆沒在使用的 USB 2.0 以上的隨身碟來使用即可 (其實 8GB 也夠用了!)

我們選擇的 host 作業系統為 CentOS 7.4,請自行下載 ISO 檔案,只需要下載第一片 DVD 即可,不需要下載所有的套件。 鳥哥是在崑山 FTP 網站下載的:

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

[root@cloud ~]# dd if=CentOS-7-x86_64-DVD-1708.iso of=/dev/sdc

如果你的工作環境是 windows 的話,那麼建議使用 rufus 這套開源軟體 (http://rufus.akeo.ie/) ,在『 Device 』部份請選擇你的正確隨身碟,然後直接在『 Create a bootable disk using 』部份, 先選擇你的映像檔檔名,然後將模式調整為『DD 模式』,這樣所有的設定就會使用映像檔設定值。之後按下『 Start 』就可以開始寫入 USB 開機片了。 鳥哥試過這個 rufus ,速度真的很快~即使是使用 DD 模式,效能依舊不錯。

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

思考例題:我們知道 USB 2.0 與 USB 3.0 的速度並不一樣。但是某些號稱支援 USB 3.0 的隨身碟,僅只是界面為使用 USB 3.0 而已, 實際上內部使用的快閃記憶體依舊是舊的規格,因此該速度並不會有像 USB 3.0 般的快速。
  • 請查出 USB 2.0 與 USB 3.0 的最大理論效能,同時寫下 Mbits/s 及 Mbytes/s 的不同單位。
  • http://24h.pchome.com.tw/prod/DGAG1K-A76554092 為例,查看一下該隨身碟的讀取、寫入速度與實際理論速度差異有多大。



1.1.3、簡易安裝程序

鳥哥假設大家都已經知道如何安裝 Linux 作業系統,加上因為我們這個系統的硬碟小到快要看不到容量 (160GB),所以, 我們的分割就使用最簡易的分割 (讓系統自訂),盡量避免整個檔案容量的分散。如果你是有想要拿來作為某些特別的用途時, 建議還可以附掛一顆固態硬碟,可以讓你的系統效能更棒!廢話不多說,連截圖也不做了!單純跟大家講一下幾個重要的項目即可。

  1. 開機後,選擇『 Install CentOS 7 』這個項目 (有 60 秒可以選擇)
  2. 選擇語系,當然選擇台灣的『繁體中文』語系
  3. 主選單:時區選擇『亞洲台北』
  4. 主選單:鍵盤配置裡面的『選項』部份,調整為『Ctrl+Shift』的切換模式
  5. 主選單:語言支援的部份當然就是台灣的繁體中文
  6. 主選單:安裝來源當然是本地媒體
  7. 主選單:軟體選擇請一定要改為『虛擬主機』,其他不要勾選!
  8. 主選單:安裝目的地請選擇你的正確的硬碟,然後使用自動分割模式即可。
  9. 主選單:KDUMP,我是很喜歡取消 KDUMP ,所以這裡我將他取消。各位自己選擇即可。
  10. 主選單:網路與主機名稱的部份,這部機器暫時被我放在桌邊測試,因此使用內部的 DHCP 網路(自動取得 IP), 然後主機名稱我暫時設定為『 cloud.vbird 』這樣。同時按下『設定』後,幾個頁面的資料要調整一下:
    • 『一般』頁面中,請勾選『當這個網路可用時自動連線』個項目
    • 『IPv4』的頁面中,確定使用的是 DHCP 自動設定的參數
  11. 主選單:按下『開始按裝』後,系統就會開始自動安裝的步驟了。

進入安裝步驟之後,記得一定要設定一下 root 的密碼以及建立一個一般操作的帳號。鳥哥建立一個 vbird 帳號在這個系統內, 然後勾選『讓這個帳號變成管理員』的項目,並且設定好密碼,未來就主要用這個帳號來操作系統,若有需要管理員權限時, 再以 sudo 來切換身份即可。盡量不要直接使用 root 的身份來進入系統啦!未來我們也會將遠端登入的身份取消 root 的登入! 所以,這裡就開始養成習慣吧!

因為虛擬主機伺服器安裝的軟體不會太多,因此差不多 10 分鐘內系統就可以安裝完畢~此時,請按下重新開機,然後拔除 USB 隨身碟吧! 重新開機完成之後,你就已經開始進入 CentOS 7 的小型雲系統環境中了。



1.1.4、簡易基礎設定

  • CPU 是否支援虛擬化指令集查詢

由於 KVM 這個軟體需要 CPU 有支援虛擬化才能夠順利運作,而從前一個小節我們也知道 BIOS 必須要啟動 CPU 的虛擬化指令集設定後, 才能夠真的驅動 CPU 的虛擬化功能。那如何用簡單的方式查詢是否真的有支援呢?就從 /proc/cpuinfo 的旗標 (flags) 去查詢即可! 針對 Intel 的 CPU 來說,是否支援虛擬化,請查詢有沒有 vmx 這個旗標即可!

[root@cloud ~]# grep vmx /proc/cpuinfo
....(前面省略)....
flags           : fpu vme de pse ... ds_cpl vmx smx est...

CPU 指令集的功能非常多,所以上面的輸出非常複雜~鳥哥已經篩選過一些資料,讓這個顯示比較簡單。總之,你只要看到 vmx 這個關鍵字的出現即可囉!

  • 更新 yum 設定值

依據 Linux 基礎學習篇的建議,初次安裝好 Linux 之後,當然也是需要更新整個系統是比較好的。但是,為了讓系統更新的速度可以加快, 透過直接設定本機到最靠近的映射站會是比較直覺快速的作法。這裡鳥哥使用最靠近我們伺服器的崑山科大 FTP 站來作為更新的來源。 設定的方法介紹請參考基礎學習篇,簡單設定的方式有點像這樣:

[root@cloud ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/os/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever - Updates
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/updates/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever - Extras
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/extras/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[root@cloud ~]# yum clean all

[root@cloud ~]# yum repolist
repo id                    repo name                    status
base                       CentOS-7 - Base              9,591
extras                     CentOS-7 - Extras              329
updates                    CentOS-7 - Updates           1,670
repolist: 11,590
# 會很快的列出目前的三個主要的軟體倉儲伺服器的相關項目。當然,你的網路必須是通的

因為未來我們可能會用到其他 EPEL 的相關軟體,所以我們也直接將 EPEL 的軟體倉儲給他安裝上來。但是由於非必要就不要啟用 EPEL, 因此也將 EPEL 設定為預設不啟用的模樣!整體作法有點像這樣:

[root@cloud ~]# yum install epel-release
# 過程中你可能需要輸入兩次 y 才行!

[root@cloud ~]# yum install epel-release
# 不要懷疑!最好執行第二次~因為 epel 自己也對自己的軟體做了個升級的軟體包了!

[root@cloud ~]# vim /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
metalink=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
# 將啟動狀態設定為預設不啟用!

[root@cloud ~]# yum list netcdf
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Error: No matching Packages to list

[root@cloud ~]# yum --enablerepo=epel list netcdf
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * epel: mirror01.idc.hinet.net
Available Packages
netcdf.x86_64           4.3.3.1-5.el7           epel

預設不要啟用 epel 啦!因為無須重複更新!不過,如果要使用到 EPEL 時,就透過 --enablerepo=epel 的參數來處理即可! 如上所示,預設系統是找不到 netcdf 這個科學用軟體的,加上該參數後,才能夠在 EPEL 裡面找到這個科學軟體呢! 這樣理解了吧?

  • 更新磁碟佇列機制與預讀資料

『據說』預設的 cfq 磁碟佇列不是很適合 Server 的運作,在效能上,似乎是 deadline 比較好!所以,這裡也建議你修改一下磁碟佇列的存取方式。 此外,越多快取當然效能會越好,因此,這裡也建議你將預讀 (read_ahead_kb) 資料量加大。不過也不需要加大太多~ 如下的設定值已經很夠用了。

[root@cloud ~]# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
[root@cloud ~]# cat /sys/block/sda/queue/read_ahead_kb
128
# 上面這個是預設值,我們想要每次開機都修改,因此可以這樣做:

[root@cloud ~]# mkdir bin; cd bin
[root@cloud bin]# vim parameters.sh
#!/bin/bash

echo "deadline" > /sys/block/sda/queue/scheduler
echo 4096       > /sys/block/sda/queue/read_ahead_kb

[root@cloud bin]# chmod a+x /root/bin/parameters.sh
[root@cloud bin]# vim /etc/rc.d/rc.local
/usr/bin/bash /root/bin/parameters.sh

[root@cloud bin]# chmod a+x /etc/rc.d/rc.local
[root@cloud bin]# sh /etc/rc.d/rc.local
[root@cloud bin]# cat /sys/block/sda/queue/scheduler /sys/block/sda/queue/read_ahead_kb
noop [deadline] cfq
4096

如上所示,最終就可以完成磁碟佇列的修改以及預讀資料的容量。而且,未來若有其他需要修改的參數,直接加入 /root/bin/parameters.sh 即可! 然後直接執行 sh /root/bin/parameters.sh 就好了!輕鬆又愉快!

  • 日期與時間的訂正

在台灣,剛剛安裝好你的 Linux 系統時,通常可能會發生日期與時間誤差超過 8 小時的情況發生!這是由於是否使用標準時間所導致的問題。 台灣本地時間會比國際標準時間快 8 小時啊!因此,更新時間是很重要的!不過,除非是使用對於時間延遲誤差相當敏感的 kerberos 服務等, 否則,一般來說,倒是無須啟用網路時間伺服器。我們這裡先使用 ntpdate 指令來更新時間即可。

[root@cloud ~]# ntpdate ntp.ksu.edu.tw
[root@cloud ~]# ntpdate time.stdtime.gov.tw
# 在學校單位裡面通常會有 Time server,所以鳥哥預設使用崑山科大的時間伺服器。
# 如果你不在學校單位,也沒有其他時間伺服器,則使用台灣提供的時間伺服器吧!

[root@cloud ~]# echo "ntpdate ntp.ksu.edu.tw" >> /root/bin/parameters.sh
[root@cloud ~]# vim /etc/crontab
10 4 * * * root /sbin/ntpdate ntp.ksu.edu.tw
# 除了每次開機就更新一次系統時間之外,每天凌晨也會主動更新一次時間喔!

1.2、基本的安全強化動作

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

1.2.1、減少啟動的網路服務

在網際網路上,別人想要入侵你的系統,不外乎 (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 每五秒更新一次網路狀態的顯示;

範例一:列出目前系統上面正在監聽的網路埠口,僅 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 0.0.0.0:111       0.0.0.0:*        LISTEN   1/systemd
tcp        0      0 192.168.122.1:53  0.0.0.0:*        LISTEN   1594/dnsmasq
tcp        0      0 0.0.0.0:22        0.0.0.0:*        LISTEN   1243/sshd
tcp        0      0 127.0.0.1:25      0.0.0.0:*        LISTEN   1526/master
tcp6       0      0 :::111            :::*             LISTEN   1/systemd
tcp6       0      0 :::22             :::*             LISTEN   1243/sshd
tcp6       0      0 ::1:25            :::*             LISTEN   1526/master
udp        0      0 0.0.0.0:59036     0.0.0.0:*                 30996/dhclient
udp        0      0 192.168.122.1:53  0.0.0.0:*                 1594/dnsmasq
udp        0      0 0.0.0.0:67        0.0.0.0:*                 1594/dnsmasq
udp        0      0 0.0.0.0:68        0.0.0.0:*                 30996/dhclient
udp        0      0 127.0.0.1:323     0.0.0.0:*                 862/chronyd
udp6       0      0 :::22527          :::*                      30996/dhclient
udp6       0      0 ::1:323           :::*                      862/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 25 僅針對 lo 介面開放,意指 Internet 基本上是無法連接到我本機的 25 埠口啦!
  • 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 25/tcp 與 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 與虛擬網路設備有關,這個項目請先略過。 所以,若僅針對 0.0.0.0 與 127.0.0.1 來查閱,則主要的網際網路服務僅有:

Proto  Local Address      Foreign Address    State       PID/Program name
tcp    0.0.0.0:111        0.0.0.0:*          LISTEN      1/systemd
tcp    0.0.0.0:22         0.0.0.0:*          LISTEN      1243/sshd
tcp    127.0.0.1:25       0.0.0.0:*          LISTEN      1526/master
udp    0.0.0.0:59036      0.0.0.0:*                      30996/dhclient
udp    0.0.0.0:68         0.0.0.0:*                      30996/dhclient
udp    127.0.0.1:323      0.0.0.0:*                      862/chronyd

22 與 25 這兩個埠口請盡量不要動它,未來會介紹這是啥鬼東西~而因為我們目前 IP 位址取得的方式為自動取得 (dhcp) ,因此就會有 dhclient 這個軟體所啟動的 68 號與隨機取用的另一個埠口,這個埠口也是不能關閉的 (因為系統的網路功能本身的需要)。因此,可以關閉的就只剩下 port 111, 323 這兩個了。 其中 chronyd 可關可不關,畢竟他是僅針對內網 (127.0.0.1) 來放行而已。

問題比較大的應該是 port 111 這一個項目,因為他是由 systemd 這個系統最重要的服務所啟動的!你總不能關閉 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 這兩個!那到底我們 CentOS 7 是用那一個?不用怕!使用 systemctl 來查詢即可!

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

看起來我們的 CentOS 應該使用的服務名稱是 rpcbind 才對!而且最重要的反而是那個 rpcbind.socket 有啟用 (enabled) 的緣故! 所以,要關閉這個服務就變得簡單了!

[root@cloud ~]# systemctl stop rpcbind.socket    <==立刻關閉該服務
[root@cloud ~]# systemctl disable rpcbind.socket <==下次開機不會啟用

請再次使用 netstat -tlunp 指令查詢看看, port 111 有沒有關閉啊!

實做例題:請依據上述的動作流程,思考一下如果想要將 port 323 關閉的話,應該如何處理?
  • 透過 systemctl 搭配 grep 找出關鍵字 chrony 的所有服務資料
  • 使用 systemctl 進行關閉與取消開機啟動的兩個動作
  • 再次使用 netstat 去確認埠口是否關閉了!

最終你的這部系統應該會只有底下的埠口模樣:

[root@cloud ~]# netstat -tlunp
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      1594/dnsmasq
tcp        0      0 0.0.0.0:22        0.0.0.0:*         LISTEN      1243/sshd
tcp        0      0 127.0.0.1:25      0.0.0.0:*         LISTEN      1526/master
tcp6       0      0 :::22             :::*              LISTEN      1243/sshd
tcp6       0      0 ::1:25            :::*              LISTEN      1526/master
udp        0      0 0.0.0.0:59036     0.0.0.0:*                     30996/dhclient
udp        0      0 192.168.122.1:53  0.0.0.0:*                     1594/dnsmasq
udp        0      0 0.0.0.0:67        0.0.0.0:*                     1594/dnsmasq
udp        0      0 0.0.0.0:68        0.0.0.0:*                     30996/dhclient
udp6       0      0 :::22527          :::*                          30996/dhclient

請注意:

  • 上面這個功能動作比較精簡的原因,是因為鳥哥安裝了一套很精簡的系統,因此啟動的埠口相對比較少的緣故
  • 若你使用其他模式安裝 CentOS 7 的話,可能啟用的埠口數量會比較多,請自行斟酌要關閉的服務喔!畢竟每部系統的功能與預設服務都不一樣啊!
  • 上面那個 dhclient 啟動的埠口,除了 68 是固定的之外,另外兩個埠口是隨機啟動的,每次開機都不一樣,所以跟上述的埠口號碼不同是沒關係的。
思考例題:明明你已經使用 netstat -tlunp 看到啟動的埠口已經變少了,但是每次重新開機後,許多的服務與埠口就又會被啟動。你覺得問題可能是什麼?
  • 最可能的問題就是,你只使用了 systemctl stop XX_server 而沒有使用 systemctl disable XX_server 的緣故!如果不知道為什麼要 disable, 回頭去瞧瞧基礎學習篇吧!
  • 另一個最可能的原因,應該是你可能安裝了新的服務,該服務預設為啟用 (enable),但是通常第一次安裝好時,系統不會主動幫你啟用, 所以下次重新開機就會開啟該服務...
  • 綜合上述兩點,因此你在系統有大量升級或者是初次使用不多久,建議要反覆重新開機過數次,確實檢查沒有遺漏關閉或啟用的服務才好。



1.2.2、讓系統軟體保持在最新的狀態

系統被攻擊的原因除了本身服務啟動卻忘記設定好相關的存取限制之外,另一個原因則是...作業系統本身或者是服務軟體本身有漏洞尚未修補! 因此,各家的作業系統,通常會定時發布更新套件!咱們的 CentOS 7 只要有任何漏洞被公告,軟體志工就會在短時間內趕緊將該漏洞補起來, 經過測試沒問題後,就會立即發布公告到網際網路上面提供大家線上更新!

所以,初次安裝好系統並且做了簡易的設定之後,再來就是持續不斷的進行系統更新。而且也需要排定系統的自動更新機制較佳喔! 立刻更新的方法就使用『 yum -y update 』即可!那自動更新呢?就寫入 /etc/crontab 即可!

[root@cloud ~]# yum -y update
# 系統會自動的進行全系統的軟體下載與更新,都是自動進行!剛裝好的系統第一次執行會比較久。

# 讓系統每日自動於 3:00 進行全系統更新
[root@cloud ~]# vim /etc/crontab
10 4 * * * root /sbin/ntpdate ntp.ksu.edu.tw
0  3 * * * root /bin/yum -y update

由於一般系統的 crontab 產生的訊息都只會傳給管理員 (root),因此你得要分析管理員的本機 mail 之後,才會知道該系統的軟體有沒有更新。 但是,如果你跟鳥哥一樣,通常不會切換成為 root 的身份啊,畢竟登入系統寫網頁,不需要轉成 root 身份。那怎辦?此時,你可能需要將 email 同步一份轉給你的帳號 (鳥哥的案例是使用 vbird 帳號),處理的方式很簡單:

[root@cloud ~]# vim /etc/aliases
# Person who should get root's mail
root:           root,vbird

[root@cloud ~]# newaliases
[root@cloud ~]# ll /etc/aliases*
-rw-r--r--. 1 root root  1523  1月 24 14:13 /etc/aliases  
-rw-r--r--. 1 root root 12288  1月 24 14:13 /etc/aliases.db

我們系統的郵件傳遞會使用本機的 port 25 傳送資料,但是資料傳送到每個用戶的郵件信箱時,會分析 /etc/aliases.db 這個資料庫檔案。 不過該資料庫檔案主要是參考 /etc/aliases 而來的,因此修改完 /etc/aliases 之後,要使用 newaliases 轉成資料庫檔案才行。 現在,讓我們傳送一份信件給 root 測試一下是否能成功將 root 的信件也轉一份給 vbird 這個帳號?

[root@cloud ~]# echo "testing from me" | mail -s 'my test' root

# 用 vbird 這個帳號的身份來查閱信件看看:
[vbird@cloud ~]$ who am i
vbird    pts/0        2018-01-24 13:50 (gateway)

[vbird@cloud ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/vbird": 1 message 1 new
>N  1 root                  Wed Jan 24 14:16  18/543   "my test"
& 1
Message  1:
From root@cloud.vbird  Wed Jan 24 14:16:43 2018
Return-Path: <root@cloud.vbird>
X-Original-To: root
Delivered-To: root@cloud.vbird
Date: Wed, 24 Jan 2018 14:16:42 +0800
To: root@cloud.vbird
Subject: my test
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: root@cloud.vbird (root)
Status: R

testing from me

& exit

如上所示,這就能確認信件能夠傳給 vbird 這個一般帳號囉!你只要登入自己的一般帳號,收自己的郵件,就可以同時收到給 root 的信件了!

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



1.2.3、用 logwatch 分析登錄檔

分析登錄檔對於系統管理員來說是很重要的任務!為了節省大家的時間,使用 logwatch 取代人工分析也是很重要的啦! 在基礎篇裡面談到的 logwatch 安裝行為,直接使用 yum 安裝好即可,裝好之後, logwatch 就會主動的每日分析登錄檔囉。

[root@cloud ~]# yum install logwatch
[root@cloud ~]# sh /etc/cron.daily/0logwatch
[root@cloud ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 8 messages 8 new
>N  1 (Cron Daemon)         Fri Jan 19 04:10  26/907   "Cron <root@cloud> /sbin/ntpdate ntp.ksu.edu.tw"
....
 N  7 root                  Wed Jan 24 14:16  18/543   "my test"
 N  8 logwatch@cloud.vbird  Wed Jan 24 14:56  62/2194  "Logwatch for cloud.vbird (Linux)"
& 8
Message  8:
From root@cloud.vbird  Wed Jan 24 14:56:44 2018
....

 ################### Logwatch 7.4.0 (03/01/11) ####################
        Processing Initiated: Wed Jan 24 14:56:44 2018
        Date Range Processed: yesterday
                              ( 2018-Jan-23 )
                              Period is day.
        Detail Level of Output: 0
        Type of Output/Format: mail / text
        Logfiles for Host: cloud.vbird
 ##################################################################

 --------------------- Postfix Begin ------------------------

      795   Bytes accepted                                 795
      795   Bytes delivered                                795
 ========   ==================================================

        1   Accepted                                   100.00%
 --------   --------------------------------------------------
        1   Total                                      100.00%
 ========   ==================================================

        1   Removed from queue
        1   Delivered


 ---------------------- Postfix End -------------------------
....

詳細的登錄檔內容請自行分析,這邊鳥哥就不再說明。此外,每日系統都會分析前一日的登錄資訊,所以你應該每日都得要查閱一次才好。 當然,由於我們已經設定 vbird 也能收到 root 的信件,因此你用 vbird 帳號去看 mail 就好了!都會有這封信件的資料囉。 如果你還有其他需要每日進行的報告,那就請自行處理相關的分析行為囉!



1.2.4、以 nmap 觀察本身系統網路埠口

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

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

[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 :這種是變形的主機範圍啦!很好用吧!

[root@cloud ~]# yum install nmap

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

# 查看本機啟用的 UDP 與 TCP 埠口
[root@cloud ~]# nmap -sTU localhost

Starting Nmap 6.40 ( http://nmap.org ) at 2018-01-24 15:59 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00087s latency).
Other addresses for localhost (not scanned): 127.0.0.1
Not shown: 1997 closed ports
PORT   STATE         SERVICE
22/tcp open          ssh
25/tcp open          smtp
68/udp open|filtered dhcpc

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

可以看出來,在本機搜尋到的埠口就是有上述的這幾個,不過,比較大的 UDP 埠口還沒有被找到,這是因為 UDP 與 TCP 封包的運作方式不同所致。 因此,如果加上 UDP 想要搜尋的埠口範圍,可能會讓整體搜尋的速度降低喔!在使用上還得要特別注意!鳥哥嘗試探索 1000 個 UDP 的埠口, 大概要花 50 秒左右,如果全部的埠口都探索 (大約 65000 個),初步計算就得要花費 1 小時左右!所以,一般 UDP 僅探索 well know 的埠口而已。

# 探索整個 class C 的區網中,哪些主機 IP 可能是活動中的 (active, alive)
[root@cloud ~]# nmap -sP 192.168.201.0/24
Starting Nmap 6.40 ( http://nmap.org ) at 2018-01-24 16:17 CST
Nmap scan report for 192.168.201.101
Host is up (0.00017s latency).
MAC Address: 10:BF:48:D6:8B:2E (Asustek Computer)
Nmap scan report for 192.168.201.252
Host is up (0.0010s latency).
MAC Address: 94:57:A5:9C:DF:60 (Unknown)
Nmap scan report for 192.168.201.254
Host is up (0.00021s latency).
MAC Address: 00:25:90:23:02:0B (Super Micro Computer)
Nmap scan report for 192.168.201.28
Host is up.
Nmap done: 256 IP addresses (4 hosts up) scanned in 3.47 seconds

一般針對單一主機的偵測結果輸出會有 3 行左右,如上所示,偵測 192.168.201.101 的結果中,除了探測出正確的網卡卡號 (MAC) 之外, 也從網卡卡號找到該主機可能的主機板類型哩!而且速度相當快,只花費 3.47 秒就完成 256 個 IP 的偵測了。 比較特別的是 192.168.201.252 那部主機,竟然沒有辦法偵測到系統類型,我覺得怪怪的,所以來偵測一下該主機的 TCP 埠口好了!

[root@cloud ~]# nmap 192.168.201.252
Starting Nmap 6.40 ( http://nmap.org ) at 2018-01-24 16:18 CST
Nmap scan report for 192.168.201.252
Host is up (0.025s 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 (Unknown)

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

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

  • 不要偵測別人的環境

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

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



1.3、管理員的管理態度

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

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

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

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

基本的流程就是:

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

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

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

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

  • 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 的權限來登入與操作系統了! 你說,可怕不可怕!所以,本章一開始才會要求大家一定要更新軟體!非常非常重要喔!

Tips鳥哥的圖示 有個不可以更新軟體的特例要說明。在鳥哥服務的單位中,有幾組用來跑空氣品質模式的系統,該系統裡面安裝與編譯的軟體是固定的,不能隨變更動! 在該系統底下,最好不要隨意更新軟體~否則更新之後,反而導致系統出問題...不過,通常該系統都不會上網,而是透過一部防火牆系統來統一操作全部的系統。 也就是說,沒有連上 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 http://linux.vbird.org/linux_server/0107cloudandvm/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

這個檔案未來還是可以使用瀏覽器去查閱圖檔資訊,但是該檔案後面幾行就藏了你個人的密碼!當然,這個檔案就要好好保存!不要流出去也不要被自己誤刪! 至少比起一般的文字檔來說,別人比較不容易透過這樣的方式去追蹤檢查啊!


1.4、實做例題總整理

因為後續章節幾乎所有的系統都是從這個章節的母系統 (KVM host) 裡面產生的,因此這個系統的建立也是相當重要的呢!所以,許多的實做部份的資料, 最好做個檢查~避免後續某些資料跟鳥哥不一樣,導致環境差異產生某些問題啊!

  • 關於硬體資源的相關檢查

因為這部系統是 KVM host,因此 CPU 需要支援虛擬化指令集 (我這裡用 Intel CPU 為範例),同時因為未來會有許多部虛擬機器同時運作,所以記憶體最好要足夠!

# 檢查 CPU 是否有支援虛擬化,注意,關鍵字是 vmx 這個 Intel 的 CPU 指令集 (flags)
[root@cloud ~]# grep vmx /proc/cpuinfo
flags           : fpu vme de pse .... vmx smx ....

# 檢查記憶體是否有超過 16G 以上,至少也需要 8G 以上喔!不然後續的章節可能會出現問題:
[root@cloud ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          32104         350       31346          16         406       31360
Swap:         15707           0       15707

# 檔案系統容量也需要做個檢查,未來才知道要將虛擬機器硬碟檔放在哪裡
[root@cloud ~]# df -m | grep -v tmpfs
檔案系統                1M-區段  已用  可用 已用% 掛載點
/dev/mapper/centos-root   51175  1471 49705    3% /
/dev/sda2                  1014   153   862   16% /boot
/dev/sda1                   200    10   191    5% /boot/efi
/dev/mapper/centos-home   88889    33 88857    1% /home
# 看起來應該是放在 /home 裡面比較妥當~所以未來就直接放在 /home/kvm/ 這個目錄下囉!

# 磁碟佇列修改為 deadline 測試看看
[root@cloud ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
  • 系統的簡易設定檢查

再來則是檢查一下基礎設定,包括日期檢查、yum 的設定檔檢查、以及我們自己設定的 parameters.sh 內容檢查等等。

# 先看日期對不對,最簡單的方法就是透過 ntpdate 去檢查看看:
[root@cloud ~]# ntpdate ntp.ksu.edu.tw
26 Jan 11:24:54 ntpdate[2381]: adjust time server 120.114.100.1 offset -0.230828 sec
[root@cloud ~]# timedatectl
      Local time: 五 2018-01-26 11:25:08 CST
  Universal time: 五 2018-01-26 03:25:08 UTC
        RTC time: 五 2018-01-26 11:25:02
       Time zone: Asia/Taipei (CST, +0800)  # 看看時區是否正確
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

# 看看 yum 設定檔是否正常正確這樣!
[root@cloud ~]# ll /etc/yum.repos.d/epel*
-rw-r--r--. 1 root root  951  1月 18 22:39 /etc/yum.repos.d/epel.repo
-rw-r--r--. 1 root root 1050 10月  3 01:44 /etc/yum.repos.d/epel-testing.repo

[root@cloud ~]# grep ksu /etc/yum.repos.d/CentOS-Base.repo
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/os/x86_64/
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/updates/x86_64/
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/7/extras/x86_64/
# 確認一下 yum 有使用最近的映射站,關鍵字 ksu 請自行修改成你使用的環境!

# 看看 /etc/rc.d/rc.local 的權限與內容是否正確
[root@cloud ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 511  1月 18 23:02 /etc/rc.d/rc.local

[root@cloud ~]# tail -n 5 /etc/rc.d/rc.local
touch /var/lock/subsys/local
/usr/bin/bash /root/bin/parameters.sh

# 查看 /root/bin/parameters.sh 的權限與內容是否正確
[root@cloud ~]# ll /root/bin/parameters.sh; cat /root/bin/parameters.sh
-rwxr-xr-x. 1 root root 133  1月 18 15:17 /root/bin/parameters.sh
#!/bin/bash

echo "deadline" > /sys/block/sda/queue/scheduler
echo 4096       > /sys/block/sda/queue/read_ahead_kb
ntpdate ntp.ksu.edu.tw

# 檢查本機的埠口是否控制在較少的埠口啟動環境:
[root@cloud ~]# netstat -tlunp | grep -v 192.168.122.1
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      1177/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1304/master
tcp6       0      0 :::22                   :::*                    LISTEN      1177/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      1304/master
udp     5376      0 0.0.0.0:58452           0.0.0.0:*                           988/dhclient
udp        0      0 0.0.0.0:68              0.0.0.0:*                           988/dhclient
udp6       0      0 :::49295                :::*                                988/dhclient

# 檢查核心是否已經更新到最新,且已經重新開機妥當
[root@cloud ~]# ll /lib/modules
drwxr-xr-x. 7 root root 4096  1月 19 16:07 3.10.0-693.11.6.el7.x86_64
drwxr-xr-x. 7 root root 4096  1月 18 20:00 3.10.0-693.el7.x86_64

[root@cloud ~]# uname -r
3.10.0-693.11.6.el7.x86_64 # 跟上面比較,確實是新的核心版本!有重新開機過了

# 檢查 crontab 裡面已經加入我們需要的自訂功能了!
[root@cloud ~]# cat /etc/crontab
10 4 * * * root /sbin/ntpdate ntp.ksu.edu.tw
0  3 * * * root /bin/yum -y update

# 檢查一般帳號也能收到 root 的信件了:
[root@cloud ~]# grep '^root' /etc/aliases
root:           root,vbird

[root@cloud ~]# ll /etc/aliases*
-rw-r--r--. 1 root root  1523  1月 24 14:13 /etc/aliases
-rw-r--r--. 1 root root 12288  1月 24 14:13 /etc/aliases.db
# 資料庫檔案一定要比純文字檔更新。如果不確定,可以使用 newaliases 重建一次資料庫!

如果上述的許多資料還沒有完成的,請盡快完成喔!我們即將進入安裝虛擬機器的章節與許多測試囉!


2018/01/26:嘗試處理新的小型系統,並將之前許多的文件彙整一下,變成一個關於管理員態度的短篇小節
2018/01/26以來統計人數
計數器
   http://linux.vbird.org is designed by VBird during 2001-2017.