fbpx

GitLabのアクセス管理台帳を自動生成してみる #gitlab #gitlabjp #developers #Csharp

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本記事は一定期間ログインしていないGitLabアカウントを検出/通知するの続編シリーズになります。

ISMSなどの規格を導入している企業は、利用システムに対して利用者アクセスの管理を適切に行うことが求められます。
GitLabを利用するケースにおいても必要になってくることでしょう。

GitLabのUIにAdminでログインしてユーザ情報を見ることによってアカウントの確認は可能なのですが、
「既に固有のフォーマットでアクセス管理台帳(以降台帳と記載)が用意されていてそちらをメンテンスしていく必要がある」
といったケースもあるのではないでしょうか。

手動による台帳のメンテナンスは面倒ですし、長く続ける取組は形骸化の恐れもあります。
更新担当者が入れ替わったりしたら管理が疎かになっていた...なんてケースもあり得るかと思います。

今回は以下のような運用を想定し、台帳の更新を機械的に実施してみたいと思います。

  • Googleスプレッドシートにて台帳を管理/運用している。
  • 台帳は限定公開されており、特定のユーザしかアクセスできない。
  • 台帳には「ユーザ名」「メールアドレス」「状態」「作成日」「権限」を記録している。
  • 人の出入りなどに伴い、台帳を手動で更新している。

今回もAPIにてサンプルを作成しています。
図にするとこんなイメージです。

今回は先に実行イメージの説明をします。

実行イメージ

台帳に見立てたスプレッドシートを用意して...

APIを実行(一部パラメータはセキュリティ上モザイク加工しています)
※今回はswaggerUIを使用。

ユーザ情報が反映されました。

slackへの結果通知。"click here"のリンクはスプレッドシートへのリンク。

技術的な説明

以降は上記の技術的な説明をしていきたいと思います。
今回の流れは大きく以下になります。

・GitLabユーザ情報の取得
・Google スプレッドシートへ情報出力
・slackへ結果通知

GitLabユーザ情報の取得

前回と同様にGitLabAPIを用いてユーザ情報を取得します。
APIの実行については、詳細は前回の記事をご覧ください。

今回はGitLabAPIで得たユーザ情報のうち、以下を利用します。

レスポンス 説明 補足
name 利用者名
email Eメールアドレス
state 状態 active(有効) / deactivated(無効) / blocked(ブロック)
created_at 作成日
is_admin 管理者or非管理者 true or falseで得られるがスプレッドシート書き込みのタイミングで"管理者","利用者"を設定

Google Spread Sheetへ情報出力

上記で取得したGitLabユーザ情報をスプレッドシートに反映(更新)します。
スプレッドシートへのアクセスはGoogle Sheets APIを用いて行うことが可能です。
本記事を書いている段階で最新のv4を用います。

事前準備

限定公開されているスプレッドシートを更新するために必要な準備があります。

Google Sheets APIの有効化

Google Cloud PlatformのAPIとサービスにアクセスし、「+ APIとサービスを有効化」からGoogle Sheets APIを検索し、有効化します。

認証情報の作成

認証の概要は公式ドキュメントの認証の概要をご覧ください。
また、Sheets APIの認証においてはこちらを元にケースに応じた適切な認証方式を決定する必要があります。

例えば、API Keyを用いての認証は「限定公開されているシートへの書き込み」が不可のため今回のケースでは不適応になります。今回はサービスアカウントを用いて行います。

サービスアカウントの作成

こちらを参考にサービスアカウントを作成します。
今回、役割には「サービスアカウントユーザ」を指定しています。

サービスアカウントキーの作成

こちらを参考に上記で作成したサービスアカウントのキーを発行します。
今回は、JSON形式で作成しています。
生成した鍵情報はSheet API発行時の認証の際に必要になるので、ローカルに保存します。

台帳(スプレッドシート)にサービスアカウントの編集権限を追加

スプレッドシートの共有設定を開いて、上記で作成したサービスアカウントに対して編集権限を付与します。
長くなりましたがここまでが事前準備となります。

Google スプレッドシートへ情報出力

スプレットシートへ書き込みするためのメソッドは複数存在しますが、今回はbatchUpdateメソッドを用います。
一言でいうと、「1つ以上のデータを更新することができるメソッド」になります。

今回はC#でサンプルを書いていますので、以降はそちらを前提とした説明になります。

Sheets APIのパッケージをinstall

Nugetパッケージ情報はこちらになります。
Package Managerから行う場合は以下コマンドになります。

PM> Install-Package Google.Apis.Sheets.v4 -Version X.X.XXXX

資格情報の作成

using Google.Apis.Auth.OAuth2;
.
.
.
string[] scopes = { SheetsService.Scope.Spreadsheets };
GoogleCredential.FromFile(@"./Temp/serviceaccount.json").CreateScoped(scopes);

今回はサービスアカウントキーファイルから認証に必要な資格情報を作成しています。
サンプルレベルなので、パスはハードコーディングとなっています。
動かしてみる際は、ローカルにファイルを用意して実行する必要があります。

シートに反映するデータの作成

今回はBatchUpdateValuesRequestを用いてシートに反映するデータのリストを作成します。

こちらが実際にスプレッドシートにデータ更新を依頼している処理サンプルになりますので、詳細は上記をご覧ください。
※2019年いっぱいは参照可能ですが、2020年には該当ブランチを削除する予定であるため参照できなくなります。

sheetIdは作成したスプレッドシートのIDになります。
例えば作成したスプレッドシートが「https://docs.google.com/spreadsheets/d/XYZXYZ」だった場合は、"XYZXYZ"がsheetIdになります。

ValueRangeに格納するrangeは「シート名!セル」の指定になります。
セルは更新開始地点のセルを指定します。

slackへ結果通知

仕組み自体は前回同様、Incoming Webhookを利用しています。今回説明は割愛します。
今回は毎回結果を通知していますが、更新に失敗した際に通知するほうが実際の利用ケースには則しているのかなという気がします。

最後に

前回同様あくまでサンプルレベルになります。
エラー、例外はほとんど作りこんでおりませんし、シートの情報は上書き保存されますが更新非対象のセルは以前の値がそのまま残ります。
実際に利用する場合は、シートの中身をクリアする処理などが必要になるかと思います。

本記事を通してGitLab APIの使いどころを感じていただければ幸いです。

また、今回はSheets APIを用いましたが、コンセプトをご覧いただくとイメージが深まるかと思います。
また、Usage Limitsをご覧いただいて利用上限に気をつけてご利用ください。
※ 本記事執筆時点では、クオーターを増加しない範囲では1プロジェクトに対して500リクエスト/100秒、1ユーザに対して100リクエスト/100秒のリミットがあります。

バックナンバー

新規CTA