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

源文檔:https://blog.csdn.net/cnbird2008/article/details/6130696前端

簡介web

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

  1. 把 SSH 的標準端口改成不經常使用的值並加強 SSH 配置,從而擋住最簡單的攻擊。
  2. 定義有限的用戶列表,只容許這些用戶登陸。
  3. 徹底隱藏容許 SSH 訪問的事實,要求根據特殊的 「敲門」 序列識別有效用戶。

要想應用這些技術,須要可以訪問根帳戶。另外,可能必須安裝一些包,須要配置防火牆和路由器(若是有路由器的話),打開和關閉特定的端口並把數據包轉發到您的計算機。後端

增強保護安全

「隱匿產生安全」 這個概念盡人皆知並且受到你們的嘲笑,由於採用隱匿的方式,但願沒人瞭解您的方法,這只是一廂情願的想法。可是,在某些場景中,隱匿一點兒會有幫助。儘管簡單的措施沒法阻止下定決心的黑客,可是至少可以擋住那些 「腳本小子」,他們的腳本每每水平很通常。服務器

人人都知道 SSH 鏈接的標準端口是 22。所以,爲了讓計算機更安全,應該採起的第一個措施是把端口改成另外一個不經常使用的非標準端口號,好比 22960。1024 以上的號碼一般均可以使用,可是應該查閱參考資料以免致使問題。這一修改對您的影響僅僅是必須使用下面的命令鏈接計算機:網絡

ssh -p 22960 your.machine.urlsession

爲了實現這個小措施,只需在 /etc/ssh/sshd_config 文件中作簡單的修改。編輯此文件(必須做爲根用戶),尋找 Port 22 行,把端口號改成您選擇的號碼(若是這一行以鎊符 [#] 開頭,表示它被註釋掉了,那麼應該取消註釋標誌)。保存文件,用/etc/init.d/sshd restart 命令從新啓動 SSH。應該在防火牆上打開您選擇的端口並關閉端口 22。ssh

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

清單 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

相關文章
相關標籤/搜索