👌

[AWS]クロスアカウント設定の外部IDについて簡単にまとめてみた

2022/01/15に公開

外部ID利用でハッピー02

マネジメントコンソールにてクロスアカウント用のIAMロールを作成時に、外部IDを必須にするか設定することができます。

この外部IDですが、主にサードパーティー製品からのアクセスを許可するときに利用し、公式では「混乱した代理問題」と呼ばれる課題を解決するために利用するそうです。

「外部IDを指定することで意図していない不正なユーザーからのアクセスを防ぐことができる」

という説明で終わっているサイトが多いのですが、実際にどのように不正なアクセスを防ぐことになるのかイメージが出来なかったためまとめることにしました。

特に、「サードパーティ製品からのアクセス」のところがイメージしづらかったので、今回は『EC2コストチェックくん』というサードパーティ製品を妄想して考えてみました。

外部ID無しで利用する場合

今回は『EC2コストチェックくん』を元に考えてみました。

『EC2コストチェックくん』の仕様は一応、以下のようなものだと考えます。

  • 自分のAWSアカウントでEC2が月額いくら掛かるか調べることができる
  • インスタンスごとのコストを算出し、コストの降順でインスタンス名を見ることが出来る

まず、正しいユーザーが利用する場合です。
以下の流れで『EC2コストチェックくん』を利用します。

正しいユーザーが利用する場合

  1. 正しいユーザーは自分のAWSアカウント上に、『EC2コストチェックくん』用のロールを用意する。ここでは『EC2コストチェックくん』のAWSアカウントが作成したロールを使えるように信頼関係ポリシーを設定する。
    混乱した代理問題00

  2. 『EC2コストチェックくん』からロールのARNを聞かれるので、応える。
    混乱した代理問題01

  3. 『EC2コストチェックくん』が一時的にロールの権限を手に入れて、EC2の情報を得ることが出来る。
    混乱した代理問題02

  4. 画面に欲しかった情報が表示される。
    混乱した代理問題02

不正なユーザーが利用する場合

  1. 『EC2コストチェックくん』を利用しているユーザーのAWSアカウントIDを手に入れる。
    不正ユーザー1

  2. ロール名は予想しやすいので、いくつか試してみる。
    不正ユーザー2

  3. ロール名が的中し、コストチェックくんは情報を取りに行く。
    不正ユーザー3

  4. 不正なユーザーの画面に、利用者の情報が表示される。
    不正ユーザー4

外部IDを利用しない場合では、以上のように不正なユーザーに簡単に情報を見られてしまいました。
今回はEC2のコストを見られるだけだったので被害は少ないかもしれませんが、酷い場合を想定すると勝手にEC2が起動されたり、高額なサービスを利用されたり、環境が消されたりするかもしれません。
このようなことが起こらないために、外部IDを利用します。

外部IDを利用する場合

外部IDを利用する場合、『EC2コストチェックくん』の仕様を変更し、ユーザーごとに外部IDを作成するようにします。
この外部IDを『EC2コストチェックくん』の内部で持つことで、特定のユーザーは必ず特定の外部IDを利用してユーザーのIAMロールを使用しにいきます。
流れは以下のようになります。

正しいユーザーが利用する場合

  1. 正しいユーザーは自分のAWSアカウント上に、『EC2コストチェックくん』用のロールを用意する。ここでは『EC2コストチェックくん』のAWSアカウントが作成したロールを使えるように信頼関係ポリシーを設定する。
    さらに、『EC2コストチェックくん』から外部IDを指定されるので、こちらを信頼関係ポリシーに含めて、指定された外部ID以外からはロールを使えないようにする。

外部ID利用でハッピー01

  1. 『EC2コストチェックくん』が外部IDをたずさえてIAMロールを利用しに行く。信頼関係ポリシーが外部IDが正しいか判断する。
    外部ID利用でハッピー02

  2. 『EC2コストチェックくん』が一時的にロールの権限を手に入れて、EC2の情報を得ることが出来る。
    混乱した代理問題02

  3. 画面に欲しかった情報が表示される。
    混乱した代理問題02

以上の通り、外部IDをサードパーティ製品のアプリ側で持っていることで、指定された外部IDを持っていなければIAMロールを使うことが出来なくなります。
不正アクセスの止め方も見ていきましょう。

不正なユーザーが利用する場合

  1. 『EC2コストチェックくん』を利用しているユーザーのAWSアカウントIDを手に入れる。
    外部ID利用で苦汁をなめる1

  2. ロール名は予想しやすいので、いくつか試してみる。
    外部ID利用で苦汁をなめる2

  3. ロール名が的中し、コストチェックくんは情報を取りに行く。
    しかし、実はコストチェックくんは「external-2」という外部IDを内部で持っており、これを携えていく。
    信頼関係ポリシーで不正な外部IDであることがばれてしまい、情報を取ってこれない。

外部ID利用で苦汁をなめる3

  1. 不正なユーザーの画面には、何も表示されることが無い。
    外部ID利用で苦汁をなめる4

このように、不正なユーザーは強制的に別の外部IDを使うことになるため、不正に別アカウントの情報を取ってくることができなくなりました。

おわりに

とても細かい話ですが、サードパーティ製品を使う際のクロスアカウント、スイッチロールのイメージが付かなかったのでまとめさせていただきました。
また、パッと分からなかったAWS関連の記事を書いていこうと思います。

Discussion