Amazon EKS 審計日誌可透過 CloudWatch Logs 獲得。使用 k8saudit-eks Falco 插件。
開始之前
-
Falco 使用
k8saudit-eks和json插件構建。 -
EKS 叢集已啟動控制平面日誌記錄。
步驟
- 在 AWS Console 中啟用控制平面日誌記錄。
- 導航至您的 EKS 叢集。
- 移至
- 啟用「Audit」日誌記錄。
- 在 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 Metadata Service (IMDS),因此 pods 無法從 Fargate 執行角色繼承 IAM 角色。IRSA (IAM Roles for Service Accounts) 是唯一能夠提供 AWS 憑證給 Fargate 上容器的方法。- 取得 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 帳號 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}
