arrow_back

Implementing Role-Based Access Control with Google Kubernetes Engine

ログイン 参加
700 以上のラボとコースにアクセス

Implementing Role-Based Access Control with Google Kubernetes Engine

ラボ 1時間 universal_currency_alt クレジット: 5 show_chart 入門
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

概要

このラボでは、GKE クラスタ内に Namespace を作成し、ロールベース アクセス制御を使用して、管理者以外のユーザーが特定の Namespace 内の Pod を操作できるようにします。

目標

このラボでは、次のタスクの実行方法について学びます。

  • ユーザー用の Namespace を作成してクラスタ リソースへのアクセスを制御する
  • ロールと RoleBinding を作成して Namespace 内でのアクセスを制御する
注: このラボ用に、[接続の詳細] ダイアログで使用できる 2 つのユーザー名が用意されています。

このラボでは、これらのアカウントを Username 1 および Username 2 とします。

タスク 1. クラスタ リソースへのユーザー アクセスを可能にするための Namespace を作成する

1 人目のユーザーとして Google Cloud コンソールにログインする

  1. Qwiklabs であらかじめ用意されている Username 1 を使用して、シークレット ウィンドウで通常どおりに Google Cloud Console にログインします。どちらのユーザー名でも同じパスワードを使用します。
  2. Google Cloud コンソールのタイトルバーで、[Cloud Shell をアクティブにする] アイコン(「Cloud Shell をアクティブにする」アイコン)をクリックします。
  3. 画面の指示に従って [続行] をクリックします。

Cloud Shell が起動するのを待たずに、ただちに次のタスクに進むことができます。

注: この時点では、Username 2 はプロジェクトにアクセスできますが、閲覧者 ロールだけを持っているので、プロジェクト内のすべてのリソースは表示されても読み取り専用です。

2 人目のユーザーとして Google Cloud コンソールにログインする

  1. シークレット ウィンドウで別のタブを開きます。
  2. console.cloud.google.com に移動します。
  3. 画面右上にあるユーザー アイコンをクリックし、[アカウントを追加] をクリックします。
  4. 提供されている Username 2 を使用して Google Cloud コンソールにログインします。先ほど説明したように、両方の Username が同じパスワードを使用します。
  5. Google Cloud コンソールのタイトルバーで、「Cloud Shell をアクティブにする」アイコン(「Cloud Shell をアクティブにする」アイコン)をクリックします。
  6. 画面の指示に従って [続行] をクリックします。

Cloud Shell が起動するのを待たずに、ただちに次のタスクに進むことができます。

ラボの GKE クラスタに接続する

  1. Google Cloud コンソールの Username 1 のタブに戻ります。
注: Google Cloud コンソールの Username 1 タブで作業していることを確認してください。
  1. Cloud Shell で次のコマンドを入力して、ゾーンとクラスタ名の環境変数を設定します。
export my_zone={{{ project_0.default_zone | ZONE }}} export my_cluster=standard-cluster-1
  1. kubectl コマンドライン ツールのタブ補完を構成します。
source <(kubectl completion bash)
  1. kubectl がクラスタにアクセスできるよう構成します。
gcloud container clusters get-credentials $my_cluster --zone $my_zone
  1. Cloud Shell で次のコマンドを入力して、ラボの Cloud Shell にラボのリポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
  1. 作業ディレクトリへのショートカットとしてソフトリンクを作成します。
ln -s ~/training-data-analyst/courses/ak8s/v1.1 ~/ak8s
  1. このラボのサンプル ファイルが入っているディレクトリに移動します。
cd ~/ak8s/RBAC/

名前空間を作成する

用意されている my-namespace.yaml というマニフェスト ファイルによって、production という新しい Namespace が作成されます。

apiVersion: v1 kind: Namespace metadata: name: production
  1. 次のコマンドを使用して、クラスタ内の現在の Namespace を一覧表示します。
kubectl get namespaces

出力:

NAME STATUS AGE default Active 17m kube-node-lease Active 17m kube-public Active 17m kube-system Active 17m
  1. Cloud Shell で次のコマンドを実行して、新しい Namespace を作成します。
kubectl create -f ./my-namespace.yaml
  1. 次のコマンドを実行して、作成した Namespace があるかどうかを確認します。
kubectl get namespaces

出力:

NAME STATUS AGE default Active 6m kube-node-lease Active 6m kube-public Active 6m kube-system Active 6m production Active 4s

リストの一番下に新しい Namespace が表示されます。

  1. 次のコマンドを実行して、この Namespace の詳細を確認できます。
kubectl describe namespaces production

出力:

Name: production Labels: Annotations: Status: Active Resource Quotas Name: gke-resource-quotas Resource Used Hard -------- --- --- count/ingresses.extensions 0 100 count/jobs.batch 0 5k pods 0 1500 services 0 500 No LimitRange resource.

Namespace 内にリソースを作成する

Pod の Namespace を指定しない場合、「default」という Namespace が使用されます。このタスクでは、新しい Pod を作成する際に、先ほど作成した Namespace の場所を指定します。用意されている my-pod.yaml というシンプルなマニフェスト ファイルによって、nginx コンテナを含む Pod が作成されます。

apiVersion: v1 kind: Pod metadata: name: nginx labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
  1. Cloud Shell で次のコマンドを実行して、production という Namespace 内にリソースを作成します。
kubectl apply -f ./my-pod.yaml --namespace=production

または、yaml ファイルで Namespace を指定することもできます。その場合、metadata: セクションに namespace: production を指定する必要があります。

例:

apiVersion: v1 kind: Pod metadata: name: nginx labels: name: nginx namespace: production spec: containers: - name: nginx image: nginx ports: - containerPort: 80
  1. 次のコマンドを使用して Pod を表示してみます。
kubectl get pods

出力:

No resources found in default namespace.

新しい Namespace ではなくデフォルトの Namespace を kubectl で確認したため、Pod が表示されません。

  1. 新しい Namespace を指定してもう一度コマンドを実行します。
kubectl get pods --namespace=production

出力:

NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 20s

今度は、新しく作成された Pod が表示されます。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。

Namespace と Pod を作成する

タスク 2. ロールと RoleBinding について

このタスクでは、カスタムロールのサンプルを作成した後、production Namespace で Username 2 に編集者のロールを付与する RoleBinding を作成します。

ロールは、用意されている pod-reader-role.yaml ファイルで定義されます。このマニフェストでは、production Namespace 内の Pod オブジェクトに create、get、list、watch 権限を付与する pod-reader というロールを定義します。なお、このロールでは Pod を削除することはできません。

kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: production name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["create", "get", "list", "watch"]

カスタムロールを作成する

ロールを作成するには、そのロールに含まれる権限が、お使いのアカウントに付与されている必要があります。クラスタ管理者の場合は、次の RoleBinding を作成して自分のユーザー アカウントに cluster-admin のロールを付与することで、簡単にこれを実現できます。

  1. Username 1 アカウントに cluster-admin 権限を付与するには、次のコマンドを実行します。[USERNAME_1_EMAIL]Username 1 アカウントのメールアドレスに置き換えます。
kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user [USERNAME_1_EMAIL]

出力例:

kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user gcpstaging28307_student@qwiklabs.net
  1. Cloud Shell で次のコマンドを実行して、ロールを作成します。
kubectl apply -f pod-reader-role.yaml
  1. 次のコマンドを実行してロールを一覧表示し、作成されていることを確認します。
kubectl get roles --namespace production

出力:

NAME AGE pod-reader 3m

RoleBinding を作成する

ロールは権限を割り当てるために使用されますが、ロール自体は何も行いません。RoleBinding でユーザーとオブジェクトにロールをバインドする必要があります。

username2-editor-binding.yaml マニフェスト ファイルによって username2-editor という RoleBinding が作成され、先ほど作成した pod-reader のロールがラボの 2 番目のユーザーにバインドされます。このロールでは Pod を作成および表示できますが、削除することはできません。

kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: username2-editor namespace: production subjects: - kind: User name: [USERNAME_2_EMAIL] apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io

このファイルにはプレースホルダ [USERNAME_2_EMAIL] が含まれています。これを Username 2 のメールアドレスに置き換えてから適用する必要があります。

  1. Cloud Shell で、Username 2 のメールアドレス全体を格納する環境変数を作成します。
export USER2=[USERNAME_2_EMAIL]

出力例:

export USER2=gcpstaginguser68_student@qwiklabs.net
  1. Cloud Shell で sed を使用して、ファイル内のプレースホルダを環境変数の値に置き換えます。
sed -i "s/\[USERNAME_2_EMAIL\]/${USER2}/" username2-editor-binding.yaml
  1. Cloud Shell で次のコマンドを実行して、適切に変更されたことを確認します。
cat username2-editor-binding.yaml

subjects セクションが次のように表示されるようになります。

出力例:

subjects: - kind: User name: gcpstaginguser68_student@qwiklabs.net apiGroup: rbac.authorization.k8s.io

後でこの RoleBinding を適用します。

アクセスをテストする

次に、Username 2 が production Namespace で Pod を作成できるかどうかをテストします。テストとして、Username 2 で production-pod.yaml マニフェスト ファイルを使って Pod を作成してみます。このマニフェストによって、nginx コンテナを 1 つ含むシンプルな Pod がデプロイされます。

apiVersion: v1 kind: Pod metadata: name: production-pod labels: name: production-pod namespace: production spec: containers: - name: production-pod image: nginx ports: - containerPort: 8080

これは別個のユーザー アカウントであるため、ラボのリポジトリから取得したサンプル ファイルやクラスタにアクセスできるように、Cloud Shell 環境をもう一度準備する必要があります。

  1. Google Cloud コンソールの Username 2 のタブに戻ります。
注: Google Cloud コンソールの Username 2 タブで作業していることを確認してください。
  1. Username 2 の Cloud Shell で次のコマンドを入力して、ゾーンとクラスタ名の環境変数を設定します。
export my_zone={{{ project_0.default_zone | ZONE }}} export my_cluster=standard-cluster-1
  1. kubectl コマンドライン ツールのタブ補完を構成します。
source <(kubectl completion bash)
  1. kubectl がクラスタにアクセスできるよう構成します。
gcloud container clusters get-credentials $my_cluster --zone $my_zone
  1. Cloud Shell で次のコマンドを入力して、ラボの Cloud Shell にラボのリポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
  1. 作業ディレクトリへのショートカットとしてソフトリンクを作成します。
ln -s ~/training-data-analyst/courses/ak8s/v1.1 ~/ak8s
  1. このラボのサンプル ファイルが入っているディレクトリに移動します。
cd ~/ak8s/RBAC/
  1. 次のコマンドを使用して、Username 2 で production という Namespace が表示されるかどうかを確認します。
kubectl get namespaces

出力:

NAME STATUS AGE default Active 29m kube-node-lease Active 29m kube-public Active 29m kube-system Active 29m production Active 23m

リストの一番下に production という Namespace が表示されていれば、次に進むことができます。

  1. Cloud Shell で次のコマンドを実行して、production という Namespace 内にリソースを作成します。
kubectl apply -f ./production-pod.yaml

この処理は失敗します。これは、Pod を作成するための適切な権限が Username 2 にないことを示しています。Username 2 には他のロールがまだバインドされていないため、この時点で付与されているのはラボ開始時からあった閲覧権限のみです。これを変更します。

  1. Google Cloud コンソールの Username 1 のタブに戻ります。
注: Google Cloud コンソールの Username 1 タブで作業していることを確認してください。
  1. Username 1 の Cloud Shell で次のコマンドを実行して、Username 2 に pod-reader ロールを付与する RoleBinding を作成します。このロールには、production Namespace で Pod を作成する権限が含まれます。
kubectl apply -f username2-editor-binding.yaml
  1. Username 1 の Cloud Shell で次のコマンドを実行して、新しい RoleBinding を探します。
kubectl get rolebinding

出力:

No resources found in default namespace.

kubectl がデフォルトの Namespace を参照しているため、RoleBinding は表示されません。

  1. Username 1 の Cloud Shell で、production という Namespace を指定して次のコマンドを実行します。
kubectl get rolebinding --namespace production

出力:

NAME AGE username2-editor 23s
  1. Google Cloud コンソールの Username 2 のタブに戻ります。
注: Google Cloud コンソールの Username 2 タブで作業していることを確認してください。
  1. Username 2 の Cloud Shell で次のコマンドを実行して、production という Namespace でリソースを作成します。
kubectl apply -f ./production-pod.yaml

Username 2 には production Namespace で Pod を作成する権限があるので、今回は成功します。

  1. 次のコマンドを使用して、production Namespace で Pod が適切にデプロイされたことを確認します。
kubectl get pods --namespace production

出力:

NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 16m production-pod 1/1 Running 0 20s

新しく作成された Pod が表示されます。

  1. pod-reader ロールによって付与された特定の RBAC 権限のみが Username 2 に対して有効になっていることを確認します。そうするには、次のように production-pod を削除してみます。
kubectl delete pod production-pod --namespace production

Username 2 には Pod の削除権限がないので、この処理は失敗します。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。

ロールと RoleBinding

ラボを終了する

ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。