LoginSignup
4
0

SalesforceのイベントモニタリングのログをGCSに定期的にアップロードするスクリプト

Last updated at Posted at 2023-12-21

はじめに

今回はSalesforce Shieldのイベントモニタリングのログを定期的にGCSにアップロードを行うためのスクリプトとGitHub Actionsを書きます。

イベントモニタリングの注意点

定期的にログファイルが保存されるが

  • ログファイルが格納されるまで最大24時間かかる
  • サーバー上での保管期間は30日

以上のことから、
30日以上のログを遡ることがいつでもできるように
定期的に1日分のログをアップロードしておく必要があります。

イベントモニタリングとは

イベントモニタリングにより、誰が、いつ、どこから、重要なビジネスデータにアクセスしているかを確認できます。
チェックマーク
重要なイベントをリアルタイムで、またはログファイルを使い監視
チェックマーク
トランザクションセキュリティポリシーでデータ漏えいを防止
チェックマーク
内部脅威の検知および異常の報告
チェックマーク
ユーザーの行動を監査し、カスタムアプリケーションのパフォーマンスを測定
event-monitoring-application-lifecyle-management.jpg

参考記事

取得できるイベント

サポートされてるイベント種別にあるイベントがログファイルとして蓄積できるようになります。

これは取れるのかな?といろんな人が気になりそうな部分を以下に列挙しました。

詳しく書かないこと

  • 接続アプリケーションの作成
  • GCS周辺
  • サービスアカウントの設定

事前準備

1. 接続アプリケーションの作成

以下の記事を参考にしました。
クライアントログイン情報フローを使用しています。

スクリーンショット 2023-12-22 1.01.40.png

2. GCSの準備

ストレージクラスについてはご自身の利用頻度によって決めてください。
ライフサイクルを決めてストレージクラスを変更するようにするとか、Autoclassを使うようにするといいかもですね。

3. GCSにアクセス可能なサービスアカウントのJSONキーを取得

ログファイルのダウンロード

以下のスクリプトを参考に作成させていただきました。

イベントログ自体は、EventLogFileオブジェクトにデータが入っています。

処理の流れは以下の通りです。

  • 1. クライアントログイン情報フローで認証
  • 2. SOQLでEventLogFileからダウンロードするログファイルの情報を取得
  • 3. ファイルダウンロード

BASE_URL="https://{組織のドメイン}.my.salesforce.com"にはイベントモニタリング対象のSalesforce組織のドメインを入れてください。

get_event_logs.sh
#!/bin/bash

API_VERSION=${API_VERSION:-v59.0}

if [ -z "$CLIENT_ID" ]; then
  echo "コンシューマーキーを設定してください。"
  exit 1
fi

if [ -z "$CLIENT_SECRET" ]; then
  echo "コンシューマーキーの秘密鍵を設定してください。"
  exit 1
fi

BASE_URL="https://{組織のドメイン}.my.salesforce.com"

# 1. 認証
ACCESS_TOKEN=$(curl -X POST "${BASE_URL}/services/oauth2/token" \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode "client_id=${CLIENT_ID}" \
--data-urlencode "client_secret=${CLIENT_SECRET}" | jq '.access_token')
ACCESS_TOKEN="${ACCESS_TOKEN//\"}"

# 2. ログファイルの一覧を取得
TARGET_DAY=${TARGET_DAY:-Yesterday} # ログファイル生成日
INTERVAL=${INTERVAL:-'Daily'}
WHERE="WHERE+CreatedDate+=+${TARGET_DAY}+AND+Interval='${INTERVAL}'"

logs=$(curl ${BASE_URL}/services/data/${API_VERSION}/query?q=SELECT+Id+,+EventType+,+LogDate+,+LogFile+From+EventLogFile+${WHERE} -H "Authorization: Bearer ${ACCESS_TOKEN}" -H "X-PrettyPrint:1" -H "Content-Type: application/json")
logFiles=($(echo ${logs} | jq -r ".records[].LogFile"))
eventTypes=( $(echo ${logs} | jq -r ".records[].EventType") )
logDates=( $(echo ${logs} | jq -r ".records[].LogDate" | sed 's/'T.*'//' ) ) # イベント発生日

# 3. ログファイルのダウンロード
for i in "${!logFiles[@]}"; do   
    echo "${i}: ${logFiles[$i]}"
    echo "${i}: ${eventTypes[$i]}"
    echo "${i}: ${logDates[$i]}"
    mkdir "./logs/${eventTypes[$i]}"

    curl --compressed "${BASE_URL}${logFiles[$i]}" -H "Authorization: Bearer ${ACCESS_TOKEN}" -H "X-PrettyPrint:1" -o "./logs/${eventTypes[$i]}/${logDates[$i]}.csv"
done

実行

export CLIENT_ID={接続アプリケーションのコンシューマー鍵}
export CLIENT_SECRET={接続アプリケーションのコンシューマーの秘密鍵}
./get_event_logs.sh

実行すると logs/イベント名/に1日単位のCSVでログファイルがダウンロードされます。

スクリーンショット 2023-12-22 1.23.19.png

GitHub ActionsでGCSに定期アップロード

scheduleで作ったスクリプトを定期実行させます。

GitHub にシークレットを保存

環境変数名
CLIENT_ID 接続アプリケーションのコンシューマー鍵
CLIENT_SECRET 接続アプリケーションのコンシューマーの秘密鍵
GCP_CREDENTIALS GCSにアクセスできるサービスアカウントのJSON鍵

GitHub Actions

.github/workflows/log-to-gcs.yml
name: log-to-gcs

on:
  schedule:
    - cron: "0 0 * * *" # JST 9:00 に前日に生成されたイベントログファイルをGCSにアップロードする
  workflow_dispatch:

env:
  CLIENT_ID: ${{ secrets.CLIENT_ID }}
  CLIENT_SECRET: ${{ secrets.CLIENT_SECRET }}

jobs:
  upload_file_gcs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: 'google-github-actions/auth@v1'
        with:
          credentials_json: ${{ secrets.GCP_CREDENTIALS }}
      - name: make logs dir
        run: mkdir logs
      - name: get logs
        run: ./get_event_logs.sh
      - name: upload-gcs
        uses: google-github-actions/upload-cloud-storage@v2
        with:
          path: ./logs
          destination: salesforce-logs
          parent: false

実行結果

イベントごとに1日のログファイルをアップロードできました。

スクリーンショット 2023-12-22 1.35.20.png

スクリーンショット 2023-12-22 1.35.33.png

最後に

イベントログファイルですが、セキュリティ面にも利用できますが
作ったレポートやリストビューが見られているかどうかのチェックにも利用できます。
積極的に利用していきましょう。

結構簡単にデフォルトの保持期間30日問題を解決できるので、対策したかったけど
できていなかったみたいな人の役に立つ記事になっていると嬉しいです。
ありがとうございました。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0