SSH:在 IP 命名空間中打開的 shell
我試圖強制通過 SSH 登錄的使用者在 IP 命名空間中有一個 shell。
我試過用
/etc/passwd
類似的東西替換外殼,ip netns exec sshns /bin/bash
但沒有用。還有其他想法嗎?有可能嗎?它是安全的還是根本不安全?
通過更改登錄 shell 來處理這個問題,如 OP 的範例所示,當使用者連接到
sshd
主網路名稱空間時,即使您讓他們的 shell 在另一個名稱空間內執行,但他們的埠轉發無論如何都會在預設網路名稱空間中執行.我提出的解決方案還解決了包含到命名空間和外殼的埠轉發問題。它可能僅限於使用本地帳戶,因為通過網路(NIS、SMB 等)對遠端系統進行身份驗證可能不起作用,因為身份驗證階段將在網路命名空間內執行。
我需要 shell 和埠轉發才能在目標命名空間中執行,而無需在預設命名空間和包含的命名空間之間創建網路/路由。
以下是一些實現此目的的方法/工具:
xinetd
- 感謝 Stéphane Chazelas 指出這一點。對於單個或靜態數量的命名空間並將其轉發給它們xinetd
似乎是更好的選擇。例如文件/etc/xinetd.d/sshd-netns-foo
service sshdnetns { type = UNLISTED socket_type = stream protocol = tcp port = 222 wait = no user = root server = /sbin/ip server_args = netns exec NameSpaceName /usr/sbin/sshd -i }
socat
- 對於需要獨立啟動/停止轉發給它們的多個命名空間socat
是一個很好的選擇。在預設命名空間中執行:socat tcp-listen:222,fork,reuseaddr \ exec:'ip netns exec NameSpaceName /usr/sbin/sshd -i',nofork
ncat
- 如果socat
不可用,那麼ncat
(在我的 RHEL 盒子上nc
)可以完成這項工作。缺點ncat
是通過管道而不是直接連接到套接字,因此sshd
看不到客戶端 IP,因此日誌的用處不大。您最終還會執行一個額外的中間過程。ncat``sshd``ncat
ncat --keep-open --sh-exec "exec ip netns exec NameSpaceName /usr/sbin/sshd -i" -l 222
可能還有其他工具。
sshd -i
這在自定義埠 222 上的預設命名空間中接受 SSH 連接,並且每個連接在目標命名空間內啟動一次。這為我解決了這個問題,但是您還需要限制可以登錄到每個命名空間的使用者。創建一個命名空間特定的 sshd 配置:
mkdir -pv /etc/netns/NameSpaceName/ cp -Rp /etc/ssh /etc/netns/NameSpaceName/
為每個文件添加訪問控制
sshd_config
,例如預設/etc/ssh/sshd_config
:AllowUsers user1 user2
…並且在
/etc/netns/NameSpaceName/ssh/sshd_config
AllowUsers restrictedUser1 restrictedUser2
…也看看
AllowGroups
指令現在重新創建名稱空間以使 dir 綁定生效
我的簡短測試顯示使用者訪問控制按預期工作,但我並沒有真正使用它,所以它需要你來驗證。
我嘗試將單獨
/etc/passwd
的 ,/etc/shadow
和/etc/group
文件放入/etc/netns/NameSpaceName/
以獲得單獨的使用者列表,但在我的快速測試中不起作用:useradd test
命名空間內失敗。筆記:
如果您不喜歡自定義埠,您可以使用雙主埠,例如 macvlan,或者只需添加另一個 IP 地址並監聽專用 IP 上的預設埠。
所有的身份驗證、shell、子系統、埠轉發等都由我處理,
sshd
所以我不必破解其他任何東西。它確實有
sshd -i
這樣執行的缺點,請閱讀man sshd
查找-i
選項。您可以通過在命名空間內執行完整時間sshd
並將轉發守護程序更改為如下內容來輕鬆解決它:nc --keep-open --sh-exec "exec ip netns exec NameSpaceName nc localhost 22" -l 222
我想知道是否可以使用掛載和/或使用者名稱空間(除了網路名稱空間)來更巧妙地解決它。我沒有這些經驗。
可能有更好的方法來實現這一點,我會對其他人的想法非常感興趣。