Uno de los servicios más utilizados nativos de la nube, son los contenedores orquestados por Kubernetes, donde los servicios de nube publica son uno de los más usados para este tipo de carga de trabajo. De hecho en una de las encuestas de cncf.io del 2020, nos muestra que alrededor del 60% de los usuarios / empresas utilizan almacenamiento nativo de nube para sus contenedores directamente desde Google (81%), AWS (80%) y Azure (74%), seguro que estos porcentajes han cambiado en estos años. Es por esto que en este post revisaremos como proteger todos los contenedores en AWS EKS.
Pasos Iniciales
Inicialmente, ya que mencioné el reporte de cncf.io, lo puedes revisar aquí:
https://www.cncf.io/wp-content/uploads/2020/12/CNCF_Survey_Report_2020.pdf
Como siempre debemos revisar la documentación oficial de Kasten:
https://docs.kasten.io/latest/install/aws/aws.html
Aquí veremos la forma recomendada de instalación, existiendo otra, pero debemos tratar siempre se acercarnos a las buenas practicas.
Instalación Kasten con IAM Role
La forma recomendada es utilizar la integración con un rol de IAM asociado a una cuenta de servicio, en este caso, k10-k10, por tanto comenzaremos creando las políticas de IAM para asignar los permisos de acuerdo a la configuración oficial de Kasten:
- https://docs.kasten.io/latest/install/aws/using_aws_iam_roles.html#using-aws-iam-roles
- https://docs.kasten.io/latest/install/aws/aws_permissions.html
El primer link nos indica los permisos necesarios para realizar snapshots, restaurar y migrar entre distintos cluster. En el segundo link nos aparecen todos los permisos por cada servicio que se necesita acceso de acuerdo a lo que necesites proteger. En este caso veremos 3 políticas de IAM para crear y tener una granularidad de permisos a la cuenta de servicio.
Generaremos 3 políticas, asociadas al json que nos muestra la documentación de Kasten, por ejemplo, para hacer la política de AWS EBS debemos hacer clic en “Crear Política”, clic en “JSON” y pegamos el contenido:
Luego, clic en siguiente, para aplicar tags y luego como último paso ingresaremos el nombre de la política:
**Importante: Se debe realizar la creación de las políticas necesarias, por tanto, se debe repetir este paso, con las políticas para los servicios necesarios del segundo link anterior**
Habilitar OIDC en EKS
Debemos utilizar Cloudshell o una configuración local de aws cli, configurando la autenticacion como un usuario administrador para la gestión de los siguientes comandos.
Para contar con una autenticación correcta, podemos configurar OIDC en nuestro cluster EKS con el siguiente comando (debes ingresar el nombre de tu cluster):
eksctl utils associate-iam-oidc-provider --cluster NombreCluster --approve
Como se indica en la documentacion:
Se debe considerar que el nombre del la cuenta de servicio que crearemos debe ser “k10-k10”, el namespace “kasten-io” y ademas agregar el ARN de las políticas que generamos, para obtener los ARN de las políticas, debes ingresar en IAM y hacer clic en el nombre de la política para ver el ARN, copiamos cada uno de los ARN de las políticas creadas anteriormente:
Ahora crearemos el namespace “kasten-io”
kubectl create ns kasten-io
Y luego generamos la cuenta de servicio con el siguiente comando:
eksctl create iamserviceaccount \
--name k10-k10 \
--namespace kasten-io \
--cluster Lab-EKS \
--attach-policy-arn arn:aws:iam::123456789000:policy/k10-EBS \
--attach-policy-arn arn:aws:iam::123456789000:policy/k10-RDS \
--attach-policy-arn arn:aws:iam::123456789000:policy/k10-S3 \
--approve \
--override-existing-serviceaccounts
**recuerda ingresar el nombre del cluster EKS y el ARN de cada politica**
Luego de esto veremos en IAM, un nuevo Rol:
Como se observa en la imagen anterior, las políticas están asociadas a este nuevo rol generado y asociado a la cuenta de servicio. Copiaremos el ARN del nuevo rol y pasaremos a la instalación de Kasten K10
Instalación Kasten K10 AWS EKS
Como ya hemos visto varias veces en este blog, debemos tener configurado “helm” con su respectivo chart, lo puedes ver aquí:
Y ahora instalaremos Kasten K10 con el siguiente comando:
helm install k10 kasten/k10 --namespace=kasten-io --set secrets.awsIamRole="arn:aws:iam::123456789000:role/eksctl-Lab-EKS-addon-iamserviceaccount-kaste-Role1-12FASDASDCKA"
*Recuerda que debes ingresar el ARN del Rol creado anteriormente*
** En caso de que aparezca un error reclamando sobre la existencia de un cuenta de servicio, solo elimina y crea nuevamante el namsespace kasten-io**
Esperamos que los pods de “kasten-io” queden en estado “running” revisándolos con el siguiente comando:
watch kubectl get pods -n kasten-io
Si deseas ver los discos que se crearon automáticamente con la instalación de Kasten K10:
kubectl get pvc -n kasten-io
Por último necesitamos acceso a la consola de Kasten K10, sólo debemos ejecutar el siguiente comando:
helm upgrade k10 kasten/k10 --namespace=kasten-io \
--reuse-values \
--set externalGateway.create=true \
--set auth.tokenAuth.enabled=true
Lo cual creara un servicio de “Load Balancer” y asignara una dirección dns de AWS:
kubectl get svc gateway-ext -n kasten-io
Solo debemos ingresar a la url, en este caso:
http://a8c57c2bded63432194a6545af3ce024-1753718719.sa-east-1.elb.amazonaws.com/k10/#/
y procederemos a autenticarnos como se observa en la documentación oficial:
https://docs.kasten.io/latest/access/authentication.html#obtaining-tokens
Hasta aquí ya puedes usar Kasten K10 para realizar respaldo de tus cargas en AWS EKS 🙂
Integrar con K10 Multi-Cluster Manager AWS EKS
Ya hemos visto anteriormente como instalar K10 Multi-Cluster Manager, si no lo haz revisado aún:
O instalar K10 Multi-Cluster Manager sin Keycloak:
Ahora, nos queda configurar el archivo kubeconfig en nuestra interfaz de Multi-Cluster Manager, intentaremos agregar el cluster por la interfaz web, haciendo clic en “Add Clusters” y pegaremos el contenido del archivo kubeconfig de nuestro cluster AWS EKS y nos mostrará lo siguiente:
Como vemos, no se puede seleccionar el cluster, ya que K10MultiCluster necesita un paso anterior para preparar el archivo kubeconfig correctamente, para ello realizaremos el siguiente comando para identificar el contexto de kubernetes usado:
kubectl config get-contexts
Copiamos el nombre del contexto y luego ejecutamos el comando:
k10multicluster kubeconfig prepare --context arn:aws:eks:sa-east-1:12345678900:cluster/Lab-EKS
Copiamos el contenido después de “—” y lo pegamos nuevamente en K10 Multi-Cluster Manager en “Add Clusters” y veremos que ahora están habilitadas las opciones para agregar el cluster de AWS EKS:
Seleccionamos el cluster y lo pasamos hacia la derecha, para luego ingresar el “Cluster Display Name”, la “Ingress URL” que es la direccion url que se nos asigno en los servicios de kasten-io, siempre agregando como lo indica la interfaz, namespace “kasten-io”, release name de helm “k10” y deshabilitar el TLS, ya que lo estamos agregando sin TLS, en caso de que configures el acceso con certificado, habilitas, luego clic en “Add Clusters”:
Y tendremos el cluster de AWS EKS en nuestra K10 Multi-Cluster Manager configurado para aplicar las políticas necesarias.
Agregar bucket S3 con el Rol IAM
Como anteriormente configuramos todos los permisos asociados a una cuenta de servicio de kasten k10 y las políticas asociadas al rol creado, cuando configuramos un “Location Profile” podremos usar el mismo IAM Role para la autenticacion seleccionando:
Ingresamos la Región, Nombre del bucket y guardamos el profile, por supuesto si el bucket tiene habilitada la inmutabilidad también la puedes usar.
Recomendaciones
Siempre las recomendaciones son a nivel de seguridad, siempre solo permite las direcciones IP’s autorizadas para que accedan a los servicios de kasten, a través de reglas de firewall para conservar la privacidad, por otra parte, si es necesario generar mas permisos al rol, solo debes generar la política necesaria, como por ejemplo para respaldar con los permisos necesarios de RDS y asociarlo al rol generado.