開発者ドキュメント

oauth2_proxyを使用してGitHubログインの背後にあるプライベートKubernetesサービスを保護する方法

序章

Kubernetes ingresses を使用すると、Webサービスをインターネットに簡単に公開できます。 ただし、プライベートサービスに関しては、アクセスできるユーザーを制限することをお勧めします。 oauth2_proxy は、パブリックインターネットとプライベートサービスの間のバリアとして機能します。 oauth2_proxyは、GitHubなどのさまざまなプロバイダーを使用して認証を提供し、ユーザーの電子メールアドレスまたはその他のプロパティによってユーザーを検証するリバースプロキシおよびサーバーです。

このチュートリアルでは、GitHubでoauth2_proxyを使用して、サービスを保護します。 完了すると、次の図のような認証システムが作成されます。

前提条件

このチュートリアルを完了するには、次のものが必要です。

ステップ1—ドメインの構成

前提条件のセクションにリンクされているチュートリアルに従うと、クラスターで2つのWebサービスが実行されます。 echo1echo2. マップする1つの入口もあります echo1.your_domainecho2.your_domain 対応するサービスに。

このチュートリアルでは、次の規則を使用します。

注:必ず交換してください your_domain このチュートリアルに表示されている場所には、独自のドメイン名を使用します。

開始するには、既存の入力定義を更新して、 echo1echo2 下のサービス .int.your_domain. 開ける echo_ingress.yaml ドメインを変更できるように、テキストエディタで次の手順を実行します。

  1. nano echo_ingress.yaml

のすべてのインスタンスの名前を変更します echo1.your_domainecho1.int.your_domain、およびのすべてのインスタンスを置き換えます echo2.your_domainecho2.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

ファイルを保存し、変更を適用します。

  1. kubectl apply -f echo_ingress.yaml

これにより、次のTLS証明書が更新されます echo1echo2 サービスも。

次に、行った変更を反映するようにDNS構成を更新します。 まず、次のコマンドを実行して詳細を出力することにより、Nginx入力のIPアドレスを検索します。

  1. kubectl get svc --namespace=ingress-nginx

下にIPアドレスが表示されます EXTERNAL-IP 出力:

Output
NAME 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レコードを管理している場合、手順についてはDNSレコードの管理方法を参照してください。

のレコードを削除します echo1echo2. 新しいを追加します A ホスト名のレコード *.int.your_domain 入力の外部IPアドレスをポイントします。

これで、サブドメインへのリクエストはすべて *.int.your_domain Nginx入力にルーティングされるため、クラスター内でこれらのサブドメインを使用できます。

次に、GitHubをログインプロバイダーとして構成します。

ステップ2—GitHubOAuthアプリケーションを作成する

oauth2_proxyは、さまざまなログインプロバイダーをサポートしています。 このチュートリアルでは、GitHubプロバイダーを使用します。 開始するには、新しいGitHubOAuthアプリを作成します。

アカウントの開発者設定ページのOAuthアプリタブで、新しいOAuthアプリボタンをクリックします。

アプリケーション名およびホームページURLフィールドは、任意のフィールドにすることができます。 承認コールバックURLフィールドに次のように入力します https://auth.int.your_domain/oauth2/callback.

アプリケーションを登録すると、クライアントIDとシークレットを受け取ります。 次のステップで必要になるため、2つに注意してください。

GitHub OAuthアプリケーションを作成したので、oauth2_proxyをインストールして構成できます。

ステップ3–ログインポータルの設定

Helmを使用して、oauth2_proxyをクラスターにインストールします。 まず、GitHubアプリケーションのクライアントIDとシークレットを保持するKubernetesシークレットと、oauth2_proxyによって設定されたブラウザCookieの暗号化シークレットを作成します。

次のコマンドを実行して、安全なCookieシークレットを生成します。

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

結果をクリップボードにコピーします

次に、Kubernetesシークレットを作成し、強調表示された値をCookieシークレット、GitHubクライアントID、およびGitHubシークレットキーに置き換えます。

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

次の出力が表示されます。

Output
secret/oauth2-proxy-creds created

次に、という名前の新しいファイルを作成します oauth2-proxy-config.yaml の構成が含まれます oauth2_proxy:

  1. 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: |-
    allowed@user1.com
    allowed@user2.com

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 Let’sEncryptのTLS証明書を使用します。

シークレットと構成ファイルの準備ができたので、インストールできます oauth2_proxy. 次のコマンドを実行します。

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

Let’s Encrypt証明書が発行され、インストールされるまでに数分かかる場合があります。

展開が成功したことをテストするには、次のURLを参照してください。 https://auth.int.your_domain. GitHubでログインするように求めるページが表示されます。

oauth2_proxyを設定して実行すると、あとはサービスで認証を要求するだけです。

ステップ4—プライベートサービスの保護

サービスを保護するには、oauth2_proxyを介して認証を実施するようにNginx入力を構成します。 Nginxとnginx-ingressはこの構成をネイティブにサポートしているため、入力定義にいくつかのアノテーションを追加するだけで済みます。

保護しましょう echo1echo2 前提条件のチュートリアルで設定したサービス。 開ける echo_ingress.yaml エディターで:

  1. nano echo_ingress.yaml

認証を要求するには、次の2つの注釈をファイルに追加します。

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"

ファイルを保存し、変更を適用します。

  1. kubectl apply -f echo_ingress.yaml

今、あなたが閲覧するとき https://echo1.int.your_domain、GitHubにアクセスするには、GitHubを使用してログインするように求められます。 有効なアカウントでログインすると、にリダイレクトされます echo1 サービス。 同じことが当てはまります echo2.

結論

このチュートリアルでは、Kubernetesクラスターにoauth2_proxyを設定し、GitHubログインの背後にあるプライベートサービスを保護しました。 保護する必要のあるその他のサービスについては、手順4で概説されている手順に従ってください。

oauth2_proxyは、GitHub以外のさまざまなプロバイダーをサポートしています。 さまざまなプロバイダーの詳細については、公式ドキュメントを参照してください。

さらに、デフォルトはほとんどのニーズに適合しますが、調整が必要になる可能性のある多くの構成パラメーターがあります。 パラメータのリストについては、ヘルムチャートのドキュメントおよびoauth2_proxyのドキュメントを参照してください。

モバイルバージョンを終了