Cloud9インスタンスをInspector v2でスキャンしてみた

2022.09.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、こんにちは。

AWS事業本部コンサルティング部の芦沢(@ashi_ssan)です。

同僚から「Cloud9インスタンスはInspector v2でスキャンできるらしいよ」という話を聞いたため、実際にやってみました。

いきなりまとめ

  • パブリックサブネットに作成したCloud9インスタンスは、Inspector v2でスキャンできる
    • InternetGateway向けに22番ポートが解放されているという検出結果が検知される
  • プライベートサブネットに作成したCloud9インスタンスは、Inspector v2でスキャンできない
    • Inspector v2はSystems Manager Agentを利用してスキャンを行うが、プライベートサブネットに配置したCloud9インスタンスはAWS managed temporary credentials(AMTC)の制約でSystems Managerエンドポイントとの疎通ができない(=スキャンができない)ため

やってみた

まずはInspector v2を有効化します。

Inspector v2の有効化については、こちらのブログを参考に実施してください(数クリックで終わります)

続いて、Cloud9環境をセットアップします。

Cloud9の作成方法や作成時の詳しい手順については、こちらのブログを参考にしてみてください。

Cloud9は作成時のオプションの指定で、以下の2つの方法のどちらの経路からCloud9インスタンスに接続するかを選択できます。1

  • EC2インスタンスにSSH(22番ポート)で接続する(以降Ingressありと称します)
  • EC2インスタンスにSystems Manager経由で接続する(以降Ingressなしと称します)

また、作成するサブネットの指定が可能なので、どのサブネット(パブリック/プライベート)にCloud9インスタンスを配置するのか選択できます。

今回はそれぞれの選択肢を組み合わせた以下の4つのパターンで検証してみました。

  • A. パブリックサブネットに配置 & Ingressあり
  • B. パブリックサブネットに配置 & Ingressなし
  • C. プライベートサブネットに配置 & Ingressあり
  • D. プライベートサブネットに配置 & Ingressなし

以降が検証内容となります。

A.パブリックサブネット & Ingressあり

Cloud9起動時にEnvironment type オプションは Create a new EC2 instance for environment (direct access)を選択し、インスタンスを作成するサブネットはパブリックサブネットを選択します。

インスタンスの作成が完了すると、Inspector v2のスキャンが自動で実行されます。

スキャンが完了すると、インスタンス別にスキャン結果が表示されます。

今回は1件、Port 22 is reachable from an Internet Gatewayという検出結果が出力されていました。

検出結果をクリックすると、結果の具体的な内容が確認できます。

Cloud9をパブリックサブネットで起動したため、Internet GatewayへのアウトバウンドのSSH(22番)ポートが解放されていることからこの検出結果を検知したと想定できます。


また、以下のようにInspector v2コンソール上のインスタンスのステータスがアンマネージドインスタンスと表示されています。

この原因は、作成したサブネットはパブリックサブネットなのでアウトバウンドの通信経路は確保できていますが、Cloud9インスタンスにIAMロールが付与されておらず、Systems Managerからマネージドインスタンスとして認識されていないことに起因します。

Cloud9をaccess via Systems Managerオプションで作成すると自動付与されるインスタンスプロファイル(AWSCloud9SSMInstanceProfile)と権限が同等のIAM Roleをアタッチしたところ、マネージドインスタンスであると認識され、スキャンと表示されるようになりました。

B.パブリックサブネット & Ingressなし

Cloud9起動時に、Environment type のオプションで Create a new no-ingress EC2 instance for environment (access via Systems Manager)を選択し、インスタンスを作成するサブネットはパブリックサブネットを選択します。

こちらの設定でインスタンスを起動すると、以下のようなエラーが出力され、Cloud9インスタンスが正常に起動できません。

今回は、Ingressなしオプションを指定したため、Ingressありオプションで設定されていた、特定CIDR(18.179.48.96/27,18.179.48.128/27)からのインバウンドルールが設定されていません。

セキュリティグループを変更したところ接続は可能になりました。

ですが、オプションで指定した設定ではインスタンスは起動しないため、Inspector v2によるスキャンを走らせることができない、との結論とします。

※Cloud9作成時のオプションの指定による設定差については、こちらのブログを参考にしました。

C.プライベートサブネット & Ingressあり

Cloud9起動時にEnvironment type オプションは Create a new EC2 instance for environment (direct access)を選択し、インスタンスを作成するサブネットはプライベートサブネットを選択します。

こちらの設定でインスタンスを起動すると、以下のようなエラーが出力され、Cloud9インスタンスが正常に起動できません。

プライベートサブネットにインスタンスを作成すると、Internet Gatewayからの22番ポートのインバウンドの通信経路が確保できなくなるため、22番ポートでの直接アクセスができなくなりエラーとなったと想定します。

Ingressなしオプションとの差分は、インスタンスプロファイルAWSCloud9SSMInstanceProfileのアタッチの有無です。

インスタンスプロファイルを設定したところ、インスタンスは正常に起動しました。

こちらの設定もオプションで指定した設定ではインスタンスは起動しないため、Inspector v2によるスキャンを走らせることができない、との結論とします。

D.プライベートサブネット & Ingressなし

Cloud9起動時に、Environment type のオプションで Create a new no-ingress EC2 instance for environment (access via Systems Manager)を選択し、インスタンスを作成するサブネットはプライベートサブネットを選択します。

Cloud9起動時のNetwork Settingsの設定でプライベートサブネットを選択すると、以下のようなメッセージが表示されていますが、

こちらもインスタンスの作成が完了すると、Inspector v2のスキャンが自動で実行されますが、スキャン時に内部エラーとなってしまい検知結果を確認することができませんでした。

なぜ内部エラーとなったのか?

原因は、Cloud9がAWS CLIを利用する際に発行する一時クレデンシャルであるAWS managed temporary credentials(AMTC)による制約によるものだと思われます。

Cloud9インスタンスは一般的なEC2インスタンスと異なり、作成されたサブネットがパブリック/プライベート問わずグローバルIPが付与され、AWS APIコールの送信元IPアドレスが このグローバルIPアドレスに制限 されているため、プライベートサブネット上から外部へAPIコールを実行すると方法を問わず(NAT Gateway経由でもVPCエンドポイント経由でも)APIコールが失敗してしまいます。

この辺りのCloud9のネットワーク的な制約については、以下のブログにわかりやすくまとめられています。

まとめ

  • パブリックサブネットに作成したCloud9インスタンスは、Inspector v2でスキャンできる
    • InternetGateway向けに22番ポートが解放されているという検出結果が検知される
  • プライベートサブネットに作成したCloud9インスタンスは、Inspector v2でスキャンできない
    • Inspector v2はSystems Manager Agentを利用してスキャンを行うが、プライベートサブネットに配置したCloud9インスタンスはAWS managed temporary credentials(AMTC)の制約でSystems Managerエンドポイントとの疎通ができない(=スキャンができない)ため

結論として、Inspctor v2でスキャンできるCloud9インスタンスの設定はA.パブリックサブネット & Ingressありのみである、とわかりました。

AMTCの制約があるためInspector v2によるスキャンが必要な場合は、プライベートサブネットではなくパブリックサブネットでCloud9インスタンスを作成する必要がある、と覚えて帰っていただければと思います。

以上、AWS事業本部コンサルティング部の芦沢(@ashi_ssan)でした。


  1. Cloud9にはもう1つのオプションSSH Connectionがありますが、このオプションは既存のCloud9インスタンスもしくは既存のEC2インスタンスを利用したSSHでログイン可能なリモート環境を作成するためのオプションです。他のオプションとは少し異なるものなので今回の検証では利用しませんでした。Cloud9のSSH connectionオプションについてはこちらのAWS公式ドキュメントをご覧ください。