CentOS 7.4 基礎設定 (6) - 禁止 Root 帳號本機及 SSH 遠端登入


前言

最近工作關係開始玩 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


此外,考量 SSH 連線機制安全性請調整 Ciphers 及 MACs 的組態設定值:
# vi /etc/ssh/sshd_config
# Ciphers and keying //說明文字
Ciphers aes128-ctr,aes192-ctr,aes256-ctr //加入此行
MACs hmac-sha1,hmac-ripemd160            //加入此行


完成上述 SSH 連線機制組態設定後,請重新啟動 SSH 服務以便套用生效:
# 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 管理帳號登入密碼



變更密碼規則與強度

我們可以依據企業及組織的安全性策略,調整 CentOS 主機的 SSH 密碼規則及強度,舉例來說,經過下列調整後密碼規則為至少 3 位數、大寫英文字母至少 1 位數、小寫英文字母至少 1 位數、密碼長度最少 8 個字元、變更密碼時最多只能重試 5 次。詳細資訊請參考 4.3. Securing Services - Red Hat Customer Portal
# vi /etc/pam.d/system-auth
#password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=   //預設值
password requisite pam_cracklib.so local_user_only dcredit=-3 ucredit=-1 lcredit=-1 difor=3 minlen=8 retry=5 authtok_type=   //修改後




透過 sosreport 收集系統資訊

透過 sosreport 功能,可以快速且完整的蒐集 CentOS 主機的系統日誌、完整的組態設定、詳細的系統資訊……等。只要執行「yum -y install sos」指令進行安裝,後續即可使用 sosreport 指令完整蒐集指定資訊。
# yum -y install sos    //安裝 sos 軟體套件
# sosreport -l          //列出支援的模組功能
# sosreport -a          //蒐集系統資訊 (互動模式)
# sosreport -a --batch  //蒐集系統資訊但不要互動
# sosreport -o cron,processor --batch  //僅蒐集 Cron 及 Processor 資訊




透過公鑰/私鑰驗證登入

簡單來說,我們可以透過加密金鑰的方式來進行登入而非密碼驗證 (搭配停用密碼驗證功能),如此一來可以有效防止密碼猜測攻擊,同時也可以讓後續自動化管理流程更為順暢。

首先,在要被連線的 CentOS 主機上執行「ssh-keygen -t rsa」指令,產生加密公鑰 (id_rsa.pub)加密私鑰 (id_rsa),執行後會在目前使用者的家目錄下產生相關檔案。
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/weithenn/.ssh/id_rsa):
Created directory '/home/user/weithenn/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/weithenn/.ssh/id_rsa.
Your public key has been saved in /home/user/weithenn/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:joSZklgzU9FhY6ne/fGPjXTqdD/WIRhUtUX9DrKUfhA weithenn@centos74.weithenn.org
The key's randomart image is:
+---[RSA 2048]----+
| oo=o ...o+|
| . oo. .E +|
| = . . o ..|
| o =.+ .= . .|
|. o.+...S oo+ o |
| ....o. ..o....|
| . .. oo.+ o|
| .o.B +.|
| .=.+ o|
+----[SHA256]-----+

圖、產生加密金鑰對

順利產生加密金鑰對之後,請將加密公鑰 (id_rsa.pub) 檔案內容複製並改名為 authorized_keys,然後確認所在目錄及檔案權限是否正確。
# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
# rm -f id_rsa.pub
# chmod 700 ~/.ssh
# chmod 600 ~/.ssh/id_rsa
# chmod 600 ~/.ssh/authorized_keys


接著,將剛才 CentOS 產生的加密私鑰 (id_rsa) 備份出來後刪除。因為,習慣在 Windows 主機透過 putty 連線至 CentOS 主機,所以請下載 Putty RSA/DSA Key Generation Utility 工具,開啟 Putty Key Generator 工具後按下 Load 鈕,選擇剛才備份出來的 CentOS 主機加密私鑰,然後按下 Save private key 鈕將驗證資訊儲存成 .ppk 檔案 (Putty 專用)。
請注意,在被連線的 CentOS 主機中只有加密公鑰 (authorized_keys) 檔案存在,請確保加密私鑰 (id_rsa) 已經備份出來後刪除掉。
圖、儲存 CentOS 主機連線驗證資訊

圖、透過 .ppk 連線至遠端 CentOS 主機

圖、順利透過加密金鑰連線至遠端 CentOS 主機

至此,已經完成透過加密金鑰的方式連線至遠端 CentOS 主機,我們可以停用 CentOS 主機採用密碼驗證方式登入,請修改 SSH 組態設定檔將 PasswordAuthentication yes -> no 後重新啟動 SSH 服務。那麼,後續連線至 CentOS 主機的帳戶若不支援採用加密金鑰方式便無法登入:

圖、無法使用密碼驗證方式登入



CentOS 7.4 基礎設定系列文章: