1. 程式人生 > >如何增加黑客通過ssh入侵的難度--保護ssh的三把鎖

如何增加黑客通過ssh入侵的難度--保護ssh的三把鎖

源文件:https://blog.csdn.net/cnbird2008/article/details/6130696

簡介

如果需要遠端訪問計算機並啟用了 Secure Shell (SSH) 連線,黑客就會嘗試突破您的防線並控制您的計算機,您必須接受這個事實。儘管不能保證計算機不會被 “黑客” 佔領,但是一些簡單的解決方案有助於保護 SSH,可以讓攻擊困難一些。本文討論三種技術:

  1. 把 SSH 的標準埠改為不常用的值並增強 SSH 配置,從而擋住最簡單的攻擊。
  2. 定義有限的使用者列表,只允許這些使用者登入。
  3. 完全隱藏允許 SSH 訪問的事實,要求根據特殊的 “敲門” 序列識別有效使用者。

要想應用這些技術,需要能夠訪問根賬戶。另外,可能必須安裝一些包,需要配置防火牆和路由器(如果有路由器的話),開啟和關閉特定的埠並把資料包轉發到您的計算機。

加強保護

“隱匿產生安全” 這個概念盡人皆知而且受到大家的嘲笑,因為採用隱匿的方式,希望沒人瞭解您的方法,這只是一廂情願的想法。但是,在某些場景中,隱匿一點兒會有幫助。儘管簡單的措施無法阻止下定決心的黑客,但是至少能夠擋住那些 “指令碼小子”,他們的指令碼往往水平很一般。

人人都知道 SSH 連線的標準埠是 22。因此,為了讓計算機更安全,應該採取的第一個措施是把埠改為另一個不常用的非標準埠號,比如 22960。1024 以上的號碼通常都可以使用,但是應該查閱參考資料以避免導致問題。這一修改對您的影響僅僅是必須使用下面的命令連線計算機:

ssh -p 22960 your.machine.url

為了實現這個小措施,只需在 /etc/ssh/sshd_config 檔案中做簡單的修改。編輯此檔案(必須作為根使用者),尋找 Port 22 行,把埠號改為您選擇的號碼(如果這一行以鎊符 [#] 開頭,表示它被註釋掉了,那麼應該取消註釋標誌)。儲存檔案,用/etc/init.d/sshd restart 命令重新啟動 SSH。應該在防火牆上開啟您選擇的埠並關閉埠 22。

但是,還可以更進一步。編輯配置檔案,在其中包含 清單 1 所示的行。注意,其中一些行可能已經存在,但是可以把它們註釋掉。

清單 1. 通過修改 SSH 配置檔案簡便地增強安全性

Port 22960
LoginGraceTime 30
MaxAuthTries 3
Protocol 2
PermitRootLogin no

LoginGraceTime 允許一次登入花費 30 秒;如果使用者花費的時間超過 30 秒,就不允許他訪問,必須重新登入。MaxAuthTries 把錯誤嘗試的次數限制為 3 次,3 次之後拒絕登入嘗試。上面的 Protocol 2 行禁止使用比較弱的協議。最後一行不允許任何人作為根使用者登入,這會讓黑客攻擊更困難。還可以使用 DenyUsers、AllowUsers、DenyGroups 和 AllowGroups 選項實現其他限制。這些修改不會顯著增強計算機的安全性,但是隻嘗試強力攻擊標準埠 22 的一般指令碼會失敗,不會造成損害。無論如何,這是向正確的方向邁出了第一步。在本文後面,我們將使用更安全的方法,不僅修改埠號,而且完全隱藏它。

誰可以進入?

對於大多數人,PAM 是一種罐裝的烹調油。但是作為 Linux® 安全術語,PAM 代表可插入身份驗證模組(Pluggable Authentication Modules)。這些模組提供額外的身份驗證規則,保護對計算機的訪問。

首先討論一個基本問題:究竟為什麼要使用 PAM?如果每個程式不得不定義自己的身份驗證邏輯,就會很混亂。如何確定所有應用程式都實現了相同的測試和檢查?如果需要額外的控制手段,那麼怎麼辦?難道要重新編寫所有程式嗎?在電腦科學領域,有時候可以用額外的一層解決所有問題,至少在安全方面是這樣。如果一個程式需要驗證使用者的身份,它可以呼叫 PAM API。這個 API 負責執行在 PAM 配置檔案中指定的所有檢查。這種方法還允許方便地修改身份驗證規則,所有感知 PAM 的程式都會自動地應用新規則,不需要修改它們的程式碼。如果希望使用某種生物學檢查(比如虹膜掃描器或指紋採集器),而且生產商提供了 PAM,就可以方便地設定它。在配置檔案中包含模組呼叫,所有應用程式就可以使用這個裝置了。

配置 PAM

PAM 提供四個安全領域的特性,但是應用程式不太可能同時需要所有這些方面。例如,passwd 命令只需要下面列表中的第三組:

  • account 處理賬戶限制。對於有效的使用者,允許他做什麼?
  • auth 處理使用者識別 — 例如,通過輸入使用者名稱和密碼。
  • password 只處理與密碼相關的問題,比如設定新密碼。
  • session 處理連線管理,包括日誌記錄。

在 /etc/pam.d 目錄中為將使用 PAM 的每個應用程式建立一個配置檔案,檔名與應用程式名相同。例如,login 命令的配置檔案是 /etc/pam.d/login。

必須定義將應用哪些模組,建立一個動作 “堆”。PAM 執行堆中的所有模組,根據它們的結果允許或拒絕使用者的請求。還必須定義檢查是否是必需的。最後,other 檔案為沒有特殊規則的所有應用程式提供預設規則。

  • optional 模組可以成功,也可以失敗;PAM 根據模組是否最終成功返回 success 或 failure。
  • required 模組必須成功。如果失敗,PAM 返回 failure,但是會在執行堆中的其他模組之後返回。
  • requisite 模組也必須成功。但是,如果失敗,PAM 立即返回 failure,不再執行其他模組。
  • sufficient 模組在成功時導致 PAM 立即返回 success,不再執行其他模組。

配置檔案的結構很簡單。可以包含註釋,註釋以雜湊符 (#) 開頭;通過在換行處加上反斜槓 (/),可以把長的行分為多行。行有三個欄位:領域 (account、auth、password 或 session)、控制標誌(optional、required、requisite 或 sufficient)、將執行的模組的路徑和引數。注意,第二個欄位可以更復雜;更多資訊見 參考資料。另外,可以使用 include 規則以包含其他檔案中的規則,比如auth include common-account。

特殊的 /etc/pam.d/other 檔案是 “預設的” 配置檔案(見 清單 2),其中的規則自動地應用於沒有自己的配置檔案的所有應用程式。為了確保安全,應該快速檢查 /etc/pam.d 目錄,把您不使用的所有配置檔案改為其他名稱(這樣就會使用 other 配置)。如果認為確實需要某個應用程式,那麼只需把配置檔案改回原來的名稱。預設配置通常拒絕所有請求(通過使用 pam_deny.so 模組)並警告管理員(通過 pam_warn.so 模組),讓管理員解決問題。

標準的 “other” 配置檔案為沒有自己的配置檔案的所有應用程式提供安全的預設規則(拒絕所有請求)。

清單 2. 標準的 “other” 配置檔案

account required pam_deny.so
auth required pam_deny.so
auth required pam_warn.so
password required pam_deny.so
password required pam_warn.so
session required pam_deny.so

如果把 pam_deny.so 替換為 pam_unix.so,就應用標準的身份驗證方法(輸入使用者名稱和密碼)。如果您不關心安全性,那麼使用pam_permit.so,這會允許任何請求!

一些可用方法

儘管沒有標準的模組列表,但是所有發行版都包含以下模組中的大多數。請檢查駐留模組的 /lib/security 或 /usr/lib/security 目錄。對於 64 位作業系統,用 lib64 替換 lib。如果需要更多資訊,可以嘗試執行 man the.name.of.the.module,而不要直接執行它;PAM 不是可執行的二進位制程式碼。

  • pam_access 根據 /etc/security/access.conf 檔案允許或拒絕訪問。稍後將使用此模組決定允許哪些使用者登入。
  • pam_cracklib 和 pam_pwcheck 檢查新密碼的強度。
  • pam_deny 和 pam_permit 是基本模組,分別拒絕或允許訪問。
  • pam_echo 向用戶顯示指定檔案的內容。
  • pam_lastlog 向用戶顯示他上一次登入的日期和時間。
  • pam_ldap.so 讓使用者根據 LDAP 伺服器進行身份驗證,提供跨網路的集中式身份驗證。
  • pam_limits 模組允許指定系統資源限制,限制在 /etc/security/limits.conf 檔案中定義。
  • pam_listfile 提供根據一個檔案的內容允許或拒絕服務的另一種方法。
  • pam_mail 檢查使用者是否有未處理的郵件。
  • pam_motd 向用戶顯示 “message of the day” 檔案。
  • 如果 /etc/nologin 檔案存在,pam_nologin 阻止所有登入。
  • pam_rootok 允許根使用者訪問,不執行進一步檢查。/etc/pam.d/su 中常常包含這個模組;必需的行是 auth sufficient pam_rootok.so。根使用者可以作為任何使用者操作,不需要提供密碼。
  • pam_succeed_if 檢查賬戶的特定屬性,比如是否是某個組的成員。
  • pam_time 可以根據 /etc/security/time.conf 中的規則限制對服務的訪問。
  • pam_unix(或 pam_unix2)提供基於 /etc/passwd 和 /etc/shadow 檔案的傳統 UNIX® 身份驗證。
  • pam_userdb 根據一個 Berkeley 資料庫執行身份驗證。
  • pam_warn 在系統日誌中記錄資訊。
  • pam_wheel 只向 wheel 組的成員提供根訪問權;必需的行是 auth required pam_wheel.so。

關於其他模組和編寫自己的模組的資訊,請查閱 參考資料。現在,使用 PAM 決定誰可以登入您的計算機。

用 PAM 限制訪問

現在,我們來使用 PAM 限制誰可以連線您的伺服器。必須編輯 /etc/pam.d/sshd 檔案,讓它像清單 3 這樣。

清單 3. 在 sshd PAM 檔案中新增 pam_access.so

#%PAM-1.0
account include common-account
account required pam_access.so
auth include common-auth
auth required pam_nologin.so
password include common-password
session include common-session

在 sshd PAM 檔案中新增 pam_access.so,就可以輕鬆地定義誰可以使用 SSH 連線您的計算機。pam_access.so 模組實現基於 /etc/security/access.conf 檔案的安全控制,見清單 4。

清單 4. 通過使用 pam_access.so,定義誰可以或不可以使用 SSH

+ : ALL : 192.168.1.
+ : jack : ALL
+ : jill : ALL
- : ALL : ALL

第一行允許任何使用者 (ALL) 從內部網路登入。後兩行允許使用者 jack 和 jill 從任何地方訪問伺服器。最後一行拒絕其他任何使用者從其他任何地方訪問。允許多個使用者訪問的另一種方法是使用 pam_listfile.so,這需要建立一個允許訪問的使用者列表(例如 /etc/ssh_users)。在 /etc/pam.d/sshd 檔案中新增以下行:

auth required pam_listfile.so item=user sense=allow
file=/etc/ssh_users onerr=fail

這還沒有完。必須修改 /etc/ssh/sshd_config 檔案,讓它使用 PAM。在此檔案中新增 UsePAM yes 行,重新啟動 sshd 守護程序,這樣就行了!

究竟是否有門?

即使應用了前兩節中的方法,無論您怎麼預防,黑客仍然會嘗試穿越您系統中任何開放的門戶。改變 SSH 埠號對於經驗豐富的黑客只能造成小小的麻煩。限制允許訪問的使用者會有幫助,但前提是沒有使用者落入黑客或社會工程攻擊的圈套而洩露密碼。無論如何,只要您的系統中有門,就會吸引黑客。

增強電腦保安性的最後一種方案是最激進的:關閉開啟的埠,這會讓任何攻擊都無法攻破您的計算機。只向能夠提供 “祕密敲門暗號” 的使用者開放所需的埠,讓使用者能夠輸入密碼並訪問計算機。

這種技術稱為埠敲門,適用於需要訪問不向公眾開放的伺服器的使用者。伺服器可以關閉所有埠,直到使用者提供一個祕密的敲門序列 (序列很容易實現,而且需要的資源不多)。

開啟祕密埠之後,應用常用的安全機制(比如密碼或證書)。只需在防火牆級上提供一個額外的安全層,需要祕密埠的所有服務就會正常工作。

這種方法的要點在於關閉所有埠並監視外部連線嘗試。當識別出預定義的嘗試序列(稱為敲門序列 )時,可以執行開啟埠等操作,讓外部的使用者能夠進來。敲門序列的複雜程度由您決定,從簡單的列表(比如依次嘗試 TCP 埠 7000、UDP 埠 7100 和 TCP 埠 7200)到一次性序列集合都可以。(按密碼學術語來說,一次性序列與 “一次一密” 相似,這是已知最安全的加密方法。)外面的使用者必須知道使用 SSH 所需的埠號和密碼,還必須知道開啟埠並啟用密碼所需的敲門序列。如果沒有這個序列,連線嘗試就會靜悄悄地失敗。

這為什麼是非常安全的方案?因為有 65,535 個埠(見 參考資料)。即使考慮到已經分配的埠,仍然有超過 60,000 個可用埠。如果敲門序列只包含四次 “敲門”,黑客要想通過強力攻擊猜出序列,就必須測試大約 13,000,000,000,000,000,000 個序列(13 後面 18 個零)。這樣的攻擊顯然不太可能奏效!當然,強力攻擊或胡亂猜測並不是猜出正確序列的惟一方法。因此,不要只使用單一安全方法;而是使用一系列安全層來增加攻擊的難度。

必須安裝敲門守護程序 knockd;它監視敲門序列,當發現有效的序列時執行相應的操作。如果願意,可以從頭構建它,但是大多數(如果不是所有的話)發行版中都有這個包。最好使用包管理工具安裝它。例如,在 OpenSUSE 中,可以使用 Yast2 或通過執行sudo zypper install knockd 安裝它。在 Ubuntu 中可以使用 sudo apt-get install knockd,在 Debian 中使用 sudo aptitude install knockd。用發行版的軟體安裝工具搜尋 knockd 往往能夠找到它。

安裝這個包之後,必須編輯 /etc/knockd.conf 檔案以指定埠敲門規則,然後啟動守護程序。為了完成所需的設定,必須瞭解您的防火牆的工作方式。例如,在 OpenSUSE 中,可以使用 清單 5 這樣的設定。

清單 5. 針對 OpenSUSE 防火牆設計的示例配置檔案

[opencloseSSH]
sequence= 7000,8000,9000
tcpflags= syn
seq_timeout= 15
cmd_timeout= 30
start_command= /usr/sbin/iptables -s %IP% -I input_ext 1 -p tcp –dport 22960 -j ACCEPT
stop_command= /usr/sbin/iptables -s %IP% -D input_ext -p tcp –dport 22960 -j ACCEPT

這個示例在使用者依次在埠 7000、8000 和 9000 上敲門之後啟用 SSH 訪問。

在啟動 knockd 之前,關閉埠 22960 並嘗試遠端登入。這個嘗試應該會失敗,見清單 6。

清單 6. 如果禁用 SSH 訪問而且不啟動敲門守護程序,登入嘗試會失敗

> ssh the.url.for.your.site -p 22960 -o ConnectTimeout=15
ssh: connect to host the.url.for.your.site port 22960: Connection timed out

現在,使用 sudo /etc/init.d/knockd start 或 sudo knockd -d 啟動埠敲門守護程序(這兩個命令是等效的),然後再試一下;埠敲門序列要求在埠 7000、8000 和 9000 上敲門。必須在 15 秒內完成這個序列。識別出序列之後埠開啟,必須在 30 秒內登入。否則,埠再次關閉。

為了檢驗這個過程,回到您的遠端機器上並登入。這一次提供所需的敲門序列,見 清單 7。注意,在安裝 knockd 時通常也會安裝knock 命令。如果不是這樣,只需用發行版的包管理工具搜尋它。

清單 7. 提供所需的敲門序列之後登入成功

> knock the.url.for.your.site 7000
> knock the.url.for.your.site 8000
> knock the.url.for.your.site 9000
> ssh the.url.for.your.site -p 22960 -o ConnectTimeout=10
Password:

如果提供了錯誤的敲門序列(或根本沒有敲門),會收到 “Connection timed out” 訊息,SSH 埠仍然完全關閉,看不出它是存在的。

如果您處於路由器後面

如果您的伺服器通過路由器連線 Internet,就必須修改它的配置。具體細節因路由器和防火牆型別而異,但是一般來說應該:

  • 開啟敲門埠並把資料包轉發到您的計算機,讓knockd 能夠識別並處理它們。
  • 把埠 22960(SSH 連線使用的埠)上的資料包轉發到您計算機上的埠 22960。
  • 配置您計算機的防火牆,讓它拒絕對埠 22960 和敲門埠的連線。

儘管路由器會開啟一些埠,但是對它們的所有訪問都會到達您計算機的防火牆。訪問會被阻止,除非探測到正確的埠敲門序列。

敲門配置

/etc/knockd.conf 檔案有一個一般選項小節 options,希望使用的每個敲門序列各有一個小節。選項可以是大寫、小寫或大小寫混合形式。

  • 在預設情況下,knockd 監視 eth0 介面。要想使用另一個介面(例如 eth1),可以包含 Interface=eth1 行。注意,只使用裝置名而不是裝置的完整路徑。
  • 如果希望啟用日誌記錄,可以通過包含 useSyslog 行使用標準的 Linux 日誌檔案,也可以通過包含LogFile=/the/full/path/to/your/file 使用自己的檔案。但是,應該認識到日誌記錄是一個漏洞;如果黑客獲得了日誌,入侵者就會掌握埠敲門序列。
  • 如果希望能夠檢查 knockd 是否仍然在執行,那麼包含PidFile=/the/full/path/to/a/PID/file。這個守護程序的程序 ID (PID) 將儲存在這個檔案中。應該通過一個 cron 任務定期檢查knockd 是否仍然在執行並在需要時重新啟動它。注意,當這個守護程序停止執行時,系統是安全的;所有埠關閉,不可訪問。在守護程序重新啟動之前,使用者無法登入。

可以讓 knockd 監聽多個序列並以不同方式響應各個序列。在前面的示例中,讓 knockd 開啟 SSH 埠;可以簡單地啟用 HTTP 埠,讓使用者能夠訪問 web 伺服器,也可以執行特定的程序。在配置檔案中,每個序列都有相應的小節。

  • 使用 sequence 定義敲門序列,比如 7000,8000,9000。在預設情況下,敲門使用 TCP,但是可以新增 UDP 以增加複雜性,比如 7000,8000:udp,9000。
  • 除了使用固定的序列之外,還可以指定一個包含 “一次性序列” 的檔案,這些序列在使用之後就會刪除,不能再次使用。指定這種序列的方法如下:one_time_sequences=/the/full/path/to/a/sequences/file

    使用任何文字編輯器建立此檔案;其中每行包含一個序列(按照上面所示的格式)。應該在遠端計算機上儲存此檔案的拷貝以便記住如何登入。

  • 可以指定應該掃描哪些到達的 TCP 資料包,丟棄不與 ACK、FIN、PSH、RST、SYN 或 URG 標誌匹配的資料包。對於 SSH 連線,應該使用 TCPFlags=SYN。
  • 可以用 Seq_Timeout=seconds.to.wait 指定完成一個序列的最大時間。如果在此時間內沒有輸入完整的序列,就不會識別出它,訪問被拒絕。
  • 可以用 Cmd_Timeout=seconds.to.wait 指定在識別出序列之後使用者執行第二個命令的最大時間。如果提供了敲門序列的使用者沒有快速地輸入下一個命令(例如登入),埠會再次關閉。
  • 最重要的引數是 Start_command=some.command.to.execute,它指定成功地識別出敲門序列之後要執行的命令或指令碼。如果需要引用敲門者的 IP 地址(例如為了允許從他的計算機連線您的計算機),可以使用 %IP%。在執行時,它會替換為正確的值。在上面的示例中指定:/usr/sbin/iptables -s %IP% -I input_ext 1 -p tcp –dport 22960 -j ACCEPT

    iptables 向提供敲門序列的 IP 地址上的使用者開放埠 22960。

  • 另一個重要的引數是 Stop_command=some.command.to.execute;當超過 Cmd_timeout 時間之後,執行它指定的命令或指令碼。

在這裡,因為只希望開啟或關閉埠 22960,所以使用單一命令就夠了。如果需要更復雜的操作,可以通過呼叫指令碼執行所需的任何操作 — 操作甚至可以完全不涉及開啟埠。可以觸發任何操作,比如執行程序或執行備份。當然,瞭解要使用的命令可能有點兒難度。例如,因為我執行 OpenSUSE,它提供自己的防火牆前端,所以我不得不通過檢視 iptables -l 的輸出瞭解應該執行哪個命令來開啟或關閉埠 22960。

對於 knockd 本身,有幾個選項需要考慮:

  • -c:允許指定預設配置檔案 /etc/knockd.conf 之外的另一個配置檔案
  • -d:讓 knockd 作為後臺守護程序執行,這是標準執行方式
  • -D:提供輸出除錯訊息
  • -h:提供關於語法和選項的幫助
  • -i:允許指定預設的 eth0 介面之外的其他介面
  • -l:為日誌項啟用 DNS 查詢 — 這是一種不好的做法,因為這強迫計算機使用 DNS 通訊流,會產生漏洞
  • -v:提供更詳細的訊息和解釋
  • -V:提供程式的版本號

最後,可以使用多種方法產生敲門序列本身,編寫 knock 命令是最簡單的方法。

以下命令在 TCP 埠 7000 上敲門:

knock the.url.for.your.site 7000

以下命令在 UDP 埠 8000 上敲門:

knock the.url.for.your.site -u 8000

knock the.url.for.your.site 8000:udp

-h 引數提供這個命令的幫助。

結束語

您看到了三種保護 SSH 訪問的方法:修改 sshd 的配置引數,通過 PAM 限制可以登入的使用者,以及使用埠敲門序列隱藏存在 SSH 訪問的事實。儘管沒有任何方法能夠完全保護任何計算機,但是採取這三個措施會讓您的伺服器安全一些。

 

源文件:https://blog.csdn.net/cnbird2008/article/details/6130696