ビュー:

Amazon EKSのAudit LogsはCloudWatch Logsを通じて利用可能です。k8saudit-eks Falcoプラグインを使用してください。

始める前に

  • Falcoはk8saudit-eksjsonプラグインで構築されています。
  • コントロールプレーンのログ記録が有効になっているEKSクラスター。

手順

  1. AWS Consoleでコントロールプレーンのログを有効にします。
    1. EKSクラスターに移動します。
    2. [Observability][Control plane logging] に移動します。
    3. [監査]ログを有効にする。
  2. AWS ConsoleでEC2ノードグループのIAM権限を設定します。
    注意
    注意
    この手順はEC2をバックエンドとするノードグループを使用しているEKSクラスターに適用されます。クラスターがFargateを使用している場合は、次の手順に進んでください。
    1. [計算][Node groups]に移動し、ノードグループ名をクリックしてください。
    2. [Node IAM role ARN] をクリックして IAM を開きます。
    3. 次のインラインポリシーを追加します。
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "ReadAccessToCloudWatchLogs",
          "Effect": "Allow",
          "Action": [
            "logs:Describe*",
            "logs:FilterLogEvents",
            "logs:Get*",
            "logs:List*"
          ],
          "Resource": [
            "arn:aws:logs:${region}:${account-id}:log-group:/aws/eks/${cluster-name}/cluster:*"
          ]
        }
      ]
    }
    ${region}${account-id}${cluster-name}をご自身の値に置き換えてください。
  3. FargateのIRSAを設定します。
    注意
    注意
    この手順はFargateを使用するEKSクラスターに適用されます。クラスターがEC2バックのノードグループを使用している場合は、次の手順に進んでください。
    FargateはEC2 Instanceメタデータサービス (IMDS) へのアクセスをブロックするため、ポッドはFargate実行ロールからIAMロールを継承できません。Fargate上のコンテナにAWS認証情報を提供する唯一の方法はIRSA (サービスアカウント用IAMロール) です。
    1. EKS OIDCプロバイダIDを取得します。
      OIDC_ID=$(aws eks describe-cluster --name <CLUSTER_NAME> \
        --query "cluster.identity.oidc.issuer" --output text | sed 's|.*/id/||')
    2. 信頼ポリシーを持つIAMロールを作成します。
      以下の変数をあなたの値に置換してください。
      • <ACCOUNT_ID>: AWS account ID。
      • <OIDC_ID>: 上記の手順3aから。
      • <REGION>: 例えば、us-east-1
      • <NAMESPACE>。例えば、trendmicro-system)。
      • <SA_NAME>: デフォルトはaudit-log-collector-trendmicro-container-securityです。
      cat > trust-policy.json << EOF
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Federated": "arn:aws:iam::<ACCOUNT_ID>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<OIDC_ID>"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
              "StringEquals": {
                "oidc.eks.<REGION>.amazonaws.com/id/<OIDC_ID>:sub": "system:serviceaccount:<NAMESPACE>:<SA_NAME>",
                "oidc.eks.<REGION>.amazonaws.com/id/<OIDC_ID>:aud": "sts.amazonaws.com"
              }
            }
          }
        ]
      }
      EOF
      
      aws iam create-role \
        --role-name audit-log-collector-irsa \
        --assume-role-policy-document file://trust-policy.json
    3. CloudWatch Logsの読み取りポリシーをロールにアタッチしてください。
      aws iam put-role-policy \
        --role-name audit-log-collector-irsa \
        --policy-name audit-log-cloudwatch-read \
        --policy-document '{
          "Version": "2012-10-17",
          "Statement": [
            {
              "Sid": "ReadAccessToCloudWatchLogs",
              "Effect": "Allow",
              "Action": [
                "logs:Describe*",
                "logs:FilterLogEvents",
                "logs:Get*",
                "logs:List*"
              ],
              "Resource": [
                "arn:aws:logs:<REGION>:<ACCOUNT_ID>:log-group:/aws/eks/<CLUSTER_NAME>/cluster:*"
              ]
            }
          ]
        }'
  4. overrides.yamlを更新して、監査ログの収集を有効にします。
    EC2ノードグループの場合:
    visionOne:
        bootstrapToken: ...
        endpoint: ...
        exclusion:
            namespaces: [kube-system]
        ...
    auditLogCollection:
        enabled: true
        provider: eks
        eks:
            region: "${your cluster's region}"
            clusterName: "${your cluster's name in aws console}"
    Fargateの場合、サービスアカウントにIRSAアノテーションを追加してください。
    visionOne:
        bootstrapToken: ...
        endpoint: ...
        exclusion:
            namespaces: [kube-system]
        ...
    auditLogCollection:
        enabled: true
        provider: eks
        eks:
            region: "${your cluster's region}"
            clusterName: "${your cluster's name in aws console}"
    
    serviceAccount:
        auditLogCollector:
            annotations:
                eks.amazonaws.com/role-arn: "arn:aws:iam::<ACCOUNT_ID>:role/audit-log-collector-irsa"
トラブルシューティング: NoCredentialProvidersエラー (EC2ノードグループのみ)
Error: NoCredentialProviders: no valid providers in chainが表示された場合:
原因: ホップ制限のため、コンテナがIMDSに到達できません。
解決策:
# Get instance ID
INSTANCE_ID=$(aws ec2 describe-instances --region <region> \
  --filters "Name=private-dns-name,Values=<node-name>" \
  --query "Reservations[0].Instances[0].InstanceId" --output text)

# Increase hop limit
aws ec2 modify-instance-metadata-options --region <region> \
  --instance-id $INSTANCE_ID \
  --http-put-response-hop-limit 2

# Restart pod
kubectl delete pod -n trendmicro-system <pod-name>
Fargate検証
# Check pod is running
kubectl get pods -n trendmicro-system -l app.kubernetes.io/component=trendmicro-audit-log-collector

# Check IRSA env vars are injected
kubectl get pod <POD_NAME> -n trendmicro-system -o jsonpath='{.spec.containers[0].env[?(@.name=="AWS_ROLE_ARN")].value}'

# Check logs for successful event upload
kubectl logs -n trendmicro-system -l app.kubernetes.io/component=trendmicro-audit-log-collector -c audit-log-collector --tail=10
期待される正常なログ出力:
{"level":"info","logger":"event-uploader","msg":"Batch upload completed","success":1,"failed":0}