做企業(yè)門戶網(wǎng)站都南寧網(wǎng)站快速排名提升
嘮嘮閑話
一開始接觸服務(wù)器,我只是把它當博客的托管網(wǎng)站,源文件用 GitHub 備份,所以網(wǎng)站被黑了也沒啥關(guān)系。但隨著使用深入,網(wǎng)站逐漸加入我的日常工作流中,而且有了使用更多服務(wù)的需求。在這種情況下,服務(wù)器安全是一個非常需要重視的問題了。
當然,還有一個動機。實驗室服務(wù)器由我和幾位同學負責日常管理,前段時間還出現(xiàn)過被挖礦的行為。與云服務(wù)器不同的是,實驗室服務(wù)器缺少企業(yè)提供的保護,容易成為被攻擊對象。所以,在安全意識層面,有必要進行一次“升級”。
本篇主要參考 Bensz 的 Linux 基礎(chǔ) 個人 VPS 安全,非常適合新手入門。
網(wǎng)絡(luò)安全是一個相對的概念,你要做到的不是絕對安全,而是比大多數(shù)人安全。 這樣攻擊者就不會去啃你這個硬骨頭,而去找一些軟柿子(那些沒有安全防護的VPS)捏了。
安全措施
接下來是具體實踐的部分,出于安全考慮,在修改核心配置時,建議 先備份原始文件。修改配置和重啟服務(wù)后,先在新的終端嘗試連接服務(wù)器,確認無誤后,再退出當前的連接。如果錯誤修改了配置,當前連接狀態(tài)通常不會掉,發(fā)現(xiàn)新終端連不上還能及時改回來。
mkdir backup
sudo cp /etc/ssh/sshd_config ./backup
此外,這些策略更多是防止網(wǎng)絡(luò)攻擊,而不影響機房對服務(wù)器的連接。比如禁用 Root 密碼登錄后,仍可以正常使用云服務(wù)器的“遠程登錄”。同理,機房登錄服務(wù)器也不受這些策略影響。
禁用 root 密碼登錄
一般情況下,主機是允許 root 用戶遠程登陸的。而 root 用戶的名字一般就是 root。所以,如果攻擊者知道你 VPS 的 ip 地址(ping 你的域名獲得)、用戶名(默認有一個 root 可用)和 ssh 端口號(默認 22 ),那么保護你電腦的就只有你的用戶密碼了。
root 用戶擁有服務(wù)器的最高權(quán)限,一旦被攻陷,服務(wù)器就完全任人宰割了。所以第一步,在首次配置好 ssh 密鑰后,我們將 root 的登錄功能禁掉。
如下,用編輯 ssh
配置文件
sudo vim /etc/ssh/sshd_config
輸入 /Permi
回車檢索,找到 PermitRootLogin
,將其注釋掉
#LoginGraceTime 2m
PermitRootLogin yes
# PermitRootLogin prohibit-password
然后重啟 sshd 服務(wù)
sudo systemctl restart sshd
順帶一提,重啟 ssh 服務(wù)有八條命令可用,暫時不清楚區(qū)別
sudo systemctl restart/reload sshd/ssh
sudo service ssh/sshd restart/reload
禁用普通用戶密碼登錄
除了禁用 root 用戶,也可以設(shè)置所有用戶不能密碼登錄,這一來攻擊者就不可能用暴力窮舉的方式登錄任何賬號了。
同前邊操作,先
vim /etc/ssh/sshd_config
檢索并修改參數(shù)為 PasswordAuthentication no
,然后重啟 ssh 服務(wù)。
當然,禁用所有用戶密碼登錄的措施可能太嚴厲了,也可以檢索 Match User
,對某一用戶單獨修改。
這段代碼通常在文件最后:
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
修改如下,并重啟服務(wù)。
# Example of overriding settings on a per-user basis
Match User usernamePasswordAuthentication no
創(chuàng)建用戶名時,應避免使用常見名詞,比如 test
之類。攻擊者通常會對 IP 進行批量無差別攻擊,由于對個體信息缺少了解,它們只能用常見詞表來嘗試用戶名。比如上次實驗室被挖礦就是前管理員創(chuàng)了個名為 tmp
的用戶,且設(shè)置了弱口令密碼。
更改默認 ssh 端口
默認的 ssh 端口號是 22。SSH 的端口一般建議把它改成一個大于 1024 小于 65535 的整數(shù)。舉個例子,比如改為 1234。
同前邊操作,用 vim 檢索 /etc/ssh/sshd_config
的 Port
參數(shù),更改如下
Port 1234
#AddressFamily any
#ListenAddress 0.0.0.0
修改后重啟 ssh 服務(wù)生效。
注意,如果開啟了防火墻,需開放新端口后再修改 ssh 端口,具體見下文。
密碼復雜度策略
除了禁用登錄,也可以采用相對溫和的策略來防止窮舉:通過修改 PAM(Pluggable Authentication Modules)來設(shè)置用戶密碼的強度、長度和重試間隔。
設(shè)置密碼強度
這部分參考了 How to enable and enforce secure password policies on Ubuntu。
安全起見,先備份原始文件
mkdir -p backup
sudo cp /etc/pam.d/common-password ./backup/
安裝相關(guān)依賴
sudo apt install libpam-pwquality -y
這是原始文件 /etc/pam.d/common-password
的部分內(nèi)容
# here's the fallback if no module succeeds
password requisite pam_deny.so
將 requisite
所在行修改為
password requisite pam_pwquality.so retry=3 minlen=8 difok=3
requisite
常用參數(shù)的解釋:
retry=N
:限制用戶在輸入錯誤密碼后可以再次嘗試的次數(shù)。minlen=N
:指定密碼的最小長度。difok=N
:指定密碼中必須包含的不同字符數(shù)。ucredit=-N
:指定密碼中必須包含的大寫字母數(shù)。lcredit=-N
:指定密碼中必須包含的小寫字母數(shù)。dcredit=-N
:指定密碼中必須包含的數(shù)字數(shù)。ocredit=-N
:指定密碼中必須包含的特殊字符數(shù)。
注意這些參數(shù)中的 -N
表示至少需要包含 N
個字符,而省略符號 -
則表示必須剛好包含 N
個字符。
對于新用戶,上述設(shè)置將立即生效。對于現(xiàn)有用戶,他們的密碼策略將在下一次更改密碼時應用
設(shè)置重試間隔
我們要用到一個 pam_fallock
的模塊。
auth required pam_faillock.so preauth silent audit deny=3 unlock_time=1200
auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600
這部分設(shè)置后沒效果,不確定是否和模塊版本有關(guān),但這個感覺挺重要,后續(xù)再排查下問題。
開啟防火墻
前邊主要是針對 ssh
登錄的保護策略,除此之外,可以用防火墻工具 ufw
(Uncomplicated Firewall) 保護其他端口。
個人服務(wù)器建議開啟防火墻,這樣能可以加一層保護,對當前開放的端口有更好的把控。實驗室服務(wù)器使用場景復雜,方便起見,考慮可以不啟用。
先查看是否安裝了防火墻
which ufw # /usr/sbin/ufw
如果沒有,直接安裝一個
sudo apt-get install ufw
防火墻常用命令
sudo ufw status # 查看當前狀態(tài) | inactive 代表關(guān)閉
sudo ufw enable # 開啟防火墻
sudo ufw disable # 關(guān)閉防火墻
sudo ufw allow 22 # 允許訪問 22 端口
sudo ufw allow from 127.0.0.1 to any port 22 # 允許 127.0.0.1 訪問 22 端口
sudo ufw status numbered # 顯示序號,作為 delete 操作的索引
sudo ufw delete <數(shù)字> # 刪除第幾個規(guī)則
# 刪除規(guī)則更建議的方式,用 delete + 規(guī)則
sudo ufw delete allow 22 # 刪除規(guī)則 allow 22
sudo ufw delete allow 22/tcp # 刪除規(guī)則 allow 22/tcp
sudo ufw default deny incoming # 禁止所有進站的流量
sudo ufw default allow outgoing # 允許所有出站的流量
如果前邊更改了 ssh
端口為 1234
,則這里執(zhí)行
sudo ufw allow 1234/tcp comment "this is for ssh"
sudo ufw delete 22
禁用 Ping
除了加強服務(wù)器自身的安全防護,還可以用禁 ping 的方式避免服務(wù)器被窮舉搜索到。
StackExchange 上給了很多種方案:How to Disable Ping Response (ICMP echo) in Linux all the time?
這里采用 Iptables 方法來弄,執(zhí)行
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
在服務(wù)器上 ping 自己,ping 域名或 IP,會發(fā)現(xiàn)已經(jīng) ping 不通了。
iptables 還有其他規(guī)則和用法,后邊有空再補充更新。
Fail2ban 防掃描和暴力破解
和前邊設(shè)置登錄重試間隔一樣,這部分我的實踐也沒有成功,可能 PAM 版本問題?后續(xù)再嘗試
Fail2ban 是防止后臺暴力掃描的流行保護軟件之一,安裝方法
sudo apt update && sudo apt install fail2ban -y
查看防護狀態(tài)
sudo fail2ban-client status
返回內(nèi)容如下
Status
|- Number of jail: 1
`- Jail list: sshd
編輯 /etc/fail2ban/jail.conf
文件,檢索 /sshd modes
來配置 ssh
的監(jiān)控策略
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
bantime = 600
我在云服務(wù)器執(zhí)行這一步設(shè)置后,似乎未生效,盡管能看到用戶嘗試多少次,但并不會終止用戶的嘗試,很奇怪。。。
小結(jié)
本篇針對服務(wù)器安全采用了幾種策略:禁用密碼登錄(root/所有用戶/特定用戶);開啟防火墻;更改 ssh 端口;增強密碼復雜度;禁 ping 以及使用 Fail2Ban 工具。
這些可以讓 VPS 更安全,但不是絕對的,后續(xù)接觸到其他重要的安全策略,再來進行補充。