NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

注目のタグ

    Systems ManagerでEC2をポートスキャンしてみた

    はじめに

    こんにちは!山本です!
    普段はインフラエンジニアとして基盤構築や保守運用の業務を行っています。
    まだまだ駆け出しエンジニアなので日々知識を吸収し、刺激の多い日々を送っています。 自己研鑽にてセキュリティに関する資格勉強を進める中で攻撃手法の一つとしてポートスキャンを学びました。
    近年、ポートスキャンはますます巧妙化し特にIoT機器や家庭用ルーターなどが標的にされることが増えています。
    そこで今回はその学びをアウトプットしつつ、実際の攻撃対策として実践してみようと思います。
    具体的にはAWS Systems Managerを活用して、自サーバのポートスキャンを行う方法を紹介します。

    ※以前はポートスキャンなどのペネトレーションテストを行う際にはAWSへの事前申請が必要でしたが、現在は許可されたAWSサービスについては不要になっています。

    AWS のお客様は、[Permitted Services] (許可されたサービス) の下の次のセクションに記載されているサービスについて、事前の承認なしに AWS インフラストラクチャのセキュリティ評価またはペネトレーションテストを実行できます。
    ペネトレーションテスト(侵入テスト)- AWS セキュリティ|AWS

    今回やりたいこと

    AWS Systems ManagerのRun Commandを使って、サーバのポートスキャンを実施したい!

    AWS Systems Managerとは

    AWS Systems Manager(以後、SSM)はAWSリソースの管理と運用を一元化するためのサービスです。これにより、インフラストラクチャの管理が簡素化され運用効率が向上します。
    今回はSSMの機能の一つである、Run Commandを使用していきます。
    AWS Systems Manager とは - AWS Systems Manager

    Run Commandとは

    Run Commandは、リモートでインスタンスに対してコマンドを実行するための機能です。これにより、サーバーや仮想マシンに直接アクセスすることなく管理タスクを効率的に実行できます。
    AWS Systems Manager Run Command - AWS Systems Manager

    ポートスキャンとは

    ポートスキャンは攻撃者が攻撃の準備として実施する手法であるとともに、ネットワークセキュリティの評価や管理において重要な手法です。これはコンピュータやネットワークデバイスの通信ポートを調査し、どのポートが開いているか、どのサービスが稼働しているかを確認するプロセスです。

    具体的にはポートスキャンを実行することで、ネットワーク上のデバイスがどのポートを使用しているかを特定し、潜在的なセキュリティリスクを評価できます。例えば未使用のポートが開いている場合、それが攻撃者の侵入経路となる可能性があります。

    ポートスキャンにはTCPスキャン、UDPスキャン、SYNスキャンなどさまざまな方法があります。これらの方法はそれぞれ異なるプロトコルや技術を使用してポートの状態を確認します。

    • TCPスキャン
      TCPの3ウェイハンドシェイク(SYN、SYN/ACK、ACK)を利用してポートの状態を確認します。コネクションが確立されるため、サーバーのログに記録されます。

    • UDPスキャン
      UDPパケットを送信し、ICMP Port Unreachableメッセージが返ってこなければポートが開いていると判断します。

    • SYNスキャン
      コネクションを完全に確立せずにポートの状態を確認する方法です。SYNパケットを送信し、SYN/ACKが返ってくればポートが開いていると判断します。ステルススキャンとも呼ばれます。

    ※ポートスキャンは対象のネットワークやシステムの所有者の許可を得て行う必要があります。許可なく実施すると、法的な問題や倫理的な問題が発生する可能性があるので実施には十分注意が必要です。

    やってみた

    1. 前提
      今回スキャンを実行するサーバはAmazon Elastic Compute Cloud(以後、EC2)インスタンスを使用します。

    2. IAMロールの作成
      まず初めに、EC2用のIAMロールを作成します。
      信頼されたエンティティタイプに「AWSのサービス」、ユースケースに「EC2」を選択します。


      許可ポリシーにはマネージドポリシーである「AmazonSSMManagedInstanceCore」を選択します。

      ロール名を「My_Test_IAMRole」としてロールを作成します。

    3. サーバの起動
      起動時のAMIには「Amazon Linux 2023 AMI」を選択します。
      このAMIには、SSMを動かすために必要なSSMエージェントがプリインストールされています。
      SSMエージェントがプリインストールされているAMIは以下で確認できます。
      SSM Agent がプリインストールされている AMIs を見つける - AWS Systems Manager
      SSM Run Commandの実行結果をSSMに送信するためにインターネット接続が必要なので、パブリックIPの割り当てを有効します。
      パブリックIPは起動後に有効にすることはできないので、気を付けましょう。
      ※ちなみに今回は実施していませんが、VPCエンドポイントを設定し結果を送信することもできます。

      高度な詳細のIAMインスタンスプロフィールで先ほど作成したIAMロールを指定します。

      今回は特定の通信を設定する必要はないのでVPCやセキュリティグループは任意のものを使用します。
      本実装ではデフォルトのセキュリティグループを使用します。

    4. シェルスクリプトの準備
      標準出力で空いているポートのみを表示させるスクリプトを用意します。
      nmapはネットワーク探索とセキュリティ監査のためのツールで、特定のホストのポートをスキャンすることができます。
      また、nmapではデフォルトでTCPスキャンが実行されます。
      CanSecWest Presentation -- Use of Nmap to Identify Subtle Network Security Vulnerabilities
      今回使用しているEC2インスタンスのAMIにはnmapがインストールされていないので、インストール状況を確認して必要であればインストールを実施するようにします。

    5. Run Commandを実行
      SSMのマネジメントコンソールから「Run command」を選択します。

      次にコマンドドキュメントで「AWS-RunShellScript」を選択します。
      補足ですがRun Commandでは実行権限はルートで実行されます。
      Walkthrough: Use the AWS CLI with Run Command - AWS Systems Manager

      次にコマンドのパラメータに先ほど用意したスクリプトを記載します。

      次に「インスタンスを手動で選択する」から対象のEC2インスタンスを選択します。
      デフォルトでは「コマンド出力の Amazon S3 バケットへの書き込み」がオンになっていますが、今回は不要なのでオフにしておきます。

      それでは準備が整ったので実行してみましょう!

      問題なく実行できればインスタンスIDから出力結果のページに移動します。
      「Output」タブを開くと結果を確認することができます。
      今回の結果では22番ポートのみ空いていることが確認できます。

    6. おまけ(State Managerによる定期実行)
      追加実装として、定期的に空いているポートがないか検証するような仕組みを作成してみようと思います。
      定期実行にはSSMのState Managerという機能を使用します。
      まず、SSMのマネジメントコンソールから「ステートマネージャー」を選択します。
      次に、任意の名前を入力してから先ほど同様、ドキュメントで「AWS-RunShellScript」を選択します。

      パラメーターにも先ほどと同じスクリプトを記載します。
      次に、入力パラメーターに先ほど作成したインスタンスのIDとロールを選択します。
      実行間隔は1時間ごとの実行で設定してみます。
      今回はオプションは指定せず、そのまま「関連付けの作成」を実行します。


      少し時間をおいてから作成した関連IDを選択して実行履歴から結果を見てみると,きちんと1時間ごとに実行されていることが分かります。  

    ポートスキャンの対策はどうすればいいのか

    ここまででポートスキャンの流れを見てきました。
    悪意のある攻撃者からの攻撃を防ぐための、一般的なポートスキャンの対策としては、以下のものが挙げられます。

    • 不要なポートの閉鎖
      ネットワーク上で使用されていないポートは閉じておきましょう。これにより攻撃者がアクセスできるポイントを減らし、セキュリティを強化します。 詳細な説明は省略しますが、ufwやfirewalldといったツールを使用することでOSレベルでポート制御を行うことができます。 また、セキュリティグループによるポート制限を実施することも効果的です。

    • ファイアウォールの設定
      ファイアウォールを設定し外部からの不正なアクセスをブロックします。ファイヤウォールの方式としては必要なIPアドレスやポートのみを許可するホワイトリスト方式などがあります。 定期的にログを確認し、異常な活動を早期に検出することが重要です。

    • ウェルノウンポートの利用を避ける
      ウェルノウンポート(例えば、HTTPのポート80やSSHのポート22など)を避けて使用することで、攻撃者が特定のサービスを見つけるのが難しくなります。

    おわりに

    年々増加するサイバー攻撃の被害から身を守るためにも前提知識を持っていくことがとても重要ですね。
    攻撃手法を理解することで潜在的な脅威を早期に察知し、適切な対策を講じることができます。
    また、最新のセキュリティ情報を常にキャッチアップし、システムの脆弱性を迅速に修正することも大切です。

    セキュリティは一度設定すれば終わりではなく、継続的な監視と改善が求められます。
    これからもセキュリティの知識を深め、実践的な対策を講じていくことで、より安全でセキュアな環境構築を心掛けていこうと思います!

    執筆者 : 山本将望
    食べることが生きがいのインフラエンジニア
    執筆記事一覧 : https://tech.nri-net.com/archive/author/m4-yamamoto