如何防止SSH暴力破解
當你檢視你的 SSH 服務日誌,可能你會發現充斥著一些不懷好意的嘗試性登入。這裡有 9 條常規建議(和一些個別特殊策略)可以讓你的 SSH 會話更加安全。
其中有很多辦法來阻擋這些密碼嘗試:
vi /etc/ssh/sshd_config
#Port 22
預設埠為22,為了避免被掃描,去掉#,改成一個其他的埠,比如45632
儲存後重啟sshd服務.service sshd restart
密碼的複雜性可以增加破解的難度,大小寫混合加上數字並且有足夠的密碼長度就比較安全了,密碼的長度要大於8位最好大於20位。密碼的複雜度是密碼要儘可能有數字、大小寫字母和特殊符號混合組成,唯一的問題就是要牢記密碼.
新增普通賬號,授予root的許可權
修改sshd 設定,編輯/etc/ssh/sshd_config:
'PermitRootLogin no'
認證登入是內部的機子可以無密碼直接登入,非常方便省事
他的原理是採用RSA加密演算法 如果對RSA不是很瞭解可以點選下面傳送帶:
http://www.cnblogs.com/demonxian3/p/6261816.html
預設的登入方式是password,如果需要用RSA公鑰登入,需要先建立RSA Key
#ssh-keygen -t rsa -b 1024
會生成私鑰/home/username/.ssh/id_rsa
同時生成公鑰/home/username/.ssh/id_rsa.pub
輸入一個加密短語(也可省略)
修改sshd 設定,編輯/etc/ssh/sshd_config:
'PasswordAuthentication no'RSAAuthentication yesPubkeyAuthentication yesAuthorizedKeysFile/ .ssh/id_rsa.pub
將公鑰下載到本地計算機,然後在ssh客戶端軟體Secure CRT中設定好,就可以登入了
此指令碼允許每分鐘3個連線.有白名單,並有日誌紀錄
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSHiptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_WHITELISTiptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 -- hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_forceiptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 -- hitcount 4 --rttl --name SSH -j DROP
iptables的版本需要>1.2.11 (1.2不支援 —rttl引數)
有幾個軟體(指令碼)可以做到.
sshfilter http://www.csc.liv.ac.uk/~greg/sshdfilter/
Fail2Ban http://fail2ban.sourceforge.net/
DenyHosts http://denyhosts.sourceforge.net/
需要sshd支援tcp_wrappers此功能.
ldd /usr/sbin/sshd | grep libwrap
libwrap.so.0 => /usr/lib64/libwrap.so.0 (0x0000002a9566c000)
如果有libwrap.so.0這個庫說明支援此功能
另一種測試方法:在/etc/hosts.deny加入一行127.0.0.1
然後ssh localhost,如果無法連線,說明支援.
$ tar zxvf DenyHosts-2.6.tar.gz$ cd DenyHosts-2.6
as root:
# python setup.py install#cd /usr/share/denyhost# cp denyhosts.cfg-dist denyhosts.cfg
配置檔案
# cp daemon-control-dist daemon-control
啟動指令碼
# chown root daemon-control# chmod 700 daemon-control# cd /etc/init.d# ln -s /usr/share/denyhosts/daemon-control denyhosts# chkconfig --add denyhosts
新增到開機啟動服務中
1 下載指令碼http://www.la-samhna.de/misc/sshblock.sh
2 設定可執行許可權 chmod 755 /usr/local/bin/sshblock.sh
3 在/etc/hosts.allow中新增以下內容
#__START_SSHBLOCK__#__END_SSHBLOCK__
sshd : ALL : spawn (/usr/local/bin/sshblock.sh %a)&
設定
DONTBLOCK 白名單
BURST_MAX=5
BURST_TIM=60 60秒內登入5次就封鎖
PURGE_TIM=3600 3600秒後解凍
knockd 監視一個預定義模式在iptables的日誌,例如一次擊中埠6356,一次擊中埠63356,兩次擊中埠9356,這相當於敲一個關閉的門用一種特殊的暗碼來被konckd識別,konckd將使用iptables來開啟一個預定義埠例如ssh的22埠在一個預定定義時間.(比如一分鐘),如果一個ssh session 在這個時間範圍內開啟,這個埠會一直保留.直到預定義時間過期後ssh埠被knockd關掉.
缺點:比較複雜的方案,不適合普通人
需要客戶端(knockd-client)來實現port knocking”,同時需要knockd-server來響應
實際上,很容易檢測到這種通訊模式,一旦***者可以監控你的通訊,這種解決方案無法提供安全防護針對本地***者
這個工具原理很簡單 ,他可以檢測我們認證日誌,如果發現了有暴力破解的跡象
他就會對相應IP採取動作 比如ban掉IP
工具下載地址:http://www.fail2ban.org
tar zxf fail2ban-0.8.14.tar.gz
cd fail2ban-0.8.14;python setup.py install
記得要把/files/reha-initdt檔案 移動到 /etc/init.d/下
編輯配置檔案 /etc/fail2ban/jail.conf
[xinetd-fail]enabled = falsefilter = xinetd-failaction = iptables-allports[name=xinetd,protocol=all]logpath = /var/log/daemon*log[ssh-iptables]enabled = truefilter = sshdaction = iptables[name=SSH,port=ssh,protocol=tcp]logpath = /var/log/securemaxretry = 5findtime = 300bantime = 300
啟動後檢視是否生成規則鏈
/etc/init.d/fail2ban start
iptables -L -n
Chain fail2ban-SSH (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0