目前使用的是 Linode 提供的虛擬主機 (Ubuntu 14.04),新增好的 Ubuntu 預設會產生 root 帳號給使用者透過 ssh 登入,但這樣的風險很大,仔細看一下 /var/log/auth.log 身份驗證的 log 檔案,你會發現一直有人在透過 ssh 嘗試使用 root 帳號登入.
root@localhost:~# cat /var/log/auth.log ... Sep 30 08:22:50 localhost sshd[1150]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=58.218.198.142 user=root Sep 30 08:22:52 localhost sshd[1150]: Failed password for root from 58.218.198.142 port 33509 ssh2 Sep 30 08:22:58 localhost sshd[1150]: message repeated 2 times: [ Failed password for root from 58.218.198.142 port 33509 ssh2] Sep 30 08:22:58 localhost sshd[1150]: Received disconnect from 58.218.198.142: 11: [preauth] Sep 30 08:22:58 localhost sshd[1150]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=58.218.198.142 user=root
統計一下,嚇死人了.
root@localhost:~# grep "authentication failure" /var/log/auth.log | awk 'END{print "Authentication failure:"NR}' Authentication failure:7112
測試環境為
- SSH Client: Mac OS
- SSH Server: Ubuntu 14.04
SSH Server (Ubuntu) – 限制 root 從 SSH 連線
Linode 是建議,新建帳號,然後限制 root 透過 ssh 連線.
透過指令來新增使用者並加入到 sudo group,這樣這個使用者才會有 sudo(特權指令) 的權限.
root@localhost:~# adduser ben root@localhost:~# adduser ben sudo root@localhost:~# exit logout Connection to benjr.tw closed.
使用新建的帳號登入到系統,並確定可以使用 sudo 指令,接下來就是移除 root 使用 ssh 登入的權限了.
appledeAir:~ ben$ ssh ben@benjr.tw ben@benjr.tw's password: ben@localhost:~$ sudo su - [sudo] password for ben:
修改設定檔 /etc/ssh/sshd_config 將 PermitRootLogin 設定為 no
root@localhost:~# vi /etc/ssh/sshd_config # Authentication: PermitRootLogin no
root@localhost:~# service ssh restart root@localhost:~# exit ben@localhost:~$ exit logout Connection to benjr.tw closed.
之後使用者就不能以 root 的身份透過 ssh 來登入到系統了.
appledeAir:~ ben$ ssh root@benjr.tw root@benjr.tw's password: Permission denied, please try again.
SSH 金鑰的安全驗證
剛剛登入 SSH 使用單純的的密碼安全驗證機制,我們可以採用比較嚴格的金鑰安全驗證機制(使用者不需輸入密碼即可登入).
SSH 採用 RSA , DSA 認證步驟如下:
- SSH Server (Ubuntu) 會把他的公開金鑰提供給 SSH Client (MAC) 來作加密使用.
- SSH 伺服器會檢查 SSH Client 指定的使用者是否有儲存公開金鑰在 $HOME/.ssh/authorized_key 檔案中.
- 沒有 – 基於密碼的安全驗證,SSH Server 會提示使用者輸入使用者密碼.
- 有 – 基於金鑰的安全驗證.
- SSH Server 會請求 SSH Client 作身份驗證.
- SSH Client 會檢查自己的 $HOME/.ssh 目錄下,看看你是否擁有私鑰 (名稱 id_dsa)
- 如果私鑰存在,SSH 會提示你輸入此私鑰的通行證 passphrase ,接下來會使用這私鑰來建立簽章並傳給 SSH Server.
- 如果 SSH Server 用 SSH Client 公鑰驗證,驗證成功就不需要使用者輸入密碼了.
關於詳細 SSH 身份驗證請參考 https://benjr.tw/301
SSH Client (MAC OS) – 產生(公/私)金鑰
SSH Client 產生(公/私)金鑰,建議把這些公/私金鑰都額外備份起來,沒了 公/私金鑰 也就無法再登入到你的 SSH Server 系統了.
passphrase 主要是保護私鑰 (你需要一串密碼來解開私鑰),你也可以不設.
appledeAir:~ ben$ ssh-keygen -t rsa -C ben Generating public/private rsa key pair. Enter file in which to save the key (/Users/ben/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /Users/ben/.ssh/id_rsa. Your public key has been saved in /Users/ben/.ssh/id_rsa.pub. The key fingerprint is: SHA256:ceoeLZurMAAmZKsdfsdlwessdfCsk ben@appledeAir The key's randomart image is: +---[RSA 2048]----+ |.+ . | |+. dsf | |+.+ . . . | |++ sdf= . + | |+E*dsfdsf * o S | |+. X * B + | |. o * vgfbO O . | | . *ewr = * | | wer o ..=. | +----[SHA256]-----+
-C 使用者必須同 Ubuntu SSH 要登入的使用者名稱.
SSH Client 產生的私鑰留下來,公鑰要交給 SSH Server 保存.
appledeAir:~ ben$ scp .ssh/id_rsa.pub ben@benjr.tw:/home/ben/ ben@benjr.tw's password: id_rsa.pub 100% 396 2.6KB/s 00:00
appledeAir:~ ben$ ssh ben@benjr.tw ben@benjr.tw's password: ben@localhost:~$ mkdir .ssh ben@localhost:~$ cat id_rsa.pub >> .ssh/authorized_keys ben@localhost:~$ exit logout Connection to benjr.tw closed.
可以看到不需要輸入密碼,passphrase 主要是用來保護私鑰的密碼.
appledeAir:~ ben$ ssh ben@benjr.tw Enter passphrase for key '/Users/ben/.ssh/id_rsa':
SSH Server (Ubuntu) – 關閉基於密碼的安全驗證
接下來我們可以把基於密碼的安全驗證 (使用帳號和密碼登入) 的功能關閉 PasswordAuthentication no,只有 SSH Server 有儲存 SSH Client 公鑰的才可以自動登入到系統(無法輸入帳號密碼) .
root@localhost:~# vi /etc/ssh/sshd_config # Change to no to disable tunnelled clear text passwords PasswordAuthentication no
root@localhost:~# service ssh restart
不過問題是 wordpress 要用什麼帳號是更新系統或是 Plug-in?? 可以使用 Apache2 + SSH2 – https://benjr.tw/10928 的認證方式.