阻止用戶網路訪問,除非返回 ssh 用戶端位址

阻止用戶網路訪問,除非返回 ssh 用戶端位址

在Linux伺服器上,如何設定權限,以便允許特定群組的使用者透過ssh登錄,但其進程的所有網路連線都被阻止,除非連線返回ssh客戶端位址。例如,我想允許群組中的使用者透過 ssh 登入並啟動 HTTP 伺服器(在高連接埠上),然後從執行 ssh 用戶端的電腦連接到該伺服器,但互聯網上的任何其他用戶端都必須無法存取 HTTP 伺服器。

我知道我可以使用 iptables 完全阻止用戶的網路訪問,但是如何允許來自或流向任何值的流量$SSH_CLIENT

答案1

您可以做的一件事是讓他們運行一個 suid 腳本,該腳本在登入時修改 iptables。他們不需要向其傳遞任何參數,只需調用它即可。 .bash_login 可以自動呼叫它。它可以執行 lsof 來取得與其父級 UID 關聯的 ssh 連線的 IP,取得連線的 IP,然後使用下列規則將該 IP 列入白名單

iptables -w -A users_input -p tcp -s $ip -m owner --owner-uid $owner -j ACCEPT
iptables -w -A users_output -p tcp -d $ip -m owner --owner-uid $owner -j ACCEPT

這些鏈被放置在過濾器輸入和輸出鏈中適當的位置。當然,也要刪除任何先前的規則 --owner-uid。如果您願意,您可以只允許某些連接埠。

帶有污點模式的 Perl 應該適合這樣的腳本。

這將允許該用戶在 ssh 連線中斷後繼續保持網路連線。如果這是一個問題,您可以使用 cronjob 或守護程序來解決該問題,該守護程序會定期檢查已連接的 ssh 連接,然後刪除與它們無關的任何規則。

我意識到這個答案中有很多“你可以做”,但大部分都是繁重的工作。只要把 -m 所有者的東西弄對就可以了。

相關內容