Amazon EKSのAudit LogsはCloudWatch Logsを通じて利用可能です。k8saudit-eks Falcoプラグインを使用してください。
始める前に
-
Falcoは
k8saudit-eksとjsonプラグインで構築されています。 -
コントロールプレーンのログ記録が有効になっているEKSクラスター。
手順
- AWS Consoleでコントロールプレーンのログを有効にします。
- EKSクラスターに移動します。
- に移動します。
- [監査]ログを有効にする。
- AWS ConsoleでEC2ノードグループのIAM権限を設定します。

注意
この手順はEC2をバックエンドとするノードグループを使用しているEKSクラスターに適用されます。クラスターがFargateを使用している場合は、次の手順に進んでください。- に移動し、ノードグループ名をクリックしてください。
- [Node IAM role ARN] をクリックして IAM を開きます。
- 次のインラインポリシーを追加します。
{ "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}をご自身の値に置き換えてください。 - FargateのIRSAを設定します。

注意
この手順はFargateを使用するEKSクラスターに適用されます。クラスターがEC2バックのノードグループを使用している場合は、次の手順に進んでください。FargateはEC2 Instanceメタデータサービス (IMDS) へのアクセスをブロックするため、ポッドはFargate実行ロールからIAMロールを継承できません。Fargate上のコンテナにAWS認証情報を提供する唯一の方法はIRSA (サービスアカウント用IAMロール) です。- EKS OIDCプロバイダIDを取得します。
OIDC_ID=$(aws eks describe-cluster --name <CLUSTER_NAME> \ --query "cluster.identity.oidc.issuer" --output text | sed 's|.*/id/||')
- 信頼ポリシーを持つ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 -
- 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:*" ] } ] }'
- EKS OIDCプロバイダIDを取得します。
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}
