952 瀏覽數

Linode – Ubuntu SSH

目前使用的是 Linode 提供的虛擬主機,新增好的 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 16.04 Desktop

限制 root 從 SSH 連線

Linode 是建議,新建帳號,然後限制 root 透過 ssh 連線.

透過指令來新增使用者並加入到 sudo group,這樣這個使用者才會有 sudo(特權指令) 的權限.

root@localhost:~# adduser new_user
root@localhost:~# adduser new_user sudo
root@localhost:~# exit
logout
Connection to benjr.tw closed.

使用新建的帳號登入到系統,並確定可以使用 sudo 指令,接下來就是移除 root 使用 ssh 登入的權限了.

appledeAir:~ ben$ ssh new_user@benjr.tw
new_user@benjr.tw's password: 

new_user@localhost:~$ sudo su -
[sudo] password for new_user: 

修改設定檔 /etc/ssh/sshd_config 將 PermitRootLogin 設定為 no

root@localhost:~# vi /etc/ssh/sshd_config
# Authentication:
PermitRootLogin no
root@localhost:~# service ssh restart
root@localhost:~# exit
new_user@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 認證步驟如下:

  1. SSH Server (Ubuntu) 會把他的公開金鑰提供給 SSH Client (MAC) 來作加密使用.
  2. SSH 伺服器會檢查 SSH Client 指定的使用者是否有儲存公開金鑰在 $HOME/.ssh/authorized_key 檔案中.
    • 沒有 – 基於密碼的安全驗證,SSH Server 會提示使用者輸入使用者密碼.
    • – 基於金鑰的安全驗證.
      1. SSH Server 會請求 SSH Client 作身份驗證.
      2. SSH Client 會檢查自己的 $HOME/.ssh 目錄下,看看你是否擁有私鑰 (名稱 id_dsa)
      3. 如果私鑰存在,SSH 會提示你輸入此私鑰的通行證 passphrase ,接下來會使用這私鑰來建立簽章並傳給 SSH Server.
      4. 如果 SSH Server 用 SSH Client 公鑰驗證,驗證成功就不需要使用者輸入密碼了.

關於 SSH 身份驗證請參考 http://benjr.tw/301

SSH Client 產生(公/私)金鑰,建議把這些公/私金鑰都額外備份起來,沒了 公/私金鑰 也就無法再登入到你的 SSH Server 系統了.

appledeAir:~ ben$ ssh-keygen -t rsa
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]-----+

SSH Client 產生的私鑰留下來,公鑰要交給 SSH Server 保存.

appledeAir:~ ben$ scp .ssh/id_rsa.pub new_user@benjr.tw:/home/new_user/
new_user@benjr.tw's password: 
id_rsa.pub                                                 100%  396     2.6KB/s   00:00    
appledeAir:~ ben$ ssh new_user@benjr.tw
new_user@benjr.tw's password: 
new_user@localhost:~$ mkdir .ssh
new_user@localhost:~$ cat id_rsa.pub >> .ssh/authorized_keys
new_user@localhost:~$ exit
logout
Connection to benjr.tw closed.

可以看到不需要輸入密碼,passphrase 主要是用來保護私鑰的密碼.

appledeAir:~ ben$ ssh new_user@benjr.tw
Enter passphrase for key '/Users/ben/.ssh/id_rsa': 

接下來我們可以把基於密碼的安全驗證 (使用帳號和密碼登入) 的功能關閉 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 – http://benjr.tw/10928 的認證方式.

發表迴響