GITHUB
このドキュメントでは、Amazon S3 を使用して GitHub 監査ログを Google Security Operations に取り込む方法について説明します。パーサーは、さまざまな grok パターンを使用して「message」フィールドからデータを抽出し、JSON 形式と JSON 以外の形式の両方を処理しようとします。抽出された「process_type」に基づいて、grok、kv、その他のフィルタを使用して特定の解析ロジックを適用し、未加工のログデータを統合データモデル(UDM)スキーマにマッピングします。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス。
- エンタープライズ オーナー権限を持つ GitHub Enterprise Cloud テナントへの特権アクセス。
- AWS(S3、IAM)への特権アクセス。
GitHub Enterprise Cloud の前提条件を収集する(Enterprise アクセス)
- GitHub Enterprise Cloud 管理コンソールにログインします。
- [Enterprise settings] > [Settings] > [Audit log] > [Log streaming] に移動します。
- 監査ログのストリーミングを構成するには、エンタープライズの所有者権限が必要です。
- 次の詳細をコピーして安全な場所に保存します。
- GitHub Enterprise 名
- 企業内の組織名
Google SecOps 用に AWS S3 バケットと Identity and Access Management を構成する
- バケットの作成のユーザーガイドに沿って、Amazon S3 バケットを作成します。
- 後で参照できるように、バケットの名前とリージョンを保存します(例:
github-audit-logs
)。 - IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
- 作成したユーザーを選択します。
- [セキュリティ認証情報] タブを選択します。
- [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
- [ユースケース] として [サードパーティ サービス] を選択します。
- [次へ] をクリックします。
- 省略可: 説明タグを追加します。
- [アクセスキーを作成] をクリックします。
- [.csv ファイルをダウンロード] をクリックし、[アクセスキー] と [シークレット アクセスキー] を保存して、今後の参照に備えます。
- [完了] をクリックします。
GitHub S3 ストリーミングの IAM ポリシーを構成する
- AWS コンソールで、[IAM> ポリシー> ポリシーの作成> JSON タブ] に移動します。
- 次のポリシーをコピーして貼り付けます。
ポリシー JSON(別のバケット名を入力した場合は
github-audit-logs
を置き換えます):{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPutObjects", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::github-audit-logs/*" } ] }
[次へ] > [ポリシーを作成] をクリックします。
ポリシーに
GitHubAuditStreamingPolicy
という名前を付けて、[ポリシーを作成] をクリックします。先ほど作成した IAM ユーザーに戻ります。
[権限] タブを選択します。
[権限を追加> ポリシーを直接アタッチする] をクリックします。
GitHubAuditStreamingPolicy
を検索して選択します。[次へ> 権限を追加] をクリックします。
GitHub Enterprise Cloud の監査ログ ストリーミングを構成する
- 企業オーナーとして GitHub Enterprise Cloud にログインします。
- プロフィール写真をクリックし、[Enterprise settings] をクリックします。
- エンタープライズ アカウントのサイドバーで、[設定> 監査ログ > ログ ストリーミング] をクリックします。
- [ストリームを構成] を選択し、[Amazon S3] をクリックします。
- [認証] で [アクセスキー] をクリックします。
- 次の構成の詳細を入力します。
- リージョン: バケットのリージョン(
us-east-1
など)を選択します。 - バケット: ストリーミングするバケットの名前を入力します(例:
github-audit-logs
)。 - アクセスキー ID: IAM ユーザーのアクセスキー ID を入力します。
- シークレット キー: IAM ユーザーのシークレット キーを入力します。
- リージョン: バケットのリージョン(
- [エンドポイントを確認] をクリックして、GitHub が Amazon S3 エンドポイントに接続して書き込むことができることを確認します。
- エンドポイントの検証が完了したら、[保存] をクリックします。
Google SecOps 用の読み取り専用の IAM ユーザーと鍵を作成する
- AWS コンソール > IAM > ユーザー > ユーザーを追加 に移動します。
- [ユーザーを追加] をクリックします。
- 次の構成の詳細を入力します。
- ユーザー: 「
secops-reader
」と入力します。 - アクセスの種類: [アクセスキー - プログラムによるアクセス] を選択します。
- ユーザー: 「
- [ユーザーを作成] をクリックします。
- 最小限の読み取りポリシー(カスタム)を関連付ける: [ユーザー] > [secops-reader] > [権限] > [権限を追加] > [ポリシーを直接関連付ける] > [ポリシーを作成]。
JSON:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "arn:aws:s3:::github-audit-logs/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::github-audit-logs" } ] }
名前 =
secops-reader-policy
。[ポリシーを作成> 検索/選択> 次へ> 権限を追加] をクリックします。
secops-reader
のアクセスキーを作成します: [セキュリティ認証情報> アクセスキー> アクセスキーを作成>.CSV
をダウンロード](これらの値はフィードに貼り付けます)。
GitHub のログを取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [+ 新しいフィードを追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
GitHub audit logs
)。 - [ソースタイプ] として [Amazon S3 V2] を選択します。
- [ログタイプ] として [GitHub] を選択します。
- [次へ] をクリックします。
- 次の入力パラメータの値を指定します。
- S3 URI:
s3://github-audit-logs/
- Source deletion options: 必要に応じて削除オプションを選択します。
- ファイルの最大経過日数: 指定した日数以内に変更されたファイルを含めます。デフォルトは 180 日です。
- アクセスキー ID: S3 バケットにアクセスできるユーザー アクセスキー。
- シークレット アクセスキー: S3 バケットにアクセスできるユーザーのシークレット キー。
- Asset namespace: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
- S3 URI:
- [次へ] をクリックします。
- [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
UDM マッピング テーブル
ログフィールド | UDM マッピング | ロジック |
---|---|---|
actor |
principal.user.userid |
値は actor フィールドから取得されます。 |
actor_id |
principal.user.attribute.labels.value |
値は actor_id フィールドから取得されます。 |
actor_ip |
principal.ip |
値は actor_ip フィールドから取得されます。 |
actor_location.country_code |
principal.location.country_or_region |
値は actor_location.country_code フィールドから取得されます。 |
application_name |
target.application |
値は application_name フィールドから取得されます。 |
business |
target.user.company_name |
値は business フィールドから取得されます。 |
business_id |
target.resource.attribute.labels.value |
値は business_id フィールドから取得されます。 |
config.url |
target.url |
値は config.url フィールドから取得されます。 |
created_at |
metadata.event_timestamp |
値は UNIX ミリ秒からタイムスタンプに変換されます。 |
data.cancelled_at |
extensions.vulns.vulnerabilities.scan_end_time |
値は ISO8601 形式からタイムスタンプに変換されます。 |
data.email |
target.email |
値は data.email フィールドから取得されます。 |
data.event |
security_result.about.labels.value |
値は data.event フィールドから取得されます。 |
data.events |
security_result.about.labels.value |
値は data.events フィールドから取得されます。 |
data.head_branch |
security_result.about.labels.value |
値は data.head_branch フィールドから取得されます。 |
data.head_sha |
target.file.sha256 |
値は data.head_sha フィールドから取得されます。 |
data.hook_id |
target.resource.attribute.labels.value |
値は data.hook_id フィールドから取得されます。 |
data.started_at |
extensions.vulns.vulnerabilities.scan_start_time |
値は ISO8601 形式からタイムスタンプに変換されます。 |
data.team |
target.user.group_identifiers |
値は data.team フィールドから取得されます。 |
data.trigger_id |
security_result.about.labels.value |
値は data.trigger_id フィールドから取得されます。 |
data.workflow_id |
security_result.about.labels.value |
値は data.workflow_id フィールドから取得されます。 |
data.workflow_run_id |
security_result.about.labels.value |
値は data.workflow_run_id フィールドから取得されます。 |
enterprise.name |
additional.fields.value.string_value |
値は enterprise.name フィールドから取得されます。 |
external_identity_nameid |
target.user.email_addresses |
値がメールアドレスの場合は、target.user.email_addresses 配列に追加されます。 |
external_identity_nameid |
target.user.userid |
値は external_identity_nameid フィールドから取得されます。 |
external_identity_username |
target.user.user_display_name |
値は external_identity_username フィールドから取得されます。 |
hashed_token |
network.session_id |
値は hashed_token フィールドから取得されます。 |
job_name |
target.resource.attribute.labels.value |
値は job_name フィールドから取得されます。 |
job_workflow_ref |
target.resource.attribute.labels.value |
値は job_workflow_ref フィールドから取得されます。 |
org |
target.administrative_domain |
値は org フィールドから取得されます。 |
org_id |
additional.fields.value.string_value |
値は org_id フィールドから取得されます。 |
programmatic_access_type |
additional.fields.value.string_value |
値は programmatic_access_type フィールドから取得されます。 |
public_repo |
additional.fields.value.string_value |
値は public_repo フィールドから取得されます。 |
public_repo |
target.location.name |
値が「false」の場合、「PRIVATE」にマッピングされます。それ以外の場合は、「PUBLIC」にマッピングされます。 |
query_string |
additional.fields.value.string_value |
値は query_string フィールドから取得されます。 |
rate_limit_remaining |
additional.fields.value.string_value |
値は rate_limit_remaining フィールドから取得されます。 |
repo |
target.resource.name |
値は repo フィールドから取得されます。 |
repo_id |
additional.fields.value.string_value |
値は repo_id フィールドから取得されます。 |
repository_public |
additional.fields.value.string_value |
値は repository_public フィールドから取得されます。 |
request_body |
additional.fields.value.string_value |
値は request_body フィールドから取得されます。 |
request_method |
network.http.method |
値は大文字に変換されます。 |
route |
additional.fields.value.string_value |
値は route フィールドから取得されます。 |
status_code |
network.http.response_code |
値は整数に変換されます。 |
timestamp |
metadata.event_timestamp |
値は UNIX ミリ秒からタイムスタンプに変換されます。 |
token_id |
additional.fields.value.string_value |
値は token_id フィールドから取得されます。 |
token_scopes |
additional.fields.value.string_value |
値は token_scopes フィールドから取得されます。 |
transport_protocol_name |
network.application_protocol |
値は大文字に変換されます。 |
url_path |
target.url |
値は url_path フィールドから取得されます。 |
user |
target.user.user_display_name |
値は user フィールドから取得されます。 |
user_agent |
network.http.user_agent |
値は user_agent フィールドから取得されます。 |
user_agent |
network.http.parsed_user_agent |
値が解析されます。 |
user_id |
target.user.userid |
値は user_id フィールドから取得されます。 |
workflow.name |
security_result.about.labels.value |
値は workflow.name フィールドから取得されます。 |
workflow_run.actor.login |
principal.user.userid |
値は workflow_run.actor.login フィールドから取得されます。 |
workflow_run.event |
additional.fields.value.string_value |
値は workflow_run.event フィールドから取得されます。 |
workflow_run.head_branch |
security_result.about.labels.value |
値は workflow_run.head_branch フィールドから取得されます。 |
workflow_run.head_sha |
target.file.sha256 |
値は workflow_run.head_sha フィールドから取得されます。 |
workflow_run.id |
target.resource.attribute.labels.value |
値は workflow_run.id フィールドから取得されます。 |
workflow_run.workflow_id |
security_result.about.labels.value |
値は workflow_run.workflow_id フィールドから取得されます。 |
なし | metadata.event_type |
値は action フィールドと actor フィールドに基づいて決定されます。action フィールドに「_member」が含まれている場合、値は「USER_RESOURCE_UPDATE_PERMISSIONS」に設定されます。action フィールドが空でなく、actor フィールドが空でない場合、値は「USER_RESOURCE_UPDATE_CONTENT」に設定されます。それ以外の場合、値は「USER_RESOURCE_ACCESS」に設定されます。 |
なし | metadata.log_type |
値は「GITHUB」に設定されます。 |
なし | metadata.product_name |
値は「GITHUB」に設定されます。 |
なし | metadata.vendor_name |
値は「GITHUB」に設定されます。 |
なし | target.resource.resource_type |
値は「STORAGE_OBJECT」に設定されます。 |
なし | security_result.about.labels.key |
値は、対応する data フィールドに基づいて定数文字列に設定されます。たとえば、data.workflow_id の場合、キーは「ワークフロー ID」に設定されます。 |
なし | target.resource.attribute.labels.key |
値は、対応する data フィールドに基づいて定数文字列に設定されます。たとえば、data.hook_id の場合、キーは「フック ID」に設定されます。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。