Gmail からメッセージの送信履歴を取得してSumo Logicで解析したいとの要望がありました。
現時点ではSumo LogicにはGmail用のコレクターがなかったので、Workspace Admin SDKを使用したスクリプトを開発する事にしました。
検索したところ個人アカウントで取得する方法はたくさん見つかりましたが、組織全体で取得する方法がなかったので記事にすることにしました。
組織に所属する全アカウントの送受信履歴を取得したい管理者の方は試してみてください。
スクリプト言語にはPythonを使用しています。
プロジェクトの作成
まずはGoogle Cloudに管理者でログインしプロジェクトを作成します。
作成は画面の左上にある”プロジェクトを作成”から行います。(※1)
プロジェクトの作成画面では、プロジェクト名を入力します。(※2)
“組織”と”場所”はデフォルトで表示されているまま作成します。
※1 管理者画面 ※2 プロジェクト作成画面
APIの有効化
1で作成したプロジェクトの設定画面に移動します。
移動の方法が分からなかったので左上のメニューから移動しました。(※3)
“最近のプロジェクトの選択”の画面で1で作成したプロジェクトを選択します。(※4)
※3 メニューから移動 ※4 最近のプロジェクトの選択の画面
プロジェクトページの上部にある”APIとサービスの有効化”をクリックしAPIライブラリのページに移動します。
検索ボックスに “Gmail API”を入力しAPIを検索し、Gmail APIの設定画面を表示します。(※5)
表示された画面で”有効にする”をクリックし、このプロジェクトでGmail APIを有効にします。
※5 Gmail APIの設定画面
認証情報の登録
次にサービスアカウントを設定します。
“認証情報”の画面から作成します。(※6)
※6 認証情報の画面
サービスアカウントの作成画面でサービスアカウント名を入力して”完了をクリックします。(※7)
作成後は詳細画面から”一意のID”を確認します。(※8)
このIDは後で使用するのでコピーしておきます。
※7 サービスアカウントの作成画面 ※8 詳細画面
次に詳細画面から鍵の作成を行います。(※9)
ここでは新しい鍵を作成しています。
タイプは推奨のままで作成します。(※10)
作成と同時にJSONファイルがダウンロードされます。
ここでダウンロードしたJSONファイルは後で使用しますので大切に保管してください。
※9 鍵の登録画面 ※10 タイプの指定
ロールの登録
ロールの登録はGoogle Workspace管理コンソールから行います。
Google Workspace管理コンソールにログイン後に左のメニューの
”セキュリティ”→”アクセスとデータ管理”→”APIの制御”→”ドメイン全体の委任”
を選択し、ドメイン全体の委任の設定画面で”新しく追加”を選択します。(※11)
※11 ドメイン全体の委任
“新しいクライアントIDを追加”の画面で以下を入力します。(※12)
クライアントID:先程コピーした”一意のID”
OAuthスコープ:https://www.googleapis.com/auth/gmail.readonly
※12 新しいクライアントIDを追加の画面
クライアントライブラリのインストール
コンソールからPythonのクライアントライブラリをインストールします。
インストールはpipコマンドで行います。
コマンドはドキュメントのままです。
※このブログを作成した当初はPython3.6も対応になっていましたが、現在はバージョンが上がり3.8以降が対応になっています。
実行するコマンド:
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
スクリプトの作成
順番としては、まずメッセージIDを取得して、IDからメッセージの内容を取得します。
メッセージID の一覧はlsitmsgs()で取得できます。
また、メッセージの内容はメッセージIDを指定してusers().messages().get()で取得できます。
以下はサンプルのスクリプトになります。
1 from googleapiclient import discovery
2 from google.oauth2 import service_account
3 import json
4
5 SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
6 SERVICE_ACCOUNT_FILE = '先にダウンロードしたJSONファイル'
7 userId = '対象アカウントのメールアドレス'
8
9 def lsitmsgs(service, user):
10 response = service.users().messages().list(userId=user).execute()
11 message_ids = response['messages']
12
13 for message_id in message_ids:
14 message_info = service.users().messages().get(
15 userId=user, id=message_id['id']).execute()
16
17 if __name__ == "__main__":
18 credentials = service_account.Credentials.from_service_account_file(
19 SERVICE_ACCOUNT_FILE, scopes=SCOPES)
20 delegated_credentials = credentials.with_subject(userId)
21 service = discovery.build('gmail', 'v1', credentials=delegated_credentials)
22 messages = lsitmsgs(service, userId)
ポイントとしては
・5行目でロール登録時に入力したスコープを指定
・6行目で鍵を作成した際にダウンロードしたJSONファイルを指定
・7行目でメッセージを受信したいアカウントのアドレスを指定
・10行目でメッセージIDの一覧を取得(デフォルトで500件まで)
・13~15行目でメッセージID毎にメッセージの内容を取得
・18,19行目で鍵ファイルを利用して認証資格を作成
・20行目で作成した認証資格を用いて対象のアカウントに権限移譲
となっています。
7行目のアカウントを変更することで組織に所属する他のアカウントのメッセージの取得も可能になります。
後はサンプルを少し加工して
・組織に所属する全アカウントを対象にする。
・前回取得したメッセージ以降のメッセージを取得する。
・Sumo Logicへ送信する。
を実装することで、組織に所属する全ユーザのGmailの送受信のログをSumo Logicで取り込むことが可能になります。
--
Gmailのログ取り込みのサンプルスクリプトのスコープを指定している部分(5行目)、discovery.buildの引数(21行目)を変更することでGmail以外のGoogle WorkspaceのログもSumo Logicで取り込むことが可能になります。
これからもSumo Logicで対応していないログを取り込む方法に関する記事を書いていきますので、今後ともよろしくお願いします。
最後までお付き合いいただきありがとうございました。
- カテゴリ:
- Sumo Logic
- 技術情報