Ansichten:

Amazon EKS-Audit-Logs sind über CloudWatch Logs verfügbar. Verwenden Sie das k8saudit-eks Falco-Plugin.

Vorbereitungen

  • Falco mit den Plugins k8saudit-eks und json gebaut.
  • EKS-Cluster mit aktiviertem Steuerungsebenen-Logging.

Prozedur

  1. Aktivieren Sie die Protokollierung der Steuerungsebene in der AWS Console.
    1. Navigieren Sie zu Ihrem EKS-Cluster.
    2. Navigieren Sie zu ObservabilityControl plane logging.
    3. Aktivieren Sie die Protokollierung von Audit.
  2. Konfigurieren Sie IAM-Berechtigungen für EC2-Knotengruppen in der AWS Console.
    Hinweis
    Hinweis
    Dieser Schritt gilt für EKS-Cluster, die EC2-gestützte Knotengruppen verwenden. Wenn Ihr Cluster Fargate verwendet, überspringen Sie diesen Schritt.
    1. Navigieren Sie zu ComputeNode groups und klicken Sie dann auf den Knotengruppenname.
    2. Klicken Sie auf Node IAM role ARN, um IAM zu öffnen.
    3. Die folgende Inline-Richtlinie hinzufügen:
    {
      "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:*"
          ]
        }
      ]
    }
    Ersetzen Sie ${region}, ${account-id} und ${cluster-name} durch Ihre Werte.
  3. IRSA für Fargate konfigurieren.
    Hinweis
    Hinweis
    Dieser Schritt gilt für EKS-Cluster, die Fargate verwenden. Wenn Ihr Cluster EC2-gestützte Knotengruppen verwendet, fahren Sie mit dem nächsten Schritt fort.
    Fargate blockiert den Zugriff auf den EC2 Instance Metadata Service (IMDS), sodass Pods keine IAM-Rollen von der Fargate-Ausführungsrolle erben können. IRSA (IAM-Rollen für Servicekonten) ist die einzige Möglichkeit, AWS-Anmeldedaten für Container auf Fargate bereitzustellen.
    1. Holen Sie sich die EKS OIDC-Anbieter-ID.
      OIDC_ID=$(aws eks describe-cluster --name <CLUSTER_NAME> \
        --query "cluster.identity.oidc.issuer" --output text | sed 's|.*/id/||')
    2. Erstellen Sie eine IAM-Rolle mit einer Vertrauensrichtlinie.
      Ersetzen Sie die folgenden Variablen durch Ihre Werte:
      • <ACCOUNT_ID>: AWS-Konto-ID.
      • <OIDC_ID>: Aus Schritt 3a oben.
      • <REGION>: Zum Beispiel, us-east-1.
      • <NAMESPACE>. Zum Beispiel trendmicro-system).
      • <SA_NAME>: Der Standardwert ist 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. Fügen Sie die CloudWatch Logs-Lesepolitik der Rolle hinzu.
      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. Aktualisieren Sie die overrides.yaml, um die Erfassung von Audit-Logs zu aktivieren.
    Für EC2-Knotengruppen:
    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}"
    Für Fargate fügen Sie die IRSA-Anmerkung für das Servicekonto hinzu:
    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"
Fehlerbehebung: NoCredentialProviders-Fehler (nur EC2-Knotengruppen)
Wenn Sie Error: NoCredentialProviders: no valid providers in chain sehen:
Ursache: Der Container kann aufgrund eines Hop-Limits nicht auf IMDS zugreifen.
Lösung:
# 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-Überprüfung
# 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
Erwartete nicht infizierte Protokollausgabe:
{"level":"info","logger":"event-uploader","msg":"Batch upload completed","success":1,"failed":0}