Configuración de una cuenta de servicio de Kubernetes para que asuma un rol de IAM - Amazon EKS

Ayude a mejorar esta página

¿Quiere contribuir a esta guía del usuario? Desplácese hasta el final de esta página y seleccione Editar esta página en GitHub. Sus contribuciones ayudarán a que nuestra guía del usuario sea mejor para todos.

Configuración de una cuenta de servicio de Kubernetes para que asuma un rol de IAM

En este tema se explica cómo configurar una cuenta de servicio de Kubernetes para asumir un rol de AWS Identity and Access Management (IAM). Los Pods que estén configurados para usar la cuenta de servicio pueden acceder a cualquier Servicio de AWS al que el rol tenga permisos para acceder.

Requisitos previos
  • Un clúster existente. Si no tiene uno, puede crearlo mediante una de las siguientes guías de Introducción a Amazon EKS.

  • Un proveedor de OpenID Connect (OIDC) de IAM existente para el clúster. Para saber si ya tiene un proveedor o cómo crear uno, consulte Creación de un proveedor de OIDC de IAM para su clúster.

  • La versión 2.12.3 o posterior, o bien, la versión 1.27.160 o posterior de la AWS Command Line Interface (AWS CLI) instalada y configurada en su dispositivo o AWS CloudShell. Para comprobar su versión actual, utilice aws --version | cut -d / -f2 | cut -d ' ' -f1. Los administradores de paquetes tales como yum, apt-get o Homebrew para macOS suelen estar atrasados varias versiones respecto de la versión de la AWS CLI más reciente. Para instalar la versión más reciente, consulte Instalar, actualizar y desinstalar la AWS CLI y Configuración rápida con aws configure en la Guía del usuario de AWS Command Line Interface. La versión de AWS CLI instalada en AWS CloudShell también puede estar atrasada varias versiones respecto de la versión más reciente. Para actualizarla, consulte Instalación de la AWS CLI en el directorio de inicio en la Guía del usuario de AWS CloudShell.

  • La herramienta de línea de comandos de kubectl está instalada en su dispositivo o AWS CloudShell. La versión puede ser la misma o hasta una versión secundaria anterior o posterior a la versión de Kubernetes de su clúster. Por ejemplo, si la versión del clúster es 1.29, puede usar la versión 1.28, 1.29 o 1.30 de kubectl con él. Para instalar o actualizar kubectl, consulte Instalación o actualización del kubectl.

  • Un archivo config de kubectl existente que contenga la configuración del clúster. Para crear un archivo con config de kubectl, consulte Creación o actualización de un archivo kubeconfig para un clúster de Amazon EKS.

Para asociar el rol de IAM con una cuenta de servicio de Kubernetes
  1. Si desea asociar una política de IAM existente a su rol de IAM, vaya al siguiente paso.

    Cree una política de IAM. Puede crear su propia política o copiar una política gestionada por AWS que ya conceda algunos de los permisos que necesita y personalizarla según sus requisitos específicos. Para obtener más información, consulte Creación de políticas de IAM en la Guía del usuario de IAM.

    1. Cree un archivo que incluya los permisos para los Servicios de AWS a los que quiere que accedan sus Pods. Para obtener una lista de todas las acciones para todos los Servicios de AWS, consulte la referencia de autorizaciones de servicio.

      Puede ejecutar el siguiente comando para crear un archivo de política de ejemplo que permita el acceso de solo lectura a un bucket de Amazon S3. Opcionalmente, puede almacenar información de configuración o un script de arranque en este bucket, y los contenedores de su Pod pueden leer el archivo desde el bucket y cargarlo en su aplicación. Si desea crear esta política de ejemplo, copie el siguiente contenido en su dispositivo. Sustituya my-pod-secrets-bucket por el nombre de su bucket y ejecute el comando.

      cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
    2. Cree la política de IAM.

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. Cree un rol de IAM y asócielo a una cuenta de servicio de Kubernetes. Puede utilizar eksctl o AWS CLI.

    eksctl
    Requisito previo

    La versión 0.183.0 o posterior de la herramienta de línea de comandos eksctl instalada en su dispositivo o AWS CloudShell. Para instalar o actualizar eksctl, consulte la sección de Instalación en la documentación de eksctl.

    Reemplace my-service-account por el nombre de la cuenta de servicio de Kubernetes que desea que eksctl cree y asóciela con un rol de IAM. Reemplace default por el espacio de nombres en el que desea que eksctl cree la cuenta de servicio. Reemplace my-cluster por el nombre de su clúster. Reemplace my-role por el nombre del rol al que desea asociar la cuenta de servicio. Si no existe, eksctl lo crea por usted. Reemplace 111122223333 por el ID de su cuenta y my-policy por el nombre de una política existente.

    eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \ --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve
    importante

    Si el rol o la cuenta de servicio ya existen, podría producirse un error al ejecutar el comando anterior. eksctl tiene diferentes opciones que puede proporcionar en esas situaciones. Para obtener más información, ejecute eksctl create iamserviceaccount --help.

    AWS CLI
    1. Si tiene una cuenta de servicio de Kubernetes existente que desea que asuma un rol de IAM, puede omitir este paso.

      Cree una cuenta de servicio de Kubernetes. Copie los siguientes contenidos en su dispositivo. Reemplace my-service-account por el nombre que desee y default por un espacio de nombres diferente, si es necesario. Si cambia default, el espacio de nombres debe existir previamente.

      cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml
    2. Establezca su ID de Cuenta de AWS en una variable de entorno con el siguiente comando.

      account_id=$(aws sts get-caller-identity --query "Account" --output text)
    3. Establezca el proveedor de identidades de OIDC en una variable de entorno con el siguiente comando. Reemplace my-cluster por el nombre del clúster.

      oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
    4. Establezca variables para el espacio de nombres y el nombre de la cuenta de servicio. Reemplace my-service-account por la cuenta de servicio de Kubernetes que desea que asuma el rol. Reemplace default por el espacio de nombres de la cuenta de servicio.

      export namespace=default export service_account=my-service-account
    5. Ejecute el siguiente comando para crear un archivo de política de confianza para el rol de IAM. Si quiere permitir que todas las cuentas de servicio de un espacio de nombres utilicen el rol, copie el siguiente contenido en su dispositivo. Reemplace StringEquals por StringLike y reemplace $service_account por *. Puede agregar varias entradas en las condiciones StringEquals y StringLike para permitir que varias cuentas de servicio o espacios de nombres asuman el rol. Para permitir que los roles de una Cuenta de AWS diferente a la de su clúster asuman el rol, consulte Permisos de IAM entre cuentas para más información.

      cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
    6. Cree el rol. Reemplace my-role con un nombre para el rol de IAM, y my-role-description con una descripción de su función.

      aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
    7. Adjunte la política de IAM al rol. Reemplace my-role por el nombre de su rol de IAM y my-policy por el nombre de una política existente que haya creado.

      aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::$account_id:policy/my-policy
    8. Anote su cuenta de servicio con el nombre de recurso de Amazon (ARN) del rol de IAM que desea que asuma la cuenta de servicio. Reemplace my-role por el nombre de su rol de IAM existente. Supongamos que permitió que un rol de una Cuenta de AWS diferente a la de su clúster asumiera el rol en un paso anterior. A continuación, asegúrese de especificar la Cuenta de AWS y el rol de la otra cuenta. Para obtener más información, consulte Permisos de IAM entre cuentas.

      kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
  3. Confirme que el rol y la cuenta de servicio se hayan configurado correctamente.

    1. Confirme que la política de confianza del rol de IAM se haya configurado correctamente.

      aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument

      Un ejemplo de salida sería el siguiente.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:default:my-service-account", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
    2. Confirme que la política que adjuntó a su rol en un paso anterior se encuentre adjunta al rol.

      aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text

      Un ejemplo de salida sería el siguiente.

      arn:aws:iam::111122223333:policy/my-policy
    3. Establezca una variable para almacenar el nombre de recurso de Amazon (ARN) de la política que quiera utilizar. Reemplace my-policy por el nombre de la política para la que desea confirmar los permisos.

      export policy_arn=arn:aws:iam::111122223333:policy/my-policy
    4. Vea la versión predeterminada de la política.

      aws iam get-policy --policy-arn $policy_arn

      Un ejemplo de salida sería el siguiente.

      { "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
    5. Vea el contenido de la política para asegurarse de que incluye todos los permisos que su Pod necesita. Si es necesario, reemplace 1 en el siguiente comando por la versión devuelta en la salida anterior.

      aws iam get-policy-version --policy-arn $policy_arn --version-id v1

      Un ejemplo de salida sería el siguiente.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] }

      Si creó la política de ejemplo en un paso anterior, el resultado es el mismo. Si creó una política diferente, el contenido de example es diferente.

    6. Confirme que la cuenta de servicio de Kubernetes se anota con el rol.

      kubectl describe serviceaccount my-service-account -n default

      Un ejemplo de salida sería el siguiente.

      Name:                my-service-account
      Namespace:           default
      Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role
      Image pull secrets:  <none>
      Mountable secrets:   my-service-account-token-qqjfl
      Tokens:              my-service-account-token-qqjfl
      [...]
  4. (Opcional) Configure el punto de conexión AWS Security Token Service de una cuenta de servicio. AWS recomienda el uso de un punto de conexión de AWS STS en lugar del global. Esto reduce la latencia, proporciona redundancia integrada y aumenta la validez de los tokens de sesión.

Siguiente paso

Configuración de Pods para usar una cuenta de servicio de Kubernetes