Домашний сервер

Google OAuth Tutorial для Docker и Traefik – аутентификация для сервисов

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Устали от всех ваших сервисов докеров, имеющих собственную систему аутентификации? Для тех, кто этого не делает, ты ненавидишь основную аутентификацию Traefik? Затем продолжайте читать, чтобы настроить Google OAuth с Traefik. Наслаждайтесь удобством безопасного единого входа в службы Docker.

Примечание. Соавтором этого поста являются Ананд и Сет.

Я был так взволнован, обнаружив, что изображение Томседдона, Traefik Forward Auth, может защитить мои сервисы Docker. Это изображение обеспечивает упрощенную прямую аутентификацию с использованием Traefik Google OAuth2.

Зачем использовать Google OAuth для Docker Services?

Google OAuth2 позволяет вам использовать свою учетную запись Google для входа в свои службы. Использование Google OAuth с Traefik позволит вам создавать учетные записи в белом списке, внедрять 2FA Google, а также предоставлять единый вход (SSO) для ваших служб. Это позволяет не только часто выполнять вход, но и повышает безопасность.

По этой причине в нашей программе «Умный дом», которая использует несколько служб докеров, недавно был включен единый вход Google OAuth для многих служб.

Если вы уже используете медиасервер на основе Docker за обратным прокси- сервером Traefik, то это логичный следующий шаг. Добавление Google OAuth с Traefik для ваших сервисов Docker будет простым шагом. Это было продемонстрировано и в нашем руководстве по Traefik 2 Docker.

Это руководство было изначально написано для Traefik v1.7.16, но с тех пор было обновлено до Traefik v2.2 (в настоящее время). Но в этом руководстве по Traefik OAuth я также приведу инструкции для Traefik 1 (это может быть удалено в будущем).

June 2, 2020: Updated instructions for Traefik v2.2, which is now the default and recommended version of Traefik. Moving forward, we will not be updating Traefik v1.7 related files in our GitHub Repo.

How to check if my login credentials are already compromised?

With security and privacy in mind, our goal for this Docker Google OAuth guide is to limit access only to authorized users. Therefore, we need to start by looking at the quality of our credentials, and whether those credentials are already prone to attack.

Hackers will use the usernames and passwords from data breaches in their attacks, so I strongly recommend that you go to Have I Been Pwned and check both your emails and passwords. Have I Been Pwned has built a database of information that has been compromised during a data breach, and this site will compare your credentials to those in the database.

Now you may be asking – How do I know that I can trust this website with such sensitive info?!

The trick to comparing these values securely is that the data is stored as an SHA-1 hash, and an abbreviation of your data is checked against that list. Learn more by checking out this video for a great explanation and walk-through of how it all works.

Protecting Docker Services with Traefik’s Basic Auth

Adding the basic authentication that Traefik provides is the simplest way to protect your docker services (Traefik 2).

- "traefik.http.middlewares.test-auth.basicauth.users=user1:$$apr1$$H6uskkkW$$IgXLP6ewTrSuBkTrqE8wj/,user2:$$apr1$$d9hr9HBB$$4HxwgUir3HP4EsggP/QNo0"

In our previous guide we walked through how to use .htpasswd login credentials and Traefik 2 middlewares for adding basic authentication using labels (Traefik 2):

- "traefik.http.routers.traefik-rtr.middlewares=middlewares-basic-auth@file"

For a single service, this can be useful, but I found it quickly became inconvenient and tedious once I had to sign-in to multiple services and for every browser session.

Recommended Guides:

After implementing Traefik forward authentication, I now only need to sign-in once, and by implementing Google OAuth with Traefik I can add 2-factor authentication (2FA), making this method much more secure and convenient than using basic auth.

Configure Google OAuth SSO for Docker

June 2, 2020: I have now added Authelia as a private multifactor authentication system and use it exclusively instead of OAuth. But leaving OAuth in my setup and in my GitHub Repo as a backup for others who may prefer Google OAuth.

What is OAuth?

OAuth is an open standard for access delegation, commonly used as a way for Internet users to grant websites or applications access to their information on other websites but without giving them the passwords. This mechanism is used by companies such as Amazon, Google, Facebook, Microsoft, and Twitter to permit users to share information about their accounts with third-party applications or websites.” – Wikipedia

Before configuring Google OAuth for Docker using Traefik, how it all fits together.

How does Google OAuth with Traefik work?

Google OAuth with Traefik acts like a gatekeeper for your services, allowing or denying access after checking for an authorized cookie in your browser. To sum it up, the process goes something like this:

  1. A request is made for our Host (e.g.: https://traefik.example.com)
  2. The request is routed by our DNS provider to our WAN IP, where ports 80 and 443 are forwarded to the Traefik container.
  3. Traefik sees the incoming request and recognizes that Forward Auth is defined in the labels for that Host, therefore the request is forwarded to the Traefik Forward Auth container.
  4. The container then checks to see if the browser already has an authorized cookie. If there’s no cookie, the request is sent to Google’s OAuth2 Authorization Server.
  5. After successfully logging in to Google, the request is sent to the redirect URI identified for the Web Application (https://oauth.example.com/_oauth).
  6. An authorized cookie is then saved in the browser, and the user is sent to the backend service.

The next time that this browser tries to access a service protected by OAuth, the cookie will be recognized and the user will be taken to their service, without being prompted to sign in!

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Traefik Forward Auth with Google OAuth – Process Flow

This process happens very quickly, and once your browser receives the cookie you’ll forget you’ve even enabled Google OAuth with Traefik!

Note: The Traefik Forward Auth image uses OpenID Connect (OIDC), which is an authentication layer on top of the OAuth 2.0 protocol. This image currently supports Google as the OIDC provider, however it seems that OIDC Support for other providers is coming soon.

With the basics taken care of let’s move on to setting Google OAuth Traefik forward authentication for our Docker services.

How do I setup OAuth?

Setting up Google OAuth for Docker using Traefik, involves 3 steps: 1) create DNS records, 2) configure Google OAuth2 Service and 2) modify Docker compose files and adding the Traefik labels to activate forward authentication.

So, first, we’ll need to configure the Google OAuth service. Let’s set up all of the prerequisites now:

Step 1: Create DNS Records

Start by creating a new CNAME DNS record for our OAuth service (Google will redirect to this address after authentication). For clarity, throughout this guide we’ll use the domain name “example.com”.

Set the DNS record as oauth.example.com. The pictures below a screenshot from Cloudflare. Depending on your DNS provider, things may look different for you but essentially have the same content.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Create DNS Records for Google OAuth2

Note that DNS records can take several ours to propagate and become active.

Step 2: Configure Google OAuth2 Service

With the DNS records created, let us move on the configuring Google OAuth.

Step 2a: Create a Google Project

We need to create a Google Project that will contain our Web App, Consent Screen, and Credentials. This process is very similar to what is described in our guide on setting up Google Assistant for Home Assistant.

Navigate to the Google Cloud Developers Console and make sure that you are signed into the correct Google account that you want to use (This will normally be your own e-mail address).

Note: Sign out of other active Google accounts to make sure that the correct account is used at each step.

If prompted, you’ll need to agree to the Google Cloud Platform Terms of Service in order to use their API:

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Условия использования Google

Служба Google OAuth бесплатна, поэтому мы можем отменить бесплатную пробную версию. Нажмите на Выбрать проект и Новый проект.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Создать новый проект для OAuth

Введите уникальное имя для идентификации проекта, например «Аутентификация Traefik». Нажмите Создать.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Google OAuth Новый проект Подробнее

Шаг 2b. Создание учетных данных OAuth

Теперь, когда наш проект был создан, нам нужно создать идентификатор клиента и секрет клиента для проверки подлинности с помощью Google. Выберите наш проект аутентификации Traefik и в меню навигации выберите API & Services> Credentials. Нажмите Создать учетные данные> Идентификатор клиента OAuth.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Перейдите, чтобы создать идентификатор клиента OAuth.

Шаг 2c. Настройка экрана согласия

Как только вы нажмете OAuth Client ID, вы увидите примечание для настройки экрана согласия, как показано ниже. Перед тем, как продолжить, необходимо настроить экран согласия.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Настройка экрана согласия для Google OAuth2

Если у вас нет автоматического запроса, выберите экран согласия OAuth на левой панели.

Choose a name for your app, such as “Traefik Auth”, then under the Authorized domains section enter your domain, for instance, “example.com”. Make sure that you press Enter to add it, and then click Save.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Create OAuth Consent Screen

After hitting Save, you will return back to creating an OAuth Client ID.

Step 2d: Create the OAuth client ID

Теперь выберите тип веб-приложения и введите имя для вашего веб-приложения, например «Traefik». Кроме того, вам необходимо ввести свой URI авторизованного перенаправления как https://oauth.example.com/_oauth. Убедитесь, что вы нажимаете Enter, чтобы добавить его, а затем нажмите Сохранить.

Примечание. Вам разрешено добавлять только URI перенаправления, которые направляют на ваши авторизованные домены. Вернитесь к экрану согласия OAuth, если вам нужно отредактировать их.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Создание идентификатора клиента OAuth

Учетные данные для нашего единого входа для Docker созданы! Скопируйте и сохраните идентификатор клиента и секрет клиента ; нам нужно использовать их на следующем шаге.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Учетные данные клиента Google OAuth

Шаг 3: Настройте прямую аутентификацию Traefik

Теперь, когда учетные данные OAuth настроены, последнее, что нужно сделать, – это настроить контейнер OAuth. Войдите на локальный компьютер или используйте один из нескольких удивительных клиентов SSH для удаленного входа.

Рекомендуемые руководства:

Обязательно остановите Traefik (при необходимости) и отредактируйте файл docker-compose, добавив метки Traefik и контейнер OAuth.

OAuth Forward Authentication для Traefik 2

Как упоминалось ранее, Traefik 2 теперь является рекомендуемой версией обратного прокси. Итак, давайте сначала проверим это. Предполагается, что вы уже прочитали и следовали большей части моего руководства по Traefik 2 и читаете этот пост только для реализации Google OAuth. Если вы используете Traefik v1, перейдите к следующему разделу.

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

Шаг I: создание промежуточного программного обеспечения и цепочки OAuth

Давайте теперь определим промежуточное программное обеспечение для OAuth. Откройте файл middlewares.toml и добавьте следующие строки ниже того, что уже присутствует:

[http.middlewares.middlewares-oauth] [http.middlewares.middlewares-oauth.forwardAuth] address = "http://oauth:4181" # Make sure you have the OAuth service in docker-compose.yml trustForwardHeader = true authResponseHeaders = ["X-Forwarded-User"]

Кроме того, давайте создадим новую цепочку промежуточного программного обеспечения для служб, которые будут использовать Google OAuth. Откройте middleware-chain.toml и добавьте следующие строки ниже того, что уже присутствует:

[http.middlewares.chain-oauth] [http.middlewares.chain-oauth.chain] middlewares = [ "middlewares-rate-limit", "middlewares-secure-headers", "middlewares-oauth"]

Далее, давайте настроим контейнер OAuth Forwarder.

Шаг II: добавьте контейнер пересылки OAuth

Откройте файл docker-compose (docker-compose-t2.yml ), который был создан на основе нашего предыдущего учебника по Traefik 2, и добавьте в него следующее.

# Google OAuth - Single Sign On using OAuth 2.0 for Traefik 2.2 oauth: container_name: oauth image: thomseddon/traefik-forward-auth:latest # image: thomseddon/traefik-forward-auth:2.1-arm # Use this image with Raspberry Pi restart: unless-stopped networks: - t2_proxy security_opt: - no-new-privileges:true environment: - CLIENT_ID=$GOOGLE_CLIENT_ID - CLIENT_SECRET=$GOOGLE_CLIENT_SECRET - SECRET=$OAUTH_SECRET - COOKIE_DOMAIN=$DOMAINNAME - INSECURE_COOKIE=false - AUTH_HOST=oauth.$DOMAINNAME - URL_PATH=/_oauth - WHITELIST=$MY_EMAIL - LOG_LEVEL=warn - LOG_FORMAT=text - LIFETIME=2592000 # 30 days - DEFAULT_ACTION=auth - DEFAULT_PROVIDER=google labels: - "traefik.enable=true" ## HTTP Routers - "traefik.http.routers.oauth-rtr.entrypoints=https" - "traefik.http.routers.oauth-rtr.rule=Host(`oauth.$DOMAINNAME`)" ## Middlewares - "traefik.http.routers.oauth-rtr.middlewares=chain-oauth@file" ## HTTP Services - "traefik.http.routers.oauth-rtr.service=oauth-svc" - "traefik.http.services.oauth-svc.loadbalancer.server.port=4181"

Примечание. Блок сетей уже должен быть определен, как описано в нашем предыдущем руководстве, иначе вы столкнетесь с ошибками. Сеть t2_proxy должна быть уже определена в вашем файле docker-compose.

Обратите внимание, что мы используем цепочку промежуточного программного обеспечения OAuth (chain-oauth) для аутентификации вместо базовой аутентификации. Перед запуском службы OAuth убедитесь, что вы добавили следующие переменные среды в ваш файл .env :

  • Изображение: используйте правильный образ для архитектуры вашей системы. Например, Raspberry Pi имеет другой тег изображения.

  • GOOGLE_CLIENT_ID и GOOGLE_CLIENT_SECRET. Получено в соответствии с нашим руководством по OAuth 2.0 от Traefik.

  • OAUTH_SECRET: это используется для подписи куки и должно быть случайным. Создать случайный секрет с:

    openssl rand -hex 16

    Кроме того, вы можете использовать онлайн-сервис, подобный этому, для генерации случайного секрета.

    Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

    Случайный OAuth Secret

  • MY_EMAIL: идентификатор электронной почты Google, который будет использоваться для аутентификации.

  • URL_PATH: это тот же путь, что и в URI авторизованного перенаправления (https://oauth.example.com / _oauth ), как описано в нашем руководстве по OAuth 2.0 для Traefik Google.

Если вы хотите, чтобы несколько идентификаторов электронной почты могли проходить проверку подлинности и получать доступ к вашим услугам, используйте разные переменные (например, MY_EMAIL2, MY_EMAIL3 и т.д.) И перечислите их все через запятую для WHITELIST :


Вы также можете изменить продолжительность (LIFETIME ), для которой аутентификация действительна, с 30 дней, указанных в секундах, на другую продолжительность. При желании остальные переменные среды, определенные для oauth, могут быть настроены по вашему вкусу (если вы знаете, что делаете).

Примечание. Если вам необходимо выйти из системы, выйдите из служб Google в любой другой вкладке / окне, и ваш OAuth для служб будет признан недействительным.

После этого используйте команду docker-compose up, указанную выше, или ярлык dcup2, если у вас есть настройка bash_aliases. Теперь вы должны быть перенаправлены на страницу входа в Google OAuth, прежде чем обращаться к службе.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Логин Google OAuth для сервисов Docker

Шаг II: Добавление Google OAuth для сервисов Docker

Давайте возьмем пример панели инструментов Traefik 2. На этом этапе (предыдущее руководство) настроено использование базовой аутентификации. Давайте теперь изменим его на использование Google OAuth. Теперь это так же просто, как изменить chain-basic-auth на chain-oauth в файле docker-compose (показано ниже).

- "traefik.http.routers.traefik-rtr.middlewares=chain-oauth@file"

Итак, все готово, настройка Docker Traefik 2 с помощью Google OAuth 2.

После этого используйте команду docker-compose up (или ярлык dcup2, если у вас есть настройка bash_aliases, как описано в моем руководстве по Docker Traefik 2 ).

Шаг III: Добавление OAuth к другим (не Docker) сервисам

Файловый провайдер Traefik позволяет нам добавлять динамические маршрутизаторы, промежуточное программное обеспечение и сервисы. Ранее мы использовали наш каталог правил только для добавления промежуточного программного обеспечения, но мы можем легко добавить внешний хост, добавив новый файл в этот каталог. Traefik автоматически обнаружит и обновит свои конфигурации.

[http.routers] [http.routers.hassio-rtr] entryPoints = ["https"] rule = "Host(`hassio.example.com`)" service = "hassio-svc" middlewares = ["chain-oauth"] [http.routers.hassio-rtr.tls] certresolver = "dns-cloudflare" [http.services] [http.services.hassio-svc] [http.services.hassio-svc.loadBalancer] passHostHeader = true [[http.services.hassio-svc.loadBalancer.servers]] url = "http://HASSIO-IP:8123"

Как видите, есть три раздела: маршрутизаторы, промежуточное программное обеспечение и службы. Интерфейс Home Assistant под наблюдением будет доступен по адресу hassio.example.com. Служба (серверная часть) будет доступна по адресу HASSIO-IP: 8123, который является IP-адресом системы, на которой работает HASSio (или Home Assistant Supervised).

Поскольку каталог правил является динамическим, просто добавив этот файл в этот каталог, мы создали маршрут. Если вы добавили внешний хост, вы сможете подключиться к вашему сервису сейчас, не перезапуская Traefik!

OAuth Forward Аутентификация для Traefik 1

Traefik v1 теперь заморожен. Вы можете найти последнюю версию нашей конфигурации в нашем GitHub Repo. Если вы не используете Traefik 1, вы можете пропустить этот раздел.

Шаг А: Добавить контейнер OAuth

Откройте файл docker-compose, который был создан на основе нашего предыдущего руководства по Traefik (docker-compose-t1.yml ), и добавьте в него следующее.

# Google OAuth - Single Sign On using OAuth 2.0 for Traefik v1.7 oauth: image: thomseddon/traefik-forward-auth:latest container_name: oauth restart: always networks: - t1_proxy environment: PROVIDERS_GOOGLE_CLIENT_ID: $GOOGLE_CLIENT_ID PROVIDERS_GOOGLE_CLIENT_SECRET: $GOOGLE_CLIENT_SECRET SECRET: $OAUTH_SECRET COOKIE_DOMAIN: $DOMAINNAME INSECURE_COOKIE: "false" AUTH_HOST: oauth.$DOMAINNAME URL_PATH: /_oauth WHITELIST: $MY_EMAIL LOG_LEVEL: warn LIFETIME: 2592000 # 30 days labels: traefik.enable: "true" traefik.backend: oauth traefik.port: 4181 traefik.frontend.rule: Host:oauth.$DOMAINNAME traefik.frontend.headers.SSLHost: oauth.$DOMAINNAME traefik.docker.network: t1_proxy traefik.frontend.passHostHeader: "true" traefik.frontend.headers.SSLForceHost: "true" traefik.frontend.headers.customResponseHeaders: X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex traefik.frontend.headers.SSLRedirect: "true" traefik.frontend.headers.browserXSSFilter: "true" traefik.frontend.headers.contentTypeNosniff: "true" traefik.frontend.headers.forceSTSHeader: "true" traefik.frontend.headers.STSSeconds: 315360000 traefik.frontend.headers.STSIncludeSubdomains: "true" traefik.frontend.headers.STSPreload: "true" traefik.frontend.auth.forward.address: "http://oauth:4181" traefik.frontend.auth.forward.authResponseHeaders: X-Forwarded-User traefik.frontend.auth.forward.trustForwardHeader: "true"

Примечание. Блок сетей уже должен быть определен, как описано в нашем предыдущем руководстве, иначе вы столкнетесь с ошибками. Сеть t1_proxy должна быть уже определена в вашем файле docker-compose.

Используемые переменные среды точно такие же, как и в Traefik 2. Поэтому для настройки или настройки обратитесь к предыдущим разделам данного руководства.

Шаг Б. Добавление Google OAuth для сервисов Docker

Хорошо, давайте проверим это! Теперь, когда контейнер OAuth добавлен в наш стек, мы можем добавить метки Traefik к остальным сервисам, чтобы включить прямую аутентификацию Traefik для них. В качестве примера давайте заменим базовую аутентификацию для панели инструментов Traefik, определенную в нашем предыдущем руководстве по Traefik, на Google OAuth2.

Для этого добавьте в сервис следующие 3 ярлыка traefik:

traefik.frontend.auth.forward.address: "http://oauth:4181" traefik.frontend.auth.forward.authResponseHeaders: X-Forwarded-User traefik.frontend.auth.forward.trustForwardHeader: "true"

Весь docker-compose для Traefik должен выглядеть примерно так (обычная аутентификация отключена, если закомментировать с #):

# Traefik - Reverse Proxy # Touch (create empty files) traefik.toml and acme/acme.json. Set acme.json permissions to 600. traefik: image: traefik:maroilles container_name: traefik restart: unless-stopped networks: - default - t1_proxy ports: - "80:80" - "443:443" # - "$TRAEFIK_DASHBOARD_PORT:8080" domainname: $DOMAINNAME dns: - volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - $USERDIR/docker/traefik1:/etc/traefik - $USERDIR/docker/shared:/shared environment: CF_API_EMAIL: $CLOUDFLARE_EMAIL CF_API_KEY: $CLOUDFLARE_API_KEY # DUCKDNS_TOKEN: $DUCKDNS_TOKEN labels: traefik.enable: "true" traefik.backend: traefik traefik.protocol: http traefik.port: 8080 traefik.frontend.rule: Host:traefik.$DOMAINNAME traefik.frontend.headers.SSLHost: traefik.$DOMAINNAME traefik.docker.network: t1_proxy traefik.frontend.passHostHeader: "true" traefik.frontend.headers.SSLForceHost: "true" traefik.frontend.headers.SSLRedirect: "true" traefik.frontend.headers.browserXSSFilter: "true" traefik.frontend.headers.contentTypeNosniff: "true" traefik.frontend.headers.forceSTSHeader: "true" traefik.frontend.headers.STSSeconds: 315360000 traefik.frontend.headers.STSIncludeSubdomains: "true" traefik.frontend.headers.STSPreload: "true" traefik.frontend.headers.customResponseHeaders: X-Robots-Tag:noindex,nofollow,nosnippet,noarchive,notranslate,noimageindex traefik.frontend.headers.customFrameOptionsValue: "allow-from https:$DOMAINNAME" # traefik.frontend.auth.basic.users: '$HTTP_USERNAME:$HTTP_PASSWORD' traefik.frontend.auth.forward.address: "http://oauth:4181" traefik.frontend.auth.forward.authResponseHeaders: X-Forwarded-User traefik.frontend.auth.forward.trustForwardHeader: "true"

Сохраните файлы docker-compose и обновите свой стек с помощью команды docker-compose up -d, как описано в нашем предыдущем руководстве по docker.

Теперь попробуйте открыть панель инструментов Traefik в веб-браузере. Вы должны быть перенаправлены на страницу входа в Google.

Чтобы использовать OAuth для других служб докеров, вам просто нужно добавить в сервис следующие три метки Traefik v1:

traefik.frontend.auth.forward.address: "http://oauth:4181" traefik.frontend.auth.forward.authResponseHeaders: X-Forwarded-User traefik.frontend.auth.forward.trustForwardHeader: "true"

Auth.forward.address этикетка говорит Traefik, куда отправить запрос. Здесь мы используем преимущества внутренней сети Docker, отправляя запрос в наш контейнер с именем oauth на порт 4181.

Шаг C: Добавление OAuth к другим сервисам

OAuth отлично работает для всех приложений докеров. Что делать, если у вас есть некоторые не-докерские приложения, работающие на вашем док-хосте или любой другой системе в вашей сети (например, PiHole, Webmin, Synology DSM и т.д. )?

Кроме Google OAuth2, вы можете разместить и не докерские приложения.

Все, что вам нужно сделать, это создать правила Traefik, как в Traefik v2. Вы можете увидеть мой пример на GitHub.

Поэтому, если вы настроили Traefik для использования папки с правилами (в traefik.toml), то создайте новый файл (например, appname.toml) и добавьте в него следующее. Обязательно замените то, что нужно заменить.

# Replace APPNAME, LAN-IP, PORT, example.com [backends] [backends.backend-APPNAME] [backends.backend-APPNAME.servers] [backends.backend-APPNAME.servers.server-APPNAME-ext] url = "http://LAN-IP:PORT" weight = 0 [frontends] [frontends.frontend-APPNAME] backend = "backend-APPNAME" passHostHeader = true [frontends.frontend-APPNAME.routes] [frontends.frontend-APPNAME.routes.route-APPNAME-ext] rule = "Host:APPNAME.example.com" [frontends.frontend-APPNAME.headers] SSLRedirect = true SSLHost = "APPNAME.example.com" SSLForceHost = true STSSeconds = 315360000 STSIncludeSubdomains = true STSPreload = true forceSTSHeader = true frameDeny = true contentTypeNosniff = true browserXSSFilter = true customFrameOptionsValue="allow-from https:example.com" [frontends.frontend-APPNAME.auth] headerField = "X-WebAuth-User" [frontends.frontend-APPNAME.auth.forward] address = "http://oauth:4181" trustForwardHeader = true authResponseHeaders = ["X-Forwarded-User"]

Теперь каждый раз, когда вы получаете доступ к этим приложениям, вы должны получить логин Google.

В обход OAuth / выборочной аутентификации

Я использую приложение NZB360 на Android для удаленного управления SABnzbd, Sonarr, Radarr и т.д. Когда эти приложения находятся за OAuth, я не мог использовать приложение NZB360 удаленно. Существуют другие такие приложения, которые не поддерживают OAuth (например, LunaSea).

Так было до тех пор, пока я не обнаружил обход OAuth на основе правил, как описано на странице GitHub Auth Forwarder.

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

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

Определение правила обхода

Как мы можем выяснить, какие конкретные правила использовать?

Это может быть довольно сложно. Как обсуждено в ссылке ниже, универсальный способ обойти аутентификацию будет использовать путь. Например, запросы приложения NZB360 имеют / api в пути. Вы можете отключить аутентификацию для всех этих запросов.

Resource:: проверьте этот поток GitHub для дополнительной информации выборочной аутентификации.

Но это может ослабить безопасность, и я рекомендую установить определенные правила. Например, если заголовок запроса содержит ключ API SABnzbd, тогда обходят аутентификацию.

Тогда следующий вопрос, как я узнал, что искать ключ API SABnzbd? Это требует проб и ошибок.

Во-первых, убедитесь, что SABNzbd стоит за OAuth. Затем установите уровень журнала контейнера OAuth для отслеживания в переменной среды:

LOG_LEVEL: trace

Затем проверьте журналы докера для контейнера OAuth (основные команды Docker ). Это будет выплевывать практически все, что происходит в этом контейнере, что может быть огромным. Вы можете урезать это до интересующего вас приложения, добавив команду grep sabnzbd.

Теперь, когда я пытаюсь открыть SABnzbd через интересующее приложение, в моем случае NZB360, он создает запись журнала OAuth, как показано ниже.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Запись журнала OAuth для доступа SABnzbd через приложение NZB360

Указание правила обхода OAuth

Обратите внимание, что URI на приведенном выше снимке экрана содержит ключ API SABnzbd. Таким образом, вы можете установить использование обхода, основываясь на этом, следующим образом:

command: --rule.sabnzbd.action=allow --rule.sabnzbd.rule="HeadersRegexp(`X-Forwarded-Uri`, `$SABNZBD_API_KEY`)"

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Журнал OAuth для доступа к Radarr через приложение NZB360

Для Radarr, Sonarr, Lidarr и т.д. Вы можете использовать следующее правило (должно работать для NZB360 или аналогичных приложений):

command: --rule.radarr.action=allow --rule.radarr.rule="Headers(`X-Api-Key`, `$RADARR_API_KEY`)"

Для полного составления докера, проверьте мой репозиторий GitHub. Все приведенные выше коды предполагают, что вы следовали моим предыдущим руководствам Traefik, и ключи API правильно определены в вашем файле .env. В противном случае вышеуказанные правила не будут работать.

Перезапустите контейнер OAuth и попробуйте получить доступ к SABnzbd сейчас через приложение и браузер. Браузер должен представить логин OAuth, а приложение должно доставить вас непосредственно в сервис.

Есть еще несколько способов указать правила. Проверьте OAuth Forwarders на странице GitHub для всех доступных опций.

Альтернативные методы обхода

Хотя OAuth Forwarder позволяет обходить, я не предпочитаю / рекомендую этот метод.

Traefik имеет встроенные механизмы условного обхода. Если вы заинтересованы в этом, ознакомьтесь с разделом об обходе в моем руководстве по Traefik 2.

Я также рекомендую вам ознакомиться с примерами создания docker, которые есть у меня для таких приложений, как SABnzbd, Radarr, Sonarr и Lidarr, в моем репозитории GitHub.

Заголовки OAuth и Security

Следует отметить одну вещь, касающуюся использования службы OAuth от Google с вашими заголовками безопасности. Если служба находится за OAuth и вы пытаетесь проверить, применяются ли ваши заголовки безопасности, вы, вероятно, получите более низкий рейтинг. Сначала это вызывало у меня большую обеспокоенность, пока я не понял, что заголовки, которые я видел, были на самом деле не для моего сервиса, а для Google.

Google OAuth Tutorial для Docker и Traefik - аутентификация для сервисов

Заголовки безопасности с Google OAuth

Вопросы и ответы

В чем разница между OIDC и OAuth?

OIDC или OpenID Connect (OIDC) – это протокол для аутентификации. Это набор спецификаций, основанных на OAuth 2.0, который добавляет дополнительные функции. По сути, OIDC – это подлинный протокол, а OAuth – это набор спецификаций для доступа к ресурсам и совместного использования.

Существуют ли другие (более частные) альтернативы Google OAuth?

Да. Authelia и Keycloak – два, о которых я могу думать. ИМХО, Authelia была намного проще в настройке. И я, и Сет (соавтор этого и руководства по Traefik 2) начали с OAuth и теперь полностью переехали в Authelia.

Последние мысли

Внедрение Google OAuth с прямой аутентификацией Traefik стало для меня одним из самых простых и безопасных способов защиты моих служб докеров. Имея белый список учетных записей и внедряя Google 2FA, я уверен, что я буду единственным, кто сможет получить доступ к этим услугам.

Надеюсь, вам понравилось знакомство с Google OAuth с помощью сервисов Traefik for Docker! Если у вас есть какие-либо вопросы, не стесняйтесь оставлять комментарии ниже.

Источник записи: https://www.smarthomebeginner.com

Похожие записи
Домашний сервер

Изменить интервал синхронизации времени Windows?

Домашний сервер

План новичка: полное руководство по установке Monit

Домашний сервер

Установите Guacamole на Docker - VNC, SSH, SFTP и RDP, как босс!

Домашний сервер

Ultimate Docker Home Server с Traefik 2, LE и OAuth / Authelia [2020]

Sign up for our Newsletter and
stay informed
[mc4wp_form id="14"]

Политика конфиденциальности

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