Identity-Aware Proxy(IAP)でサーバーレス アプリケーションを保護する

1. 概要

このラボでは、従業員が Cymbal Eats アプリから注文を表示、更新、削除できる従業員ポータルをデプロイします。Identity Aware Proxy(IAP)を使用して、仮想プライベート ネットワーク(VPN)を使用せずにポータル アクセスを保護します。IAP を使用すると、ゼロトラスト アクセスモデルの実装が簡素化され、オンプレミスとクラウド環境の両方で、リモート ワーカー向けの VPN よりも短時間でアプリへのアクセスを管理するための単一の制御ポイントを確立できます。

94b06525c85408ad.png

Identity-Aware Proxy とは

Identity-Aware Proxy(IAP)は、アプリケーションに送信されたリクエストをインターセプトし、Google Identity Services を使用してリクエストを送信したユーザーを認証し、アプリケーションへのアクセスが許可されたユーザーからのリクエストのみを通過させる Google Cloud サービスです。さらに、リクエストのヘッダーを変更して、認証されたユーザーに関する情報を含めることができます。

学習内容

  • サーバーレス ネットワーク エンドポイント グループ(NEG)を構成する方法
  • ロードバランサを構成する方法
  • アクセスを制限する IAP を有効にする方法
  • IAP を使用してアクセスを制限する方法

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。この設定はいつでも変更できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクト全体を削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

環境設定

  1. プロジェクトとリソースに関連する環境変数を作成する
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
  1. IAP と Cloud Resource Manager サービス API を有効にする
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. サンプルアプリ リポジトリのクローンを作成してディレクトリに移動する
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
  1. セットアップ スクリプトを使用して従業員ポータルをデプロイします。スクリプトが完了するまで待ってから次のステップに進む
./setup.sh

出力例

...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. [Service URL] リンクをクリックします。

86416f68c0b8152a.png

3. サーバーレス ネットワーク エンドポイント グループ(NEG)を構成する

従業員 UI Cloud Run サービス用のサーバーレス ネットワーク エンドポイント グループ(サーバーレス NEG)を作成します。サーバーレス NEG を使用すると、外部 HTTP(S) ロード バランシングを適用した Google Cloud サーバーレス アプリを使用できます。

2abe669e53c27186.png

  1. 従業員 UI サービスのネットワーク エンドポイント グループを作成します。
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
    --project $PROJECT_ID \
    --region=$REGION \
    --network-endpoint-type=serverless  \
    --cloud-run-service=employee-ui-service

出力例

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg].
Created network endpoint group [employee-ui-iap-neg].

バックエンド サービスを作成してサーバーレス NEG を追加する

バックエンド サービスは、Cloud Load Balancing によるトラフィックの分散方法を定義します。バックエンド サービスの構成には、バックエンドへの接続に使用されるプロトコル、さまざまな配信とセッションの設定、ヘルスチェック、タイムアウトなどの値が含まれます。これらの設定により、ロードバランサの動作を細かく制御できます。

  1. バックエンド サービスを作成する
gcloud compute backend-services create employee-ui-iap-backend \
        --global 

出力例

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
NAME: employee-ui-iap-backend
BACKENDS:
PROTOCOL: HTTP
  1. サーバーレス NEG をバックエンドとしてバックエンド サービスに追加する
gcloud compute backend-services add-backend employee-ui-iap-backend \
    --global \
    --network-endpoint-group=employee-ui-iap-neg \
    --network-endpoint-group-region=$REGION

出力例

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. 受信リクエストをバックエンド サービスに転送するための URL マップを作成する
gcloud compute url-maps create employee-ui-iap-url-map \
    --default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map].
NAME: employee-ui-iap-url-map
DEFAULT_SERVICE: backendServices/employee-ui-iap-backend

4. ロードバランサ コンポーネントの構成

次の図は、ロードバランサがサーバーレス NEG バックエンドを使用して、リクエストをサーバーレス Cloud Run サービスに転送していることを示しています。

335f4674737a6514.png

静的 IP アドレスを予約する

  1. 静的 IPv4 アドレスを予約してドメインを保存する
gcloud compute addresses create employee-ui-iap-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

出力例

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
  1. nip.io ドメインを保存する
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io

Google マネージド SSL 証明書リソースを作成する

  1. Google マネージド SSL 証明書リソースを作成する
gcloud compute ssl-certificates create employee-ui-iap-cert \
    --description=employee-ui-iap-cert \
    --domains=$DOMAIN \
    --global

出力例

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert].
NAME: employee-ui-iap-cert
TYPE: MANAGED
CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00
EXPIRE_TIME:
MANAGED_STATUS: PROVISIONING

34.102.234.98.nip.io: PROVISIONING

ターゲット HTTPS プロキシを作成する

  1. URL マップにリクエストをルーティングするターゲット HTTPS プロキシを作成する
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
    --ssl-certificates employee-ui-iap-cert \
    --url-map employee-ui-iap-url-map

出力例

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy].
NAME: employee-ui-iap-http-proxy
SSL_CERTIFICATES: employee-ui-iap-cert
URL_MAP: employee-ui-iap-url-map
CERTIFICATE_MAP:

転送ルールを構成する

  1. 受信リクエストをプロキシに転送する転送ルールを作成する
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
    --load-balancing-scheme=EXTERNAL \
    --network-tier=PREMIUM \
    --address=employee-ui-iap-ip \
    --global \
    --ports=443 \
    --target-https-proxy employee-ui-iap-http-proxy

出力例

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].

Cloud Run サービスへの上り(内向き)を制限する

上り(内向き)トラフィックを制限して、内部リクエストと HTTP(S) ロード バランシング経由のリクエストのみを受け入れます。

26cb0b2a9162e7ab.png

  1. 内部リクエストと HTTP(S) ロードバランサ経由のリクエストからの上り(内向き)トラフィックのみを許可するようにサービスを更新する
gcloud run services update employee-ui-service \
    --ingress internal-and-cloud-load-balancing \
    --region $REGION

出力例

OK Deploying... Done.                            
  OK Creating Revision...
  OK Routing traffic...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. [Service URL] リンクをクリックします。

8505fde7e0784bf1.png

Cloud Run サービスの URL へのアクセスが禁止と表示されるようになりました。

5. ロードバランサで Cloud Identity-Aware Proxy(IAP)を有効にする

IAP を使用すると、HTTPS によってアクセスされるアプリケーションの一元的な認可レイヤを確立できます。ネットワーク レベルのファイアウォールの代わりに、アプリケーション レベルのアクセス制御モデルを使用できます。

d9740402a74370a8.png

ブランドとは、ユーザーのブランディング情報を含む OAuth 同意画面のことです。ブランドは、内部ユーザーまたはパブリック ユーザーに限定できます。内部ブランドを使用すると、プロジェクトと同じ Google Workspace 組織のメンバーが OAuth フローにアクセスできるようになります。パブリック ブランドを使用すると、インターネットにアクセスできるユーザーが OAuth フローにアクセスできるようになります。

  1. ブランドを作成する
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")

gcloud alpha iap oauth-brands create \
    --application_title="Cymbal Eats" \
    --support_email=$USER_EMAIL

出力例

Created [462858740426].
applicationTitle: Cymbal Eats
name: projects/462858740426/brands/462858740426
orgInternalOnly: true

IAP OAuth クライアントの作成

  1. 前のステップのブランド名を使用してクライアントを作成する
gcloud alpha iap oauth-clients create \
    projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
    --display_name=cymbal-eats-employee-ui

出力例

Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com].
displayName: cymbal-eats-employee-ui
name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com
secret: [secret-removed]
  1. クライアント名、ID、シークレットを保存する
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
    projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
    --filter="displayName:cymbal-eats-employee-ui")

export CLIENT_ID=${CLIENT_NAME##*/}

export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
  1. Cloud コンソールで、プロジェクト選択プルダウン メニューからプロジェクトを選択します。
  2. Cloud コンソールで OAuth 同意画面に移動します。

bcb460f3ab5241f4.png

  1. [ユーザーの種類] で [外部にする] をクリックします。
  2. 公開ステータスとして [テスト] を選択します

27fd7de6e7b7ef21.png

  1. [CONFIRM](確認)をクリックします。

6. IAP を使用してアクセスを制限する

IAP を使用してバックエンド サービスへのアクセスを制限し、アプリケーションにアクセスできないことを確認します。

  1. バックエンド サービスで IAP を有効にする
gcloud iap web enable --resource-type=backend-services \
    --oauth2-client-id=$CLIENT_ID \
    --oauth2-client-secret=$CLIENT_SECRET \
    --service=employee-ui-iap-backend

IAP 構成を確認する

  1. SSL 証明書が ACTIVE であることを確認する
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. サービス URL を取得する
echo https://$DOMAIN

出力例

https://34.102.234.98.nip.io
  1. サービス URL をクリックして、従業員ポータルを開きます。

352b600209c3fb33.png

  1. ラボの認証情報を使用してログインします。

f7e0318388aa0739.png

  1. ブラウザを閉じます

従業員ポータルへのユーザー アクセス権を付与する

  1. 前の手順で作成したユーザーのロール 'roles/iap.httpsResourceAccessor' の IAM ポリシー バインディングを追加する
gcloud iap web add-iam-policy-binding \
    --resource-type=backend-services \
    --service=employee-ui-iap-backend \
    --member=user:$USER_EMAIL \
    --role='roles/iap.httpsResourceAccessor'

出力例

Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].

サービス アクセスのテスト

従業員ポータルへのアクセス権が付与されていることを確認する

  1. サービス URL を取得する
echo https://$DOMAIN

出力例

https://34.102.234.98.nip.io
  1. サービス URL をクリックして、従業員ポータルを開きます。

86416f68c0b8152a.png

これで、従業員ポータルにアクセスできるようになりました。

(省略可)すべての依存関係をデプロイします。これらのマイクロサービスのデプロイには約 20 分かかることがあります。

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

./setup.sh
./get-site-urls.sh

7. 完了

お疲れさまでした。これでこの Codelab は終了です。

次のステップ:

Cymbal Eats の他の Codelab をご覧ください。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。