NGINX Ingress es un controlador de entrada de Kubernetes popular para enrutar el tráfico a su clúster. Una característica de Ingress estándar le permite asignar solicitudes HTTP a sus servicios de Kubernetes. Vea cómo proteger sus rutas con la autenticación básica HTTP.
Creación de un archivo HTPasswd
Contenidos
Asegúrese de tener htpasswd disponible antes de configurar Kubernetes. Puede crear un nuevo usuario htpasswd único en su terminal:
apt install apache2-utils htpasswd -c auth ejemplo-usuario
Se le pedirá que ingrese la contraseña. Se creará un nuevo archivo llamado auth en su directorio de trabajo.
A continuación, debe codificar en base64 su cadena de credenciales para que pueda usarse como un valor en una clave secreta de Kubernetes:
autenticación de gato | base64
Copie la cadena codificada en base64 en el portapapeles. Lo usaremos en la siguiente sección para crear un secreto de Kubernetes que contenga sus credenciales.
Agregar un secreto de Kubernetes
La entrada hace referencia a los archivos NGINX htpasswd como secretos de Kubernetes. El contenido del archivo debe almacenarse en la clave de autenticación de un Opaque secreto. Kubernetes también tiene un tipo de secreto de autenticación básica incorporado, pero no es adecuado para NGINX Ingress.
Cree un nuevo manifiesto secreto y aplíquelo a su clúster con Kubectl:
apiVersion: v1 tipo: Tipo de secreto: Metadatos opacos: nombre: htpasswd data: auth:
Agregue su archivo htpasswd codificado en base64 como el valor de la clave de autenticación.
Modificando tu entrada
NGINX Ingress admite varias anotaciones personalizadas que le permiten adjuntar un comportamiento adicional a sus recursos de Ingress. Para usar la autenticación básica HTTP, debe configurar la anotación de tipo de autenticación y proporcionar una referencia a su secreto.
apiVersion: networking.k8s.io/v1beta1 tipo: Metadatos de entrada: nombre: ejemplo de anotaciones de entrada: nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: htpasswd nginx.ingress .kubernetes.io/auth-realm: «Ingrese sus credenciales» especificación: reglas: – host: ejemplo.com http: rutas: – ruta: / backend: serviceName: ejemplo-servicio servicePort: 80
Las tres anotaciones configuran NGINX para requerir autenticación en cada solicitud que coincida con su recurso de Ingress. el tipo de autenticación básica se usa con las credenciales del secreto htpasswd creado anteriormente. la anotación auth-realm define el mensaje que se muestra a los usuarios cuando se les solicita que ingresen sus credenciales.
Las solicitudes que coincidan con este ingreso ahora requerirán que el usuario inicie sesión antes de continuar. El desafío de autenticación se muestra como un cuadro de diálogo emergente en la mayoría de los navegadores web. Ingrese el nombre de usuario y la contraseña proporcionados al comando htpasswd para autenticarse.
Forma secreta alternativa
El secreto que se muestra arriba usa el formato de archivo de autenticación. Esto significa que tiene un campo de autenticación que contiene una salida codificada en base64 del comando htpasswd.
NGINX Ingress también admite otro formulario llamado auth-map. En esta variación, el campo de autenticación se reemplaza con un conjunto de llaves, cada una de las cuales proporciona la contraseña para un usuario individual.
apiVersion: v1 tipo: Tipo secreto: Opaco metadatos: nombre: htpasswd datos: usuario1:
Agregue sus nombres de usuario al archivo y use htpasswd para generar credenciales cifradas. Inspeccione la salida de htpasswd; tendrá el siguiente formato:
nombre de usuario:
Tome la parte de la contraseña, codifíquela con el comando base64 y luego agregue el resultado a su secreto de Kubernetes.
NGINX aceptará inicios de sesión de cualquier combinación válida de nombre de usuario y contraseña definida en el secreto. Este enfoque puede facilitar la configuración de múltiples cuentas de usuario y lo ayuda a ver exactamente quién tiene acceso.
Autenticación más avanzada
NGINX Ingress se puede integrar con proveedores de autenticación externos si necesita más control pero desea una experiencia de configuración sencilla y similar. El uso de un proveedor de autenticación externo redirigirá a los usuarios a ese sitio antes de que puedan acceder al servicio detrás de su Ingress. Esto le permite aplicar una rutina de autenticación completa sin alterar el código de back-end.
la anotación nginx.ingress.kubernetes.io/auth-url define la URL de un servicio de autenticación externo para usar. Kubernetes reenviará cada solicitud entrante al servicio. Solo se otorgará acceso al usuario cuando el servicio devuelva un código de estado 200 OK. El flujo normal continúa con la solicitud a su servicio de Kubernetes.
Cuando el servicio de autenticación indica un error, los usuarios serán redirigidos a la página indicada por nginx.ingress.kubernetes.io/auth-signin URL Esto tomará la URL original para redirigir después de un intento de autenticación exitoso como una URL de parámetro definida con el anotación auth-signin-redirect-param.
Varios Otras notas le permite ajustar el comportamiento de NGINX al comunicarse con la plataforma de autenticación. Puede cambiar el método HTTP utilizado para realizar solicitudes de autenticación, agregar encabezados adicionales y configurar el almacenamiento en caché para las respuestas de autenticación. Este último asegura que no acceda continuamente a la plataforma externa si un usuario realiza múltiples solicitudes a su servicio en un corto período de tiempo.
Resumen
La autenticación básica HTTP es la forma más sencilla de proteger un sitio web. Es ideal para sistemas internos y sitios provisionales en los que trabaja con una pequeña lista de usuarios y no necesita una gestión de credenciales centralizada.
Use la autenticación básica con Ingress NGINX proporcionando credenciales en un secreto de Kubernetes y configurando anotaciones en los recursos de Ingress. En un caso de uso real, no debe codificar las credenciales en sus manifiestos de Kubernetes. Utilice Helm o un sistema CI/CD para proporcionar valores de forma segura cuando aplique recursos al clúster.