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

1. 概要

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

94b06525c85408ad.png

Identity-Aware Proxy とは

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

学習内容

  • サーバーレス ネットワーク エンドポイント グループ(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 を生成できます。または、ご自身でお試しになることもできます。このステップを終えた後は変更できず、プロジェクト期間中は維持されます。
  • なお、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. [サービス URL] リンクをクリックします。

86416f68c0b8152a.png

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

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

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. [サービス 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. [User Type] で [MAKE EXTERNAL] をクリックする
  2. [公開ステータス] で [テスト] を選択

27fd7de6e7b7ef21.png

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

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 証明書が有効であることを確認する
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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

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