このトピックでは、許可ポリシーで条件付きロール バインディングを使用して、Google Cloud リソースに対する一時的なアクセス権を設定する方法について説明します。日時属性を使用すると、特定のリソースにアクセスするときに時間ベースの制御を適用できます。たとえば、指定の時刻に開始および停止するプロジェクトや、スケジュール設定された定期的なプロジェクトへの一時的なアクセス権を付与できます。
始める前に
- Identity and Access Management(IAM)の条件付きロール バインディングの基本については、Conditions の概要をご覧ください。
- 条件式で使用できる日時属性を確認してください。日時属性は、すべての Google Cloud サービスで認識されています。
必要なロール
条件付きロール バインディングの管理に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。
-
プロジェクトへのアクセスを管理する: プロジェクトに対するプロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) - フォルダへのアクセスを管理する: フォルダに対するフォルダ管理者(
roles/resourcemanager.folderAdmin
) -
プロジェクト、フォルダ、組織へのアクセスを管理する: 組織に対する組織管理者(
roles/resourcemanager.organizationAdmin
) - ほぼすべての Google Cloud リソースへのアクセスを管理する: リソースへのアクセスを管理するプロジェクト、フォルダ、または組織に対するセキュリティ管理者(
roles/iam.securityAdmin
)
ロールの付与の詳細については、アクセスの管理をご覧ください。
これらの事前定義ロールには、条件付きロール バインディングの管理に必要な権限が含まれています。必要な権限を正確に確認するには、[必要な権限] セクションを開いてください。
必要な権限
条件付きロール バインディングを管理するには、次の権限が必要です。
-
プロジェクトへのアクセスを管理するには:
- プロジェクトに対する
resourcemanager.projects.getIamPolicy
- プロジェクトに対する
resourcemanager.projects.setIamPolicy
- プロジェクトに対する
-
フォルダへのアクセスを管理するには:
-
フォルダに対する
resourcemanager.folders.getIamPolicy
-
フォルダに対する
resourcemanager.folders.setIamPolicy
-
フォルダに対する
-
組織へのアクセスを管理するには:
-
組織に対する
resourcemanager.organizations.getIamPolicy
-
組織に対する
resourcemanager.organizations.setIamPolicy
-
組織に対する
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
一時的なアクセス権を付与する
条件付きロール バインディングを使用して、リソースへの時間制限付きアクセス権を付与し、指定された有効期限後にユーザーがリソースにアクセスできないようにします。
たとえば、次のようなシナリオが考えられます。ExampleCo の情報セキュリティ ルールでは、本番環境のプロジェクトのリソースに従業員が無期限にアクセスできないことを強調しています。以前は、エンジニアの緊急のニーズを満たすために、管理者が IAM の条件付きロール バインディングの設定と削除を手動で行っていました。これに対して ExampleCo では、管理上のオーバーヘッドを削減するために、バインディングの終了日を日付と時刻の条件の形で指定する条件付きロール バインディングを構成できます。
プロジェクト リソースへの期限付きアクセス権を付与するには、次のように操作します。
コンソール
Google Cloud コンソールの [IAM] ページに移動します。
プリンシパルのリストから、目的のプリンシパルを見つけて、[
] ボタンをクリックします。[権限の編集] パネルで、条件を構成するロールを見つけます。[IAM の条件(省略可)] で、[IAM の条件を追加] をクリックします。
[条件の編集] パネルで、条件のタイトルとオプションの説明を入力します。
条件作成ツールまたは条件エディタを使用して条件式を追加できます。条件ビルダーには、目的の条件タイプ、演算子、その他の式に関する適用可能な詳細を選択するためのインタラクティブなインターフェースが用意されています。条件エディタには、CEL 構文を使用して手動で式を入力するためのテキストベースのインターフェースが用意されています。
条件ビルダー:
- [条件タイプ] プルダウンから [アクセスの有効期限] を選択します。
- [演算子] プルダウンから、[次の時間まで] を選択します。
- [時刻] プルダウンで、 ボタンをクリックし、日付と時刻の範囲から選択します。
- [保存] をクリックして条件を適用します。
- [条件の編集] パネルを閉じたら、[権限の編集] パネルでもう一度 [保存] をクリックし、許可ポリシーを更新します。
条件エディタ:
[条件エディタ] タブをクリックし、次の式を入力します。タイムスタンプはご自分のものに置き換えてください。
request.time < timestamp("2020-07-01T00:00:00.000Z")
式を入力したら、右上のテキスト ボックスの上にある [リンターを実行] をクリックして、CEL 構文を検証することもできます。
[保存] をクリックして条件を適用します。
[条件の編集] パネルを閉じたら、[権限の編集] パネルでもう一度 [保存] をクリックし、許可ポリシーを更新します。
gcloud
許可ポリシーは、読み取り、変更、書き込みのパターンを使用して設定されます。
gcloud projects get-iam-policy
コマンドを実行し、プロジェクトの現在の許可ポリシーを取得します。次の例では、JSON バージョンの許可ポリシーがディスク上のパスにダウンロードされます。
コマンド:
gcloud projects get-iam-policy project-id --format=json > filepath
JSON 形式の許可ポリシーがダウンロードされます。
{
"bindings": [
{
"members": [
"user:project-owner@example.com"
],
"role": "roles/owner"
},
{
"members": [
"user:travis@example.com"
],
"role": "roles/iam.securityReviewer"
}
],
"etag": "BwWKmjvelug=",
"version": 1
}
アクセス権に有効期限を定めて許可ポリシーを構成するには、次の条件式(強調表示された部分)を追加します。タイムスタンプはご自分のものに置き換えてください。gcloud CLI により、バージョンが自動的に更新されます。
{
"bindings": [
{
"members": [
"user:project-owner@example.com"
],
"role": "roles/owner"
},
{
"members": [
"user:travis@example.com"
],
"role": "roles/iam.securityReviewer",
"condition": {
"title": "Expires_July_1_2020",
"description": "Expires on July 1, 2020",
"expression":
"request.time < timestamp('2020-07-01T00:00:00.000Z')"
}
}
],
"etag": "BwWKmjvelug=",
"version": 3
}
次に、gcloud projects set-iam-policy
コマンドを実行して新しい許可ポリシーを設定します。
gcloud projects set-iam-policy project-id filepath
新しい許可ポリシーが適用され、travis@example.com
のロールの付与は、指定された時刻に期限切れになります。
REST
読み取り、変更、書き込みのパターンを使用して、特定の時間までアクセスを許可します。
まず、プロジェクトの許可ポリシーを読み取ります。
Resource Manager API の projects.getIamPolicy
メソッドは、プロジェクトの許可ポリシーを取得します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例:my-project
)。POLICY_VERSION
: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
HTTP メソッドと URL:
POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy
リクエストの本文(JSON):
{ "options": { "requestedPolicyVersion": POLICY_VERSION } }
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{ "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/owner", "members": [ "user:project-owner@example.com" ] }, { "role": "roles/iam.securityReviewer", "members": [ "user:travis@example.com" ] } ] }
次に、特定の時間までアクセスを許可するように許可ポリシーを変更します。version
フィールドを値 3
に変更します。
{
"version": 3,
"etag": "BwWKmjvelug=",
"bindings": [
{
"role": "roles/owner",
"members": [
"user:project-owner@example.com"
]
},
{
"role": "roles/iam.securityReviewer",
"members": [
"user:travis@example.com"
],
"condition": {
"title": "Expires_July_1_2020",
"description": "Expires on July 1, 2020",
"expression":
"request.time < timestamp('2020-07-01T00:00:00.000Z')"
}
}
]
}
最後に、更新された許可ポリシーを作成します。
Resource Manager API の projects.setIamPolicy
メソッドは、リクエストのポリシーをプロジェクトの新しい許可ポリシーとして設定します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例:my-project
)。
HTTP メソッドと URL:
POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy
リクエストの本文(JSON):
{ "policy": { "version": 3, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/owner", "members": [ "user:project-owner@example.com" ] }, { "role": "roles/iam.securityReviewer", "members": [ "user:travis@example.com" ], "condition": { "title": "Expires_July_1_2020", "description": "Expires on July 1, 2020", "expression": "request.time < timestamp('2020-07-01T00:00:00.000Z')" } } ] } }
リクエストを送信するには、次のいずれかのオプションを展開します。
レスポンスには、更新された許可ポリシーが含まれます。
曜日や時間帯に基づいてアクセスを管理する
条件付きロール バインディングを使用すると、リソースに対してアクセス権を特定の曜日や時間帯に定期的に付与できます。
たとえば、次のシナリオを考えてみましょう。ExampleCo には品質保証プロジェクトがあります。QA チーム全体では、作業を完了するために高い権限を持つロールが必要です。また、ExampleCo は勤務時間を月曜日から金曜日の午前 9 時から午後 5 時までに制限する現地の労働法を遵守する必要があります。このとき、ExampleCo で、日付と時刻の条件を使用して、従業員が既定の勤務日や勤務時間内にのみ Google Cloud にアクセスできるようにするとします。
プロジェクト リソースへのアクセスを、特定の曜日または時間帯のみに付与するには、次の手順を行います。
コンソール
Google Cloud コンソールの [IAM] ページに移動します。
プリンシパルのリストから、目的のプリンシパルを見つけて、[
] ボタンをクリックします。[権限の編集] パネルで、条件を構成するロールを見つけます。[IAM の条件(省略可)] で、[IAM の条件を追加] をクリックします。
[条件の編集] パネルで、条件のタイトルとオプションの説明を入力します。
条件作成ツールまたは条件エディタを使用して条件式を追加できます。条件ビルダーには、目的の条件タイプ、演算子、その他の式に関する適用可能な詳細を選択するためのインタラクティブなインターフェースが用意されています。条件エディタには、CEL 構文を使用して手動で式を入力するためのテキストベースのインターフェースが用意されています。
条件ビルダー:
- [追加] をクリックします。
- [条件タイプ] プルダウンから、[時間] [スケジュール] [曜日] の順に選択します。
- [演算子] プルダウンから、[次の日時以後] を選択します。
- [曜日] プルダウンから、[月曜日] を選択します。
- [タイムゾーンを選択] のプルダウンで、目的のタイムゾーンをリストから選択します。
- [および] 演算子が左側で選択されていることを確認し、[追加] をもう一度クリックします。
- [条件タイプ] プルダウンから、[時間] [スケジュール] [曜日] の順に選択します。
- [演算子] プルダウンから、[次の日時以前] を選択します。
- [曜日] プルダウンから、[金曜日] を選択します。
- [タイムゾーンを選択] のプルダウンで、目的のタイムゾーンをリストから選択します。
この時点で、月曜日から金曜日までのみアクセス権を構成しています。次に、午前 9 時から午後 5 時までのアクセスを構成します。
- [および] 演算子が左側で選択されていることを確認し、[追加] をもう一度クリックします。
[条件タイプ] プルダウンから、[時間]
[スケジュール] [時間帯] の順に選択します。- [演算子] プルダウンから、[次の日時以後] を選択します。
- [時間帯] プルダウンから、[9](午前 9:00)を選択します。
- [タイムゾーンを選択] のプルダウンで、目的のタイムゾーンをリストから選択します。
- [条件タイプ] プルダウンから、[時間] [スケジュール] [時間帯] の順に選択します。
- [演算子] プルダウンから、[次の日時以前] を選択します。このように選択した場合、「on」は論理的には 17:00(午後 5 時)から 17:59(午後 5 時 59 分)の間のすべての時間と評価されます。4:59 PM にアクセスが期限切れになるように設定するには、時間が 17 ではなく 16 に設定されていることを確認します。
- [時間帯] プルダウンから、[17](午後 5 時)を選択します。
- [タイムゾーンを選択] のプルダウンで、目的のタイムゾーンをリストから選択します。
- [保存] をクリックして条件を適用します。
- [条件の編集] パネルを閉じたら、[権限の編集] パネルでもう一度 [保存] をクリックし、許可ポリシーを更新します。
これで、月曜から金曜の午前 9 時から午後 5 時にアクセスが構成されました。
条件エディタ:
[条件エディタ] タブをクリックし、次の式を入力します。プレースホルダ値はご自分のものに置き換えてください。
request.time.getHours("Europe/Berlin") >= 9 && request.time.getHours("Europe/Berlin") <= 17 && request.time.getDayOfWeek("Europe/Berlin") >= 1 && request.time.getDayOfWeek("Europe/Berlin") <= 5
式を入力したら、右上のテキスト ボックスの上にある [リンターを実行] をクリックして、CEL 構文を検証することもできます。
[保存] をクリックして条件を適用します。
[条件の編集] パネルを閉じたら、[権限の編集] パネルでもう一度 [保存] をクリックし、許可ポリシーを更新します。
gcloud
許可ポリシーは、読み取り、変更、書き込みのパターンを使用して設定されます。
gcloud projects get-iam-policy
コマンドを実行し、プロジェクトの現在の許可ポリシーを取得します。次の例では、JSON バージョンの許可ポリシーがディスク上のパスにダウンロードされます。
コマンド:
gcloud projects get-iam-policy project-id --format=json > filepath
JSON 形式の許可ポリシーがダウンロードされます。
{
"bindings": [
{
"members": [
"user:project-owner@example.com"
],
"role": "roles/owner"
},
{
"members": [
"user:rita@example.com"
],
"role": "roles/bigquery.dataViewer"
}
],
"etag": "BwWKmjvelug=",
"version": 1
}
スケジュール設定されたアクセス権で許可ポリシーを構成するには、次の条件式(強調表示された部分)を追加します。タイムスタンプはご自分のものに置き換えてください。gcloud CLI により、バージョンが自動的に更新されます。
{
"bindings": [
{
"members": [
"user:project-owner@example.com"
],
"role": "roles/owner"
},
{
"members": [
"user:rita@example.com"
],
"role": "roles/bigquery.dataViewer",
"condition": {
"title": "Business_hours",
"description": "Business hours Monday-Friday",
"expression": "request.time.getHours('Europe/Berlin') >= 9 && request.time.getHours('Europe/Berlin') <= 17 && request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5"
}
}
],
"etag": "BwWKmjvelug=",
"version": 3
}
次に、gcloud projects set-iam-policy
コマンドを実行して新しい許可ポリシーを設定します。
gcloud projects set-iam-policy project-id filepath
新しい許可ポリシーが適用され、rita@example.com
のロール付与により、指定された日時の間のアクセスが許可されます。
REST
読み取り、変更、書き込みのパターンを使用して、スケジュールされたアクセスを許可します。まず、プロジェクトの許可ポリシーを読み取ります。
Resource Manager API の projects.getIamPolicy
メソッドは、プロジェクトの許可ポリシーを取得します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例:my-project
)。POLICY_VERSION
: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
HTTP メソッドと URL:
POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy
リクエストの本文(JSON):
{ "options": { "requestedPolicyVersion": POLICY_VERSION } }
リクエストを送信するには、次のいずれかのオプションを展開します。
次のような JSON レスポンスが返されます。
{ "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/owner", "members": [ "user:project-owner@example.com" ] }, { "role": "roles/bigquery.dataViewer", "members": [ "user:rita@example.com" ] } ] }
次に、スケジュールされたアクセスを許可するようにポリシーを変更します。
次の条件式(強調表示された部分)を追加します。タイムスタンプはご自分のものに置き換えてください。version
値が 3
に更新されたことを確認します。
{
"etag": "BwWKmjvelug=",
"version": 3,
"bindings": [
{
"role": "roles/owner",
"members": [
"user:project-owner@example.com"
]
},
{
"role": "roles/bigquery.dataViewer",
"members": [
"user:rita@example.com"
],
"condition": {
"title": "Business_hours",
"description": "Business hours Monday-Friday",
"expression":
"request.time.getHours('Europe/Berlin') >= 9 &&
request.time.getHours('Europe/Berlin') <= 17 &&
request.time.getDayOfWeek('Europe/Berlin') >= 1 &&
request.time.getDayOfWeek('Europe/Berlin') <= 5"
}
}
]
}
Resource Manager API の projects.setIamPolicy
メソッドは、リクエストのポリシーをプロジェクトの新しい許可ポリシーとして設定します。
リクエストのデータを使用する前に、次のように置き換えます。
PROJECT_ID
: Google Cloud プロジェクト ID。プロジェクト ID は英数字からなる文字列です(例:my-project
)。
HTTP メソッドと URL:
POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy
リクエストの本文(JSON):
{ "policy": { "etag": "BwWKmjvelug=", "version": 3, "bindings": [ { "role": "roles/owner", "members": [ "user:project-owner@example.com" ] }, { "role": "roles/bigquery.dataViewer", "members": [ "user:rita@example.com" ], "condition": { "title": "Business_hours", "description": "Business hours Monday-Friday", "expression": "request.time.getHours('Europe/Berlin') >= 9 && request.time.getHours('Europe/Berlin') <= 17 && request.time.getDayOfWeek('Europe/Berlin') >= 1 && request.time.getDayOfWeek('Europe/Berlin') <= 5" } } ] } }
リクエストを送信するには、次のいずれかのオプションを展開します。
レスポンスには、更新された許可ポリシーが含まれます。
次のステップ
- 条件付きロール バインディングを管理する方法を学習する。
- 許可ポリシーの lint チェックを行う方法を学習する。
- 条件付きロール バインディングを使用して、プロジェクトに対するジャストインタイム特権アクセスを管理する方法を学習する。