Вопрос или проблема
У меня есть кластер EKS с развернутым контроллером входящего трафика Nginx для Kubernetes. Я хотел бы добавить дополнительный уровень базовой аутентификации на уровне API Kubernetes, чтобы ограничить доступ и использовать пользовательские страницы ошибок для пользователей без токена базовой аутентификации, чтобы никто не мог обращаться к API, не пройдя базовую аутентификацию.
В настоящее время я использую токены AWS SSO для аутентификации к API, а также IAM-права. Мой вопрос: есть ли способ отправлять дополнительные заголовки аутентификации с каждым запросом kubectl для обработки базовой аутентификации?
Я проверял плагины, которые могут помочь с этим, но, похоже, единственным решением является запуск простого прокси, который добавляет заголовок базовой аутентификации за меня. Является ли это лучшим подходом или есть другие доступные варианты?
Ответ или решение
Чтобы добавить дополнительный слой базовой аутентификации поверх API Kubernetes в вашем EKS-кластере с развернутым контроллером Ingress Nginx, вы можете рассмотреть несколько методов. Давайте подробно разберем подходы к реализации этой задачи.
1. Использование NGINX Ingress для базовой аутентификации
Контроллер Ingress NGINX поддерживает базовую аутентификацию с помощью конфигурации. Вам нужно будет добавить аннотацию в ваш ресурс Ingress для включения базовой аутентификации.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-basic-realm: "Protected Area"
nginx.ingress.kubernetes.io/auth-secret: my-secret
spec:
rules:
- host: your-api-host
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: your-service
port:
number: 80
В данном примере my-secret
должен содержать ваши учетные данные для базовой аутентификации.
Для создания секрета используйте следующую команду:
kubectl create secret generic my-secret --from-literal=auth=username:$(openssl passwd -stdin -crypt) --namespace=your-namespace
2. Использование прокси для добавления заголовков
Вы также можете создать прокси-сервер, который будет добавлять нужные заголовки аутентификации. Это может быть ещё один контейнер в вашем кластере, который будет прослушивать запросы и добавлять заголовок Authorization
к каждому запросу, который поступает к API Kubernetes.
Вы можете использовать такие инструменты, как nginx
, haproxy
или другой легкий HTTP-прокси. Например, с использованием NGINX:
server {
listen 80;
location / {
proxy_pass http://your-k8s-api-url;
proxy_set_header Authorization "Basic $(echo -n 'username:password' | base64)";
}
}
3. Использование kubectl с дополнительными заголовками
К сожалению, стандартный kubectl
не поддерживает добавление дополнительных заголовков для каждого запроса. Однако, вы можете использовать altermate tooling или собственные скрипты. Например, с помощью curl
:
curl -H "Authorization: Basic $(echo -n 'username:password' | base64)" https://your-k8s-api-url/api/v1/namespaces
Это позволит вам контролировать запросы и добавлять необходимые заголовки.
4. Пользовательские страницы ошибок
В NGINX Ingress вы также можете настроить пользовательские страницы ошибок. Например, если пользователь не сможет пройти аутентификацию, вы можете перенаправить его на кастомную страницу ошибки:
error-page: "401/403" "/custom-error-page.html"
Заключение
В заключение, существует несколько способов добавления дополнительного уровня базовой аутентификации для вашего Kubernetes API, работающего в EKS. Самым простым решением будет использование встроенной поддержки базовой аутентификации в Ingress NGINX. Если вам необходимо более гибкое решение, стоит рассмотреть использование HTTP-прокси. Попробуйте реализовать оба варианта и выберите тот, который лучше всего подходит для вашей инфраструктуры.