Uso de Azure RBAC en clústeres de Kubernetes habilitados para Azure Arc
Los tipos de objeto ClusterRoleBinding y RoleBinding de Kubernetes ayudan a definir la autorización en Kubernetes de forma nativa. Con esta característica, puede usar Microsoft Entra ID y las asignaciones de roles en Azure para controlar las comprobaciones de autorización en el clúster. Las asignaciones de roles de Azure permiten controlar de forma granular qué usuarios pueden leer, escribir y eliminar objetos de Kubernetes, como la implementación, el pod y el servicio.
Para encontrar información general conceptual sobre esta característica, consulte Azure RBAC en Kubernetes habilitado para Azure Arc.
Requisitos previos
Instale o actualice la CLI de Azure a la versión más reciente.
Instale la versión más reciente de la extensión de la CLI de Azure
connectedk8s
:az extension add --name connectedk8s
Si la extensión
connectedk8s
ya está instalada, puede actualizarla a su versión más reciente con el siguiente comando:az extension update --name connectedk8s
Conecte un clúster existente de Kubernetes habilitado para Azure Arc:
- Si no ha conectado aún un clúster, use nuestro inicio rápido.
- Actualice los agentes a la versión más reciente.
Nota:
El RBAC de Azure no está disponible para las ofertas de Red Hat OpenShift o Kubernetes administrado en las que el acceso de usuario al servidor de API esté restringido (por ejemplo: Amazon Elastic Kubernetes Service (EKS), Google Kubernetes Engine (GKE)).
El RBAC de Azure no admite actualmente clústeres de Kubernetes que funcionen con arquitectura ARM64. Use el RBAC de Kubernetes para administrar el control de acceso para clústeres de Kubernetes basados en ARM64.
En el caso de los clústeres de Azure Kubernetes Service (AKS), esta característica está disponible de forma nativa y no requiere que el clúster de AKS esté conectado a Azure Arc.
En el caso de los clústeres de Azure Kubernetes Service (AKS) habilitados por Azure Arc en Azure Stack HCI 23H2, la habilitación de Azure RBAC solo se admite actualmente durante la creación del clúster de Kubernetes. Para crear un clúster de AKS habilitado por Azure Arc con Azure RBAC habilitado, siga la guía de Uso de Azure RBAC para la autorización de Kubernetes. Tenga en cuenta que Azure RBAC no es compatible con Azure Stack HCI, versión 22H2.
Habilitación de RBAC de Azure en el clúster
Para obtener la identidad MSI del clúster, ejecute el comando siguiente:
az connectedk8s show -g <resource-group> -n <connected-cluster-name>
Obtenga el identificador (
identity.principalId
) de la salida y ejecute el comando siguiente para asignar el rol CheckAccess Reader de identidad administrada del clúster conectado al MSI del clúster:az role assignment create --role "Connected Cluster Managed Identity CheckAccess Reader" --assignee "<Cluster MSI ID>" --scope <cluster ARM ID>
Ejecute el siguiente comando para habilitar el control de acceso basado en rol (RBAC) de Azure en el clúster de Kubernetes habilitado para Azure Arc:
az connectedk8s enable-features -n <clusterName> -g <resourceGroupName> --features azure-rbac
Nota:
Antes de ejecutar el comando anterior, asegúrese de que el archivo
kubeconfig
de la máquina apunta al clúster en el que va a habilitar la característica RBAC de Azure.Use
--skip-azure-rbac-list
con el comando anterior para obtener una lista separada por comas de los nombres de usuario, correos electrónicos y conexiones de OpenID en proceso de comprobación de autorización mediante los objetosClusterRoleBinding
yRoleBinding
nativos de Kubernetes, en lugar de RBAC de Azure.
Clúster genérico donde no se ejecuta ningún conciliador en la apiserver
especificación
Conéctese mediante SSH a cada nodo principal del clúster y realice los pasos siguientes:
Si
kube-apiserver
es unpod estático:El secreto
azure-arc-guard-manifests
del espacio de nombreskube-system
contiene dos archivos:guard-authn-webhook.yaml
yguard-authz-webhook.yaml
. Copie estos archivos en el directorio/etc/guard
del nodo.sudo mkdir -p /etc/guard kubectl get secrets azure-arc-guard-manifests -n kube-system -o json | jq -r '.data."guard-authn-webhook.yaml"' | base64 -d > /etc/guard/guard-authn-webhook.yaml kubectl get secrets azure-arc-guard-manifests -n kube-system -o json | jq -r '.data."guard-authz-webhook.yaml"' | base64 -d > /etc/guard/guard-authz-webhook.yaml
Abra el manifiesto
apiserver
en modo de edición:sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
Agregue la siguiente especificación después de
volumes
:- hostPath path: /etc/guard type: Directory name: azure-rbac
Agregue la siguiente especificación después de
volumeMounts
:- mountPath: /etc/guard name: azure-rbac readOnly: true
Si
kube-apiserver
no es un pod estático:Abra el manifiesto
apiserver
en modo de edición:sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
Agregue la siguiente especificación después de
volumes
:- name: azure-rbac secret: secretName: azure-arc-guard-manifests
Agregue la siguiente especificación después de
volumeMounts
:- mountPath: /etc/guard name: azure-rbac readOnly: true
Agregue los siguientes argumentos de
apiserver
:- --authentication-token-webhook-config-file=/etc/guard/guard-authn-webhook.yaml - --authentication-token-webhook-cache-ttl=5m0s - --authorization-webhook-cache-authorized-ttl=5m0s - --authorization-webhook-config-file=/etc/guard/guard-authz-webhook.yaml - --authorization-webhook-version=v1 - --authorization-mode=Node,RBAC,Webhook
Si el clúster de Kubernetes es de la versión 1.19.0 o posterior, también debe establecer el argumento
apiserver
siguiente:- --authentication-token-webhook-version=v1
Guarde y cierre el editor para actualizar el pod
apiserver
.
Clúster creado mediante la API de clústeres
Copie el secreto de restricción que contiene los archivos de configuración de webhooks de autenticación y autorización del clúster de cargas de trabajo en el equipo:
kubectl get secret azure-arc-guard-manifests -n kube-system -o yaml > azure-arc-guard-manifests.yaml
Cambie el valor del campo
namespace
del archivo azure-arc-guard-manifests.yaml por el espacio de nombres en el clúster de administración en el que está aplicando los recursos personalizados para la creación de clústeres de cargas de trabajo.Aplique el siguiente manifiesto:
kubectl apply -f azure-arc-guard-manifests.yaml
Ejecute
kubectl edit kcp <clustername>-control-plane
para editar el objetoKubeadmControlPlane
:Agregue el siguiente fragmento de código después de
files
:- contentFrom: secret: key: guard-authn-webhook.yaml name: azure-arc-guard-manifests owner: root:root path: /etc/kubernetes/guard-authn-webhook.yaml permissions: "0644" - contentFrom: secret: key: guard-authz-webhook.yaml name: azure-arc-guard-manifests owner: root:root path: /etc/kubernetes/guard-authz-webhook.yaml permissions: "0644"
Agregue el siguiente fragmento de código después de
apiServer
>extraVolumes
:- hostPath: /etc/kubernetes/guard-authn-webhook.yaml mountPath: /etc/guard/guard-authn-webhook.yaml name: guard-authn readOnly: true - hostPath: /etc/kubernetes/guard-authz-webhook.yaml mountPath: /etc/guard/guard-authz-webhook.yaml name: guard-authz readOnly: true
Agregue el siguiente fragmento de código después de
apiServer
>extraArgs
:authentication-token-webhook-cache-ttl: 5m0s authentication-token-webhook-config-file: /etc/guard/guard-authn-webhook.yaml authentication-token-webhook-version: v1 authorization-mode: Node,RBAC,Webhook authorization-webhook-cache-authorized-ttl: 5m0s authorization-webhook-config-file: /etc/guard/guard-authz-webhook.yaml authorization-webhook-version: v1
Guarde y cierre para actualizar el objeto
KubeadmControlPlane
. Espere a que estos cambios aparezcan en el clúster de cargas de trabajo.
Creación de asignaciones de roles para que los usuarios accedan al clúster
Los propietarios del recurso de Kubernetes habilitado para Azure Arc pueden usar roles integrados o roles personalizados para conceder a otros usuarios acceso al clúster de Kubernetes.
Roles integrados
Role | Descripción |
---|---|
Visor de Azure Arc Kubernetes | Permite el acceso de solo lectura para ver la mayoría de los objetos en un espacio de nombres. Este rol no permite ver secretos, ya que read el permiso en secretos habilitaría el acceso a ServiceAccount las credenciales en el espacio de nombres. A su vez, estas credenciales permitirían el acceso a la API a través del valor de ServiceAccount (una forma de elevación de privilegios). |
Escritor de Azure Arc Kubernetes | Permite el acceso de lectura y escritura para ver la mayoría de los objetos en un espacio de nombres. Este rol no permite la visualización o modificación de roles o enlaces de roles. No obstante, este rol permite acceder a secretos y ejecutar pods como cualquier valor ServiceAccount en el espacio de nombres, por lo que se puede usar para obtener los niveles de acceso de la API de cualquier valor ServiceAccount en el espacio de nombres. |
Administrador de Azure Arc Kubernetes | Permite el acceso de administrador. Está diseñado para su concesión dentro de un espacio de nombres a través de RoleBinding . Si se usa en RoleBinding , permite el acceso de lectura y escritura a la mayoría de los recursos de un espacio de nombres, incluida la capacidad de crear roles y enlaces de roles dentro del espacio de nombres. Este rol no permite el acceso de escritura a la cuota de recursos o al espacio de nombres en sí. |
Administrador de clústeres de Azure Arc Kubernetes | Permite el acceso de superusuario para ejecutar cualquier acción en cualquier recurso. Si se usa en ClusterRoleBinding , proporciona control total sobre todos los recursos del clúster y en todos los espacios de nombres. Si se usa en RoleBinding , proporciona control total sobre todos los recursos del espacio de nombres del enlace de roles, incluido el propio espacio de nombres. |
Puede crear asignaciones de roles cuyo ámbito sea un clúster de Kubernetes habilitado para Azure Arc en Azure Portal, en el panel Control de acceso (IAM) del recurso de clúster. También puede usar los siguientes comandos de la CLI de Azure:
az role assignment create --role "Azure Arc Kubernetes Cluster Admin" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID
En estos comandos, AZURE-AD-ENTITY-ID
puede ser un nombre de usuario (por ejemplo, testuser@mytenant.onmicrosoft.com
) o incluso el valor appId
de una entidad de servicio.
El siguiente es otro ejemplo de creación de una asignación de roles en el ámbito de un espacio de nombres específico dentro del clúster:
az role assignment create --role "Azure Arc Kubernetes Viewer" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID/namespaces/<namespace-name>
Nota:
Puede crear asignaciones de roles en el ámbito del clúster mediante Azure Portal o la CLI de Azure. Sin embargo, solo se puede usar la CLI de Azure para crear asignaciones de roles cuyo ámbito sea espacios de nombres.
Roles personalizados
Puede elegir su propia definición de roles para usarla en las asignaciones de roles.
Examine el siguiente ejemplo una definición de roles que solo permite a un usuario leer las implementaciones. Para obtener más información, consulte la lista completa de acciones de datos que puede usar para crear una definición de roles.
Copie el siguiente objeto JSON en un archivo denominado custom-role.json. Reemplace el marcador de posición <subscription-id>
por el identificador de la suscripción real. El rol personalizado usa una de las acciones de datos y le permite ver todas las implementaciones del ámbito (clúster o espacio de nombres) en el que se creó la asignación de roles.
{
"Name": "Arc Deployment Viewer",
"Description": "Lets you view all deployments in cluster/namespace.",
"Actions": [],
"NotActions": [],
"DataActions": [
"Microsoft.Kubernetes/connectedClusters/apps/deployments/read"
],
"NotDataActions": [],
"assignableScopes": [
"/subscriptions/<subscription-id>"
]
}
Ejecute el siguiente comando desde la carpeta donde se guardó el archivo custom-role.json para crear la definición de roles:
az role definition create --role-definition @custom-role.json
Cree una asignación de roles con esta definición de roles personalizada:
az role assignment create --role "Arc Deployment Viewer" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID/namespaces/<namespace-name>
Configuración de kubectl con credenciales de usuario
Hay dos maneras de obtener el archivo kubeconfig que necesita para acceder al clúster:
- Use la característica Conexión de clúster (
az connectedk8s proxy
) del clúster de Kubernetes habilitado para Azure Arc. - El administrador del clúster comparte el archivo kubeconfig con todos los demás usuarios.
Uso de conexión del clúster
Ejecute el siguiente comando para iniciar el proceso de proxy:
az connectedk8s proxy -n <clusterName> -g <resourceGroupName>
Una vez que se está ejecutando el proceso de proxy, puede abrir otra pestaña en la consola para empezar a enviar solicitudes al clúster.
Uso de un archivo kubeconfig compartido
El uso de kubeconfig compartido requiere pasos ligeramente diferentes en función de la versión de Kubernetes.
Ejecute el siguiente comando para establecer las credenciales del usuario. Especifique
serverApplicationId
como6256c85f-0aad-4d50-b960-e6e9b21efe35
yclientApplicationId
como3f4439ff-e698-4d6d-84fe-09c9d574f06b
:kubectl config set-credentials <testuser>@<mytenant.onmicrosoft.com> \ --auth-provider=azure \ --auth-provider-arg=environment=AzurePublicCloud \ --auth-provider-arg=client-id=<clientApplicationId> \ --auth-provider-arg=tenant-id=<tenantId> \ --auth-provider-arg=apiserver-id=<serverApplicationId>
Abra el archivo kubeconfig que creó anteriormente. En
contexts
, compruebe que el contexto asociado al clúster apunta a las credenciales de usuario que creó en el paso anterior. Para establecer el contexto actual en estas credenciales de usuario, ejecute el siguiente comando:kubectl config set-context --current=true --user=<testuser>@<mytenant.onmicrosoft.com>
Agregue el valor config-mode debajo de
user
>config
:name: testuser@mytenant.onmicrosoft.com user: auth-provider: config: apiserver-id: $SERVER_APP_ID client-id: $CLIENT_APP_ID environment: AzurePublicCloud tenant-id: $TENANT_ID config-mode: "1" name: azure
Nota:
El plugin Exec es una estrategia de autenticación de Kubernetes que permite
kubectl
ejecutar un comando externo para recibir las credenciales de usuario y enviarlas aapiserver
. A partir de la versión 1.26 de Kubernetes, el complemento de autorización de Azure predeterminado ya no se incluye enclient-go
ykubectl
. Con versiones posteriores, para usar el complemento exec para recibir credenciales de usuario, debe usar Azure Kubelogin, unclient-go
complemento de credenciales (exec) que implemente la autenticación de Azure.Instale Azure Kubelogin:
Para Windows o Mac, siga las Instrucciones de instalación de Azure Kubelogin.
Para Linux o Ubuntu, descargue la versión más reciente de kubeloginy ejecute los siguientes comandos:
curl -LO https://github.com/Azure/kubelogin/releases/download/"$KUBELOGIN_VERSION"/kubelogin-linux-amd64.zip unzip kubelogin-linux-amd64.zip sudo mv bin/linux_amd64/kubelogin /usr/local/bin/ sudo chmod +x /usr/local/bin/kubelogin
Kubelogin se puede usar para autenticarse con clústeres habilitados para Azure Arc solicitando un token de prueba de posesión (PoP). Convertir kubeconfig mediante para usar el modo de inicio de sesión adecuado. Por ejemplo, para el inicio de sesión de código de dispositivo con un usuario de Microsoft Entra, los comandos serían los siguientes:
export KUBECONFIG=/path/to/kubeconfig kubelogin convert-kubeconfig --pop-enabled --pop-claims 'u=<ARM ID of cluster>"
Envío de solicitudes al clúster
Ejecutar cualquier comando
kubectl
. Por ejemplo:kubectl get nodes
kubectl get pods
Una vez que se le solicite la autenticación basada en explorador, copie la dirección URL de inicio de sesión del dispositivo (
https://microsoft.com/devicelogin
) y ábrala en el explorador web.Escriba el código impreso en la consola. Copie y pegue el código del terminal en la solicitud de autenticación del dispositivo.
Escriba el nombre de usuario (
testuser@mytenant.onmicrosoft.com
) y la contraseña asociada.Si ve un mensaje de error similar al siguiente, significa que no está autorizado para acceder al recurso solicitado:
Error from server (Forbidden): nodes is forbidden: User "testuser@mytenant.onmicrosoft.com" cannot list resource "nodes" in API group "" at the cluster scope: User doesn't have access to the resource in Azure. Update role assignment to allow access.
Un administrador debe crear una nueva asignación de roles para autorizar a este usuario el acceso al recurso.
Uso del acceso condicional con Microsoft Entra ID
Al integrar Microsoft Entra ID con el clúster de Kubernetes habilitado para Azure Arc, también puede usar elAcceso condicional para controlar el acceso al clúster.
Nota:
El acceso condicional de Microsoft Entra es una funcionalidad P2 de Microsoft Entra ID.
Para crear una directiva de acceso condicional de ejemplo para usarla con el clúster:
En la parte superior de Azure Portal, busque y seleccione Microsoft Entra ID.
En el menú de Microsoft Entra ID en el lado izquierdo, seleccione Aplicaciones empresariales.
En el menú de aplicaciones empresariales del lado izquierdo, seleccione Acceso condicional.
En el menú de acceso condicional del lado izquierdo, seleccione Directivas>Nueva directiva.
Escriba un nombre para la directiva, como arc-k8s-policy.
Selecciona Usuarios y grupos En Incluir, elija Seleccionar usuarios y grupos. A continuación, elija los usuarios y grupos a los que quiere aplicar la directiva. En este ejemplo, elija el mismo grupo de Microsoft Entra que tiene acceso administrativo al clúster.
Seleccione Aplicaciones en la nube o acciones. En Incluir, elija Seleccionar aplicaciones. A continuación, busque y seleccione la aplicación de servidor que creó anteriormente.
En Controles de acceso, seleccione Conceder. Por ejemplo, seleccione Conceder acceso>Requerir que el dispositivo esté marcado como compatible.
En Habilitar directiva, seleccione Activar>Crear.
Vuelva a acceder al clúster. Por ejemplo, ejecute el comando kubectl get nodes
para ver los nodos del clúster:
kubectl get nodes
Siga las instrucciones para iniciar sesión de nuevo. Un mensaje de error indica que inició sesión correctamente, pero el administrador requiere que el dispositivo que solicita acceso esté administrado mediante por Microsoft Entra ID para acceder al recurso. Siga estos pasos:
En el Azure Portal, vaya a Microsoft Entra ID.
Seleccione Aplicaciones empresariales. A continuación, en Actividad, seleccione Inicios de sesión.
Una entrada en la parte superior muestra Error en Estado y Correcto en Acceso condicional. Seleccione la entrada y, a continuación, seleccione Acceso condicional en Detalles. Observe que se muestra su directiva de acceso condicional.
Configuración del acceso al clúster Just-In-Time con el identificador de Entra de Microsoft
Otra opción para el control de acceso al clúster es usar Privileged Identity Management (PIM) para las solicitudes Just-in-Time.
Nota:
Microsoft Entra PIM es una funcionalidad P2 de Microsoft Entra ID. Para más información sobre las SKU de Microsoft Entra ID, consulte la guía de precios.
Para configurar solicitudes de acceso Just-In-Time para el clúster, siga estos pasos:
En la parte superior de Azure Portal, busque y seleccione Microsoft Entra ID.
Anote el id. de inquilino. Para el resto de estas instrucciones, haremos referencia a ese id. como
<tenant-id>
.En el menú de Microsoft Entra ID en el lado izquierdo, en Administrar, seleccione Grupos>Nuevo grupo.
Asegúrese de que Seguridad está seleccionado para Tipo de grupo. Escriba el nombre de un grupo, como myJITGroup. En Roles de Microsoft Entra se pueden asignar a este grupo (versión preliminar),seleccione Sí. Por último, seleccione Crear.
Se le redirigirá a la página Grupos. Seleccione el grupo recién creado y anote el id. de objeto. Para el resto de estas instrucciones, nos referiremos a este id. como
<object-id>
.De nuevo en Azure Portal, en el menú de Actividad de la izquierda, seleccione Privileged Access (Preview) (Acceso con privilegios [versión preliminar]). A continuación, seleccione Enable Privileged Access (Habilitar acceso con privilegios).
Seleccione Agregar asignaciones para empezar a conceder acceso.
Seleccione un rol de Miembro y elija los usuarios y grupos a los que desea conceder el acceso al clúster. Un administrador de grupo puede modificar estas asignaciones en cualquier momento. Elija Siguiente cuando esté listo para continuar.
Elija un tipo de asignación Activa, la duración deseada y especifique una justificación. Cuando esté listo para continuar, seleccione Asignar. Para más información sobre los tipos de asignación, consulte Asignación de la elegibilidad para un grupo de acceso con privilegios (versión preliminar) en Privileged Identity Management.
Una vez que se han realizado las asignaciones, acceda al clúster para comprobar que el acceso Just-in-Time funciona. Por ejemplo, use el comando kubectl get nodes
para ver los nodos del clúster:
kubectl get nodes
Tenga en cuenta el requisito de autenticación y siga los pasos para autenticarse. Si la autenticación se realizó correctamente, debería ver una salida similar a esta:
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.
NAME STATUS ROLES AGE VERSION
node-1 Ready agent 6m36s v1.18.14
node-2 Ready agent 6m42s v1.18.14
node-3 Ready agent 6m33s v1.18.14
Pasos siguientes
- Conéctese de forma segura al clúster mediante Conexión de clúster.
- Obtenga información sobre la arquitectura de Azure RBAC en Kubernetes habilitado para Arc.