【Security Hub修復手順】[ECS.1] Amazon ECS タスク定義には、セキュアなネットワークモードとユーザー定義が必要です

AWS SecurityHub 基礎セキュリティのベストプラクティスコントロール修復手順をご紹介します。
2023.01.24

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

こんにちは、AWS事業本部の平井です。

皆さん、お使いのAWS環境のセキュリティチェックはしていますか?

当エントリでは、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介します。

本記事の対象コントロール

[ECS.1] Amazon ECS タスク定義には、セキュアなネットワークモードとユーザー定義が必要です。

[ECS.1] Amazon ECS task definitions should have secure networking modes and user definitions

前提条件

本記事はAWS Security Hubで「AWS基礎セキュリティのベストプラクティススタンダード」を利用されている方向けの内容となります。 AWS Security Hubの詳細についてはこちらのブログをご覧ください。

対象コントロールの説明

今回のコントロールは、「Amazon ECS タスク定義には、セキュアなネットワークモードとユーザー定義が必要です。」になります。

このコントロールは、以下の3つの条件が揃うと失敗します。

  • タスク定義のネットワークモードがhostである
  • タスク定義のパラメータうち、「priviledged=false or 空」
  • タスク定義のパラメータうち、「user=root or 空」

タスク定義の各パラメータについて

  • privileged
    • privilegedは、コンテナに特権を与えるパラメータです。このパラメータが「false or 空」 のときは、権限が無いと解釈されます。パラメータがtrueの場合、通常のコンテナとは異なり、ホストコンピュータのあらゆるリソースへのアクセスが可能となります。(ホストコンピュータにおけるrootユーザと同様)
    • Amazon ECS タスク定義パラメータ privileged
  • user
    • userは コンテナ内で使用するユーザーを指定するパラメータです。パラメータが「user=root」の場合、rootユーザーが指定されます。ただし、このパラメータは、「空」の場合でも、rootと解釈されます。
    • Amazon ECS タスク定義パラメータ user

そのため、privilegedがfalseであった場合でも、userが「user=root or 空」の条件で、rootユーザーになってしまいます。

root権限は、悪用されたときに多大な被害を受けるリスクがあるため、避けましょう。

対象コントロールの対応方法

対応方法は、2つあります。

  • タスク定義のネットワークモードがhostのまま、パラメータのuserを適切な値にする
  • タスク定義のネットワークモードをhostではなく、awsvpcに変更する

後者の方法について、hostモードは、先程ご説明したセキュリティ上のリスクだけでなく、1つのホスト上で、同じタスク定義のタスクを複数起動できないなどの成約があります。

hostモードでは、ダイナミックポートマッピングは、使用できません。このモードを使用するタスク定義内のコンテナには、特定の hostPort 番号を指定する必要があります。 ホストのポート番号は、複数のタスクで使用できません。その結果として、1 つの Amazon EC2 インスタンスで同じタスク定義のタスクを複数実行することはできません。
引用 Amazon ECS タスクネットワーキング

そのため、AWSでは、awsvpcモードの使用を推奨していますので、こちらのモードに切り替える方法もあります。

Amazon ECS では、別のネットワークモードを使用する特別の必要性がある場合を除き、awsvpc ネットワークモードの使用を推奨します。
引用 Amazon ECS タスクネットワーキング

修正手順

1 ステークホルダーに確認

まずはステークホルダー(リソースの作成者や管理している部署などの関係者)に以下を確認します。

  • タスク定義のネットワークモードをhostからawsvpcに変更してよいか
    • 変更して良い場合、[2 タスク定義のネットワークモードをawsvpcに変更]の作業のみ行ってください。
    • 変更してはならない場合、[3 タスク定義のuserパラメータ値を変更]の作業のみ行ってください。

※設定変更後、業務に影響が出る可能性があります。そのため、社内で注意深く確認と対応して下さい。

対象のリソースの確認

  1. AWSマネージメントコンソールにログインし、AWS 基礎セキュリティのベストプラクティス v1.0.0にて、「ECS.1」を検索します。タイトルを選択します。
  2. リソースの欄から失敗しているタスク定義を確認できます。
  3. ECSのコンソールを開き、対象のタスク定義の詳細を確認できます。

2 タスク定義のネットワークモードをawsvpcに変更

  1. 新しいECSのコンソールは、作成済みタスク定義のネットワークモードを変更できないため、クラシックコンソールに変更します。
  2. タスク定義から修正対象のタスク定義のリビジョンを選択し、新しいリビジョンを作成します。
  3. ネットワークモードをhostからawsvpcに変更して、リビジョンを作成します。
  4. クラスターのサービスに遷移後、先程作成したタスク定義のリビジョンを指定し、サービスを更新するとデプロイされます。

これで、ネットワークモードがawsvpcのタスクをデプロイすることができました。

3 タスク定義のuserパラメータ値を変更

タスク定義のパラメータうち、userを適切な値に変える対応をします。

  1. ECSのコンソールのタスク定義から修正対象のタスク定義のリビジョンを選択し、JSON を使用してリビジョンを作成クリックします。
  2. jsonファイルの内、キーがcontainerDefinitions内のuserの箇所を確認し、root以外の適切な値を入力し、リビジョンを作成します。

    • userのキーがない場合、userキーと適切な値を加えます。
  3. クラスターのサービスに遷移後、先程作成したタスク定義のリビジョンを指定し、サービスを更新するとデプロイされます。

これで、コンテナ内で使用するユーザーがrootでないタスクをデプロイすることができました。

最後に

今回は、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介しました。

コントロールを修正して、お使いのAWS環境のセキュリティをパワーアップさせましょう!

最後までお読みいただきありがとうございました!どなたかのお役に立てれば幸いです。

以上、平井でした!