Ssh

SSH:在 IP 命名空間中打開的 shell

  • April 1, 2021

我試圖強制通過 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

我想知道是否可以使用掛載和/或使用者名稱空間(除了網路名稱空間)來更巧妙地解決它。我沒有這些經驗。

可能有更好的方法來實現這一點,我會對其他人的想法非常感興趣。

引用自:https://unix.stackexchange.com/questions/238403