Microsoft SQL Server のログを収集する
このドキュメントでは、Bindplane を使用して Microsoft SQL Server ログを Google Security Operations に取り込む方法について説明します。このパーサーは、構造化(JSON、Key-Value ペア)と半構造化(syslog)の両方の Microsoft SQL Server ログを処理します。フィールドを抽出し、タイムスタンプを正規化し、SourceModuleType
と Message
のコンテンツ(監査、ログイン、データベース イベントなど)に基づいてさまざまなログ形式を処理し、それらを UDM にマッピングします。また、監査レコード、ログイン試行、データベース オペレーションに対して特定の解析ロジックを実行し、追加のコンテキストと重大度情報でデータを拡充します。syslog 転送(NXLog)を使用して Windows イベントログから SQL Server の監査ログとエラーログを収集し、BindPlane エージェントに送信して Google SecOps に配信します。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス
- Microsoft SQL Server を実行している Windows Server 2016 以降のホスト
- BindPlane Agent と NXLog をインストールして構成するための管理者アクセス権
- プロキシの背後で実行している場合は、Bindplane エージェントの要件に従ってファイアウォール ポートが開いていることを確認します
Google SecOps の取り込み認証ファイルを取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [コレクション エージェント] に移動します。
- Ingestion Authentication File をダウンロードします。Bindplane をインストールするシステムにファイルを安全に保存します。
Google SecOps のお客様 ID を取得する
- Google SecOps コンソールにログインします。
- [SIEM 設定] > [プロファイル] に移動します。
- [組織の詳細情報] セクションから [お客様 ID] をコピーして保存します。
Bindplane エージェントをインストールする
次の手順に沿って、Windows または Linux オペレーティング システムに Bindplane エージェントをインストールします。
Windows のインストール
- 管理者として コマンド プロンプトまたは PowerShell を開きます。
次のコマンドを実行します。
msiexec /i "https://github.com/observIQ/bindplane-agent/releases/latest/download/observiq-otel-collector.msi" /quiet
その他のインストール リソース
その他のインストール オプションについては、インストール ガイドをご覧ください。
Syslog を取り込んで Google SecOps に送信するように Bindplane エージェントを構成する
- 構成ファイルにアクセスします。
config.yaml
ファイルを見つけます。通常、Windows の場合は `C:\Program Files\observIQ\bindplane-agent` ディレクトリにあります。- テキスト エディタ(
nano
、vi
、メモ帳など)を使用してファイルを開きます。
config.yaml
ファイルを次のように編集します。receivers: udplog: # Replace the port and IP address as required listen_address: "0.0.0.0:1514" exporters: chronicle/chronicle_w_labels: compression: gzip # Adjust the path to the credentials file you downloaded in Step 1 creds_file_path: '/path/to/ingestion-authentication-file.json' # Replace with your actual customer ID from Step 2 customer_id: <YOUR_CUSTOMER_ID> endpoint: malachiteingestion-pa.googleapis.com # Add optional ingestion labels for better organization log_type: 'MICROSOFT_SQL' raw_log_field: body ingestion_labels: service: pipelines: logs/source0__chronicle_w_labels-0: receivers: - udplog exporters: - chronicle/chronicle_w_labels
- 自社のインフラストラクチャでの必要性に応じて、ポートと IP アドレスを置き換えます。
<customer_id>
は、実際の顧客 ID に置き換えます。/path/to/ingestion-authentication-file.json
の値を、Google SecOps の取り込み認証ファイルを取得するで認証ファイルを保存したパスに更新します。
Bindplane エージェントを再起動して変更を適用する
Windows で Bindplane エージェントを再起動するには、Services コンソールを使用するか、次のコマンドを入力します。
net stop BindPlaneAgent && net start BindPlaneAgent
Windows イベントログで SQL Server Audit を有効にする
SQL Server Audit は、SQL Server Management Studio(SSMS)GUI または T-SQL コマンドを使用して有効にできます。ご使用の環境に最適なオプションを選択してください。
オプション 1: SSMS GUI を使用して SQL Server Audit を有効にする
SQL Server Management Studio UI でサーバー監査を作成する
- SQL Server Management Studio(SSMS)を開き、SQL Server インスタンスに接続します。
- [オブジェクト エクスプローラ] で、サーバー インスタンスを開きます。
- [Security] フォルダを開きます。
- [監査] を右クリックし、[新しい監査] を選択します。
- [監査の作成] ダイアログで、次の構成の詳細を指定します。
- 監査名: 「
ChronicleAudit
」と入力します。 - キューの遅延(ミリ秒単位): 「
1000
」と入力します。 - 監査ログの失敗時: [続行] を選択します。
- 監査の宛先: [アプリケーション ログ] を選択します。
- 監査名: 「
- [OK] をクリックして監査を作成します。
- オブジェクト エクスプローラーで、新しく作成した ChronicleAudit を右クリックし、[監査を有効にする] を選択します。
SSMS GUI を使用してサーバー監査の仕様を作成する
- [オブジェクト エクスプローラ] で、[セキュリティ] を開きます。
- [サーバー監査仕様] を右クリックし、[新しいサーバー監査仕様] を選択します。
- [サーバー監査仕様の作成] ダイアログで、次の構成の詳細を指定します。
- 名前: 「
ChronicleAuditSpec
」と入力します。 - 監査: メニューから [ChronicleAudit] を選択します。
- 名前: 「
- [監査アクション タイプ] セクションで [追加] をクリックし、次の監査アクション グループを選択します(それぞれを選択してから [追加] をクリックして、個別に 1 つずつ追加します)。
- FAILED_LOGIN_GROUP
- SUCCESSFUL_LOGIN_GROUP
- LOGOUT_GROUP
- SERVER_ROLE_MEMBER_CHANGE_GROUP
- DATABASE_OBJECT_CHANGE_GROUP
- DATABASE_PRINCIPAL_CHANGE_GROUP
- SCHEMA_OBJECT_CHANGE_GROUP
- DATABASE_PERMISSION_CHANGE_GROUP
- [OK] をクリックして、監査仕様を作成します。
- [オブジェクト エクスプローラー] で、新しく作成した ChronicleAuditSpec を右クリックし、[サーバー監査仕様を有効にする] を選択します。
監査構成を確認する
- オブジェクト エクスプローラーで、[セキュリティ > 監査] を開きます。
- [ChronicleAudit] を右クリックして、[プロパティ] を選択します。
- [ステータス] が [開始] または [有効] と表示されていることを確認します。
- [セキュリティ] > [サーバー監査仕様] を開きます。
- [ChronicleAuditSpec] を右クリックして、[プロパティ] を選択します。
- 8 つの監査アクション グループがすべて一覧表示され、仕様が有効になっていることを確認します。
オプション 2: T-SQL を使用して SQL Server Audit を有効にする
- SQL Server Management Studio(SSMS)を開き、SQL Server インスタンスに接続します。
次の T-SQL コマンドを実行して、Windows アプリケーション ログに書き込むサーバー監査を作成します。
USE master; GO CREATE SERVER AUDIT ChronicleAudit TO APPLICATION_LOG WITH (QUEUE_DELAY = 1000, ON_FAILURE = CONTINUE); GO ALTER SERVER AUDIT ChronicleAudit WITH (STATE = ON); GO
関連するセキュリティ イベントをキャプチャする監査仕様を作成します。
CREATE SERVER AUDIT SPECIFICATION ChronicleAuditSpec FOR SERVER AUDIT ChronicleAudit ADD (FAILED_LOGIN_GROUP), ADD (SUCCESSFUL_LOGIN_GROUP), ADD (LOGOUT_GROUP), ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP), ADD (DATABASE_OBJECT_CHANGE_GROUP), ADD (DATABASE_PRINCIPAL_CHANGE_GROUP), ADD (SCHEMA_OBJECT_CHANGE_GROUP), ADD (DATABASE_PERMISSION_CHANGE_GROUP); GO ALTER SERVER AUDIT SPECIFICATION ChronicleAuditSpec WITH (STATE = ON); GO
この構成により、認証イベント、権限の変更、オブジェクトの変更が Windows イベントログに記録されます。
イベントを Bindplane に転送するように NXLog をインストールして構成する
- nxlog.co/downloads から NXLog Community Edition をダウンロードします。
- インストーラを実行し、インストール ウィザードを完了します。
次の場所にある NXLog 構成ファイルを開きます。
C:\Program Files\nxlog\conf\nxlog.conf
内容を次の構成に置き換えます。
define ROOT C:\Program Files\nxlog Moduledir %ROOT%\modules CacheDir %ROOT%\data Pidfile %ROOT%\data\nxlog.pid SpoolDir %ROOT%\data LogFile %ROOT%\data\nxlog.log <Extension _json> Module xm_json </Extension> <Input in_eventlog> Module im_msvistalog Query <QueryList>\ <Query Id="0">\ <Select Path="Application">*[System[Provider[@Name='MSSQLSERVER']]]</Select>\ </Query>\ </QueryList> </Input> <Output out_syslog> Module om_udp Host 127.0.0.1 Port 1514 Exec to_json(); </Output> <Route r1> Path in_eventlog => out_syslog </Route>
- ホストの現在の値
127.0.0.1
を Bindplane エージェントの IP アドレスに置き換えます。 - ポートの値が、先ほど構成した Bindplane
udplog
レシーバー ポートと一致していることを確認します。
- ホストの現在の値
ファイルを保存して、NXLog サービスを再起動します。
net stop nxlog && net start nxlog
UDM マッピング テーブル
ログフィールド | UDM マッピング | ロジック |
---|---|---|
AccountName |
principal.user.userid |
Starting up database や Log was backed up などのログに存在する場合、principal.user.userid に使用されます。 |
AgentDevice |
additional.fields |
キー「AgentDevice」で additional.fields に Key-Value ペアとして追加されます。 |
AgentLogFile |
additional.fields |
キー「AgentLogFile」で additional.fields に Key-Value ペアとして追加されます。 |
agent.hostname |
observer.asset.hostname |
オブザーバーのホスト名にマッピングされます。 |
agent.id |
observer.asset_id |
agent.type と連結して observer.asset_id を形成します。 |
agent.type |
observer.asset_id |
agent.id と連結して observer.asset_id を形成します。 |
agent.version |
observer.platform_version |
オブザーバー プラットフォーム バージョンにマッピングします。 |
ApplicationName |
principal.application |
プリンシパル アプリケーションにマッピングされます。 |
application_name |
target.application |
ターゲット アプリケーションにマッピングします。 |
client_address |
principal.ip |
ホストと異なり、ローカルまたは名前付きパイプでない場合、プリンシパル IP に使用されます。 |
client_ip |
principal.ip |
プリンシパル IP にマッピングされます。 |
computer_name |
about.hostname |
about ホスト名にマッピングされます。 |
correlationId |
security_result.detection_fields |
キー「correlationId」で security_result.detection_fields に Key-Value ペアとして追加されます。 |
Date |
metadata.event_timestamp |
Time と組み合わせてイベント タイムスタンプを作成します。 |
database_name |
target.resource_ancestors.name |
監査ログに存在する場合、ターゲット リソースの祖先名に使用されます。 |
durationMs |
network.session_duration.seconds |
ミリ秒から秒に変換され、マッピングされます。 |
ecs.version |
metadata.product_version |
プロダクト バージョンにマッピングされます。 |
error |
security_result.detection_fields |
キー「error」で security_result.detection_fields に Key-Value ペアとして追加されます。 |
err_msg |
security_result.description |
セキュリティ結果の説明にマッピングされます。 |
EventID |
metadata.product_event_type |
他のフィールドが利用できない場合に、プロダクト イベントのタイプを構築するために使用されます。接頭辞として「EventID: 」が付加されます。 |
event.action |
Source |
存在する場合はソースとして使用されます。 |
event.code |
metadata.product_event_type |
event.provider と組み合わされて metadata.product_event_type を形成します。 |
event.provider |
metadata.product_event_type |
event.code と組み合わされて metadata.product_event_type を形成します。 |
EventReceivedTime |
metadata.ingested_timestamp |
解析され、取り込まれたタイムスタンプとして使用されます。 |
event_time |
metadata.event_timestamp |
解析され、イベント タイムスタンプとして使用されます。 |
file_name |
principal.process.file.full_path |
プリンシパル プロセス ファイルのフルパスにマッピングされます。 |
file_path |
target.file.full_path |
バックアップ ログで見つかった場合、ターゲット ファイルのフルパスに使用されます。 |
first_lsn |
target.resource.attribute.labels |
キー「First LSN」で target.resource.attribute.labels に Key-Value ペアとして追加されます。 |
host |
principal.hostname 、observer.hostname |
IP ではない場合、プリンシパルまたはオブザーバーのホスト名に使用されます。IP かどうかによって、ターゲット ホスト名または IP にも使用されます。 |
host.ip |
principal.ip |
プリンシパル IP に統合されます。 |
host.name |
host |
ホストとして使用されます(存在する場合)。 |
Hostname |
principal.hostname 、target.hostname |
プリンシパルまたはターゲット ホスト名に使用されます(存在する場合)。 |
hostinfo.architecture |
principal.asset.hardware.cpu_platform |
プリンシパル アセットのハードウェア CPU プラットフォームにマッピングされます。 |
hostinfo.os.build |
additional.fields |
キー「os_build」で additional.fields に Key-Value ペアとして追加されます。 |
hostinfo.os.kernel |
principal.platform_patch_level |
プリンシパル プラットフォームのパッチレベルにマッピングされます。 |
hostinfo.os.name |
additional.fields |
キー「os_name」で additional.fields に Key-Value ペアとして追加されます。 |
hostinfo.os.platform |
principal.platform |
大文字に変換され、プリンシパル プラットフォームにマッピングされます。 |
hostinfo.os.version |
principal.platform_version |
プリンシパル プラットフォーム バージョンにマッピングされます。 |
last_lsn |
target.resource.attribute.labels |
キー「Last LSN」で target.resource.attribute.labels に Key-Value ペアとして追加されます。 |
level |
security_result.severity |
「Informational」の場合は、security_result.severity を「INFORMATIONAL」に設定します。 |
log.level |
security_result.severity_details |
セキュリティ結果の重大度の詳細にマッピングされます。 |
LoginName |
principal.user.userid |
KV ログに存在する場合、プリンシパル ユーザー ID に使用されます。 |
login_result |
security_result.action |
セキュリティ結果のアクション(ALLOW または BLOCK)を決定します。 |
logon_user |
principal.user.userid |
ログインログに存在する場合、プリンシパル ユーザー ID に使用されます。 |
logstash.process.host |
intermediary.hostname |
仲介ホスト名にマッピングされます。 |
Message |
metadata.description 、security_result.description |
ログタイプに応じて、イベントの説明またはセキュリティ結果の説明に使用されます。 |
msg |
metadata.description |
イベントの説明に使用されます(存在する場合)。 |
ObjectName |
target.resource.name |
ターゲット リソース名にマッピングされます。 |
object_name |
target.resource.name |
監査ログに存在する場合、ターゲット リソース名に使用されます。 |
ObjectType |
target.resource.type |
ターゲット リソースタイプにマッピングします。 |
operationId |
security_result.detection_fields |
キー「operationId」で security_result.detection_fields に Key-Value ペアとして追加されます。 |
operationName |
metadata.product_event_type |
プロダクト イベントタイプにマッピングされます。 |
operationVersion |
additional.fields |
キー「operationVersion」で additional.fields に Key-Value ペアとして追加されます。 |
ProcessInfo |
additional.fields |
キー「ProcessInfo」で additional.fields に Key-Value ペアとして追加されます。 |
properties.apiVersion |
metadata.product_version |
プロダクト バージョンにマッピングされます。 |
properties.appId |
target.resource.product_object_id |
ターゲット リソースのプロダクト オブジェクト ID にマッピングされます。 |
properties.clientAuthMethod |
extensions.auth.auth_details |
認証の詳細を決定するために使用されます。 |
properties.clientRequestId |
additional.fields |
キー「clientRequestId」で additional.fields に Key-Value ペアとして追加されます。 |
properties.durationMs |
network.session_duration.seconds |
秒に変換され、マッピングされます。 |
properties.identityProvider |
security_result.detection_fields |
キー「identityProvider」で security_result.detection_fields に Key-Value ペアとして追加されます。 |
properties.ipAddress |
principal.ip 、principal.asset.ip |
IP を解析し、プリンシパル IP とプリンシパル アセット IP に統合されます。 |
properties.location |
principal.location.name |
プリンシパルのロケーション名にマッピングされます。 |
properties.operationId |
security_result.detection_fields |
キー「operationId」で security_result.detection_fields に Key-Value ペアとして追加されます。 |
properties.requestId |
metadata.product_log_id |
プロダクトログ ID にマッピングされます。 |
properties.requestMethod |
network.http.method |
ネットワーク HTTP メソッドにマッピングされます。 |
properties.requestUri |
target.url |
ターゲット URL にマッピングされます。 |
properties.responseSizeBytes |
network.received_bytes |
符号なし整数に変換され、マッピングされます。 |
properties.responseStatusCode |
network.http.response_code |
整数に変換され、マッピングされます。 |
properties.roles |
additional.fields |
キー「roles」で additional.fields に Key-Value ペアとして追加されます。 |
properties.servicePrincipalId |
principal.user.userid |
properties.userId が存在しない場合、プリンシパル ユーザー ID に使用されます。 |
properties.signInActivityId |
network.session_id |
ネットワーク セッション ID にマッピングされます。 |
properties.tenantId |
metadata.product_deployment_id |
プロダクト デプロイ ID にマッピングされます。 |
properties.tokenIssuedAt |
additional.fields |
キー「tokenIssuedAt」で additional.fields に Key-Value ペアとして追加されます。 |
properties.userAgent |
network.http.user_agent |
ネットワーク HTTP ユーザー エージェントにマッピングされます。 |
properties.userId |
principal.user.userid |
プリンシパル ユーザー ID に使用されます(存在する場合)。 |
properties.wids |
security_result.detection_fields |
キー「wids」で security_result.detection_fields に Key-Value ペアとして追加されます。 |
reason |
security_result.summary |
ログイン イベントのセキュリティ結果の概要に使用されます。 |
resourceId |
target.resource.attribute.labels |
キー「Resource ID」で target.resource.attribute.labels に Key-Value ペアとして追加されます。 |
schema_name |
target.resource_ancestors.resource_subtype |
監査ログに存在する場合、ターゲット リソースの祖先サブタイプに使用されます。 |
security_result.description |
metadata.description |
監査イベントでない場合のイベントの説明に使用されます。 |
security_result.severity |
security_result.severity |
存在する場合は直接マッピングされます。KV ログの場合は「LOW」、特定のエラー メッセージの場合は「INFORMATIONAL」に設定され、level フィールドまたは Severity フィールドから派生します。 |
security_result.severity_details |
security_result.severity_details |
存在する場合は直接マッピングされます。 |
security_result.summary |
security_result.summary |
存在する場合は直接マッピングされます。ログイン イベントの場合は「Windows 認証を使用して接続が確立されました」またはログイン イベントの特定の理由に設定します。監査イベントの場合は「SQL Server 監査レコード」に設定します。 |
security_result_action |
security_result.action |
security_result.action に統合されました。ほとんどのイベントでは「ALLOW」に設定され、ログイン イベントでは login_result から派生します。 |
server_instance_name |
target.hostname |
監査ログにターゲット ホスト名が存在する場合に使用されます。 |
server_principal_name |
principal.user.userid |
監査ログに存在する場合、プリンシパル ユーザー ID に使用されます。 |
server_principal_sid |
principal.asset_id |
プリンシパル アセット ID の構築に使用されます。「server SID:」という接頭辞が付いています。 |
session_id |
network.session_id |
監査ログに存在する場合、ネットワーク セッション ID に使用されます。 |
sev |
security_result.severity |
セキュリティ結果の重大度を判断するために使用されます。 |
Severity |
security_result.severity |
セキュリティ結果の重大度を判断するために使用されます。 |
Source |
additional.fields |
キー「Source」で additional.fields に Key-Value ペアとして追加されます。 |
source |
principal.resource.attribute.labels |
キー「source」で principal.resource.attribute.labels に Key-Value ペアとして追加されます。 |
SourceModuleType |
observer.application |
オブザーバー アプリケーションにマッピングします。 |
SourceModuleName |
additional.fields |
キー「SourceModuleName」で additional.fields に Key-Value ペアとして追加されます。 |
source_module_name |
observer.labels |
キー「SourceModuleName」で observer.labels に Key-Value ペアとして追加されます。 |
source_module_type |
observer.application |
オブザーバー アプリケーションにマッピングします。 |
SPID |
network.session_id |
ネットワーク セッション ID にマッピングされます。 |
statement |
target.process.command_line |
監査ログに存在する場合、ターゲット プロセスのコマンドラインに使用されます。 |
TextData |
security_result.description 、metadata.description |
ログイン イベントでない場合はセキュリティ結果の説明に使用され、ログイン イベントの場合はイベントの説明に使用されます。 |
time |
metadata.event_timestamp |
解析され、イベント タイムスタンプとして使用されます。 |
Time |
metadata.event_timestamp |
Date と組み合わせてイベント タイムスタンプを作成します。 |
transaction_id |
target.resource.attribute.labels |
キー「transaction_id」で target.resource.attribute.labels に Key-Value ペアとして追加されます。 |
UserID |
principal.user.windows_sid |
存在し、正しい形式の場合、プリンシパル ユーザーの Windows SID に使用されます。 |
user_id |
principal.user.userid |
プリンシパル ユーザー ID に使用されます(存在する場合)。 |
metadata.log_type |
metadata.log_type |
「MICROSOFT_SQL」にハードコードされています。 |
metadata.vendor_name |
metadata.vendor_name |
「Microsoft」にハードコードされています。 |
metadata.product_name |
metadata.product_name |
「SQL Server」にハードコードされています。 |
metadata.event_type |
metadata.event_type |
ログの内容に応じてさまざまな値に設定されます。デフォルトでは、「USER_LOGIN」、「USER_LOGOUT」、「STATUS_STARTUP」、「STATUS_SHUTDOWN」、「NETWORK_HTTP」、「GENERIC_EVENT」、「STATUS_UNCATEGORIZED」などがあります。 |
extensions.auth.type |
extensions.auth.type |
ログイン イベントとログアウト イベントの場合は「MACHINE」に設定されます。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。