Вступление
Kubernetesingresses упрощает предоставление веб-сервисов Интернету. Однако когда дело доходит до частных услуг, вы, вероятно, захотите ограничить доступ к ним. oauth2_proxy может служить барьером между общедоступным Интернетом и частными услугами. oauth2_proxy - это обратный прокси-сервер и сервер, который обеспечивает аутентификацию с использованием разных поставщиков, таких как GitHub, и проверяет пользователей по их адресу электронной почты или другим свойствам.
В этом руководстве вы будете использовать oauth2_proxy с GitHub для защиты своих сервисов. Когда вы закончите, у вас будет система авторизации, которая выглядит так, как показано на следующей диаграмме:
Предпосылки
Для завершения этого урока вам понадобится:
-
Кластер Kubernetes с двумя веб-сервисами, работающими с входом Nginx и Let’s Encrypt. Этот учебник основан наHow to Set Up an Nginx Ingress with Cert-Manager on DigitalOcean Kubernetes. Обязательно следуйте этому до самого конца, чтобы завершить этот урок.
-
АккаунтGitHub.
-
Python установлен на вашем локальном компьютере. Если он у вас не установлен, следуйтеinstallation instructions for your operating system.
[[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
Этот код делает следующее:
-
Указывает oauth2_proxy использовать созданный вами секрет.
-
Устанавливает имя домена и тип провайдера.
-
Устанавливает список разрешенных адресов электронной почты. Если учетная запись GitHub связана с одним из этих адресов электронной почты, ей будет разрешен доступ к частным сервисам.
-
Настраивает вход, который будет обслуживать портал входа на
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.