sshedユーザーにのみパブリックポートを公開します。

sshedユーザーにのみパブリックポートを公開します。

ホスティングプロバイダに関係なく、汎用ソリューションが必要ですが、AWSでVPSを実行しています。

このVPSは、SSHを介してさまざまな他のボックスにアクセスする(リバースSSHを介してジャンプボックスに接続する)など、さまざまな内部サーバーのジャンプボックス(CentOS 6を実行)として機能します。 Jump Box は、各サービスに対してランダムな親ポートを公開します。

現在、SSHを介してジャンプボックスに接続されているIPアドレスにのみこれらの親ポートを公開できますか?

出力をスキャンしてwho -aIPアドレスをフィルタリングし、IPTABLEScronjobを使用して更新するか、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に接続する

  1. ssh -D 1080 <JumpBox address>
  2. SOCKSプロキシサーバーを使用するようにクライアントソフトウェアを構成するlocalhost:1080
  3. 設定されたソフトウェアを介して行われた接続は、JumpBox自体からターゲットに接続するかのようにトンネルされます。

答え2

以下を使用して説明したシステムを構築できます。iptablesIPセットそして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ルール(アクセス許可)と一致します。

関連情報