ホスティングプロバイダに関係なく、汎用ソリューションが必要ですが、AWSでVPSを実行しています。
このVPSは、SSHを介してさまざまな他のボックスにアクセスする(リバースSSHを介してジャンプボックスに接続する)など、さまざまな内部サーバーのジャンプボックス(CentOS 6を実行)として機能します。 Jump Box は、各サービスに対してランダムな親ポートを公開します。
現在、SSHを介してジャンプボックスに接続されているIPアドレスにのみこれらの親ポートを公開できますか?
出力をスキャンしてwho -a
IPアドレスをフィルタリングし、IPTABLES
cronjobを使用して更新するか、APIを使用してAWSのセキュリティグループを更新することを検討しています。しかし、このアプローチは粗雑に見えます。どんな提案がありますか?
答え1
SSH接続を開始するときに宛先/ポートを知っている場合
ssh -L 8080:10.0.0.1:80 <JumpBox address>
理想的には、現在見ている場所に似たものを使用してJumpBoxに接続することをお勧めします。10.0.0.1 ファイアウォール/ NATの背後にありますが、JumpBox経由でアクセスできます。。
これにより、接続が作成され、127.0.0.1(localhost)にバインドされるため、ブラウザ(または他のソフトウェア)クライアントから接続してhttp://localhost:8080あなたのパケットは次のアドレスにルーティングされます。10.0.0.1:80これはJumpBox自体から直接アクセスするのと同じです。
[ssh] 接続時にポート番号/対象がわからない場合
SOCKS / SOCKS 5プロキシを使用するように構成されたクライアントでは、接続されたクライアントにサーバーにアクセスできるすべてのリソースへのアクセス権を提供できることに注意することが重要です。
「動的転送」を使用してVPSに接続する
ssh -D 1080 <JumpBox address>
- SOCKSプロキシサーバーを使用するようにクライアントソフトウェアを構成する
localhost:1080
- 設定されたソフトウェアを介して行われた接続は、JumpBox自体からターゲットに接続するかのようにトンネルされます。
答え2
以下を使用して説明したシステムを構築できます。iptables、IPセットそしてpam_exec。
アイデアは次のとおりです。着信トラフィックがより高いポートに到達することを可能にするルールを持つ別々のチェーンがあります。 iptables INPUTチェーンにIPセットログインしたホストと一致するルールは別のチェーンに移動します。ログインに成功すると、pam_execはPAMセッションが開かれたときに設定されたipsetにリモートホストのIPアドレスを追加し、PAMセッションが閉じられたときにそれを削除するスクリプトを実行します。
IPTABLESとIPSETの設定
ユーザーのIPアドレスのグループを作成します。 ipsetは永続的ではないため、iptableを復元する前に起動時に作成するように設定する必要があります。
ipset -N users hash:ip
iptableを設定します。新しいINPUT-users
チェーンには、ログインしたユーザーにトラフィックを許可するルールが含まれています。
iptables -N INPUT-users
ソースアドレスが設定されている場合はチェーンusers
にジャンプします。INPUT-users
iptables -A INPUT -m set --match-set users src -j INPUT-users
INPUT-users
チェーンに関連ルールを追加します。これらのルールは、送信元アドレスがユーザーアドレスと一致するトラフィックに使用されます。たとえば、tcp
ポートを許可します16384
。
iptables -A INPUT-users -p tcp --dport 16384
PAMの設定
pam セッションが開いたり閉じたりしたときに実行される次のスクリプトを作成します。 IP アドレスはPAM_RHOST
環境変数に設定されます。pam_exec
。
/etc/security/pam_exec-session_open
:
#!/bin/sh
ipset --exist --add users "$PAM_RHOST"
/etc/security/pam_exec-session_close
:
#!/bin/sh
ipset --del users "$PAM_RHOST"
次に、SSHセッションでそれを使用するようにpamを構成します。に接続する/etc/pam.d/sshd
:
session optional pam_exec.so type=open_session /etc/security/pam_exec-session_open
session optional pam_exec.so type=close_session /etc/security/pam_exec-session_close
罠
ユーザーが複数のSSHセッションを開いている場合は、そのいずれかを閉じるとipsetからIPアドレスが削除されます。これを防ぐには、IPアドレスがユーザーの最後の残りのセッションである場合にのみIPアドレスを削除するようにsession_closeスクリプトのいくつかのチェックを作成する必要があります。
ユーザーがNATの後ろに接続している場合、同じNATの後ろに接続しているすべての人はipsetルール(アクセス許可)と一致します。