使用 iptables 進行基於 MAC 過濾的 SSH - 推薦嗎?

使用 iptables 進行基於 MAC 過濾的 SSH - 推薦嗎?

我在內部網路中有一台伺服器(透過 VPN 登入),我從那裡透過 SSH 使用 OpenSSH 公鑰/私鑰身份驗證登入伺服器。從安全角度來看,我想透過iptables伺服器綁定我的三個使用的客戶端的 MAC 位址,以便只有這些客戶端可以使用它登入。

iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT
iptables -A INPUT -p tcp --destination-port 22 -j DROP

但是,是否建議這樣做?我可以使用哪些其他(更好的)方法將 SSH 登入綁定到所使用的用戶端?

(如果有人想要請求 2FA,不幸的是 2FA 不可能作為潛在的解決方案。)

謝謝。

答案1

我假設您想要阻止您的 SSH 伺服器接受來自不受信任的主機的連接,即使它們提供了有效的使用者憑證。這樣對嗎?

將使用者的公鑰身份驗證與選定的客戶端主機聯繫起來的一種可能的解決方案是透過基於主機的身份驗證。透過設定基於主機的身份驗證並將AuthenticationMethods參數定義/etc/ssh/sshd_config為:

AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password

或者:

AuthenticationMethods hostbased,publickey

這將指示 SSH 守護程序請求用戶端在檢查使用者金鑰或密碼之前對它們連接的主機進行身份驗證。前一種選擇允許基於密碼的身份驗證,而後者僅限於公鑰。由於基於主機的身份驗證是基於金鑰對,因此 SSH 伺服器將能夠使用動態 IP 位址對用戶端進行身份驗證。


以下是完整的說明。 SSH 如何執行基於主機的身份驗證的文檔寫在ssh(1)手冊頁。請注意SSH如何識別使用者並檢查它是否適用於您的情況。

基於主機的身份驗證的工作原理如下:如果使用者登入的電腦在遠端電腦中列出,/etc/hosts.equiv並且/etc/ssh/shosts.equiv雙方用戶名相同,或者如果檔案~/.rhosts~/.shosts存在於遠端電腦上的使用者主目錄中並且包含一行,其中包含客戶端電腦的名稱和該電腦上的使用者的名稱,該使用者被視為登入。此外,伺服器必須能夠驗證客戶端的主機金鑰才能允許登入。此驗證方法可以彌補由於 IP 欺騙、DNS 欺騙和路由欺騙而導致的安全漏洞。 [管理員注意:/etc/hosts.equiv~/.rhosts和 rlogin/rsh 協定一般來說本質上是不安全的,如果需要安全性,應該停用。

若要在 OpenSSH 中啟用基於主機的身份驗證:

# /etc/ssh/sshd_config

HostbasedAuthentication yes
IgnoreUserKnownHosts yes
IgnoreRhosts yes

# AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
AuthenticationMethods hostbased,publickey
  • HostbasedUsesNameFromPacketOnly yes若要執行基於主機的身份驗證,您可以透過設定來信任用戶端提供的主機名稱資訊/etc/ssh/sshd_config
# /etc/ssh/sshd_config

HostbasedUsesNameFromPacketOnly yes
  • 或者,您也可以設定 SSH 守護程序,透過使用儲存在/etc/hosts網路 DNS 伺服器的檔案或 PTR 記錄中的資訊解析用戶端的 IP 位址來識別主機名稱:
# /etc/ssh/sshd_config

HostbasedUsesNameFromPacketOnly no
UseDNS yes
# /etc/ssh/shosts.equiv

ssh-client-alpha
ssh-client-bravo
ssh-client-charlie
  • /etc/ssh/ssh_known_hosts列出文件中授權主機的公鑰。一個方便的方法是透過ssh-keyscan
[root@ssh-server ~]# ssh-keyscan ssh-client-alpha >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-bravo >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-charlie >> /etc/ssh/ssh_known_hosts

將 OpenSSH 伺服器設定為接受基於主機的身份驗證請求後,也必須將用戶端設定為請求基於主機的身份驗證:

# /etc/ssh/ssh_config

Host *
    HostbasedAuthentication yes
    EnableSSHKeySign yes
  • 確保 SUID/SGID 位ssh-keysign可執行檔授予對主機私鑰檔案的讀取權限:
[root@ssh-client-alpha ~]# find /usr -name ssh-keysign -ls
 16517300    616 -r-xr-sr-x   1  root     ssh_keys   630344 Feb  4 16:01 /usr/libexec/openssh/ssh-keysign

[root@ssh-client-alpha ~]# ls -l /etc/ssh/ssh_host_*key
-rw-r----- 1 root ssh_keys  480 Apr 13 06:51 /etc/ssh/ssh_host_ecdsa_key
-rw-r----- 1 root ssh_keys  387 Apr 13 06:51 /etc/ssh/ssh_host_ed25519_key
-rw-r----- 1 root ssh_keys 2578 Apr 13 06:51 /etc/ssh/ssh_host_rsa_key

相關內容