はじめに
今回はSalesforce Shieldのイベントモニタリングのログを定期的にGCSにアップロードを行うためのスクリプトとGitHub Actionsを書きます。
イベントモニタリングの注意点
定期的にログファイルが保存されるが
- ログファイルが格納されるまで最大24時間かかる
- サーバー上での保管期間は30日
以上のことから、
30日以上のログを遡ることがいつでもできるように
定期的に1日分のログをアップロードしておく必要があります。
イベントモニタリングとは
イベントモニタリングにより、誰が、いつ、どこから、重要なビジネスデータにアクセスしているかを確認できます。
チェックマーク
重要なイベントをリアルタイムで、またはログファイルを使い監視
チェックマーク
トランザクションセキュリティポリシーでデータ漏えいを防止
チェックマーク
内部脅威の検知および異常の報告
チェックマーク
ユーザーの行動を監査し、カスタムアプリケーションのパフォーマンスを測定
参考記事
取得できるイベント
サポートされてるイベント種別にあるイベントがログファイルとして蓄積できるようになります。
これは取れるのかな?といろんな人が気になりそうな部分を以下に列挙しました。
-
ダウンロード系
-
閲覧系
-
ログイン履歴
-
API実行系
詳しく書かないこと
- 接続アプリケーションの作成
- GCS周辺
- サービスアカウントの設定
事前準備
1. 接続アプリケーションの作成
以下の記事を参考にしました。
クライアントログイン情報フローを使用しています。
2. GCSの準備
ストレージクラスについてはご自身の利用頻度によって決めてください。
ライフサイクルを決めてストレージクラスを変更するようにするとか、Autoclassを使うようにするといいかもですね。
3. GCSにアクセス可能なサービスアカウントのJSONキーを取得
ログファイルのダウンロード
以下のスクリプトを参考に作成させていただきました。
イベントログ自体は、EventLogFileオブジェクトにデータが入っています。
処理の流れは以下の通りです。
- 1.
クライアントログイン情報フロー
で認証 - 2. SOQLで
EventLogFile
からダウンロードするログファイルの情報を取得 - 3. ファイルダウンロード
BASE_URL="https://{組織のドメイン}.my.salesforce.com"
にはイベントモニタリング対象のSalesforce組織のドメインを入れてください。
#!/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でログファイルがダウンロードされます。
GitHub ActionsでGCSに定期アップロード
scheduleで作ったスクリプトを定期実行させます。
GitHub にシークレットを保存
環境変数名 | 値 |
---|---|
CLIENT_ID | 接続アプリケーションのコンシューマー鍵 |
CLIENT_SECRET | 接続アプリケーションのコンシューマーの秘密鍵 |
GCP_CREDENTIALS | GCSにアクセスできるサービスアカウントのJSON鍵 |
GitHub Actions
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日のログファイルをアップロードできました。
最後に
イベントログファイルですが、セキュリティ面にも利用できますが
作ったレポートやリストビューが見られているかどうかのチェックにも利用できます。
積極的に利用していきましょう。
結構簡単にデフォルトの保持期間30日問題
を解決できるので、対策したかったけど
できていなかったみたいな人の役に立つ記事になっていると嬉しいです。
ありがとうございました。