BigQuery のリソースへのアクセスを IAM Conditions とタグで制御する方法をまとめてみた #cm_google_cloud_adcal_2024
Google Cloud データエンジニアのはんざわです。
クラスメソッドの Google Cloud Advent Calendar 2024 の 11 日目のブログです。
以前、BigQuery のリソースへのアクセスを IAM Conditions とタグで制御する方法をまとめて紹介したブログを投稿しましたが、内容に誤りがあったため、改めて正しい内容を紹介したいと思います。(該当のブログは非公開にしました。)
タグでアクセス制御するケース
タグとラベルの違い
Google Cloud では、タグと似た機能にラベルが存在します。
タグを使用する最大のメリットは、IAM Conditions の条件式で参照できる点です。ラベルでは参照できません。
例えば、特定のタグが付いたリソースに対してのみ、特定のユーザーにアクセス権を付与するといった、IAM Conditions による一貫したアクセス制御を実現するには、タグを利用しましょう。
タグとラベルの違いについては、以下のドキュメントを参考にしてください。
タグを使ったアクセス制御のユースケース
タグを使ったアクセス制御には、以下のようなユースケースが考えられます。
- 開発環境単位
- 例)
environment: dev
、environment: prod
- 例)
- コンポーネント単位
- 例)
component: frontend
、component: backend
- 例)
- 開発プロダクト単位
- 例)
project: serviceA
、project: serviceB
- 例)
これらのユースケースは、組織レベルまたはプロジェクトレベルでタグを設定することで実現できます。
また、タグは、以下のドキュメントに記載されているサービスで利用できます。
IAM Conditions とタグでアクセスを制御する方法
タグの条件式
IAM Conditions とタグで BigQuery のリソースへのアクセスを制御する場合、大きく分けて2つの条件式で実現が可能です。
- 指定したキーの名称がタグに付いているかどうか
- 指定したキーとバリューの名称がタグに付いているかどうか
IAM Conditions では、設定した条件が true
と評価されるとアクセスが許可されます。
それぞれの条件式は、以下のとおりです。
# 1. 指定したキーの名称がタグに付いているかどうか
resource.hasTagKey(
keyName: string
) trending_flat -> bool
# 2. 指定したキーとバリューの名称がタグに付いているかどうか
resource.matchTag(
keyName: string,
valueShortName: string
) trending_flat -> bool
例として、env
のキーが存在し、そのキーに dev
と prod
のバリューが存在すると仮定します。
バリューに関係なく env
のキーが付いている全てのリソースを対象としたい場合、前者の resource.hasTagKey
を使用すると良いでしょう。
一方で、キーが env
で、尚且つバリューが dev
のリソースを対象としたい場合、後者の resource.matchTag
を使用すると良いでしょう。
また、タグのキーとバリューには、作成時に一意の ID が割り当てられます。
env
や dev
のような名称ではなく、この ID での条件設定も可能です。その場合の条件式は以下になります。
# 1. 指定したキーの ID がタグに付いているかどうか
resource.hasTagKeyId(
keyName: string
) trending_flat -> bool
# 2. 指定したキーとバリューの ID がタグに付いているかどうか
resource.matchTagId(
keyName: string,
valueShortName: string
) trending_flat -> bool
参考:リソースタグ
名称と ID の使い分け
名称と ID の使い分けについてですが、どちらかが必ず正しいというものではありません。
それぞれにメリットとデメリットが存在するので、利用方法に合わせて使い分けてください。
-
名称を利用するケース
- タグをテストする場合
- Terraform などで構成を宣言的に管理する場合
-
ID を利用するケース
- リスクを最小限に抑える場合
それぞれのメリットとデメリットの詳細は、以下のドキュメントを参考にしてください。
参考:タグの定義と識別子
必要な権限
BigQuery でタグを使用するためには、いくつかの権限が必要になります。
事前定義ロールの場合、以下の権限が該当します。
-
BigQuery
- BigQuery データオーナー(
roles/bigquery.dataOwner
) - BigQuery 管理者(
roles/bigquery.admin
)
- BigQuery データオーナー(
-
Resource Manager
- タグユーザー(
roles/resourcemanager.tagUser
)
- タグユーザー(
必要な権限の詳細は、以下のドキュメントを確認してください。
参考:必要な権限
注意事項
制限事項の詳細は、以下のドキュメントを確認してください。
参考:制限事項
最も注意する点として、以下のベストプラクティスが挙げられます。
ドキュメントに記載のとおり、否定の IAM Conditions を使用すると過剰なアクセス権が誤って付与される可能性があります。
さらに、次のような不都合が発生する恐れがあるので、肯定の IAM Conditions を使用するようにしましょう。
BigQuery 以外のサービスの中には、IAM Conditions のタグ条件を正確に評価しないサービスがあります。
タグ条件が正である場合、つまり、リソースに特定のタグがある場合にのみ、ユーザにそのリソースのロールが付与される場合、リソースにどのようなタグが付与されているかに関わらず、リソースへのアクセスは拒否されます。
タグの条件が否定的な場合、つまり、リソースに特定のタグがない場合にのみ、ユーザにそのリソースのロールが付与される場合、タグの条件は評価されずにアクセスが許可されます。
また、以下の注意点もあるので、タグで条件を付与する際は注意しましょう。
利用例
ここからは IAM Conditions とタグで BigQuery へのアクセスを制御する利用例をいくつか紹介します。
BigQuery のリソースにタグを付与する方法は、以下のドキュメントを参考にしてください。
1. 特定のキーの ID のタグが付与された BigQuery への読み取り権限を付与
以下の例では、281476748720946
のキーの ID がタグが付与されている BigQuery のテーブルとデータセットへの読み取り権限を付与しています。
cat << EOF > condition.json
{
"title": "only_team_key",
"expression":
"resource.hasTagKeyId('tagKeys/281476748720946')"
}
EOF
gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member "serviceAccount:sa-team@<PROJECT_ID>.iam.gserviceaccount.com" \
--role "roles/bigquery.dataViewer" \
--condition-from-file condition.json
2. 特定の名称のキーとバリューのタグが付与された BigQuery への読み取り権限を付与
以下の例では、team
のキーとそのバリューが da
のタグが付与されている BigQuery のテーブルとデータセットへの読み取り権限を付与しています。
cat << EOF > condition.json
{
"title": "only_da_value",
"expression":
"resource.matchTag('<PROJECT_ID>/team', 'da')"
}
EOF
gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member "serviceAccount:sa-analyst@<PROJECT_ID>.iam.gserviceaccount.com" \
--role "roles/bigquery.dataViewer" \
--condition-from-file condition.json
まとめ
本ブログでは、BigQuery へのアクセスを IAM Conditions とタグで制限する方法を紹介しました。
タグを利用する最大のメリットは、リソースへの一貫したアクセス制御を実現することが可能な点です。
ぜひ、この記事を参考に、実際にタグと IAM Conditions を活用してみてください!
明日 12/12 は suto さんです。よろしくお願いします!