今回は、Google Cloudで使用するユーザーアカウントの棚卸し方法について説明します。
現在、私の参画しているプロジェクトで、Google Cloudで使用しているユーザーの棚卸し方法に関する運用を提案しています。その中で調査した内容について、アウトプットします。
今後、私と同じように、Google Cloudで使用するユーザーアカウントの棚卸し方法を決める方を対象に、私が調査した内容について、実際の操作手順含めて説明します。
是非、最後までご覧いただけると嬉しいです。
Google Cloudで使用するユーザーアカウントについて
Google Cloudで使用できるユーザーアカウントは、以前のブログでも説明した通り、プリンシパルと呼びます。プリンシパルは、下記ブログのように限定されています。
注意してほしいのは、Google Cloudでユーザーアカウントを発行することはできない点です。Google Cloudというのは、旧名Google Cloud Platformのことを言います。(Google Cloudサービスはサービスの総称、Google Cloudは旧名Google Cloud Platform(GCP)で単体のサービス)
要は、下記のGoogle CloudのIAMのページでは、アカウントを新規発行するわけではなく、プリンシパルで記載しているものを、Google Cloudに取り込む形になります。
よって、プリンシパルにないアカウントに対し、上記画面の「アクセス権を付与」でアカウントに対してロールを割り当てようとすると下記画面のようにエラーメッセージが表示されてアカウントを取り込むことができません。
プリンシパルを発行する為には、既にあるメールアドレスをGoogleアカウントとして登録するか、Cloud IdentityやGoogle Workspace等が必要になります。
何がここで言いたいかというと、Google Cloud(旧名:Google Cloud Platform)で、プリンシパルを新規発行することはできないという点です。
今回の棚卸しは、あくまで、Google Cloudで使用しているユーザーアカウントの棚卸しをすることを対象にしています。
これは、実際に顧客に説明した時に、質問されたことで、AWSだと、ルートアカウントでコンソールにログインし、IAM ユーザを発行できます。Google Cloudは、コンソールでGoogleアカウントを新規発行はできません。
下記が、AWSとGoogle CloudのIAMの相違点をまとめたものになります。
Cloud Asset Inventoryの概要
次に、実際にユーザーアカウント(プリンシパル)の棚卸し方法で使用するツールの話です。Cloud Asset Inventoryを使用することで、ユーザーアカウント(プリンシパル)の棚卸しを行うことができます。今後、ユーザーアカウント(プリンシパル)は、ユーザーアカウントと表記します。
Cloud Asset Inventoryには、下記特徴があります。
- 5週間分のアセットメタ情報の履歴が保管されている
- 特定期間のアセットメタ情報をエクスポートできる
- IAMポリシーを分析して、誰が何にアクセスできるかを調べることができる
上記で記載されている通り、Cloud Asset Inventoryは「IAMポリシーを分析して、誰が何にアクセスできるかを調べることができる」という機能があり、ユーザーアカウントの棚卸し時に、この機能を使用します。
ちなみに、アセットとは、Google Cloud のリソースまたはポリシーのことです。リソースとポリシーについても、上記の参考記事に記載していますので、そちらをご参照ください。
アセット インベントリの操作手順
それでは、実際にアセット インベントリの操作手順について説明します。今回の対象は、ユーザーアカウントの棚卸し方法なので、Google Cloudで使用してIAMポリシーをエクスポートして、それをGoogleドキュメントのスプレッドシートを使用して一覧表示する方法について説明します。
1.アセット インベントリを開く
組織又はプロジェクトが選択されている状態で、Google Cloudのダッシュボード左上にある、メニューアイコンを選択し、「IAMと管理→アセント インベントリ」を選択します。
2.IAMポリシーを選択
画面上部の「IAMポリシー」を選択します。なお、IAMポリシーを開くためには「cloudasset.assets.searchAllIamPolicies」の権限が必要です。
※上記画像は、一部情報を非表示にしています。
3.CSV 形式でダウンロードを実行
CSV 形式でダウンロードを実行します。WebブラウザのダウンロードフォルダにIAMポリシーのファイルが保存されます。
4.Googleスプレッドシートで開く
ダウンロードした、IAMポリシーのCSVファイルを開きます。VS Codeで開いてもよいですが、みづらいので、私は、Google スプレッドシートを使用して開いています。ちなみに、Microsoft Excelを使用すると、2バイト文字(和文)が文字化けします。スプレッドシートで開いた場合、文字化けしません。
ダウンロードしたCSV形式のファイルをGoogleドライブの任意の場所に保存します。
CSVファイルをダブルクリックすると、画面上部に「アプリで開く」のメニューが表示されるので、「Google スプレッドシート」を選択します。
CSV形式のファイルが、Google スプレッドシート形式に変換されファイルが開きます。なお、下記画像は、一部情報を隠しています。
CSV形式のIAMポリシーの項目について
CSV形式でダウンロードされたIAMポリシーの項目は、下記6つになります。
- リソース:詳細なリソース情報
- リソースの種類:リソースの種類
- プロジェクトID:プロジェクトID
- フォルダ:プロジェクトがフォルダに包含されている場合、そのフォルダ名
- 組織:組織ID
- ポリシー:ポリシー詳細
ユーザーアカウントの棚卸しで使用するのは、ポリシーの部分です。
ユーザーアカウントの洗い出し
実際のユーザーアカウントの洗い出しは、上記「ポリシー」の部分を分解して使用します。業務では、ポリシーを分解するスクリプトを使用して洗い出しを行っていますが、初期は、手作業で行っていました。今回は、手作業で行います。
例えばCSV形式の一番最初のレコードのポリシー部分は以下になります。一部情報を変更しています。
{version:0,bindings:[{role:roles/iam.serviceAccountAdmin,members:[user:root@hajimenoit.com],condition:null},{role:roles/iam.serviceAccountUser,members:[user:root@hajimenoit.com],condition:null}],auditConfigs:[],etag:}
このポリシーの見方は、一つずつ分解します。ポリシーの一番最初にある
{version:0,bindings:
は、すべてのポリシーに記載されているので無視します。また、最後にある、
auditConfigs:[],etag:}
も、今回は無視します。最初に記載されている、
{role:roles/iam.serviceAccountAdmin,members:[user:root@hajimenoit.com],condition:null}
roleに記載されている「roles/iam.serviceAccountAdmin」は、「サービス アカウント管理者」ロールになります。
membersに記載されている「user:root@hajimenoit.com」は、「サービス アカウント管理者」ロールが付与されていることを表しています。
最後に記載されている「condition:null」は、「IAM Conditions」に値が設定されていないことを表しています。
以上のことから、最初の意味は、「サービスアカウント管理者ロールが付与されているユーザは、root@hajimenoit.comユーザーになる」ことを表しています。
次の行で記載されている、
{role:roles/iam.serviceAccountUser,members:[user:root@hajimenoit.com],condition:null}
roleに記載されている「roles/iam.serviceAccountUser」は、「サービス アカウント ユーザー」ロールになります。
membersに記載されている「user:root@hajimenoit.com」は、「サービス アカウント ユーザー」ロールが付与されていることを表しています。
最後に記載されている「condition:null」は、「IAM Conditions」に値が設定されていないことを表しています。
以上のことから、「サービス アカウント ユーザーが付与されているユーザは、root@hajimenoit.comユーザーになる」ことを表しています。
上記と、その他のリソース等の情報をまとめて記載すると下記の通りとなります。
- 組織ID:6xxxxxxxxxxx(私のドメインの組織ID)
- プロジェクトID:animated-guard-xxxxxx
- リソースの種類:サービスアカウント
- ポリシー①:サービスアカウント管理者ロールが付与されているユーザは、root@hajimenoit.comユーザー
ポリシー②:サービス アカウント ユーザーが付与されているユーザは、root@hajimenoit.comユーザー
上記内容となります。ユーザーアカウントの棚卸しとしては、
プロジェクトID | ユーザーアカウント | リソース | ロール |
animated-guard-xxxxxx | root@hajimenoit.com | サービスアカウント | ・サービスアカウント管理者 ・サービス アカウント ユーザー |
上記のような形となります。後は、棚卸しのルールに従って、例えば、ユーザーアカウントの使用者がすでに退職している場合等は、ポリシー等に記載されている対応をとります。一般的には、他のユーザーにロールを移行するやアカウントを削除するなどです。
このように、アセット インベントリのIAMポリシーを使用することで、Google Cloudのユーザーアカウントの棚卸しを行うことができます。
アセット インベントリでは収集できない情報について
実際の棚卸時に気づいたのですが、アセット インベントリでは収集できない情報があります。私が知る限りは、下記になりますが、他にもある可能性があります。
- Access Context Managerに設定されているユーザーアカウント
- VPC Service Controlsに設定されているユーザーアカウント
- Cloud SQLのインスタンスのユーザー
- BigQueryのスケジュールクエリに設定されているユーザーアカウント
私が知る限りには、上記ユーザーアカウントについては、アセット インベントリのIAMポリシーには載ってこないです。それ以外のユーザーアカウントに関して、ご存知の方がおりましたら、お問い合わせページから教えて頂けると幸いです。
まとめ
本日は、下記5点について説明しました。
- Google Cloudサービスで使用するユーザーアカウントについて
- Cloud Asset Inventoryの概要
- アセットインベントリの操作手順
- ユーザーアカウントの洗い出し
- アセットインベントリでは収集できない情報について
組織で、Google Cloudを使用する際、移動や退職等があり、ユーザーアカウントがそのまま残ってしまうことがあるので、3ヶ月や半年ごと等でユーザーアカウントの棚卸しをする必要があります。今回の調査手順を例にとって、定期的にユーザーアカウントの棚卸しをすることをオススメします。
使用していないユーザーアカウントが残っていることで、セキュリティリスクが高くなってしまうからです。
これからも、Macのシステムエンジニアとして、日々、習得した知識や経験を発信していきますので、是非、ブックマーク登録してくれると嬉しいです!
それでは、次回のブログで!