SSHクライアントのアドレス以外へのユーザーネットワークアクセスをブロックする

SSHクライアントのアドレス以外へのユーザーネットワークアクセスをブロックする

Linux サーバーで、特定のユーザー グループが SSH 経由でログインできるように権限を設定するにはどうすればよいでしょうか。ただし、接続が SSH クライアント アドレスに戻らない限り、そのユーザーのプロセスによるすべてのネットワーク接続はブロックされます。たとえば、グループ内のユーザーが SSH でログインして HTTP サーバー (高ポート) を起動し、SSH クライアントを実行しているコンピューターからそのサーバーに接続できるようにしたいのですが、インターネット上の他のクライアントは HTTP サーバーにアクセスできないようにする必要があります。

iptables を使用してユーザーのネットワーク アクセスを完全にブロックできることはわかっていますが、 の値に応じて送受信されるトラフィックを許可するにはどうすればよいでしょうか$SSH_CLIENT

答え1

1つの方法としては、ログイン時にiptablesを変更するsuidスクリプトを実行させることです。引数を渡す必要はなく、単に呼び出すだけです。.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

これらのチェーンは、フィルターの INPUT チェーンと OUTPUT チェーンの適切な場所に配置されます。もちろん、--owner-uid を使用して以前のルールも削除します。必要に応じて、特定のポートのみを許可することもできます。

このようなスクリプトには、汚染モードを備えた Perl が適しているはずです。

これにより、SSH 接続が切断された後も、そのユーザーのネットワークが維持されます。これが問題になる場合は、接続された SSH 接続を定期的にチェックし、それに関連付けられていないルールを削除する cronjob またはデーモンを使用して解決できます。

この回答には「できること」がたくさんあることはわかっていますが、そのほとんどは地味な作業です。-m owner を正しく実行してください。

関連情報