被黑經歷:有一天下午,後臺全部網址所有被跳轉,第一反應就是服務器被黑了。首先到監測站點被篡改的腳本日誌查看,檢查主節點服務器上代碼的完整性,發現index.php文件有被竄改的痕跡,因此致使跳轉。xshell遠程鏈接服務器,普通用戶連不了,用root發現連不上密碼顯示錯誤,很明顯,被黑後密碼被篡改,xxx者想徹底控制這臺服務器,還好其它節點作了ssh鏈接免密機制,連進去沒多久就被踢出終端鏈接了,普通用戶的/etc/shadow和/etc/passwd都被刪掉了,防火牆限制22端口的IP段被刪掉了。php
問題解決方法:linux
1.經過內網其它節點ssh遠程鏈接主節點服務器,改掉默認端口22,改爲xxxx。nginx
2.改掉root用戶密碼,添加好普通用戶,
算法
3.加上防火牆限制IP的固定端口訪問。重啓防火牆shell
4.爲了防止有異常程序或xxx在運行,重啓服務器(主節點沒跑什麼服務,就nginx,讀者本身斟酌)windows
爲了防止下次再出現相似的問題,須要增強ssh服務防禦和優化,下面是針對ssh服務的說明以及參數詳解和配置實踐。
安全
基本大綱:
bash
1.SSH服務協議說明服務器
2.SSH配置文件相關參數詳細說明網絡
3.經常使用的SSH服務端遠程登陸配置與實踐
4.更高級的SSH安全策略
5.ssh服務安全增強的建議
一: SSH服務協議說明
SSH 是 Secure Shell Protocol 的簡寫,由 IETF 網絡工做小組(Network Working Group )制定;在進行數據傳輸以前,SSH先對聯機數據包經過加密技術進行加密處理,加密後在進行數據傳輸。確保了傳遞的數據安全。
SSH是專爲遠程登陸會話和其餘網絡服務提供的安全性協議。利用 SSH 協議能夠有效的防止遠程管理過程當中的信息泄露問題,在當前的生產環境運維工做中,絕大多數企業廣泛採用SSH協議服務來代替傳統的不安全的遠程聯機服務軟件,如telnet(23端口,非加密的)等。
在默認狀態下,SSH服務主要提供兩個服務功能:
一是提供相似telnet遠程聯機服務器的服務,即上面提到的SSH服務。
另外一個是相似FTP服務的sftp-server,藉助SSH協議來傳輸數據的.提供更安全的SFTP服務(vsftp,proftp)。
windows服務器的默認遠程管理端口是3389,管理員用戶是administrator。linux的管理用戶默認是root。普通用戶默認有不少,遠程鏈接默認端口爲22。有IT經驗的人都知道,更況且是×××了,因此爲了減小沒必要要的風險,爲了系統安全,必須隱藏或更改上述默認配置。
/etc/ssh/ssh——config
#配置文件概要
Host * #選項「Host」只對可以匹配後面字串的計算機有效。「*」表示全部的計算機。
ForwardAgent no #設置鏈接是否通過驗證代理(若是存在)轉發給遠程計算機。
ForwardX11 no #設置X11鏈接是否被自動重定向到安全的通道和顯示集(DISPLAY set)
RhostsAuthentication n #設置是否使用基於rhosts的安全驗證。
RhostsRSAAuthentication no #設置是否使用用RSA算法的基於rhosts的安全驗證。
RSAAuthentication yes #設置是否使用RSA算法進行安全驗證。
PasswordAuthentication yes #設置是否使用口令驗證。
FallBackToRsh no #設置若是用ssh鏈接出現錯誤是否自動使用rsh。
UseRsh no #設置是否在這臺計算機上使用「rlogin/rsh」。
BatchMode no #若是設爲「yes」,passphrase/password(交互式輸入口令)的提示將被禁止。當不能交互式輸入口令的時候,這個選項對腳本文件和批處理任務十分有用。
CheckHostIP yes #設置ssh是否查看鏈接到服務器的主機的IP地址以防止DNS欺騙。建議設置爲「yes」。
StrictHostKeyChecking no #若是設置成「yes」,ssh就不會自動把計算機的密匙加入「$HOME/.ssh/known_hosts」文件,而且一旦計算機的密匙發生了變化,就拒絕鏈接。
IdentityFile ~/.ssh/identity #設置從哪一個文件讀取用戶的RSA安全驗證標識。
Port 22 #設置鏈接到遠程主機的端口。
Cipher blowfish #設置加密用的密碼。
EscapeChar ~ #設置escape字符。
2)SSH服務端配置文件詳解
/etc/ssh/sshd_config
#配置文件概要
Port 22 # SSH 預設使用 22 這個 port,最好是用別的 port !
Protocol 2,1 # 選擇的 SSH 協議版本,能夠是 1 也能夠是 2 ,若是要同時支持二者,就必需要使用 2,1 這個分隔了!
ListenAddress 0.0.0.0
#監聽的主機適配卡!舉個例子來講,若是您有兩個 IP,分別是 192.168.0.100 及 192.168.2.20 ,那麼只想要開放 192.168.0.100 時,
#就能夠寫如同下面的樣式:ListenAddress 192.168.0.100 只監聽來自 192.168.0.100 這個 IP 的SSH聯機。若是不使用設定的話,則預設全部接口均接受 SSH
PidFile /var/run/sshd.pid # 能夠放置 SSHD 這個 PID 的檔案!左列爲默認值
LoginGraceTime 600 # 當使用者連上 SSH server 以後,會出現輸入密碼的畫面,在該畫面中,在多久時間內沒有成功連上 SSH server ,就斷線!時間爲秒!
Compression yes # 是否可使用壓縮指令?
HostKey /etc/ssh/ssh_host_key # SSH version 1 使用的私鑰
HostKey /etc/ssh/ssh_host_rsa_key # SSH version 2 使用的 RSA 私鑰
HostKey /etc/ssh/ssh_host_dsa_key # SSH version 2 使用的 DSA 私鑰
KeyRegenerationInterval 3600 # 由前面聯機的說明能夠知道, version 1 會使用 server 的 Public Key ,每隔一段時間來從新創建一次!時間爲秒!
ServerKeyBits 768 # Server key 的長度!
SyslogFacility AUTH # 當有人使用 SSH 登入系統的時候,SSH會記錄信息
LogLevel INFO # 登陸記錄的等級---》所有
PermitRootLogin no # 是否容許 root 登入!預設是容許的,可是建議設定成 no!
UserLogin no # 在 SSH 底下原本就不接受 login 這個程序的登入!
StrictModes yes # 當使用者的 host key 改變以後,Server 就不接受聯機
RSAAuthentication yes # 是否使用純的 RSA 認證!?僅針對 version 1 !
PubkeyAuthentication yes # 是否容許 Public Key ?只有 version 2
AuthorizedKeysFile .ssh/authorized_keys #設定若要使用不須要密碼登入的帳號時,那麼那個帳號的存放檔案所在檔名!
RhostsAuthentication no # 本機系統不使用 .rhosts , .rhosts 不安全!
IgnoreRhosts yes # 是否取消使用 ~/.ssh/.rhosts 來作爲認證!
RhostsRSAAuthentication no # 針對 version 1 ,使用 rhosts 檔案在/etc/hosts.equiv配合 RSA 演算方式來進行認證!
HostbasedAuthentication no # 這個項目與上面的項目相似,不過是給 version 2 使用的!
IgnoreUserKnownHosts no # 是否忽略家目錄內的 ~/.ssh/known_hosts 這個檔案所記錄的主機內容
PasswordAuthentication yes # 密碼驗證固然是須要的!
PermitEmptyPasswords no # 上面那一項若是設定爲 yes 的話,這一項就最好設定爲 no ,這個項目在是否容許以空的密碼登入!
ChallengeResponseAuthentication yes # 挑戰任何的密碼認證!因此,任何 login.conf規定的認證方式,都可適用!
PAMAuthenticationViaKbdInt yes # 是否啓用其它的 PAM 模塊!啓用這個模塊將會致使 PasswordAuthentication 設定失效!
#與Kerberos 有關的參數設定!底下不用設定
KerberosAuthentication no
KerberosOrLocalPasswd yes
KerberosTicketCleanup yes
KerberosTgtPassing no
#有關在 X-Window 底下使用的相關設定
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
PrintMotd no # 登入後是否顯示出一些信息呢?例如上次登入的時間、地點等,預設是 yes ,可是,若是爲了安全,能夠考慮改成 no !
PrintLastLog yes # 顯示上次登入的信息!能夠啊!預設也是 yes !
KeepAlive yes # 通常而言,若是設定這項目的話,那麼 SSH Server 會傳送KeepAlive 的訊息給 Client 端,以確保二者的聯機正常!在這個狀況下,任何一端死掉後, SSH 能夠馬上知道!而不會有殭屍程序的發生!
UsePrivilegeSeparation yes # 使用者的權限設定項目!
MaxStartups 10 # 同時容許幾個還沒有登入的聯機畫面?
DenyUsers * # 設定受抵擋的使用者名稱
三:經常使用的SSH服務端遠程登陸配置與實踐
配置文件 /ect/ssh/sshd_config
#經常使用參數:
Port # 可修改ssh訪問端口,默認爲22。默認在本機的全部網絡接口上監聽。端口範圍:0~65535,不能與已有的服務器端口衝突
PermitEmptyPasswords #是否容許密碼爲空的用戶遠程登陸。默認爲"no"
PermitRootLogin #是否容許ssh遠程登陸root賬號,建議爲no
ClientAliveInterval 0 #客戶端鏈接數作限制,根據需求設置
UseDNS #指定sshd是否應該對遠程主機名進行方向解析,以檢查此主機名是否與其IP地址真實對應。默認值爲"yes"。我的建議改爲no,不然可能會致使ssh鏈接很慢
GSSAPIAuthentication no #解決Linux之間使用SSH遠程鏈接慢的問題
#限制可登陸用戶的辦法以下:
AllowUsers user1 user2 user3 #容許ssh登陸用戶
DenyUsers #禁止ssh登錄用戶
AllowGroups #容許ssh登陸用戶組
DenyGroups #禁止ssh登錄用戶組
#舒適提示:這裏用虛擬機作測試,以避免參數設置有誤,鏈接不上。能夠上真實虛擬機修改
[root@localhost ssh]# cp sshd_config sshd_config$(date +%F) [root@localhost ssh]# cat sshd_config Port 52168 #鏈接端口改成52168 PermitRootLogin no #不容許ssh遠程登陸root賬號 PermitEmptyPasswords no #不容許密碼爲空的用戶遠程登陸 UseDNS no #不進行解析 GSSAPIAuthentication no #解決Linux之間使用SSH遠程鏈接慢的問題 allowusers ywxi@192.168.1.11 #容許ywxi用戶使用本機內網地址連接 denyusers ywxitest@192.168.1.11 #禁止ywxitest用戶使用本機內網地址鏈接 [root@localhost ssh]# useradd ywxi #建立用戶,用來測試 [root@localhost ssh]# useradd ywxitest [root@localhost ssh]# passwd ywxi #給ywxi用戶設置密碼,暫時不給ywxitest用戶設置 [root@localhost ssh]# ifconfig |grep 'inet addr' #虛擬機IP地址 inet addr:192.168.1.8 Bcast:192.168.1.255 Mask:255.255.255.0 inet addr:127.0.0.1 Mask:255.0.0.0 [root@localhost ssh]# /etc/init.d/sshd restart #重啓服務,使SSH服務端配置生效 Stopping sshd: [ OK ] Starting sshd: [ OK ] [root@localhost ssh]# grep 52168 /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 52168 -j ACCEPT #添加防火牆規則容許52168端口開放 [root@localhost ssh]# /etc/init.d/iptables restart iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] iptables: Applying firewall rules: [ OK ]
如下是客戶端用CRT工具經過sshd服務遠程鏈接虛擬主機過程:
用root用戶鏈接,一直會提示密碼驗證失敗
修改配置PermitRootLogin yes 改成yes,注意有allowusers限制用戶時須要把root用戶也容許
修改後,重啓sshd服務設置好端口後,root用戶便可鏈接
四:更高級的SSH安全策略
限制用戶登陸IP的方法有兩種;
1)修改/etc/hosts.allow和/etc/hosts.deny 這兩個文件,把須要經過的IP寫在/etc/hosts.allow 文件裏 [root@localhost ~]# cat /etc/hosts.allow sshd:192.168.1.11:allow [root@localhost ~]# cat /etc/hosts.deny sshd:ALL [root@localhost ~]# /etc/init.d/sshd restart #重啓服務使配置生效 2)修改/etc/ssh/sshd_config文件 [root@localhost ~]# cat /etc/ssh/sshd_config allowusers ywxi@192.168.1.11 allowusers root@192.168.1.11 denyusers ywxitest@192.168.1.11 [root@localhost ~]# /etc/init.d/sshd restart #重啓服務使配置生效
更改SSH監聽的IP,使其監聽內網IP段或指定ip;
1)更改SSH監聽的IP,使其監聽內網IP段 [root@localhost ssh]# cat sshd_config|grep Listen ListenAddress 192.168.1.8:52168 2)經過防火牆限制僅能使用內網IP鏈接此服務器。限制命令以下 iptables -I INPUT -p -tcp --dport 52168 -s 192.168.1.0/24 -j ACCEPT 3)經過撥號到×××服務器,而後從局域網訪問這些服務器,提高安全性。
五:ssh服務安全增強的建議(僅供參考,工做中根據需求來就好行)
一、不要使用默認端口
二、禁止使用protocol version 1
三、限制可登陸用戶
四、設定空閒會話超時時長
五、利用防火牆設置ssh訪問策略
六、僅監聽特定的IP地址
七、基於口令認證時,使用強密碼策略
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
八、使用基於密鑰的認證
九、禁止使用空密碼
十、禁止root用戶直接登陸
十一、限制ssh的訪問頻度和併發在線數
十二、作好日誌,常常分析
1三、鎖死sshd服務的配置文件,防止篡改,修改鎖文件命令