我在內部網路中有一台伺服器(透過 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
:
# /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
列出文件中授權客戶端的主機名稱。如果不存在則手動建立。該文件的語法幾乎與中記錄的相同人主機.equiv(5), 然而SSH 守護程式不接受空主機名。
# /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
:
# /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