Wie verwende ich die Funktion IAM-Rollen für Servicekonten (IRSA) mit Amazon EKS, um den Zugriff auf einen Amazon S3-Bucket einzuschränken?

Lesedauer: 4 Minute
0

Ich möchte den Zugriff auf einen Amazon Simple Storage Service (Amazon S3)-Bucket auf Pod-Ebene in Amazon Elastic Kubernetes Service (Amazon EKS) einschränken. Ich möchte auch die Mindestberechtigungen für meine Anwendung mit AWS Identity and Access Management (IAM)-Rollen für Servicekonten (IRSA) beibehalten.

Behebung

Wichtig: Bevor Sie IRSA mit Amazon EKS verwenden, müssen Sie einen IAM-OIDC-Anbieter für Ihren Cluster erstellen.

Erstellen Sie eine IAM-Richtlinie und Rolle

1.Erstellen Sie eine JSON-Datei namens iam-policy.json.

Die folgende Beispielrichtlinie schränkt die Amazon S3- und Amazon DynamoDB-Berechtigungen ein. IAM-Benutzer dürfen auf einen S3-Bucket und auf eine bestimmte DynamoDB-Tabelle zugreifen.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListAndDescribe",
            "Effect": "Allow",
            "Action": [
                "dynamodb:List*",
                "dynamodb:Describe*"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/YOUR_TABLE"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::YOUR_BUCKET"
        },
        {
            "Sid": "List",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::YOUR_BUCKET/*"
        }
    ]
}

Hinweis: Ersetzen Sie YOUR_TABLE durch Ihre Tabelle. Ersetzen Sie YOUR_NAMESPACE durch Ihren Namespace.

2.Erstellen Sie eine IAM-Richtlinie mit dem Namen YOUR-IAM-POLICY.

$ aws iam create-policy \
    --policy-name YOUR-IAM-POLICY \
    --policy-document file://iam-policy.json

Hinweis: Ersetzen Sie YOUR-IAM-POLICY durch Ihren Richtliniennamen.

3.Verwenden Sie die IAM-Konsole, um eine IAM-Rolle für Ihr Dienstkonto zu erstellen und kommentieren Sie dann ein Dienstkonto mit dieser IAM-Rolle. Oder verwenden Sie eksctl, um eine IAM-Rolle für Ihr Dienstkonto zu erstellen. Zum Beispiel:

$ eksctl create iamserviceaccount \
  --name YOUR-SERVICEACCOUNT \
  --namespace YOUR-NAMESPACE \
  --cluster YOUR-CLUSTER \
  --attach-policy-arn arn:aws:iam::1111122222:policy/YOUR-IAM-POLICY \
  --approve

Hinweis: Ersetzen Sie 1111122222 durch Ihren Amazon-Ressourcennamen (ARN). Sie können auch mithilfe der IAM-Konsole eine IAM-Rolle für Ihr Dienstkonto erstellen.

Erstellen Sie einen Amazon EKS-Pod

Ersetzen Sie in den folgenden Schritten Ihre eigene Anwendung durch ein aws-cli image. Auf diese Weise können Sie überprüfen, ob Ihr Pod die angegebene IAM-Rolle mit den richtigen IAM-Berechtigungen übernehmen kann.

1.Erstellen Sie eine YAML-Datei namens aws-cli-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: aws-cli
  namespace: YOUR_NAMESPACE
spec:
  serviceAccountName: YOUR_SERVICEACCOUNT
  containers:
  - name: aws-cli
    image: amazon/aws-cli:latest
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

Hinweis: Ersetzen Sie YOUR_NAMESPACE durch Ihren Namespace. Ersetzen Sie SERVICE_ACCOUNT durch Ihren Kubernetes-Dienstkontonamen.

2.Erstellen Sie einen Amazon EKS-Pod:

$ kubectl apply -f ./aws-cli.yaml

Testen Sie Ihren Amazon EKS-Pod

Vergewissern Sie sich, dass Ihr Pod die richtige IAM-Rolle verwendet, indem Sie Aktionen für Amazon S3 und DynamoDB einschränken. Im folgenden Beispiel kann der Pod nur den S3-Bucket (YOUR_BUCKET) und die DynamoDB-Tabelle (YOUR_TABLE) auflisten.

1.Suchen Sie die IAM-Rolle, die Anmeldeinformationen verwendet:

$ kubectl exec -it aws-cli -- aws sts get-caller-identity

Die Ausgabe sieht ähnlich aus wie: 

{
    "UserId": "AIDACKCEVSQ6C2EXAMPLE:botocore-session-1111122222",
    "Account": "111122223333",
    "Arn": "arn:aws:sts::111122223333:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1UEXAMPLE/botocore-session-1111122222"
}

Wenn Sie einen Namespace angeben, hängen Sie das Namespace-Argument (-n) an alle kubectl-Befehle an.Ersetzen Sie YOUR_NAMESPACE durch Ihren Namespace. 

$ kubectl -n YOUR_NAMESPACE exec -it aws-cli -- aws sts get-caller-identity

2.Stellen Sie sicher, dass Ihr Pod über s3:ListBuckets-Berechtigungen für Ihren S3-Bucket (YOUR_BUCKET) verfügt:

$ kubectl exec -it aws-cli -- aws s3 ls s3://YOUR_BUCKET

Hinweis: Ersetzen Sie YOUR_BUCKET durch Ihren S3-Bucket.

Output:

2021-09-28 09:59:22        269 demo-test-file

3.Stellen Sie sicher, dass Ihr Pod den S3-Bucket (YOUR_BUCKET) nicht löschen kann:

$ kubectl exec -it aws-cli -- aws s3 rm s3://YOUR_BUCKET/demo-test-file

Hinweis: Ersetzen Sie YOUR_BUCKET durch Ihren S3-Bucket.

Der Befehl gibt den folgenden Fehler „Access Denied“ (Zugriff verweigert) zurück, da der Pod keine s3:DeleteObject-Berechtigungen besitzt:

delete failed: s3://YOUR_BUCKET/demo-test-file An error occurred (AccessDenied) when calling the DeleteObject operation: Access Denied
command terminated with exit code 1

4.Stellen Sie sicher, dass Ihr Pod über dynamodb:List-Berechtigungen für Ihre DynamoDB-Tabelle (YOUR_TABLE) verfügt:

$ kubectl exec -it aws-cli -- aws dynamodb describe-table --table-name YOUR_TABLE

Hinweis: Ersetzen Sie YOUR_TABLE durch Ihre DynamoDB-Tabelle.

Output:

{
    "Table": {
        "AttributeDefinitions": [
            {
                "AttributeName": "demo",
                "AttributeType": "S"
            }
        ],
        "TableName": "YOUR_TABLE",
        "KeySchema": [
            {
                "AttributeName": "demo",
                "KeyType": "HASH"
            }
        ],
        "TableStatus": "ACTIVE",
        "CreationDateTime": "2021-09-28T10:05:53.599000+00:00",
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "ReadCapacityUnits": 5,
            "WriteCapacityUnits": 5
        },
        "TableSizeBytes": 0,
        "ItemCount": 0,
        "TableArn": "arn:aws:dynamodb:eu-west-1:000000000000:table/YOUR_TABLE",
        "TableId": "42bd1238-e042-4016-b6b2-77548939c101"
    }
}

5.Stellen Sie sicher, dass Ihr Pod die DynamoDB-Tabelle (YOUR_TABLE) nicht löschen kann:

$ kubectl exec -it aws-cli -- aws dynamodb delete-table --table-name YOUR_TABLE

Hinweis: Ersetzen Sie YOUR_TABLE durch Ihre DynamoDB-Tabelle.

Der Befehl gibt den folgenden Fehler „Access Denied“ (Zugriff verweigert) zurück, da der Pod keine dynamodb:DeleteTable-Berechtigungen besitzt:

An error occurred (AccessDeniedException) when calling the DeleteTable operation: User: arn:aws:sts::1111122222:assumed-role/eksctl-EKS-LAB-addon-iamserviceaccount-defau-Role1-ASA1U7NRNSEC/botocore-session-1632822777 is not authorized to perform: dynamodb:DeleteTable on resource: arn:aws:dynamodb:eu-west-1: 1111122222:table/MyTable
command terminated with exit code 254

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren