SSH:IP名前空間でシェルを開く

SSH:IP名前空間でシェルを開く

SSHを介してログインしたユーザーがIP名前空間内にシェルを持つように強制しようとしています。

/etc/passwdシェルを似たようなものに置き換えようとしましたが、ip netns exec sshns /bin/bash成功しませんでした。

別のアイデアがありますか?可能ですか?安全ですか、それとも全く安全ではないでしょうか?

答え1

これを処理するためにログインシェルを変更するときの問題(OPの例のように)は、ユーザーがプライマリsshdネットワークネームスペースに接続しているときにシェルが別のネームスペース内で実行されていても、そのポート転送がプライマリネットワークで実行され続けるということです。です。名前空間。

私が思いついたソリューションは、名前空間とシェルへのポート転送の問題も解決しました。認証フェーズはネットワークネームスペース内で実行されるため、ネットワーク(NIS、SMBなど)を介したリモートシステムの認証が機能しない可能性があるため、ローカルアカウントの使用に制限される可能性があります。

ターゲット名前空間で実行するには、シェルとポートの転送が必要です。デフォルトの名前空間と埋め込まれた名前空間の間にネットワーク/パスを作成する必要はありません。

これを達成するためのいくつかの方法/ツールは次のとおりです。

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(My RHELボックスでnc)操作を実行します。欠点ncatは、sshd接続がncatソケットに直接接続されず、パイプで接続されているため、sshdクライアントIPが表示されず、ログの使いやすさが低下することです。また、追加の中間プロセスを実行します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_configdefaultなど、各ファイルのアクセス制御を追加します/etc/ssh/sshd_config

AllowUsers user1 user2

...そして/etc/netns/NameSpaceName/ssh/sshd_config

AllowUsers restrictedUser1 restrictedUser2

AllowGroups...指示も見てください

これで、ディレクトリバインディングを適用するための名前空間を再作成します。

簡単なテストの結果、ユーザーアクセス制御が期待どおりに機能することがわかりましたが、実際には使用しませんので、直接確認してください。

/etc/passwd別々のファイルとファイル/etc/shadowを別々のユーザーリスト/etc/groupに入れようとしましたが、/etc/netns/NameSpaceName/クイックテストでは機能しませんでした。useradd test名前空間内で失敗しました。

メモ:

カスタムポートが気に入らない場合は、macvlanなどのデュアルマスターポートを使用するか、別のIPアドレスを追加して専用IPのデフォルトポートでリッスンできます。

すべての認証、シェル、サブシステム、ポート転送などが処理されるため、sshd他のものをハッキングする必要はありません。

sshd -iこれを行うには欠点があります。オプションをman sshd見つけるために読んでください-i。名前空間内でフルタイムで実行し、sshd転送デーモンを次のように変更すると、問題を簡単に解決できます。

nc --keep-open --sh-exec "exec ip netns exec NameSpaceName nc localhost 22" -l 222

マウントおよび/またはユーザーネームスペース(ネットワークネームスペースに加えて)を使用してこの問題をよりきれいに解決できるかどうか疑問に思います。私はこれの経験がありません。

これを達成するより良い方法があるかもしれませんし、私は他の人の考えに非常に興味があります。

答え2

引数なしで、ユーザーシェルを単一のコマンドのフルパス名にのみ設定できます。

複数のコマンドまたはパラメータを持つコマンドを実行するには、シェルスクリプトを作成して実行可能にし、ユーザーのシェルをスクリプトに設定します。

例えば

printf '#!/bin/sh\n%s\n' 'exec ip netns exec sshns /bin/bash "$@"' > /usr/local/bin/myshell.sh
chmod a+rx /usr/local/bin/myshell.sh
chsh -u user -s /usr/local/bin/myshell.sh

ip netns exec sshns /bin/bash動作しているかわかりません。まだテストしていません。有効なコマンドのようには見えませんが、有効なコマンドであるか、1つを思い出すことができるとします。つまり、ユーザーのシェルが機能するようにシェルスクリプトを使用してテストしました。ただexec /usr/bin/zshスクリプトにあります。

関連情報