web-dev-qa-db-ja.com

EC2でhttp://169.254.169.254 APIを介して認証情報の盗用を防ぐにはどうすればよいですか?

AWSには インスタンスメタデータ と呼ばれる機能があり、EC2では AWS資格情報へのアクセス をHTTP呼び出しで提供します。

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/<role>

この機能自体は意図的なものであり、技術的には脆弱性ではありません。リスクは ドキュメント にも記載されています:

IAMロールでインスタンスメタデータを使用するサービスを使用する場合は、サービスがHTTP呼び出しを行うときに認証情報を公開しないようにしてください。資格情報を公開する可能性のあるサービスの種類には、HTTPプロキシ、HTML/CSS検証サービス、およびXMLの組み込みをサポートするXMLプロセッサが含まれます。

攻撃者がアプリケーションをだましてそのような要求を出し、応答を出力できない限り、これは確かに便利な機能です。残念ながら、これは 一般的な攻撃元 です。

もちろん、サーバーは以前にすべてのURLを適切に検証する必要がありますが、 (defense in depth )の精神で、それを無効にしたり、起動時にのみ(ポートを開く前に)許可したりできるのではないかと思います。 )。

質問:

  • 機能を無効にすることは技術的に可能ですか?言い換えれば、http://169.254.169.254/はブロックされていますか?
  • 技術的に可能である場合、それをブロックすることに欠点はありますか?
  • APIの安全な部分にアクセスできるが、重要な部分にはアクセスできない方法はありますか?多分特定のパスをホワイトリストに登録することによって?たとえば、 /meta-data/spot/instance-action は、EC2スポットインスタンスの終了がスケジュールされているかどうかを示します。
1
Philipp Claßen

Linuxを使用しているため、iptablesを使用してこれを実行できます。特定のUIDが特定のリクエストを行うのをブロックすることが可能です。 https://unix.stackexchange.com/questions/104830/block-specific-application-with-iptables 、または https://www.cyberciti.biz/tips/blockを参照してください。 -outgoing-network-access-for-a-single-user-from-my-server-using-iptables.html (後者はかなり古いですが、私はまだ正しいと思います)。

私があなたの場合にどうするか:そのIPアドレスに対して、サーバー/プロセスが実行するUIDからネットワーク出力を削除するルールを追加します。すべてを同じユーザーとして実行しない場合は、メタデータサービスにアクセスする他のプロセスを中断させずに、その特定のエンドポイントのSSRFまたは同様の問題を回避できます。

iptables -I OUTPUT -d 169.254.169.254 -m --uid-owner <UID or maybe username> -j DROP

これ(私は思う;テストされていません):

  • ルールをOUTPUTチェーンの先頭に追加します(送信パケットに使用されます)
  • 169.254.169.254にバインドされているパケットにフィルターします。
  • プロセスから発信されたパケットのみを指定された所有者と照合します(これが実際のUIDと有効なUIDのどちらをチェックするかは不明ですが、とにかくより高い特権をできるだけ早く削除する必要があります)
  • 床に落とします。
2
CBHacking