檢視次數:

Amazon EKS 審計日誌可透過 CloudWatch Logs 獲得。使用 k8saudit-eks Falco 插件。

開始之前

  • Falco 使用 k8saudit-eksjson 插件構建。
  • EKS 叢集已啟動控制平面日誌記錄。

步驟

  1. 在 AWS Console 中啟用控制平面日誌記錄。
    1. 導航至您的 EKS 叢集。
    2. 移至「Observability」「Control plane logging」
    3. 啟用「Audit」日誌記錄。
  2. 在 AWS Console 中為 EC2 節點群組配置 IAM 權限。
    注意
    注意
    此步驟適用於使用 EC2 支援節點群組的 EKS 叢集。如果您的叢集使用 Fargate,請跳至下一步。
    1. 導航至「Compute」「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 Metadata Service (IMDS),因此 pods 無法從 Fargate 執行角色繼承 IAM 角色。IRSA (IAM Roles for Service Accounts) 是唯一能夠提供 AWS 憑證給 Fargate 上容器的方法。
    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 帳號 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}