Apps multinube con Istio

Al utilizar el adaptador App Identity and Access, puede centralizar toda la gestión de identidades en un único lugar.

El adaptador App Identity and Access no recibe soporte actualmente.

Dado que las empresas utilizan nubes de varios proveedores o una combinación de soluciones locales y externas, los modelos de despliegue heterogéneos pueden ayudarle a conservar la infraestructura existente sin la obligación de permanecer con un proveedor. El adaptador se puede configurar para que funcione con cualquier proveedor de identidades compatible con OIDC, como por ejemplo App ID. El servicio permite al adaptador controlar las políticas de autenticación y autorización en todos los entornos, incluidas las aplicaciones frontales y de fondo. Y todo ello sin necesidad de modificar el código ni de volver a desplegar la aplicación.

Arquitectura multinube

Un entorno de cálculo de varias nubes combina múltiples entornos de nube y/o de cálculo privado en una única arquitectura de red. Al distribuir las cargas de trabajo entre varios entornos, es posible aumentar la resiliencia, la flexibilidad y la rentabilidad. Para disfrutar estas ventajas, es habitual utilizar una aplicación basada en contenedor con una capa de orquestación, como por ejemplo Kubernetes.

de arquitectura de App Identity and Access Adapter*Implantación en múltiples nubes gracias a App Identity and Access

Descripción de Istio y del adaptador

Istio es una malla de servicios de código abierto que se sitúa como capa de forma transparente en las aplicaciones distribuidas existentes que pueden integrarse con Kubernetes. Para reducir la complejidad de los despliegues, Istio proporciona información de comportamiento y control operativo sobre la malla de servicio en su conjunto. Cuando App ID se combina con Istio, se convierte en una solución de identidad escalable e integrada para arquitecturas de varias nubes que no requiere ningún cambio personalizado en el código de aplicación. Para más información, consulte Qué es Istio.

Istio utiliza un sidecar de proxy Envoy para mediar en todo el tráfico de entrada y salida para todos los servicios de la malla de servicios. Mediante el uso del proxy, Istio extrae información sobre el tráfico, lo que se conoce como telemetría, que se envía al componente Istio denominado Mixer para aplicar las decisiones de política. El adaptador App Identity and Access amplía la funcionalidad de Mixer analizando la telemetría (atributos) respecto a las políticas personalizadas con el fin de controlar la identidad y la gestión de acceso a la malla de servicio. Las políticas de gestión de acceso están vinculadas con servicios concretos de Kubernetes y se pueden ajustar de forma detallada para puntos finales de servicio específicos. Para más información sobre políticas y telemetría, consulte la documentación de Istio.

Debido a una limitación de Istio, el adaptador App Identity and Access almacena actualmente la información de sesión de usuario internamente y no persiste la información entre réplicas o configuraciones de migración tras error. Cuando utilice el adaptador, limite las cargas de trabajo a una sola réplica hasta que se corrija la limitación.

Protección de apps frontales

Si utiliza una aplicación basada en navegador, puede utilizar el flujo Open ID Connect(OIDC) / OAuth 2.0 authorization_grant para autenticar a sus usuarios. Cuando se detecta un usuario no autenticado, se le redirige automáticamente a la página de autenticación. Cuando finaliza la autenticación, el navegador se redirige a un punto final implícito de /oidc/callback en el que el adaptador intercepta la solicitud. En este punto, el adaptador obtiene señales del proveedor de identidad y, a continuación, redirige al usuario de nuevo a su URL solicitado originalmente.

Para ver la información de sesión de usuario, incluidas las señales de sesión, puede consultar la cabecera Authorization.

Authorization: Bearer <accessToken> <IDToken>

También puede cerrar la sesión de usuarios autenticados. Cuando un usuario autenticado accede a un punto final protegido con oidc/logout añadido, tal como se muestra en el ejemplo siguiente, se le desconecta.

https://myhost/path/oidc/logout

Si es necesario, se puede utilizar una señal de renovación para adquirir automáticamente nuevas señales de acceso y de identidad sin que el usuario tenga que volver a autenticarse. Si el proveedor de identidad configurado devuelve una señal de renovación, se mantiene en la sesión y se utiliza para recuperar nuevas señales cuando caduca la señal de identidad.

Protección de apps de fondo

El Adaptador puede utilizarse en colaboración con OAuth 2.0 Flujo de portadores JWT para proteger las API de servicios mediante la validación de tokens JWT Bearer. El flujo de autorización de Bearer espera que una solicitud contenga una cabecera de Authorization con una señal de acceso válida y una señal de identidad opcional. La estructura de cabecera esperada es Authorization=Bearer {access_token} [{id_token}]. A los clientes no autenticados se les devuelve un estado de respuesta HTTP 401 con una lista de los ámbitos que son necesarios para obtener la autorización. Si las señales no son válidas o han caducado, la estrategia de API devuelve una respuesta HTTP 401 con un componente de error opcional que dice Www-Authenticate=Bearer scope="{scope}" error="{error}".

Para obtener más información sobre las señales y cómo se utilizan, consulte Información sobre las señales.

Antes de empezar

Antes de empezar, asegúrese de que ha instalado los siguientes requisitos previos.

Instalación del adaptador

Para instalar el diagrama, inicialice Helm en el clúster, defina las opciones que desea utilizar y, a continuación, ejecute el mandato de instalación.

  1. Si está trabajando con el servicio IBM Cloud Kubernetes, asegúrese de iniciar la sesión y establecer el contexto para el clúster.

  2. Compruebe que ha activado la aplicación de la política Istio. Si no es así, actívelo.

  3. Añada el repositorio.

    helm repo add appidentityandaccessAdapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-Adapter/master/helm/appidentityandaccessAdapter
    
  4. Instale el diagrama.

    helm install --name appidentityandaccessAdapter appidentityandaccessAdapter/appidentityandaccessAdapter
    

    Puede especificar un código de imagen durante la instalación definiendo el distintivo image.tag. Por ejemplo, --set image.tag=0.5.0. También puede instalar el gráfico localmente. Para ello, clone el repositorio ejecutando git clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.git antes de ejecutar el mandato de instalación.

Aplicación de una política de autorización y autenticación

Una política de autenticación o autorización es un conjunto de condiciones que deben cumplirse para que una solicitud pueda acceder a un acceso de recurso. Al definir la configuración de servicio del proveedor de identidades y una política que describe cuándo debe utilizarse un flujo determinado, puede controlar el acceso a cualquier recurso de la malla de servicio. Para ver ejemplos de CRD, consulte el directorio de muestras.

Para crear una política:

  1. Defina una configuración.
  2. Registre el punto final.

Definición de una configuración

En función de si va a proteger aplicaciones frontales o de fondo, cree una configuración de política con una de las opciones siguientes.

  • Para aplicaciones frontales: las aplicaciones basadas en navegador que requieren autenticación de usuario se pueden configurar para que utilicen el flujo de autenticación de OIDC/OAuth 2.0. Para definir un CRD de OidcConfig que contenga el cliente utilizado para facilitar el flujo de autenticación con el proveedor de identidad, utilice el ejemplo siguiente como guía.

    apiVersion: "security.cloud.ibm.com/v1"
    kind: OidcConfig
    metadata:
       name:      oidc-provider-config
       namespace: sample-namespace
    spec:
       discoveryUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/.well-known/openid-configuration
       clientId:     <clientID>
       clientSecret: <randomlyGeneratedClientSecret>
       clientSecretRef:
             name: <nameOfKubeSecret>
             key: <keyInKubeSecret>
    
    Explicación de los componentes del archivo de configuración YAML
    Campo Tipo Obligatorio Descripción
    discoveryUrl string Un punto final conocido que proporciona un documento JSON de información de configuración de OIDC/OAuth 2.0.
    clientId string Un identificador para el cliente que se utiliza para la autenticación.
    clientSecret string *No Un secreto de texto sin formato que se utiliza para autenticar al cliente. Si no se proporciona, debe existir un campo clientSecretRef.
    clientSecretRef objeto No Un secreto de referencia que se utiliza para autenticar al cliente. La referencia se puede utilizar en lugar del campo clientSecret.
    clientSecretRef.name string El nombre del secreto de Kubernetes que contiene el campo clientSecret.
    clientSecretRef.key string El campo dentro del secreto de Kubernetes que contiene el valor de clientSecret.
  • Para aplicaciones backend: La especificación OAuth 2.0 Bearer token define un patrón para proteger APIs mediante el uso de JSON Web Tokens(JWTs). Al utilizar la configuración siguiente como ejemplo, defina un CRD JwtConfig que contenga el recurso de clave pública, que se utiliza para validar firmas de señales.

    apiVersion: "security.cloud.ibm.com/v1"
    kind: JwtConfig
    metadata:
       name:      jwt-config
       namespace: sample-app
    spec:
       jwksUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/publickeys
    

Registro de puntos finales de aplicación

Registre los puntos finales de aplicación dentro de un CRD de Policy para validar las solicitudes entrantes y aplicar las reglas de autenticación. Cada Policy se aplica exclusivamente al espacio de nombres de Kubernetes en el que vive el objeto, y puede especificar los servicios, las vías de acceso y los métodos que desea proteger.

apiVersion: "security.cloud.ibm.com/v1"
kind: Policy
metadata:
  name:      samplepolicy
  namespace: sample-app
spec:
  targets:
    -
      serviceName: <svcSampleApp>
      paths:
        - exact: /web/home
          method: ALL
          policies:
            - policyType: oidc
              config: <oidcProviderConfig>
              rules:
                - claim: scope
                  match: ALL
                  source: access_token
                  values:
                    - appid_default
                    - openid
                - claim: amr
                  match: ANY
                  source: id_token
                  values:
                    - cloud_directory
                    - google

        - exact: /web/user
          method: GET
          policies:
            - policyType: oidc
              config: <oidcProviderConfig>
              redirectUri: https://github.com/ibm-cloud-security/app-identity-and-access-Adapter
        - prefix: /
          method: ALL
          policies:
            -
              policyType: jwt
              config: <jwtConfig>
Comprender los componentes del objeto de servicio
Objeto de servicio Tipo Obligatorio Descripción
serviceName string El nombre del servicio Kubernetes en el espacio de nombres de política que desea proteger.
paths array[Path Object] Una lista de objetos de vía de acceso que define los puntos finales que desea proteger. Si no se especifica, se protegen todas las vías de acceso.
Comprender los componentes del objeto trayectoria
Objeto de vía de acceso Tipo Obligatorio Descripción
exact or prefix string La vía de acceso en la que desea aplicar las políticas. Las opciones incluyen exact y prefix. exact hace coincidir los puntos finales proporcionados exactamente con el último / recortado. prefix coincide con los puntos finales que empiezan por el prefijo de ruta que se proporciona.
method enum No El método HTTP protegido. Opciones válidas: ALL, GET, PUT, POST, DELETE, PATCH. Valor predeterminado: ALL.
policies array[Policy] No Las políticas de OIDC/JWT que desea aplicar.
Comprender los componentes del objeto político
Objeto de política Tipo Obligatorio Descripción
policyType enum El tipo de política de OIDC. Las opciones incluyen: jwt u oidc.
config string El nombre de la configuración de proveedor que desea utilizar.
redirectUri string No El URL al que desea que se redirija al usuario tras una correcta autenticación. Valor predeterminado: el URL de la solicitud original.
rules array[Rule] No El conjunto de reglas que desea utilizar para la validación de señal.
Comprender los componentes del objeto político
Objeto de regla Tipo Obligatorio Descripción
claim string La reclamación que desea validar.
match enum No Los criterios necesarios para la validación de reclamación. Las opciones incluyen: ALL, ANY o NOT. El valor predeterminado se establece en ALL.
source enum No La señal en la que desea aplicar la regla. Las opciones incluyen: access_token u id_token. El valor predeterminado se establece en access_token.
values array[string] El conjunto necesario de valores para la validación.

Supresión del adaptador

Para eliminar el adaptador y todas las CRD asociadas, debe suprimir el diagramaHelm y las claves de firma y cifrado asociadas.

helm delete --purge appidentityandaccessAdapter
kubectl delete secret appidentityandaccessAdapter-keys -n istio-system

Configuración del registro

De forma predeterminada, el estilo de los registros es JSON, y se proporcionan con un nivel de visibilidad info para facilitar la integración con los sistemas de registro externos. Para actualizar la configuración de registro, puede utilizar el diagrama de Helm. Los niveles de registro soportados incluyen el rango [-1, 7] tal como se muestra en el núcleo de Zap. Para más información sobre los niveles, consulte la documentación del núcleo de Zap.

Adaptador

Para ver los registros del adaptador, puede utilizar kubectl o acceder al pod desde el pod appidentityandaccessAdapter de la consola de Kubernetes.

alias Adapter_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=appidentityandaccessAdapter -o jsonpath='{.items[0].metadata.name}')"
Adapter_logs | jq

Mixer

Si el adaptador no parece recibir solicitudes, consulte los registros de Mixer para asegurarse de que se ha conectado correctamente al adaptador.

alias mixer_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=telemetry -o jsonpath='{.items[0].metadata.name}') -c mixer"
mixer_logs | jq