Поиск по сайту:

Как добавить базовую HTTP-аутентификацию в Kubernetes NGINX Ingress


NGINX Ingress — популярный входной контроллер Kubernetes для маршрутизации трафика в ваш кластер. Стандартный ресурс Ingress позволяет сопоставлять HTTP-запросы с вашими сервисами Kubernetes. Вот как защитить свои маршруты с помощью базовой HTTP-аутентификации.

Создание файла HTTPasswd

Прежде чем приступать к настройке Kubernetes, убедитесь, что у вас есть файл htpasswd. Вы можете создать нового пользователя htpasswd в своем терминале:

apt install apache2-utils
htpasswd -c auth example-user

Вам будет предложено ввести пароль. В вашем рабочем каталоге будет создан новый файл с именем auth.

Затем вам нужно закодировать строку учетных данных в base64, чтобы ее можно было использовать в качестве значения в секрете Kubernetes:

cat auth | base64

Скопируйте строку в кодировке base64 в буфер обмена. Мы будем использовать его в следующем разделе для создания секрета Kubernetes, содержащего ваши учетные данные.

Добавление секрета Kubernetes

NGINX Ingress ссылается на файлы htpasswd как на секреты Kubernetes. Содержимое файла должно храниться в ключе auth секрета Opaque. В Kubernetes также есть встроенный секретный тип basic-auth, но он не подходит для NGINX Ingress.

Создайте новый секретный манифест и примените его к своему кластеру с помощью Kubectl:

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: htpasswd
data:
  auth: <base64-encoded htpasswd file>

Добавьте файл htpasswd в кодировке base64 в качестве значения ключа auth.

Изменение входа

NGINX Ingress поддерживает несколько пользовательских аннотаций, которые позволяют вам придавать дополнительное поведение вашим ресурсам Ingress. Чтобы использовать базовую аутентификацию HTTP, вам необходимо установить аннотацию auth-type и предоставить ссылку на ваш секрет.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: htpasswd
    nginx.ingress.kubernetes.io/auth-realm: "Enter your credentials"
spec:
  rules:
    - host: example.com
      http:
        paths:
         - path: /
           backend:
            serviceName: example-service
            servicePort: 80

Три аннотации настраивают NGINX на требование аутентификации при каждом запросе, соответствующем вашему ресурсу Ingress. Тип аутентификации basic используется с учетными данными из секрета htpasswd, созданного ранее. Аннотация auth-realm определяет сообщение, отображаемое пользователям, когда им предлагается ввести свои учетные данные.

Запросы, соответствующие этому Ingress, теперь потребуют от пользователя входа в систему, прежде чем они продолжат работу. Запрос проверки подлинности отображается в виде всплывающего диалогового окна в большинстве веб-браузеров. Введите имя пользователя и пароль, предоставленные команде htpasswd, чтобы аутентифицировать себя.

Альтернативная секретная форма

Показанный выше секрет использует формат auth-file. Это означает, что у него есть поле auth, содержащее вывод в кодировке base64 из команды htpasswd.

NGINX Ingress также поддерживает другую форму, называемую auth-map. В этом варианте поле auth заменено набором ключей, каждый из которых предоставляет пароль для отдельного пользователя.

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: htpasswd
data:
  user1: <base64-encoded password hash from htpasswd>
  user2: <base64-encoded password hash from htpasswd>

Добавьте свои имена пользователей в файл, а затем используйте htpasswd для создания хешированных учетных данных. Проверьте вывод htpasswd; он будет иметь следующий формат:

username:<hashed password>

Возьмите часть пароля, закодируйте ее с помощью команды base64, а затем добавьте результат в свой секрет Kubernetes.

NGINX будет принимать входы в систему с любой действительной комбинацией имени пользователя и пароля, определенной в секрете. Такой подход может упростить настройку нескольких учетных записей пользователей и поможет вам точно увидеть, у кого есть доступ.

Более продвинутая аутентификация

NGINX Ingress может интегрироваться с внешними провайдерами аутентификации, если вам нужен больший контроль, но вы хотите такую же простую настройку. Использование внешнего поставщика аутентификации перенаправит пользователей на этот сайт, прежде чем они смогут получить доступ к Сервису за вашим Ingress. Это позволяет вам применять полную процедуру аутентификации, не затрагивая ваш внутренний код.

Аннотация nginx.ingress.kubernetes.io/auth-url определяет URL-адрес внешней службы аутентификации для использования. Kubernetes будет пересылать каждый входящий запрос в сервис. Доступ будет предоставлен пользователю только тогда, когда служба вернет код состояния 200 OK. Затем обычный поток продолжается, и запрос поступает в вашу службу Kubernetes.

Когда служба аутентификации указывает на ошибку, пользователи будут перенаправлены на страницу, указанную URL-адресом nginx.ingress.kubernetes.io/auth-signin. Он получит исходный URL-адрес для перенаправления назад после успешной попытки аутентификации в качестве параметра URL-адреса, определенного с помощью аннотации auth-signin-redirect-param.

Несколько других аннотаций позволяют настроить поведение NGINX при взаимодействии с платформой аутентификации. Вы можете изменить метод HTTP, используемый для выполнения запросов аутентификации, добавить дополнительные заголовки и настроить кэширование ответов аутентификации. Последнее гарантирует, что вы не будете постоянно обращаться к внешней платформе, если пользователь сделает несколько запросов к вашему сервису за короткий промежуток времени.

Краткое содержание

Базовая HTTP-аутентификация — это самый простой способ защиты веб-сайта. Он идеально подходит для внутренних систем и промежуточных сайтов, где вы работаете с небольшим списком пользователей и не нуждаетесь в централизованном управлении учетными данными.

Используйте обычную аутентификацию с NGINX Ingress, указав учетные данные в секрете Kubernetes и установив аннотации для ваших ресурсов Ingress. В реальном случае использования вы не должны жестко кодировать учетные данные в своих манифестах Kubernetes. Либо используйте Helm, либо систему CI/CD для безопасного предоставления значений во время применения ресурсов к кластеру.




Все права защищены. © Linux-Console.net • 2019-2024