若是你所營運的 ssh 是對外的,你首先會發現的事情,極可能就是駭客嘗試猜想用戶名稱/口令的記錄。駭客通常會掃描端口 22(ssh 缺省聆聽的端口)來找尋執行 ssh 的機器,而後嘗試強行攻擊它。藉着使用難猜想的口令,咱們但願任何攻擊在成功前會被記錄底及被留意到。 html
盼望你已經採用了難猜想的口令。要否則,請嘗試選擁有如下特徵的口令: linux
使用難測口令的好處並不止於 ssh,它更會影響到系統安全的各個範疇。有關口令的更多信息能夠在 CentOS 的文檔內找到: centos
http://www.centos.org/docs/4/html/rhel-sg-en-4/s1-wstation-pass.html 安全
若是你徹底無法阻止你的用戶選用易猜想的口令,請考慮以隨機產生或難猜想的符串做爲用戶名稱。若是壞人不能猜想用戶名稱,他們便不能強加猜想口令。然而,這只是隱晦信息來換取安全,因此要留心用戶名稱經過用戶發送的電郵等途徑而被泄漏。 服務器
SSH 服務器的設置都存儲在 /etc/ssh/sshd_confg 這個文件。要停用 root 登陸,請肯定你有如下一行: ssh
# 阻止 root 登陸: PermitRootLogin no
而後請從新引導 sshd 服務: tcp
service sshd restart
你果你須要 root 的權限,請登陸爲通常用戶,而後使用 su 這個指令。 加密
SSH 登陸能夠侷限給某些須要遠程訪問的用戶。若是你的系統有不少用戶,一個合理的作法就是侷限遠程訪問給那真正有須要的用戶,藉以減低其它用戶採用易測口令的影響。在 /etc/ssh/sshd_config 內加入 AllowUsers 一行,以空格隔開用戶名稱。例如: spa
AllowUsers alice bob
接着請從新引導 sshd 服務。 命令行
SSH 能夠採用兩款協議:第 1 類及第 2 類協議。較舊的第 1 類協議的安全性較低,所以它應該被停用,除非你知道你必需要使用它。請在 /etc/ssh/sshd_config 檔內找尋如下一行,解除註釋,並做出以下修改:
# Protocol 2,1 Protocol 2
而後請從新引導 sshd 服務。
根據缺省值,ssh 在端口 22 聆聽進入的鏈接。一個駭客若是要判定 ssh 是否在你的機器上運行,他最大可能就是掃描端口 22。一個有效混淆他的方法就是在非標準的端口上運行 ssh。任何未被使用的端口均可行,但首選的是 1024 以上的。不少人選用 2222 做爲替換的端口(它很易記),正如 8080 常常被用做 HTTP 的替換端口。正正因爲這個緣由令它不是個好的選擇,由於任何掃描端口 22 的駭客亦不會放過端口 2222。隨機地選用一個未被使用的高位端口會比較合宜。要進行改動,請在你的/etc/ssh/sshd_config 檔內加入如下一行:
# 在非標準的端口上執行 ssh: Port 2345 #修改我
而後從新引導 sshd 服務。請勿忘記在你的路由器及相關的防火牆規則裏做出任何須要的改動。譬如在 CentOS 7 你須要更改 firewalld:
$ firewall-cmd --add-port 2345/tcp $ firewall-cmd --add-port 2345/tcp –permanent
在 CentOS 6 及以上版本,你亦須要更新 selinux,並正確地標籤所選用的端口,不然 sshd 便不能訪問它。舉個例說:
$ semanage port -a -t ssh_port_t -p tcp 2345 #請更改這處
由於 ssh 再也不在標準的端口上聆聽鏈接,你需要告訴客戶端要鏈接到哪一個端口。在命令行上執行 ssh 客戶端時,你能夠用 -p 選項來指定端口:
$ ssh -p 2345 myserver
又或者若是你使用 konqueror 的 fish 協議,你可用:
fish://myserver:2345/remote/dir
若是你以爲每次鏈接時都要指定端口彷佛很痛苦,你只需在你我的的 ~/.ssh/config 文件里加入一個指定端口的記錄:
# 客戶端 ~/.ssh/config Host myserver HostName 72.232.194.162 User bob Port 2345
~/.ssh/config 必須有如下訪問權:
$ chmod 600 ~/.ssh/config
若是你只須由一個 IP 地址進行遠程訪問(例如由辦工室進入家中的服務器),請考慮在你的路由器或 iptables 內加入一條防火牆的規則,將端口 22 的訪問權限制到特定的 IP 地址,藉此對鏈接進行過濾。舉個例說,在 iptables 內你能夠用這類型的規則達至這個目的:
iptables -A INPUT -p tcp -s 72.232.194.162 --dport 22 -j ACCEPT
SSH 亦對 TCP 包裝函式有內置支持,所以 ssh 服務的訪問權亦可同時用 host.allow 及 hosts.deny 來進行管制。
若是你不能限制來源地的 IP 地址,而必須公開 ssh 端口,那麼 iptables 依然能夠經過記錄及攔截來自同一 IP 地址的重複登陸嘗試,幫助你阻止強行的攻擊。例如:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name ssh --rsource iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent ! --rcheck --seconds 60 --hitcount 4 --name ssh --rsource -j ACCEPT
第一條規則利用 recent 模塊來記錄每一個訪問端口 22 的新嘗試。第二條規則檢查這個 IP 地址在過去 60 移內有否嘗試 4 次或以上的鏈接,若然沒有更接納封包。注意這個規則需要輸入鏈採用 DROP 的缺省政策。
若是你在非標準的端口上執行 ssh,請不要忘記對端口做出相應修改。狀況許可的話,利用防火牆進行過濾是一個很是有效的方法來保衛 ssh 服務器。
採用加密金鑰來驗證提供兩大好處。首先,若是你應用公鑰/私鑰,是方便,由於你不用再輸入口令(除非你用口令來保護你的金鑰)。第二,當服務器能進行金鑰對的驗證,你即可以徹底停用口令驗證,意即訪問時靠賴受權的金鑰 —— 所以再也不有猜想口令的嘗試。
建立及在你的 ssh 服務器上安裝金鑰對是個相對地簡單的過程。
首先,在你會用來鏈接到服務器的客戶端上建立一對金鑰(你需要在每臺用來鏈接的機器上這樣作):
$ ssh-keygen -t rsa
這樣作會在你的(隱藏了的)~/.ssh 目錄內置立兩個文件,名叫:id_rsa 及 id_rsa.pub。第一個文件:id_rsa 是你的私鑰,而另外一個:id_rsa.pub 是你的公鑰。
若是你不想每次鏈接時都被問及密碼(它是用來解開特定的公鑰),在建立金鑰對的時候,你只須按 enter 做爲密碼。建立金鑰對時,是否以密碼加密純粹是你的決定。如何你不將金鑰加密,任何人奪得你的本地機器後,便自動擁有遠程服務器的 ssh 訪問權。此外,本地機器上的 root 可以訪問你的金鑰:但倘若你不能信任 root(或者 root 已被攻佔),你已經大禍臨頭。將金鑰加密捨棄了不用密碼的 ssh 服務器,來換取額外的安全,得來的就是輸入密碼來使用這條金鑰。你可利用 ssh_agent 這個程序進一步簡化這個程序。
如今爲你的私鑰設置權限:
$ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/id_rsa
請將公鑰(id_rsa.pub)複製到服務器上,而後安裝它在 authorized_keys 清單內:
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
注:一旦你輸入了公鑰,你能夠在服務器上刪除它。
最後,設置服務器上的文件權限:
$ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
若是 /etc/ssh/sshd_config 內的 StrictModes 被啓用(缺省值),以上的權限是必須的。
請確保你已設置正確的 SELinux 脈絡:
$ restorecon -Rv ~/.ssh
如今當你登陸服務器的時候,你便不用再輸入口令(除非你在建立金鑰對的時候輸入了一個口令)。ssh 缺省是會先利用金鑰進行驗證。如何它找不到金鑰,或驗證失敗,ssh 會回落到日常的口令驗證。
一旦你檢查過能夠用金鑰對來登陸服務器,你能夠在你的 /etc/ssh/sshd_conf 檔內加入如下設置來停用口令驗證:
# 停用口令驗證,強制使用金鑰 PasswordAuthentication no