1. 程式人生 > >被黑了,SSH服務需要大整頓

被黑了,SSH服務需要大整頓

linux 運維 ssh服務

被黑經歷:有一天下午,後臺所有網址全部被跳轉,第一反應就是服務器被黑了。首先到監測站點被篡改的腳本日誌查看,檢查主節點服務器上代碼的完整性,發現index.php文件有被竄改的痕跡,所以導致跳轉。xshell遠程連接服務器,普通用戶連不了,用root發現連不上密碼顯示錯誤,很明顯,被黑後密碼被篡改,xxx者想完全控制這臺服務器,還好其它節點做了ssh連接免密機制,連進去沒多久就被踢出終端連接了,普通用戶的/etc/shadow和/etc/passwd都被刪掉了,防火墻限制22端口的IP段被刪掉了。

問題解決方法:

  • 1.通過內網其它節點ssh遠程連接主節點服務器,改掉默認端口22,改成xxxx。

  • 2.改掉root用戶密碼,添加好普通用戶,

  • 3.加上防火墻限制IP的固定端口訪問。重啟防火墻

  • 4.為了防止有異常程序或xxx在運行,重啟服務器(主節點沒跑什麽服務,就nginx,讀者自己斟酌)





  • 為了防止下次再出現類似的問題,需要加強ssh服務防護和優化,下面是針對ssh服務的說明以及參數詳解和配置實踐。

基本大綱:

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經驗的人都知道,更何況是×××了,所以為了減少不必要的風險,為了系統安全,必須隱藏或更改上述默認配置。




二:SSH配置文件相關參數詳細說明

1)SSH客戶端配置文件

/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 [email protected]        #允許ywxi用戶使用本機內網地址鏈接
denyusers  [email protected]    #禁止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 [email protected]
allowusers [email protected]
denyusers  [email protected]
[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服務安全加強的建議(僅供參考,工作中根據需求來就好行)

1、不要使用默認端口

2、禁止使用protocol version 1

3、限制可登錄用戶

4、設定空閑會話超時時長

5、利用防火墻設置ssh訪問策略

6、僅監聽特定的IP地址

7、基於口令認證時,使用強密碼策略

tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs

8、使用基於密鑰的認證

9、禁止使用空密碼

10、禁止root用戶直接登錄

11、限制ssh的訪問頻度和並發在線數

12、做好日誌,經常分析

13、鎖死sshd服務的配置文件,防止篡改,修改鎖文件命令





被黑了,SSH服務需要大整頓