Administración de roles de IAM como recursos de K8s

(Naveen M) (10 de julio de 2020)

Las aplicaciones implementadas en clústeres de Kubernetes en AWS necesitan Roles de IAM para administrar y acceder a los recursos de AWS. En Intuit, tenemos más de 200 clústeres y más de 8000 espacios de nombres. Hasta hace poco, los roles de IAM solían administrarse por separado de los recursos de Kubernetes desde una aplicación centralizada.

Esto funcionaba bien, pero los desarrolladores tenían que actualizar manualmente sus políticas de IAM antes de implementar su aplicación. Los cambios manuales necesarios para las actualizaciones de la política de IAM crearon un margen de error en el que los desarrolladores a veces se olvidan de actualizar su política de IAM mientras la promocionan al siguiente entorno de prueba, y esto creó una frustración para muchos desarrolladores.

Usamos para controlar qué permisos deberían permitirse desde nuestro servicio de administración de clústeres, pero algunas aplicaciones de la plataforma necesitaban excepciones para permitir políticas más permisivas. Comenzamos a incluir la excepción en el código, pero pronto nos dimos cuenta de que necesitábamos una solución más escalable.

Fue entonces cuando se nos ocurrió el iam-manager. El iam-manager es un CRD (Definición de recurso personalizado) k8s para administrar roles de AWS IAM como recursos de Kubernetes. Iam-manager es de código abierto como parte del Keiko Project y permite que las aplicaciones creen y administren funciones de IAM de manera segura y conveniente como parte de su canal de implementación (es decir, kubectl apply) junto con otros recursos de Kubernetes.

Al igual que con cualquier función que crea o modifica roles y permisos, la seguridad es de suma importancia. Iam-manager utiliza AWS IAM Permission Boundary junto con otras medidas de seguridad para garantizar los niveles adecuados de visibilidad y control.

AWS IAM Permission Boundary jugado un papel importante en términos de seguridad para nosotros, ya que sin él, los desarrolladores podrían incluir cualquier permiso de IAM en la especificación IAMRole y una aplicación con un rol de IAM que tenga permisos eks: * o ec2: * podría destruir todo el clúster. Queríamos controlar qué permisos se pueden delegar a los roles creados por IAM Manager, y Permission Boundary es la elección perfecta para nosotros. El límite de permisos de AWS IAM es un concepto en el que puede crear un límite con la lista de permisos de IAM máximos permitidos / (o denegados) a los que se puede acceder independientemente de lo que se especifique en una política de roles de IAM. En resumen, los permisos reales serán la intersección de los permisos especificados en el Límite de permisos y la política de funciones de IAM.

Tomemos un ejemplo en el que un rol de IAM tiene la política “ AdministratorAccess ”, lo que significa que tiene prácticamente todo el acceso, pero si adjuntamos un límite de permiso que solo tiene acceso s3: Get * (que NO puede ser cambiado por el usuario sino solo por el Administrador de clúster), ese rol de IAM solo puede realizar s3: Get * aunque el rol tenga permisos de “Administrador”. En palabras sencillas, los límites de permisos se utilizan para limitar los permisos que puede delegar el CRD de iam-manager. Consulte el Límite de permisos de IAM de AWS de la documentación de aws para obtener más información.

También tenemos un webhook para rechazar las creaciones de roles de IAM si la especificación de IAMRole tiene una política que no está incluida en las políticas de la lista blanca que podemos configurar a través del mapa de configuración. Esto es totalmente opcional ya que AWS IAM Permission Boundary se ocupa de los permisos excesivos, pero se puede utilizar para mantener las políticas muy limpias.

Y por último, pero no menos importante, teníamos que ser muy cuidadosos con el rol de IAM asignado al módulo iam-manager-controller y diseñamos cuidadosamente la política de permisos de IAM de una manera en la que solo puede realizar tareas limitadas. Es decir, no puede crear ningún rol de IAM sin adjuntar un límite de permiso predefinido, puede crear roles solo con nombres predefinidos (es decir, k8s- *) y tampoco puede eliminar ningún rol que no tenga ETIQUETAS predefinidas (agregamos los TAG a los roles creados solo por iam-manager). Para obtener más información, consulte la política de IAM de iam-manager.

Para instalar y probar iam-manager:

git clone 
[email protected]:keikoproj/iam-manager.git
cd hack#update config map according to your requirements. please refer #
config map for all the configuration options
vim iammanager.keikoproj.io\_iamroles-configmap.yamlexport KUBECONFIG=/Users/myhome/.kube/[email protected]
export AWS\_PROFILE=admin\_123456789012\_account
#./install.sh [cluster\_name] [aws\_region] [aws\_profile]
./install.sh eks-dev2-k8s us-west-2 aws\_profile

Aquí hay un ejemplo simple:

apiVersion: iammanager.keikoproj.io/v1alpha1
kind: Iamrole
metadata:
name: iam-manager-iamrole
spec:
# Add fields here
PolicyDocument:
Statement:
-
Effect: "Allow"
Action:
- "s3:Get*"
Resource:
- "arn:aws:s3:::intu-oim*"
Sid: "AllowS3Access"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: "Allow"
Action: "sts:AssumeRole"
Principal:
AWS:
- "arn:aws:iam::XXXXXXXXXXX:role/20190504-k8s-kiam-role"

Para enviar, kubectl apply -f iam\_role .yaml – ns namespace1

Además de crear un rol de IAM y mantener el estado deseado todo el tiempo, también admite la creación de roles para IRSA (rol de IAM para cuentas de servicio) agregando una anotación
iam.amazonaws.com/irsa-service-account: a la especificación de función de IAM .

apiVersion: iammanager.keikoproj.io/v1alpha1
kind: Iamrole
metadata:
name: iam-manager-iamrole-irsa
annotations:
iam.amazonaws.com/irsa-service-account: aws-sa
spec:
# Add fields here
PolicyDocument:
Statement:
-
Effect: "Allow"
Action:
- "s3:Get*"
Resource:
- "arn:aws:s3:::intu-oim*"
Sid: "AllowS3Access"

Para resumir, agregar iam-manager a un clúster de Kubernetes no solo proporciona una solución segura y conveniente para la administración de roles de AWS IAM dentro de un clúster, sino que también permite aplicaciones equipos para crear una función de IAM como parte de su canal de implementación junto con otros recursos de Kubernetes a través de GitOps.

Para obtener una lista completa de funciones, consulte la sección de funciones en https://github.com/keikoproj/iam-manager .

También, muchas gracias a (Ed Lee), (Kshama Jain) y otros miembros del equipo por su valiosa contribución a iam-manager.