前言
最近工作關係開始玩 CentOS 了,本次實作環境中採用的是 CentOS 7.4 (1709) Kernel 3.10.0-693.el7.x86_64)映像檔,也就是新版 CentOS 7.4 最小化安裝版本 (Minimal Install),那麼開始來玩玩吧。💪實作環境
禁止 root 管理帳號 SSH 遠端登入
在預設的情況下,您可以直接使用 root 管理帳號來遠端登入 Linux 作業系統進行管理,然而在管理作業系統上通常安全性與便利性是相對的二個拉扯點。所以,當您所管理的作業系統其操作便利性愈高則安全性通常會相對的降低,在此建議您關閉 Linux 預設允許 root 管理者帳號可以遠端登入管理系統,原因如下:- 主機將會增加了被入侵的機會。因為,在管理者帳號已知的情況下,剩下就是嘗試登入密碼了,如此一來很容易遭受暴力猜測密碼攻擊。
- 當一台主機有眾多管理者時大家皆使用 root 管理者帳號登入系統進行管理動作,則誰修改了某個檔案內容或執行了哪些動作均無法稽核,因為記錄的資料都是 root。
- 直接使用 root 管理者帳號登入系統進行管理,若是在操作過程中不慎下錯指令時有極大的可能會把系統給毀掉。例如原本是想刪除根目錄下的 test 資料夾 rm –rf /test 若不慎在操作時不小心多個空格 rm –rf / test,則對於作業系統來說是要刪除根目錄 (/) 及目前所在的 test 資料夾。
要將 CentOS 主機預設允許 root 管理者帳號遠端登入的功能關閉 (PermitRootLogin yes -> no),可以透過修改「/etc/ssh/sshd_config」設定檔後再重新載入 SSH 服務即可套用變更,套用完成後您可以測試是否無法使用 root 管理帳號遠端登入主機以便確定修改是否生效。
此外,有時可能會遇到一種情況,便是遠端登入主機時輸入帳號後怎麼要等很久才能輸入密碼? 會有這樣的狀況發生是因為 CentOS 在啟動 SSH 服務時,預設會配合使用名稱解析所導致,所以您主機運作的網路環境中名稱解析服務已經運作正常則不會有此問題發生。倘若,發生這樣的問題時,請檢查 DNS 名稱解析中反向解析對於此主機的解析情況,若此台主機所在的網路環境中並沒有反向名稱解析的機制,您可取消 SSH 服務中預設會使用到名稱解析的動作即可解決此一問題 (UseDNS yes -> no)。
- 在 CentOS 7.3版本中,預設值仍為 UseDNS yes。
- 在最新 CentOS 7.4版本中,預設值已經改為 UseDNS no。
最後,預設情況下 SSH 的 Listen Port 為 22,為了安全性考量也可以把預設 SSH Listen Port 改掉,例如,改為 Listen Port 22168。
# vi /etc/ssh/sshd_config
#PermitRootLogin yes //預設值,禁止 Root 帳號遠端登入
PermitRootLogin no //修改後
#UseDNS yes //預設值,啟用 DNS 名稱解析
UseDNS no //修改後
#Port 22 //預設值,SSH Listen Port
Port 22168 //修改後
# grep -E '(PermitRootLogin|UseDNS|Port)' /etc/ssh/sshd_config //確認修改結果
Port 22168
PermitRootLogin no
UseDNS no
# systemctl restart sshd //重新啟動 SSH 服務
# systemctl status sshd //查看 SSH 服務運作狀態
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2017-10-24 14:06:05 CST; 4s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 3863 (sshd)
CGroup: /system.slice/sshd.service
└─3863 /usr/sbin/sshd -D
Oct 24 14:06:05 centos74.weithenn.org systemd[1]: Starting OpenSSH server daemon...
Oct 24 14:06:05 centos74.weithenn.org sshd[3863]: Server listening on 0.0.0.0 port 22168.
Oct 24 14:06:05 centos74.weithenn.org systemd[1]: Started OpenSSH server daemon.
重新載入 SSH 服務後,可以使用「netstat -tunpl」指令確認 sshd 服務是否把 Listen Port 改為 22168。
# netstat -tunpl
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:22168 0.0.0.0:* LISTEN 3863/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1089/master
udp 0 0 127.0.0.1:323 0.0.0.0:* LISTEN 532/master
圖、確認 SSH 服務 Listen Port 是否變更
後續,倘若有人嘗試以 Root 管理者帳號並透過 SSH 遠端連線的方式時,將會發現即使 Root 帳號密碼鍵入正確,也會得到 Access Denied的錯誤訊息且無法登入。同時,在系統中的「/var/log/audit/audit.log」也會記錄這個異常行為。
# tail -n2 /var/log/audit/audit.log
type=USER_AUTH msg=audit(1508826440.459:442): pid=4044 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=PAM:authentication grantors=? acct="root" exe="/usr/sbin/sshd" hostname=10.10.75.16 addr=10.10.75.16 terminal=ssh res=failed'
type=USER_AUTH msg=audit(1508826442.609:443): pid=4044 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=password acct="root" exe="/usr/sbin/sshd" hostname=? addr=10.10.75.16 terminal=ssh res=failed'
此外,要記得修改 Firewalld 防火牆規則,把允許 SSH Port 22 通行的規則改為 Port 22168。有關 Firewalld 防火牆規則操作的詳細資訊,請參考 CentOS 7.4 基礎設定 (10) - 調整 Firewalld 防火牆規則 文章。
# cat /etc/firewalld/zones/public.xml //查詢目前防火牆規則
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<port protocol="tcp" port="22168"/>
</zone>
# firewall-cmd --reload //重新載入防火牆規則
success
# firewall-cmd --list-all //顯示載入的防火牆規則
public
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services:
ports: 22168/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
圖、調整 Firewalld 防火牆規則
禁止 root 管理帳號本機登入
經過上述組態設定後,我們已經禁止讓 Root 管理帳號使用 SSH 遠端登入 CentOS 主機。然而,個人的管理習慣是希望大家都透過 sudo 轉換成管理權限,而非有人使用 root 管理帳號直接進行維運,所以也將 Root管理帳號「停用本機登入」的機制 (詳細資訊請參考 RHEL 7 Documentation - Security Guide - Controlling Root Access)。倘若,希望了解 Root 管理帳號的登入情況,請執行「utmpdump /var/log/wtmp | grep root」指令即可 (tty表示由 Console 本機登入,pts表示由 SSH 遠端登入)。
# utmpdump /var/log/wtmp | grep root
Utmp dump of /var/log/wtmp
[7] [00570] [tty1] [root ] [tty1 ] [ ] [0.0.0.0 ] [Tue Oct 24 00:14:55 2017 CST]
[7] [00560] [tty1] [root ] [tty1 ] [ ] [0.0.0.0 ] [Tue Oct 24 00:33:20 2017 CST]
[7] [00557] [tty1] [root ] [tty1 ] [ ] [0.0.0.0 ] [Tue Oct 24 00:56:48 2017 CST]
[7] [18127] [ts/0] [root ] [pts/0 ] [10.10.75.16 ] [10.10.75.16 ] [Tue Oct 24 10:51:56 2017 CST]
[7] [10262] [ts/0] [root ] [pts/0 ] [10.10.75.16 ] [10.10.75.16 ] [Tue Oct 24 11:00:11 2017 CST]
[7] [01169] [ts/0] [root ] [pts/0 ] [10.10.75.16 ] [10.10.75.16 ] [Tue Oct 24 11:29:26 2017 CST]
[7] [03991] [tty1] [root ] [tty1 ] [ ] [0.0.0.0 ] [Tue Oct 24 14:30:43 2017 CST]
圖、查詢 Root 管理帳號登入記錄
如下列操作,執行「vipw」指令將 root 管理帳號從原本的「/bin/bash」修改為「/sbin/nologin」後存檔離開即可。待修改完畢後,便會發現 Root 管理帳號也無法本機登入。
# vipw
root:x:0:0:root:/root:/bin/bash //預設值
root:x:0:0:root:/root:/sbin/nologin //修改後
僅鎖定 root 管理帳號登入密碼
倘若,不希望停用 Root 管理帳號本機登入機制,也可以採用將 Root 管理密碼「鎖定」(Locking)的方式。請執行「passwd -l root」指令便可以鎖定 Root 管理帳號的登入密碼 (使用參數 -u 即可解除鎖定)。# passwd -S root //查詢狀態,登入密碼尚未鎖定
root PS 1969-12-31 0 99999 7 -1 (Password set, SHA512 crypt.)
# passwd -l root //鎖定 Root 帳號登入密碼
Locking password for user root.
passwd: Success
# passwd -S root //查詢狀態,登入密碼已鎖定
root LK 1969-12-31 0 99999 7 -1 (Password locked.)
圖、鎖定 Root 管理帳號登入密碼