CowboYim

一個無文筆無技術無經驗的博客

VPS 安全設定

話說這 blog 未搬到 VPS 上是使用 Github Page, 除了 ping 數較大及有時會抽風外,以免費服務來說都不過不失。

在 https 及 ssl 普及的年代,Github Page 並不支援 ssl, 準確來說是不支援自訂域名的 ssl, 而 *.github.io 就已有 ssl 支援。

而適逢 Let’s encrypt 的 beta 通過產生了搬家的念頭,而當時已暫時搬到免費網存上,但發覺簽發 Let’s encrypt 的證書失敗,所以放了數日。

不過,碰上雙11時期,剛好有新的商家提供1個月免費 VPS, 於是申請了並用上了 Caddy Server,過了一星期後就推出支援 Let’s encrypt 證書簽發。

在感恩節期間經常到 Lowendtalk 尋找便宜的主機商,準備1個月後再搬到新的 VPS 上。

搜羅了2間的供應商,IgniteServers, Deepnet Solutions(Gestion DBI), 可以說交了學費。

前者:慶幸沒有剁手,已經跑路了;後者:學費已交,~12美元,超售嚴重,ping 數更慘不忍睹,連接到美國要 3xx ms,已取消服務並不支援退款。

幾經辛苦找到現在的供應商,DrServer, 曾榮登 Lowendtalk 十大供應商之一,18美元入手了個 Xen VPS, 沒大研究,好至壞排行應該是 Xen > KVM > OpenVZ, ping 數合理,價錢亦合理。除需要人手開通服務,需時較久(約12小時)外,非常滿意其服務及質素。


回正題,使用了1個多月 VPS 都未有正視過安全問題,看到別人說主機被駭,才發覺自己無為 VPS 進行安全設定。

註:全文以 CentOS 6 為教學例子,而用家電腦則以 Linux 為主系統,如有任何錯誤,還望見諒。

新增使用者

在剛裝上 Linux 的 VPS 上,只有 root 帳戶,並沒有一般使用者帳戶,以 sudo 取得 root 權限使用比 root 登入更為安全。

新增使用者:

adduser username

為使用者增設登入密碼:

passwd username

為使用者增設 root 權限:

visudo

尋找:

root		ALL=(ALL)	ALL

並增加:

username	ALL=(ALL)	ALL

完成設置後,以 SSH 登入這帳戶。

測試 root 權限:

sudo su

輸入登入密碼後,應獲得 root 權限。

禁止 root 帳戶使用 SSH 登入

進一步加強 VPS 安全,禁止 root 帳戶以 SSH 登入

於 root 帳戶或取得 root 權限帳戶輸入:

nano /etc/ssh/sshd_config

尋找:

PermitRootLogin yes

修改為

PermitRootLogin no

重新啟動 SSH 伺服器:

/etc/init.d/sshd restart

現階段使用 root 帳戶登入 SSH, 在輸入密碼後,會顯示拒絕訊息。

啟用 public key 驗證登入 SSH

登入 VPS 時會使用 public key 加密並傳至 VPS 上,校對一致後才允許連接,比單靠密碼為安全。

於日常使用電腦上輸入:

ssh-keygen

Default 以 SHA256 產生 public key,加上 -t rsa 則以 RSA 產生 public key.

留空皆可:

Enter file in which to save the key (/home/demo/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

輸入:

cat ~/.ssh/id_rsa.pub | ssh username@ip 'mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys'

這 command 進行了4個步驟,複制 id_rsa.pub 的內容,以 SSH 連接 VPS,建立 File .ssh, 建立檔案 authorized_keys 並貼上複制內容。

分別輸入:

chown -R username:username .ssh

chmod 700 .ssh

chmod 600 .ssh/authorized_keys

聲明 .ssh File 由 username 帳戶所擁有,而擁有者可以在 .ssh 進行 rwx (read, write, execute), 而 authorized_keys 只能 read & write.

完成設置後,以 SSH 登入這帳戶,理應不用輸入密碼。

停用 SSH 密碼登入

需然禁止 root 帳戶登入,但仍要輸入密碼,有機會令密碼流出,所以禁止使用密碼登入,再進一步保障密碼。

於 root 帳戶或取得 root 權限帳戶輸入:

nano /etc/ssh/sshd_config

尋找:

PasswordAuthentication yes

ChallengeResponseAuthentication yes

UsePAM yes

修改為:

PasswordAuthentication no

ChallengeResponseAuthentication no

UsePAM no

重新啟動 SSH 伺服器:

/etc/init.d/sshd restart

現階段使用 root 帳戶登入 SSH,會直接顯示拒絕訊息。

更改 SSH port

由於黑客可以不斷攻擊 SSH default port 22, 利用字符生產器不斷嘗試輸入密碼,雖然 root 帳戶已被禁止,但不斷對 VPS 進行連接只會浪費資源。

於 root 帳戶或取得 root 權限帳戶輸入:

nano /etc/ssh/sshd_config

尋找:

Port 22

修改為:

Port xxxx

xxxx 改為任何 1024 - 65535 之間的數字。

重新啟動 SSH 伺服器:

/etc/init.d/sshd restart

日後均使用:

ssh -p xxxx username@ip

連接至 VPS.

Iptables 防火牆

以下為簡單設定,允許 port 80, 443, xxxx 操作。

於 root 帳戶或取得 root 權限帳戶輸入:

/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT 

/sbin/iptables -I INPUT -p tcp --dport 443 -j ACCEPT 

/sbin/iptables -I INPUT -p tcp --dport xxxx -j ACCEPT 

此3項允許 HTTP(80), HTTPS(443), SSH(xxxx) 連接至 VPS.

儲存設定:

/etc/rc.d/init.d/iptables save

檢查設定:

/etc/init.d/iptables status

重啟防火牆:

/etc/init.d/iptables restart

完成。


Reference: