Comment utiliser la fonctionnalité de rôles IAM pour les comptes de service (IRSA) avec Amazon EKS pour restreindre l'accès à un compartiment Amazon S3 ?

Lecture de 5 minute(s)
0

Je souhaite restreindre l'accès à un compartiment Amazon Simple Storage Service (Amazon S3) au niveau du pod dans Amazon Elastic Kubernetes Service (Amazon EKS). Je souhaite également conserver des privilèges minimaux pour mon application avec des rôles AWS Identity and Access Management (IAM) pour les comptes de service (IRSA).

Résolution

**Important :**Avant d'utiliser IRSA avec Amazon EKS, vous devez créer un fournisseur IAM OIDC pour votre cluster.

Création d'une politique et d'un rôle IAM

1.    Créez un fichier JSON appelé iam-policy.json.

L'exemple de politique suivant restreint les autorisations Amazon S3 et Amazon DynamoDB. Les utilisateurs IAM sont autorisés à accéder à un compartiment S3 et à accéder à une table DynamoDB spécifique.

{
    "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/*"
        }
    ]
}

Remarque : Remplacez YOUR \ _TABLE par votre table. Remplacez YOUR \ _NAMESPACE par votre espace de noms.

2.    Créez une politique IAM appelée YOUR-IAM-POLICY.

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

Remarque : Remplacez YOUR-IAM-POLICY par le nom de votre police.

3.    Utilisez la console IAM pour créer un rôle IAM pour votre compte de service, puis annotez un compte de service avec ce rôle IAM. Vous pouvez également utiliser** eksctl** pour créer un rôle IAM pour votre compte de service. Par exemple :

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

Remarque : Remplacez 1111122222 par votre Amazon Resource Name (ARN). Vous pouvez également créer un rôle IAM pour votre compte de service à l'aide de la console IAM.

Création d'un pod Amazon EKS

Dans les étapes suivantes, remplacez votre propre application par une image aws-cli. Cela vous permet de vérifier si votre espace peut assumer le rôle IAM spécifié avec les autorisations IAM appropriées.

1.    Créez un fichier YAML appelé 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

Remarque : Remplacez YOUR \ _NAMESPACE par votre espace de noms. Remplacez SERVICE \ _ACCOUNT par le nom de votre compte de service Kubernetes.

2.    Créez un pod Amazon EKS :

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

Testez votre pod Amazon EKS

Vérifiez que votre pod utilise le rôle IAM approprié avec des actions de limitation pour Amazon S3 et DynamoDB. Dans l'exemple suivant, le pod ne peut répertorier que le compartiment S3 (YOUR \ _BUCKET) et la table DynamoDB (YOUR \ _TABLE).

1.    Trouvez le rôle IAM qui utilise les informations d'identification :

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

La sortie ressemblera à :

{
    "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"
}

Si vous spécifiez un espace de noms, ajoutez l'argument d'espace de noms (-n) à toutes les commandes kubectl. Remplacez YOUR \ _NAMESPACE par votre espace de noms.

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

2.    Vérifiez que votre pod dispose des autorisations S3:ListBuckets pour votre compartiment S3 (VOTRE\ _BUCKET) :

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

Remarque : Remplacez VOTRE \ _BUCKET par votre compartiment S3.

Sortie :

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

3.    Vérifiez que votre pod ne peut pas supprimer le compartiment S3 (VOTRE\ _BUCKET) :

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

Remarque : Remplacez VOTRE \ _BUCKET par votre compartiment S3.

La commande renvoie l'erreur « Accès refusé » suivante car le pod ne dispose pas des autorisations** s3:DeleteObject** :

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.    Vérifiez que votre espace dispose des autorisations DynamoDB:List pour votre table DynamoDB (YOUR\ _TABLE) :

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

Remarque : Remplacez YOUR \ _TABLE par votre table DynamoDB.

Sortie :

{
    "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.    Vérifiez que votre espace ne peut pas supprimer la table DynamoDB (YOUR\ _TABLE) :

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

Remarque : Remplacez YOUR \ _TABLE par votre table DynamoDB.

La commande renvoie l'erreur « Accès refusé » suivante car le pod ne dispose pas des autorisations** DynamoDB:DeleteTable** :

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 OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans