新機能: プロジェクトの最新情報についてはTwitterMastodonでご確認ください。

Pomerium Ingress

このチュートリアルでは、Pomerium Ingress Controller のインストールと、cert-manager を使用したセキュリティ保護について説明します。Pomerium は、Kubernetesサービスのカスタムイングレスコントローラーも提供できる、ID認識プロキシです。

前提条件

  1. Kubectl をインストールし、使用するクラスタにコンテキストを設定します。

  2. Pomerium は、ユーザーを認証するために ID プロバイダー (IdP) に接続します。IdP の設定方法については、ガイド を参照してください。

  3. このチュートリアルでは、このクラスタ用に予約されたドメイン空間(例:*.example.com)があることを前提としています。必要に応じて A レコードと CNAME レコードを割り当てるために、このドメインの DNS へのアクセスが必要です。

Pomerium Ingress Controllerのインストール

  1. クラスタにPomeriumをインストールします。

    kubectl apply -f https://raw.githubusercontent.com/pomerium/ingress-controller/main/deployment.yaml

    IdPの設定を含むシークレットを定義します。IdP固有の詳細は、PomeriumのIDプロバイダーページを参照してください。

    apiVersion: v1
    kind: Secret
    metadata:
    name: idp
    namespace: pomerium
    type: Opaque
    stringData:
    client_id: ${IDP_PROVIDED_CLIENT_ID}
    client_secret: ${IDP_PROVIDED_CLIENT_SECRET}

    kubectl apply -fを使用して、シークレットをクラスタに追加します。

  2. Pomeriumのグローバル設定を定義します。

    apiVersion: ingress.pomerium.io/v1
    kind: Pomerium
    metadata:
    name: global
    namespace: pomerium
    spec:
    secrets: pomerium/bootstrap
    authenticate:
    url: https://authenticate.example.com
    identityProvider:
    provider: ${YOUR_IdP}
    secret: pomerium/idp
    # certificates:
    # - pomerium/pomerium-proxy-tls

    ${YOUR_IdP}をあなたのIDプロバイダーに置き換えます。kubectl -fで適用します。

    最後の2行はコメントアウトされています。これらは、後で作成するTLS証明書を参照しています。

cert-managerのインストール

cert-managerのドキュメントのインストールセクションに記載されている方法のいずれかを使用して、cert-managerをインストールします。最も簡単な方法は、提供されているマニフェストをダウンロードして適用することです。

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.1/cert-manager.yaml

Let's Encrypt発行者の設定

イングレスとインターネット間の通信には、Let's Encryptのような信頼できる認証機関によって署名された証明書を使用する必要があります。この例では、ステージング用と本番用の2つのLet's Encrypt発行者を作成します。

Let's Encrypt本番発行者には厳しいレート制限があります。設定が確定する前に、サービスを何度も再作成する必要があり、その制限に達することがあります。スタックを構築している間は、レート制限と設定または操作のエラーを混同しやすいです。

そのため、Let's Encryptステージング発行者から始めます。設定がほぼ完了したら、本番発行者に切り替えます。これらの発行者は両方とも、HTTP01チャレンジプロバイダーを使用するように設定されています。

  1. 次のYAMLは、ステージング証明書発行者を定義しています。メールアドレスを自分のアドレスに更新する必要があります。emailフィールドはLet's Encryptによって必須であり、証明書の期限切れと更新に関する通知に使用されます。

    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
    name: letsencrypt-staging
    namespace: pomerium
    spec:
    acme:
    # The ACME server URL
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: user@example.com
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
    name: letsencrypt-staging
    # Enable the HTTP-01 challenge provider
    solvers:
    - http01:
    ingress:
    ingressClassName: pomerium

    kubectl apply -fを使用して例をダウンロードして編集し適用するか、カスタムリソースを1つのコマンドで編集して適用できます。

    kubectl create --edit -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/pomerium-staging-issuer.yaml
  2. 本番発行者を作成してデプロイします。ステージング発行者と同様に、この例を自分のメールアドレスで更新してください。

    apiVersion: cert-manager.io/v1
    kind: Issuer
    metadata:
    name: letsencrypt-prod
    namespace: pomerium
    spec:
    acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: user@example.com
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
    name: letsencrypt-prod
    # Enable the HTTP-01 challenge provider
    solvers:
    - http01:
    ingress:
    ingressClassName: pomerium
    kubectl create --edit -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/pomerium-production-issuer.yaml
  3. 発行者を作成した後は、そのステータスを確認できます。

    kubectl describe issuer -n pomerium letsencrypt-staging
    kubectl describe issuer -n pomerium letsencrypt-prod

    登録済みのアカウントとともに、発行者が一覧表示されているはずです。

  4. Pomeriumプロキシサービスの証明書を定義します。これは、手動で定義する必要がある唯一の証明書です。

    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
    name: pomerium-proxy-tls
    namespace: pomerium
    spec:
    dnsNames:
    - 'authenticate.example.com'
    issuerRef:
    kind: Issuer
    name: letsencrypt-staging
    secretName: pomerium-proxy-tls

    dnsNamesの値をドメイン空間に合わせて調整します。サブドメイン(この例ではauthenticate)は、IdPの設定でコールバックURLに使用されるドメインと一致する必要があります。kubectl -fを使用して証明書を追加します。

  5. 新しく作成した証明書を参照するPomeriumグローバル設定の最後の2行のコメントを解除し、クラスタに再適用します。

これで、Pomeriumがクラスタにインストールされ、実行されているはずです。ブラウザでhttps://authenticate.example.comにアクセスして確認できます。kubectl describe pomeriumを使用して、Pomeriumデプロイメントのステータスを確認し、最近のイベントを確認してください。

テストサービスの定義

新しいIngressコントローラーをテストするために、kuardアプリをクラスタに追加し、そのためのIngressを定義します。

  1. kuardデプロイメントと関連サービスを定義します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: kuard
    spec:
    selector:
    matchLabels:
    app: kuard
    replicas: 1
    template:
    metadata:
    labels:
    app: kuard
    spec:
    containers:
    - image: gcr.io/kuar-demo/kuard-amd64:1
    imagePullPolicy: Always
    name: kuard
    ports:
    - containerPort: 8080
    apiVersion: v1
    kind: Service
    metadata:
    name: kuard
    spec:
    ports:
    - port: 80
    targetPort: 8080
    protocol: TCP
    selector:
    app: kuard

    これらのファイルをローカルにダウンロードして参照するか、このドキュメントのGitHubソースリポジトリから参照できます。

    チュートリアルファイルからGitHubから直接サンプルサービスをインストールするには

    kubectl apply -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/deployment.yaml
    kubectl apply -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/service.yaml
  2. テストサービス用の新しいIngressマニフェスト(example-ingress.yaml)を作成します。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: kuard
    annotations:
    cert-manager.io/issuer: letsencrypt-staging
    ingress.pomerium.io/policy: '[{"allow":{"and":[{"domain":{"is":"example.com"}}]}}]'
    spec:
    ingressClassName: pomerium
    rules:
    - host: kuard.example.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: kuard
    port:
    number: 80
    tls:
    - hosts:
    - kuard.example.com
    secretName: kuard.example.com-tls

    同様に、example.comへの参照を、あなたのドメイン空間に合わせて変更してください。

  3. Ingressマニフェストをクラスタに適用します。

    kubectl apply -f example-ingress.yaml

Pomerium Ingress Controllerは、letsencrypt-staging発行者からkuard.example.comへのルートの証明書を自動的にプロビジョニングします。

クラスタ内のすべてのアプリケーションサービスの設定が完了したら、イングレス(認証サービスを含む)の発行者をletsencrypt-prodを使用するように調整します。