Cloud IAP for GKE の有効化

このページでは、Google Cloud Identity-Aware Proxy(Cloud IAP)を使用して Kubernetes Engine インスタンスを保護する方法について説明します。Cloud IAP を有効にするには、次の作業を行います。

  • アプリの OAuth 同意画面を構成する
  • Cloud IAP アクセスを設定する
  • OAuth 認証情報を作成する
  • BackendConfig を構成する

概要

Cloud IAP は GKE の Ingress によって統合されます。これにより、VPN ではなく、アプリケーション レベルで従業員のアクセスを制御できます。

GKE クラスタで、受信トラフィックは Cloud Load Balancing のコンポーネントである HTTP(S) 負荷分散によって処理されます。HTTP(S) ロードバランサは通常、Kubernetes Ingress コントローラによって構成されます。Ingress コントローラは、1 つ以上の Service オブジェクトに関連付けられている Kubernetes Ingress オブジェクトから構成情報を取得します。サービス オブジェクトは、受信リクエストを特定のポッドとポートに転送するときに使用するルーティング情報を保持します。

Kubernetes バージョン 1.10.5-gke.3 以降では、サービスと BackendConfig オブジェクトを関連付けることで、ロードバランサの構成を追加できます。BackendConfig は、kubernetes/ingress-gce リポジトリに定義されるカスタム リソース定義(CRD)です。

Kubernetes Ingress コントローラは、BackendConfig から構成情報を読み取り、それに従ってロードバランサを設定します。BackendConfig は、Cloud Load Balancing に固有の構成情報を保持しています。これにより、HTTP(S) バックエンド サービスごとに個別の構成を定義できます。

始める前に

Cloud IAP for GKE を有効にするには、次のものが必要です。

  • 請求が有効になっている Google Cloud Platform Console プロジェクト。
  • HTTPS ロードバランサで処理される 1 つ以上の GKE インスタンスを含むグループ。GKE クラスタに Ingress オブジェクトを作成すると、ロードバランサが自動的に作成されます。
  • ロードバランサのアドレスに登録されたドメイン名。
  • すべてのリクエストに ID があることを確認するアプリケーション コード。

Cloud IAP の有効化

OAuth 同意画面の構成

プロジェクトの OAuth 同意画面を構成していない場合は、構成する必要があります。OAuth 同意画面には、メールアドレスとサービス名が必要です。
  1. OAuth 同意画面に移動します。
    同意画面を構成
  2. [サポートメール] で、一般公開される連絡先として表示するメールアドレスを選択します。これは、自分のメールアドレスまたは自分が所有する Google グループである必要があります。
  3. [アプリケーション名] に、アプリケーションの表示名を入力します。
  4. 任意の詳細を追加します。
  5. [保存] をクリックします。

OAuth 同意画面の情報(サービス名やメールアドレスなど)を後で変更するには、上記の手順を繰り返して同意画面を構成します。

Cloud IAP アクセスを設定する

  1. [Identity-Aware Proxy] ページに移動します。
    [Identity-Aware Proxy] ページに移動
  2. Cloud IAP で保護するプロジェクトを選択します。
  3. メンバーを追加するリソースの横にあるチェックボックスをオンにします。
  4. 右側のパネルで [メンバーを追加] をクリックします。
  5. 表示される [メンバーの追加] ダイアログで、プロジェクトに対する IAP で保護されたウェブアプリ ユーザーの役割を付与するグループ、または個人のメールアドレスを追加します。

    メンバーにすることができるアカウントの種類は以下のとおりです。

    • Google アカウント: user@gmail.com
    • Google グループ: admins@googlegroups.com
    • サービス アカウント: server@example.gserviceaccount.com
    • G Suite ドメイン: example.com

    追加する Google アカウントは、自分がアクセスできるものにしてください。

  6. [役割] のプルダウン リストから [Cloud IAP] > [IAP で保護されたウェブアプリ ユーザー] を選択します。
  7. [保存] をクリックします。

OAuth 認証情報の作成

  1. [認証情報] ページに移動します。
    [認証情報] ページに移動
  2. [認証情報の作成] プルダウン リストを開き、[OAuth クライアント ID] を選択します。
  3. [アプリケーションの種類] で、[ウェブ アプリケーション] を選択します。
  4. [名前] を追加し、[承認済みのリダイレクト URL] を your_domain/_gcp_gatekeeper/authenticate の形式で追加します。your_domain は、Cloud IAP が有効になっているバックエンド サービスにアクセスするドメインです。
  5. 承認済みのリダイレクト URL を追加したら、[作成] をクリックします。表示される [OAuth クライアント] ウィンドウで [OK] をクリックします。
  6. クライアントをもう一度選択します。[承認済みのリダイレクト URI] フィールドにユニバーサル リダイレクト URL を https://iap.googleapis.com/v1/oauth/clientIds/CLIENT_ID:handleRedirect の形式で追加します。CLIENT_ID は OAuth クライアント ID です。
  7. [OAuth 2.0 クライアント ID] の下で、作成した認証情報の横にある [JSON をダウンロード] をクリックします。この認証情報は後で使用します。

承認済みドメインの追加

後で別のドメインからアプリにアクセスするには、以下の手順を行います。

  1. [Identity-Aware Proxy] ページに移動します。
    [Identity-Aware Proxy] ページに移動
  2. ドメインを追加するリソースの横にある [その他] をクリックし、[OAuth クライアントを編集] をクリックします。
  3. 表示される [認証情報] ウィンドウの [承認済みのリダイレクト URI] に、ドメインを your_domain/_gcp_gatekeeper/authenticate の形式で追加します。
  4. ドメインの追加が完了したら、[保存] をクリックします。これで、Cloud IAP が有効な状態でこれらのドメインからアプリにアクセスできるようになります。

BackendConfig の構成

Cloud IAP 用に BackendConfig を構成するには、Kubernetes Secret を作成して、iap ブロックを BackendConfig に追加します。

Kubernetes シークレットを作成する

BackendConfig は Kubernetes シークレットを使用して、以前作成した OAuth クライアントをラップします。Kubernetes Secret は、kubectl コマンドライン インターフェース(CLI)を使用して他の Kubernetes オブジェクトと同様に管理されます。シークレットを作成するには、次のコマンドを実行します。client_id_keyclient_secret_key は、上記の OAuth 認証情報を作成したときにダウンロードした JSON ファイルのキーです。

kubectl create secret generic my-secret --from-literal=client_id=client_id_key \
    --from-literal=client_secret=client_secret_key

シークレットが正常に作成されると、上記のコマンドは確認のための出力を表示します。

secret "my-secret" created

BackendConfig に iap ブロックを追加する

Cloud IAP 用の BackendConfig を構成するには、enabledsecretName の値を指定します。BackendConfig で、Cloud IAP と Cloud CDN の両方を有効にすることはできません。BackendConfig に Cloud IAP ブロックがない場合、バックエンド サービスの既存の Cloud IAP 設定が継承されます。Cloud IAP を有効にするには、compute.backendServices.update 権限があることを確認しiap ブロックを BackendConfig に追加します。my_secret は上記で作成した Kubernetes Secret の名前です。

apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
  name: config-default
  namespace: my-namespace
spec:
  iap:
    enabled: true
    oauthclientCredentials:
      secretName: my_secret

また、サービスポートを BackendConfig に関連付けて、Cloud IAP の有効化をトリガーする必要があります。これを行う方法の 1 つは、サービスのすべてのポートをデフォルトで BackendConfig にすることです。サービス リソースに次のアノテーションを追加して行います。

metadata:
  annotations:
    beta.cloud.google.com/backend-config: '{"default": "config-default"}'

構成をテストするには、kubectl get event を実行します。no BackendConfig for service port exists というメッセージが表示された場合、サービス アノテーションにサービスポート用の BackendConfig が指定されているものの、BackendConfig リソースが見つからなかったということです。これは、BackendConfig リソースを作成していない場合、間違った名前空間に作成した場合、サービス アノテーションの参照のスペルを間違えた場合に発生します。

参照した secretName が存在しないか正しく構成されていない場合、次のいずれかのエラーメッセージが表示されます。

  • BackendConfig default/config-default is not valid: error retrieving secret "foo": secrets "foo" not found. このエラーを解決するには、前述のように正しく Kubernetes シークレットを作成していることを確認します。
  • BackendConfig default/config-default is not valid: secret "foo" missing client_secret data. このエラーを解決するには、正しく OAuth 認証情報を作成していることと、前述の手順でダウンロードした JSON の正しい client_id キーと client_secret キーを参照していることを確認します。

enabled フラグが true に設定され、secretName が正しく設定されている場合、選択したリソースに対して Cloud IAP が構成されます。

Cloud IAP を無効にする

Cloud IAP を無効にするには、BackendConfig で enabledfalse に設定する必要があります。BackendConfig から Cloud IAP ブロックを削除しても、設定は保持されます。たとえば、Cloud IAP が secretName: my_secret で有効になっている場合にブロックを削除しても、Cloud IAP は my_secret に格納されている OAuth 認証情報で有効になります。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Identity-Aware Proxy のドキュメント