Amazon ECS ExecとSysdigを使ってコンテナ内で安全にコマンドを実行する

By 清水 孝郎 - MARCH 16, 2021

SHARE:

本文の内容は、2021年3月15日にAlejandro Villanuevaが投稿したブログ(https://sysdig.com/blog/secure-aws-ecs-exec/)を元に日本語に翻訳・再構成した内容となっております。

本日、AWSは、開発者がECSコンテナ内でコマンドを実行できる強力な機能である「Amazon ECS Exec」の一般提供を発表しました。

Amazon Elastic Container Service(ECS)は、Amazon Web Servicesによるフルマネージドなコンテナオーケストレーションサービスです。ECSでは、AWSクラウド上のコンテナリソースを整理・運用することができ、Amazon EC2とAWS Fargateのワークロードを混在させて高いスケーラビリティを実現することができます。ECSを使えば、開発者は、docker-compose定義を使ってコンテナを編成するなど、知っているツールを使って、クラウドベースのコンテナクラスターをすぐに使い始めることができます。

新しいECS Exec機能は、実行中のコンテナへのシェルアクセスを提供するexecコマンドのような機能をECSにもたらします。これは、多くの開発者がDockerやKubernetesなどのプラットフォームで、コンテナのセットアップやデバッグ作業を行うために既に使用している機能です。

この記事では、この新しいECS Exec機能がカバーするユースケース、AWS CloudTrailを使った使用状況の監査方法、そしてSysdig Secureを使って実行されたコマンドにセキュリティ・ポリシーを適用する方法について説明します。

DockerとKubernetesのexecコマンド

Kubernetesにも、実行中のコンテナ内でシェルコマンドを実行できるexecコマンドがあります。コンテナ内で対話型シェルを実行することで、開発者はコンテナ内で好きなように操作を行うことができます。

例えば、インタラクティブシェルを使用する典型的なユースケースとして、コンテナが正しく動作しない原因をデバッグすることが挙げられます。この機能は、環境変数の変更や設定ファイルの修正などの作業を行う際にもよく使われます。

docker -it exec container-name /bin/sh
kubectl exec --stdin --tty pod-name -- /bin/bash

Amazon ECS Execに入る

本日、AWSはECS Exec機能の一般提供を発表しました。

ECSとFargateでこの機能を有効にする方法は、AWSのサイトで確認できます。

有効化すると、開発者は以下のコマンドを実行して、コンテナ内でインタラクティブシェルを起動することができます。

aws ecs execute-command \
--region $REGION \
--cluster $CLUSTER_NAME \
--task $TASKID \
--container $CONTAINER_NAME \
--command "/bin/sh" \
--interactive

この新機能により、クラウドチームは強力なデバッグ機能を手に入れることができ、ローカルツールで慣れ親しんだ管理作業も行うことができます。

しかし、コンテナに侵入できるということは、本番環境で稼働中のコンテナに侵入できる可能性があるということです。この機能は有益な結果をもたらすこともあれば、潜在的に有害な結果をもたらすこともあるため、その使用を検出して監視することが重要です。

execのセキュリティへの影響

本番環境では、コンテナ内でシェルを直接実行することは、セキュリティの観点から危険な行為とみなされることが多々あります。これを防ぐために、AWSはECS Exec機能にきめ細かなIAMポリシーを提供し、その使用が制御され認可されていることを保証できます。

ここでは、AWSがどのようにしてこのツールの使用を監査し、Sysdigのような他のセキュリティ・ツールとどのように統合するかを見てみましょう。

AWS CloudTrailによるECS Execコマンドの監査

アマゾンは、AWS CloudTrailと呼んでいる、すべてのクラウド・サービスのためのグローバルな監査ツールを提供しています。CloudTrailは、コンテナ内で実行されるすべてのexecコマンドを登録する事ができます。

CloudTrailをイベントのランタイム分析に活用することで、execが使用されたときに気づくことができ、それを調査することができます。

ECS Execが使用されるたびに、CloudTrailのイベントは次のようなJSON構造で記録されます。

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "$PRINCIPAL_ID",
        "arn": "arn:aws:iam::$USER_ID:user/$USER_NAME",
        "accountId": "$USER_ID",
        "accessKeyId": "$ACCESS_KEY_ID",
        "userName": "$USER_NAME"
    },
    "eventTime": "2021-02-03T17:00:14Z",
    "eventSource": "ecs.amazonaws.com",
    "eventName": "ExecuteCommand",
    "awsRegion": "ap-southeast-1",
    "sourceIPAddress": "$SOURCE_IP_ADDRESS",
    "userAgent": "aws-cli/1.18.222 Python/2.7.16 Darwin/20.2.0 botocore/1.19.62",
    "requestParameters": {
        "cluster": "$CLUSTER_NAME",
        "container": "$CONTAINER_NAME",
        "command": "/bin/sh",
        "interactive": true,
        "task": "arn:aws:ecs:ap-southeast-1:$USER_ID:task/$CLUSTER_NAME/$TASK_ID"
    },
    "responseElements": {
        "clusterArn": "arn:aws:ecs:ap-southeast-1:$USER_ID:cluster/$CLUSTER_NAME",
        "containerArn": "arn:aws:ecs:ap-southeast-1:$USER_ID:container/20486b49-de19-4f3f-9569-4748a0cb6fef",
        "containerName": "$CONTAINER_NAME",
        "interactive": true,
        "session": {
            "sessionId": "ecs-execute-command-062049f67691b9fa8",
            "streamUrl": "wss://ssmmessages.ap-southeast-1.amazonaws.com/v1/data-channel/ecs-execute-command-062049f67691b9fa8?role=publish_subscribe",
            "tokenValue": "HIDDEN_DUE_TO_SECURITY_REASONS"
        },
        "taskArn": "arn:aws:ecs:ap-southeast-1:845151661675:task/fargate-test/637d524791b7457b9e6598414404162a"
    },
    "requestID": "1742d166-4d53-4012-8dc6-def771383b5b",
    "eventID": "a8592389-8e99-4e01-8866-48089aec4f9c",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "eventCategory": "Management",
    "recipientAccountId": "$USER_ID"
}

これらのイベントを監視して、本番環境のコンテナに不正なアクセスがないか確認する必要があります。

FalcoルールでECS execを検知する

Sysdig Cloud Connectorを使うと、CloudTrailのイベントをフィルタリングする事ができるので、重要なことに集中できるようになります。

Sysdig Cloud Connectorは、オープンソースのクラウド・ネイティブ・ランタイム・セキュリティ・プロジェクトであるFalcoをベースにしており、すぐに使い始められるルールのコレクションが含まれています。「コンテナ内のターミナルシェル」や「Attach/Exec Pod」などのFalcoルールは、特にexecアクティビティを検出するように作られています。

これは、ECSコンテナ内でのターミナルシェルの実行を検出するためのFalcoルールのコードです。

- list: system_shells
  items: [/bin/bash, /bin/csh, /bin/ksh, /bin/sh, /bin/tcsh, /bin/zsh]

- rule: Terminal Shell in ECS Container
  desc: A terminal shell has been executed inside an ECS container.
  condition:
    jevt.value[/eventSource]="ecs.amazonaws.com" and
    jevt.value[/eventName]="ExecuteCommand" and
    jevt.value[/requestParameters/command] in (system_shells) and
    jevt.value[/requestParameters/interactive]=true and
    not jevt.value[/errorCode] exists
  output:
    An interactive terminal shell has been executed inside an ECS container
    (requesting user=%jevt.value[/userIdentity/arn],
     requesting IP=%jevt.value[/sourceIPAddress],
     AWS region=%jevt.value[/awsRegion],
     cluster=%jevt.value[/requestParameters/cluster],
     container=%jevt.value[/requestParameters/container],
     command=%jevt.value[/requestParameters/command],
     task=%jevt.value[/requestParameters/task])
  priority: WARNING
  tags:
    - cloud
    - aws
    - aws_ecs
    - aws_fargate
    - aws_ecs_exec
  source: aws_cloudtrail

この “Terminal Shell in ECS Container “ルールは、Cloud Connectorに標準で含まれています。

このルールがトリガーされると、アクティビティの詳細を含む新しい発見した事実がAWS Security Hubに送信されます。
AWS Security Hub finding

対話型コマンドの起動や、ECSコンテナ内でのコマンド実行の検出など、他の種類の不審なアクティビティを検出するには、以下の例のように条件を簡単に変更できます。

- rule: Execute Interactive Command inside an ECS Container
  desc: Detect execution of an interactive command inside an ECS container.
  condition:
    jevt.value[/eventSource]="ecs.amazonaws.com" and
    jevt.value[/eventName]="ExecuteCommand" and
    not jevt.value[/requestParameters/command] in (system_shells) and
    jevt.value[/requestParameters/interactive]=true and
    not jevt.value[/errorCode] exists
  (...)
- rule: Execute Command inside an ECS Container
  desc: Detect execution of a command inside an ECS container.
  condition:
    jevt.value[/eventSource]="ecs.amazonaws.com" and
    jevt.value[/eventName]="ExecuteCommand" and
    jevt.value[/requestParameters/interactive]=false and
    not jevt.value[/errorCode] exists
  (...)

Sysdig Cloud ConnectorのFalcoルールの書き方については、こちらのAWS公式ハンズオンワークショップ「Secure DevOps」をご覧ください。

Sysdig SecureでECS Execを検出する

Sysdig Cloud Connectorは、これらのイベントをSysdigにおけるコンテナとKubernetesのセキュリティ・ソリューションであるSysdig Secureに送信することもできます。

Sysdig Secureは、クラウド規模での運用を簡素化するために、簡単に操作できるユーザー・インターフェースを備えており、Falcoが提供する機能を拡張しています。Sysdig Secureを使用することで、ECS Execのアクティビティを検出し、適切に使用することができます。

イベントフィードと完全に統合されたことで、CloudTrailイベントがFalcoルールをトリガーするたびに、これらのイベントがSysdig Secureダッシュボードに統合され、単一の真実のソースとして見ることができます。
Amazon ECS Exec event in Sysdig Secure

ECSとFargateでECS Execを検出することを含む、すべてのクラウドセキュリティルールは、ルールライブラリで利用できます。これにより、ポリシーを簡単に作成し、通知チャネルを設定して、ECS Execの使用に関するアラートを組織内の適切なチームや担当者に送って確認することができます。
Amazon ECS Exec policy in Sysdig Secure

Sysdig Secureのダッシュボードを使用して、利用可能なルールを簡単にカスタマイズし、お客様のニーズに合った検知を行うこともできます。
Amazon ECS Exec rule in Sysdig Secure

CloudTrail用のFalcoルールは、NIST 800-53、SOC2、PCI DSS、MITRE ATT&CK®、AWS CIS、AWS Foundational Security Best Practices規格などの標準や推奨事項を考慮して作成されています。

すべてのルールには、適用される規格やセクションを識別するタグが付いているので、フィルタリングして独自のポリシーを作成することもできます。
Sysdig Secure security rules library

まとめ

AWSの新しいECS Exec機能は、クラウドチームがEC2やFargate上で実行しているECSコンテナをデバッグして対話するための強力なツールを提供します。

ECSやFargateをお使いの方は、この新機能をチェックしてみてください。そして、使用状況を可視化するために必要なツールを必ず導入してください。

FalcoやSysdig Secureのようなソリューションは、AWS Execが適切かつ認可された使い方をしているかどうかを確認し、稼働中の本番ワークロードのセキュリティを確保するのに役立ちます。

Sysdigのアカウントをお持ちでない方は、今すぐ登録してトライアルをご利用いただけます。Sysdig Cloud Connectorをこの記事の手順に従って10分以内にデプロイし、セキュアなAWSアカウントにしましょう!

また、SysdigはAWS Marketplaceでもご覧いただけます。