Más contenido relacionado
La actualidad más candente (20)
Similar a 【JEUG】 オープンSIEMの世界へ (20)
Más de Hibino Hisashi (14)
【JEUG】 オープンSIEMの世界へ
- 2. 2
自己紹介
名前:日比野 恒 (ひびの ひさし)
所属:フューチャーアーキテクト株式会社
セキュリティアーキテクト (CISSP、CISA、情報処理安全確保支援士)
AIなどの「システム高度化」により、ITリテラシーの非対称性が拡大している
IoT/コネクテッド領域など、ITが人々の生活に密接に関わるにつれ、危機感を持つようになる
オープンな技術を用いたセキュリティログの分析プラットフォーム開発に目覚め、今に至る
- 5. 5
ログ管理製品の分類
Syslog 統合ログ管理 SIEM
相関分析
正規化
可視化
ログアーカイブ(長期保管)用途 ログ分析(リアルタイム)用途
※IO性能よりもディスク容量やセキュリティ重視 ※ディスク容量よりもIO性能重視
【製品例】
①Qradar
②McAfeeSIEM
③Splunk Enterprise
【製品例】
①LogStorage
②LogRevi
③EventLog Analyzer
【製品例】
①Kiwi Syslog
②rsyslog
③syslog-ng
ログ収集
相関分析
正規化
可視化
ログ収集
相関分析
正規化
可視化
ログ収集
SIEM(Security Information and Event Management)は、セキュリティ脅威検知に特化したログ管理製品。
- 24. 24
RDSのSQL監査ログ(1/3)
S3経由で取得したRDS(Oracleエンジン)のSQL監査ログのinput区はこんな感じ。
input {
s3 {
id => "rds-audit"
bucket => “SIEM-AUDIT"
prefix => "/rds/audit/"
region => "ap-northeast-1"
sincedb_path => "/var/lib/logstash/sincedb_rds-audit"
codec => multiline {
pattern => "(<?xml .*|<Audit .*|xmlns:xsi|xsi:schemaLocation|<Version>|</AuditRecord>|</Audit>)"
negate => true
what => "next"
}
}
}
RDS Oracleのaudit_trailをOS形式で出力すると1レコードが複数行にまたがるログとなるため、codecでmultilineを指定する。
Patternで指定した文字列以外(negateがtrue)の行は、最初の行の後ろ(whatがnext)に追記して1件のログと認識する。
【参考】 https://dev.classmethod.jp/cloud/aws/rds-oracle-copy-audit-logs-to-s3/
- 25. 25
RDSのSQL監査ログ(2/3)
filter区はこんな感じ。次ページに続くw
filter {
xml {
source => "message"
store_xml => false
xpath => [
"/AuditRecord/Audit_Type/text()","Audit_Type",
"/AuditRecord/Session_Id/text()","Session_Id",
"/AuditRecord/StatementId/text()","StatementId",
"/AuditRecord/EntryId/text()","EntryId",
"/AuditRecord/Extended_Timestamp/text()","Extended_Timestamp",
"/AuditRecord/DB_User/text()","DB_User",
"/AuditRecord/OS_User/text()","OS_User",
"/AuditRecord/Userhost/text()","Userhost",
"/AuditRecord/OS_Process/text()","OS_Process",
"/AuditRecord/Terminal/text()","Terminal",
"/AuditRecord/Instance_Number/text()","Instance_Number",
"/AuditRecord/Object_Schema/text()","Object_Schema",
"/AuditRecord/Object_Name/text()","Object_Name",
"/AuditRecord/Action/text()","Action",
"/AuditRecord/TransactionId/text()","TransactionId",
"/AuditRecord/Returncode/text()","Returncode",
"/AuditRecord/Scn/text()","Scn",
"/AuditRecord/Comment_Text/text()","Comment_Text",
"/AuditRecord/Sql_Bind/text()","Sql_Bind",
"/AuditRecord/Sql_Text/text()","Sql_Text",
"/AuditRecord/OSPrivilege/text()","OSPrivilege",
"/AuditRecord/DBID/text()","DBID"
]
}
xml形式のログフォーマットであるため、xml filterを利用する。
message内容をxpath指定でfieldとvalueに分解する。
- 26. 26
RDSのSQL監査ログ(3/3)
S3へのRDS OracleのSQL監査ログのアップデート方法にてログの重複の可能性があるため...
if [DB_User][0] == "/" { drop {} }
fingerprint {
source => "message"
target => "[@metadata][fingerprint]"
method => "MURMUR3"
}
date {
match => [ "Extended_Timestamp[0]" , "yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'" ]
timezone => "UTC"
target => "@timestamp"
}
mutate {
add_field => {
"file" => "%{[@metadata][s3][key]}"
}
}
}
output {
elasticsearch {
hosts => [ “<ElasticsearchのURL>:9200" ]
index => "rds-audit-%{+YYYYMMdd}"
document_id => "%{[@metadata][fingerprint]}"
}
}
ハッシュ値が一意になるようにsourceとしてmessageを指定する王道。
※同じmessageとなるログは基本的には存在しないため
method(利用するアルゴリズム)には、衝突率と処理速度でMURMUR3。
document_idにfingerprintのtargetで指定したメタフィールドを利用。
※障害時のログ取り込みの重複を防ぐ効果あり
- 30. 30
これだけ嬉しいことが起きるはず (^^)
1. SyslogサーバからFirewallログ取得
2. 国情報から国外アクセスを検索
3. 国外IP一覧をIPアドレスごとに集計
4. IPアドレスをWhoisでホスト名検索
5. 不審なIPアドレスをFirewallでブロック
繰り返す
1. SyslogサーバからFirewallログ取得
2. 国情報から国外アクセスを検索
3. 国外IP一覧をIPアドレスごとに集計
4. IPアドレスをWhoisでホスト名検索
5. 不審なIPアドレスをFirewallでブロック
ElasticStack
に
よ
る
自
動
化
- 32. 32
【参考】私がログ分析でよく使うフィルタたち
# フィルタ名 説明
1 grok 非構造データを正規表現を用いて構造化データに変換するフィルタ
2 date ログ内の日付データを@timestampに置換するフィルタ
3 mutate fieldの型を変更したり、fieldを追加削除、編集するフィルタ
4 geoip ログ内のIPアドレスに国情報や緯度経度情報を付加するフィルタ
5 dns IPアドレスからホスト名(逆引き)、またはその逆の正引きを行うフィルタ
6 drop 条件に合致するログレコードを廃棄させるフィルタ
7 csv csv形式のログデータをfieldとvalueに分割するフィルタ
8 kv key=value形式のログデータをfieldとvalueに分割するフィルタ
9 xml xml形式のログデータをfieldとvalueに分割するフィルタ
10 translate valueの中身を指定した文字列に合致したら置換させるフィルタ
11 fingerprint 指定したfieldのvalueからハッシュ値を生成し、新たにfield化するフィルタ
- 36. 36
イベントログ取得はもちろんWinlogbeatにお任せ!
イベントログの取得は、WinlogbeatでイベントIDを取得するだけでOK!
# イベントID 内容
1 21 OSログイン成功
2 23 OSログオフ成功
3 24 OSセッション切断
4 25 OSセッション再接続
5 4625 OSログイン失敗
【winlogbeat.yml】
winlogbeat.event_logs:
- name: Microsoft-Windows-TerminalServices-LocalSessionManager/Operational
tags: ["login"]
event_id: 21,23,24,25
- name: Security
tags: ["login"]
event_id: 4625
Securityの「成功の監査」や「失敗の監査」の
イベントを取るよりもこのログを取るほうが正確な
OS認証ログが効率よく取得できる。(オススメ)
踏台サーバの利用終了時
ちゃんとログオフしていない
アカウントの監視ができる。
(セキュリティポリシー違反の監査)
【認証関連イベント情報】
- 38. 38
【参考】ファイル操作に関するイベントログと表示される項目一覧
項目名 / イベントID 4656 (OPEN) 4656 (DELETE) 4658 (CLOSE) 4663 (ACCESS) 4690 (COPY)
AccessList ● ● - ● -
AccessMask (CRUDの情報) ● ● - ● -
AccessReason ● ● - - -
HandleId ● ● ● ● -
ObjectName (フォルダ名やファイル名のフルパス) ● ● - ● -
ObjectServer ● ● ● ● -
ObjectType (DirectoryまたはFile) ● ● - ● -
PrivilegeList ● ● - - -
ProcessId ● ● ● ● -
ProcessName ● ● ● ● -
ResourceAttributes ● ● - ● -
RestrictedSidCount ● ● - - -
SourceHandleId - - - - ●
SourceProcessId - - - - ●
SubjectDomainName (ユーザのドメイン名) ● ● ● ● ●
SubjectLogonId ● ● ● ● ●
SubjectUserName (アカウント名) ● ● ● ● ●
SubjectUserSid ● ● ● ● ●
TargetHandleId - - - - ●
TargetProcessId - - - - ●
TransactionId ● ● - - -
COPYしたファイル名をイベンID:4690
単体でトレースすることは出来ない。