web-dev-qa-db-ja.com

AWS ELBでIPアドレスを拒否する

私は多かれ少なかれ、AWSの構成に従っています:

3台のマシンと3つの異なる可用性ゾーンを備えたElastic Load Balancer。私のセキュリティグループでは、私のRailsアプリケーション(nginx、Unicorn))であるため、0.0.0.0/0:80を許可しています。

特定のパブリックIPアドレスへのアプリへのアクセスを拒否する方法があるかどうか疑問に思っていましたか?私はAWSのドキュメントを読んでいますが、SGは「すべて拒否」なので、1つだけ特定のIPアドレスを拒否する方法はありません。

何か案は?ロードバランサーの背後にある3台のマシンのiptables?

ありがとう!

8
boris quiroz

簡単な解決策は、VPCネットワークACL受信ルールを使用することです。これは、ELBがVPC内にある場合にのみ機能しますが、過去数年間に作成した場合は、デフォルトのELBになるはずです。

たとえば1.2.3.4を禁止するには、次のようにします。

  1. AWSにログインします。
  2. VPCに移動します。
  3. 左側のメニューからNetwork ACLsを選択します。
  4. ELBがあるVPCに関連付けられているACLを選択します。
  5. Inbound Rulesタブを選択します。
  6. Editを選択し、次の属性を持つ新しいルールを追加します。
    • ルール番号:50(ALLから許可するルールよりも小さい限り、任意の数)
    • タイプ:すべてのトラフィック
    • プロトコル:ALL
    • ポート範囲:ALL
    • 出典:1.2.3.4/32
    • 許可/拒否:拒否

ネットワークACLについてのより多くの情報がここにあります: http://docs.aws.Amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html

15
Tama

そのためには、あなたが言ったように、3つの異なるマシンのIPtablesが最善の解決策です。

実際には、リモートIP(Nginxでは$remote_addr)はAmazonのロードバランサーからのものになるため、これは良い解決策ではありません。これを禁止すると、転送されるすべてのトラフィックが禁止されます。

パケットを検査してHTTP X-Forwarded-Forヘッダーを見つける必要があります。IPtablesはそのようなプロトコルに対応していません。

私はNginxの2つのいたずらなIPに対する次の解決策に落ち着きました

set $client_ip $remote_addr;
if ($http_x_forwarded_for) {
  set $client_ip $http_x_forwarded_for;
}

if ($client_ip = "123.123.123.123") {
  return 403;
}

if ($client_ip = "123.123.123.234") {
  return 403;
}

変数$client_ipの紹介。これは、http_x_forwarded_forが利用できない場合に、ローカルでこれをテストできるようにするためです。

少し話題から外れていますが、便宜上投稿していますが、そのクライアントIPをアクセスログに追加しました。

log_format main "\$client_ip - \$remote_user [\$time_local] \"\$request\" \$status \$body_bytes_sent \"\$http_referer\" \"\$http_user_agent\"";
access_log /var/log/nginx.access.log main;

それはきれいではありませんが、それが役に立てば幸いです

1
kvz

いいえ、セキュリティグループでIPをブロックするオプションはありません。

セキュリティグループは、ブラックリストではなく、基本的にホワイトリストです。

デフォルトではすべてが拒否されており、必要に応じて選択的にポートを開くことができますが、特定の人物/ IPをブロックすることはできません。

そのためには、あなたが言ったように、3つの異なるマシンのIPtablesが最善の解決策です。

今後、AWSセキュリティグループにもこの機能が追加されると確信していますが、現時点ではサポートされていません。

1
Napster_X

いくつかのIPのみをブラックリストに登録する必要がある場合は、おそらくWebサーバーで nginx_http_access_module を使用できます。

1
Sebastian Cruz