Как защитить частные сервисы Kubernetes с помощью GitHub Войти с помощью oauth2_proxy

Вступление

Kubernetesingresses упрощает предоставление веб-сервисов Интернету. Однако когда дело доходит до частных услуг, вы, вероятно, захотите ограничить доступ к ним. oauth2_proxy может служить барьером между общедоступным Интернетом и частными услугами. oauth2_proxy - это обратный прокси-сервер и сервер, который обеспечивает аутентификацию с использованием разных поставщиков, таких как GitHub, и проверяет пользователей по их адресу электронной почты или другим свойствам.

В этом руководстве вы будете использовать oauth2_proxy с GitHub для защиты своих сервисов. Когда вы закончите, у вас будет система авторизации, которая выглядит так, как показано на следующей диаграмме:

A diagram of a request flow end-result

Предпосылки

Для завершения этого урока вам понадобится:

[[step-1 -—- configuring-your-domains]] == Шаг 1. Настройка ваших доменов

После выполнения инструкций, указанных в разделе «Необходимые условия», в вашем кластере будут запущены две веб-службы:echo1 иecho2. У вас также будет один вход, который отображаетecho1.your_domain иecho2.your_domain на их соответствующие службы.

В этом уроке мы будем использовать следующие соглашения:

  • Все частные сервисы попадают в поддомен.int.your_domain, какservice.int.your_domain. Группировка частных сервисов под одним поддоменом идеальна, поскольку файл cookie аутентификации будет совместно использоваться всеми поддоменами*.int.your_domain.

  • Портал входа будет обслуживатьсяauth.int.your_domain.

[.note] #Note: Не забудьте заменитьyour_domain своим собственным доменным именем везде, где оно встречается в этом руководстве.
#

Для начала обновите существующее определение входящего трафика, чтобы переместить службыecho1 иecho2 в.int.your_domain. Откройтеecho_ingress.yaml в текстовом редакторе, чтобы вы могли изменить домены:

nano echo_ingress.yaml

Переименуйте все экземплярыecho1.your_domain вecho1.int.your_domain и замените все экземплярыecho2.your_domain наecho2.int.your_domain:

echo_ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echo-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - echo1.int.your_domain
    - echo2.int.your_domain
    secretName: letsencrypt-prod
  rules:
  - host: echo1.int.your_domain
    http:
      paths:
      - backend:
          serviceName: echo1
          servicePort: 80
  - host: echo2.int.your_domain
    http:
      paths:
      - backend:
          serviceName: echo2
          servicePort: 80

Сохраните файл и примените изменения:

kubectl apply -f echo_ingress.yaml

Это также обновит сертификаты TLS для ваших службecho1 иecho2.

Теперь обновите свою конфигурацию DNS, чтобы отразить сделанные вами изменения. Сначала найдите IP-адрес вашего входа в Nginx, выполнив следующую команду, чтобы напечатать его данные:

kubectl get svc --namespace=ingress-nginx

Вы увидите IP-адрес подEXTERNAL-IP в выводе:

OutputNAME            TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                      AGE
ingress-nginx   LoadBalancer   10.245.247.67   203.0.113.0   80:32486/TCP,443:32096/TCP   20h

Скопируйте внешний IP-адрес в буфер обмена. Перейдите к своей службе управления DNS и найдите записиA дляecho1-2.your_domain, указывающие на этот внешний IP-адрес. Если вы используете DigitalOcean для управления записями DNS, см. Инструкции вHow to Manage DNS Records.

Удалите записи дляecho1 иecho2. Добавьте новую записьA для имени хоста*.int.your_domain и укажите ее на внешний IP-адрес входа.

Теперь любой запрос к любому субдомену в*.int.your_domain будет перенаправлен на вход Nginx, поэтому вы можете использовать эти субдомены в своем кластере.

Далее вы настроите GitHub в качестве провайдера входа в систему.

[[step-2 -—- created-a-github-oauth-application]] == Шаг 2. Создание приложения GitHub OAuth

oauth2_proxy поддерживает различные провайдеры входа. В этом руководстве вы будете использовать провайдера GitHub. Для начала создайте новое приложение GitHub OAuth.

На страницеOAuth Apps tab of the Developer settings вашей учетной записи нажмите кнопкуNew OAuth App.

ПоляApplication name иHomepage URL могут быть любыми, какими захотите. В полеAuthorization callback URL введитеhttps://auth.int.your_domain/oauth2/callback.

После регистрации приложения вы получите идентификатор клиента и секрет. Обратите внимание на два, так как они понадобятся вам на следующем шаге.

Теперь, когда вы создали приложение GitHub OAuth, вы можете установить и настроить oauth2_proxy.

[[step-3 -–- setting-up-the-login-portal]] == Шаг 3 - Настройка портала входа в систему

Вы будете использовать Helm для установки sproxy oauth2proxy onto the cluster. First, you’ll create a Kubernetes secret to hold the GitHub application’s Client ID and Secret, as well as an encryption secret for browser cookies set by oauth2.

Выполните следующую команду, чтобы создать секретный секретный файл cookie:

python -c 'import os,base64; print base64.b64encode(os.urandom(16))'

Скопируйте результат в буфер обмена

Затем создайте секрет Kubernetes, заменив выделенные значения секретом cookie, идентификатором клиента GitHub и секретным ключом GitHub:

kubectl -n default create secret generic oauth2-proxy-creds \
--from-literal=cookie-secret=YOUR_COOKIE_SECRET \
--from-literal=client-id=YOUR_GITHUB_CLIENT_ID \
--from-literal=client-secret=YOUR_GITHUB_SECRET

Вы увидите следующий вывод:

Outputsecret/oauth2-proxy-creds created

Затем создайте новый файл с именемoauth2-proxy-config.yaml, который будет содержать конфигурацию дляoauth2_proxy:

nano oauth2-proxy-config.yaml

Значения, которые вы установите в этом файле, переопределят значения по умолчанию для диаграммы Хелма. Добавьте следующий код в файл:

oauth2-proxy-config.yaml

config:
  existingSecret: oauth2-proxy-creds

extraArgs:
  whitelist-domain: .int.your_domain
  cookie-domain: .int.your_domain
  provider: github

authenticatedEmailsFile:
  enabled: true
  restricted_access: |-
    [email protected]
    [email protected]

ingress:
  enabled: true
  path: /
  hosts:
    - auth.int.your_domain
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
  tls:
    - secretName: oauth2-proxy-https-cert
      hosts:
        - auth.int.your_domain

Этот код делает следующее:

  1. Указывает oauth2_proxy использовать созданный вами секрет.

  2. Устанавливает имя домена и тип провайдера.

  3. Устанавливает список разрешенных адресов электронной почты. Если учетная запись GitHub связана с одним из этих адресов электронной почты, ей будет разрешен доступ к частным сервисам.

  4. Настраивает вход, который будет обслуживать портал входа наauth.int.your_domain с сертификатом TLS от Let’s Encrypt.

Теперь, когда у вас есть секретный файл и файл конфигурации, вы можете установитьoauth2_proxy. Запустите следующую команду:

helm repo update \
&& helm upgrade oauth2-proxy --install stable/oauth2-proxy \
--reuse-values \
--values oauth2-proxy-config.yaml

Для выдачи и установки сертификата Let Encrypt может потребоваться несколько минут.

Чтобы проверить, что развертывание прошло успешно, перейдите кhttps://auth.int.your_domain. Вы увидите страницу, которая предлагает вам войти в систему с помощью GitHub.

С установленным и запущенным oauth2_proxy все, что остается, - это требовать аутентификацию на ваших сервисах.

[[step-4 -—- protect-the-private-services]] == Шаг 4 - Защита частных услуг

Чтобы защитить службу, настройте ее вход Nginx для принудительной аутентификации через oauth2_proxy. Nginx и nginx-ingress изначально поддерживают эту конфигурацию, поэтому вам нужно всего лишь добавить несколько аннотаций к определению входа.

Давайте защитим службыecho1 иecho2, которые вы настроили в предварительном руководстве. Откройтеecho_ingress.yaml в своем редакторе:

nano echo_ingress.yaml

Добавьте эти две дополнительные аннотации к файлу для проверки подлинности:

echo_ingress.yaml

   annotations:
     kubernetes.io/ingress.class: nginx
     certmanager.k8s.io/cluster-issuer: letsencrypt-prod
     nginx.ingress.kubernetes.io/auth-url: "https://auth.int.your_domain/oauth2/auth"
     nginx.ingress.kubernetes.io/auth-signin: "https://auth.int.your_domain/oauth2/start?rd=https%3A%2F%2F$host$request_uri"

Сохраните файл и примените изменения:

kubectl apply -f echo_ingress.yaml

Теперь, когда вы перейдете кhttps://echo1.int.your_domain, вам будет предложено войти в систему с помощью GitHub, чтобы получить к нему доступ. После входа в систему с действующей учетной записью вы будете перенаправлены обратно в службуecho1. То же верно и дляecho2.

Заключение

В этом руководстве вы настроили oauth2_proxy в своем кластере Kubernetes и защитили частную службу за входом в GitHub. Для любых других услуг, которые вы хотите защитить, просто следуйте инструкциям, изложенным в шаге 4.

oauth2_proxy поддерживает много разных провайдеров, кроме GitHub. Чтобы узнать больше о разных поставщиках, см.the official documentation.

Кроме того, существует множество параметров конфигурации, которые вам может потребоваться настроить, хотя значения по умолчанию будут соответствовать большинству потребностей. Список параметров см. Вthe Helm chart’s documentation иoauth2_proxy’s documentation.

Related