レガシー アクセス スコープからの移行

このページでは、Kubernetes バージョン 1.10 以降を実行しているクラスタのアクセス スコープの変更について説明します。このような変更は、クラスタと Cloud Storage および Compute Engine とのインタラクションにのみ影響します。

アクセス スコープとは

アクセス スコープとは、ノードの権限と、ノードで実行するワークロードの権限(ワークロードがアプリケーションのデフォルト認証情報(ADC)を使用している場合)を指定するための以前の方法です。1.10 よりも前のバージョンの Kubernetes を実行しているクラスタでは、クラスタのデフォルト サービス アカウントに一連のデフォルトのアクセス スコープが付与されました。こうしたクラスタでは、gcloud と Google Cloud Console により次のアクセス スコープが付与されていました。

  • compute-rw により、すべての Compute Engine API メソッドに対する完全アクセス権が付与されます。
  • storage-ro により、すべての Cloud Storage リソース(Container Registry に保存された非公開イメージを含む)に対する読み取り専用アクセス権が付与されます。

アクセス スコープの変更

Kubernetes バージョン 1.10 以降、gcloud と Cloud Console のデフォルトでは compute-rw アクセス スコープが新しいクラスタと新しいノードプールに付与されなくなりました。さらに、--scopesgcloud container create で指定されていると、gcloudcompute-rwstorage-ro が暗黙で追加されなくなりました。

これらの変更により、デフォルト サービス アカウントはクラスタを実行するために必要な権限のみを持つため、プロジェクトのセキュリティが向上します。

ワークロードへの影響

これらのスコープによりアクセス権が許可されている API の呼び出しがワークロードで不要な場合は、何もする必要がありません。

ただし、ワークロードが Compute Engine または Cloud Storage とインタラクションする権限を必要とする場合は、ワークロードに影響が及ぶ可能性があります。同等の Identity and Access Management(IAM)ロールを持つカスタム サービス アカウントを作成することをおすすめします。

スコープをオーバーライドする際、ワークロードで Cloud Storage とやりとりする(Container Registry から非公開コンテナ イメージを pull するなど)権限が必要であれば、storage-ro スコープも含める必要があります。

あるいは、1.10 より前のクラスタの動作を再現するには、レガシー アクセス スコープに戻すをご覧ください。

効果

Compute Engine と Cloud Storage は、必要なスコープを持たない Kubernetes 1.10 クラスタで動作するアプリケーションに対して 403 エラーを返します。

さらに、スコープが不十分なリクエストに対するレスポンスには、必要なスコープが詳述された HTTP ヘッダーが含まれます。例:

WWW-Authenticate: Bearer realm="https://accounts.google.com/", error=insufficient_scope, scope="https://www.googleapis.com/auth/compute.readonly"

ワークロード用にカスタム サービス アカウントを構成する

IAM は、GCP プロジェクト内のユーザーとサービス アカウントに承認済みロールを付与するためのアクセス制御システムです。サービス アカウントは、ユーザーに代わってアプリケーションのデプロイなどのタスクを実行する特別な Google アカウントです。 IAM を使用してサービス アカウントを作成し、IAM ポリシー バインディングを使用してそのアカウントを保護します。

ワークロードが Compute Engine にアクセスする必要がある場合は、サービス アカウントに Compute Engine 管理者のロールを付与します。ワークロードが Container Registry から非公開イメージを pull する必要がある場合は、ストレージ オブジェクト閲覧者のロールを付与します。

サービス アカウントを作成する

名前を kubernetes-engine-node-sa としてカスタム サービス アカウントを作成するには、次のコマンドを実行します。

export NODE_SA_NAME=kubernetes-engine-node-sa
gcloud iam service-accounts create $NODE_SA_NAME \
  --display-name "GKE Node Service Account"
export NODE_SA_EMAIL=`gcloud iam service-accounts list --format='value(email)' \
  --filter='displayName:GKE Node Service Account'`

最小限のロールを付与する

サービス アカウントを必要最小限の GKE のロールと権限で構成するには、次のコマンドを実行します。ここで、$PROJECTプロジェクト ID です。

export PROJECT=`gcloud config get-value project`
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/monitoring.metricWriter
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/monitoring.viewer
gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/logging.logWriter

追加のロールを付与する

サービス アカウントに Compute Engine 管理者のロールを付与するには、次のコマンドを実行します。

gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/compute.admin

ストレージ オブジェクト閲覧者のロールを付与するには、次のコマンドを実行します。

gcloud projects add-iam-policy-binding $PROJECT \
  --member serviceAccount:$NODE_SA_EMAIL \
  --role roles/storage.objectViewer

Container Registry に保存されている非公開イメージに対するアクセス権をサービス アカウントに付与する方法については、IAM 権限の付与をご覧ください。

カスタム サービス アカウントを使用するクラスタまたはノードプールを作成する

カスタム サービス アカウントを使用するクラスタを作成するには、次のコマンドを実行します。

gcloud container clusters create --service-account=$NODE_SA_EMAIL

既存のクラスタにノードプールを作成するには、次のコマンドを実行します。

gcloud container node-pools create --service-account=$NODE_SA_EMAIL

レガシー アクセス スコープに戻す

Kubernetes バージョン 1.10 以降を実行しているクラスタでレガシー アクセス スコープを引き続き使用する場合は、手動でスコープを追加する必要があります。

Console

Cloud Console を使用してクラスタを作成するには、次のようにします。

  1. Cloud Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. [クラスタを作成] ボタンをクリックします。

  3. [マスターのバージョン] で、Kubernetes のバージョンを選択します。

  4. 必要に応じてクラスタを構成します。まだ [作成] はクリックしないでください。

  5. ナビゲーション パネルの [default-pool] で [セキュリティ] をクリックします。

  6. [アクセス スコープ] セクションで、[各 API にアクセス権を設定] を選択します。

  7. [Compute Engine] で [読み取り / 書き込み] を選択します。[ストレージ] には、デフォルトで [読み取り専用] が表示されます。

  8. [作成] をクリックします。

gcloud

クラスタを作成するには、次のコマンドを実行します。

gcloud container clusters create example-cluster --scopes compute-rw,gke-default

既存のクラスタにノードプールを作成するには、次のコマンドを実行します。

gcloud container node-pools create example-pool --scopes compute-rw,gke-default