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_config
defaultなど、各ファイルのアクセス制御を追加します/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
スクリプトにあります。