Security Center の [ログ分析] ページでは、セキュリティログに対してカスタムクエリや統計分析を実行できます。このトピックで説明するクエリ構文を使用して、キーワードまたはフィールドでログをフィルター処理し、SQL を使用して結果を集約し、時間または IP アドレスでログインパターンを分析できます。
仕組み
ログクエリ文は、縦棒 (|) で区切られた2つのパートで構成されます。
<search syntax> | <analytics syntax>両方のパートはオプションです。
| パート | 役割 | できないこと |
|---|---|---|
| 検索 | キーワード、フィールド値、または数値範囲でログをフィルタリングします | 集計または統計の計算はできません |
| 分析 | フィルタリングされた結果、または時間範囲内のすべてのデータを集計して統計を計算します | 単独で全文キーワードによるフィルタリングはできません |
検索部分が
*または空の場合、フィルタリングは適用されず、選択された時間範囲内のすべてのログが分析部分に渡されます。分析部分が空の場合、一致するログエントリはそのまま返され、統計は計算されません。
クエリエディターを開くには、Security Center コンソールの左側のナビゲーションウィンドウで[リスクガバナンス] > [ログ分析]に移動し、[検索と分析]に文を入力します。
検索構文
検索部分は、全文クエリとフィールド指定検索をサポートしています。クエリエディタは、複数行入力と構文ハイライトをサポートしています。
全文クエリ
フィールド名を指定せずに、すべてのログフィールドを検索します。複数のキーワードはスペースまたは and で区切ります。スペースを含むフレーズは二重引用符 (") で囲みます。
| クエリ | 返される内容 |
|---|---|
www.aliyundoc.com 404 | 両方の用語を含むログ |
www.aliyundoc.com and 404 | 上記と同じ |
www.aliyundoc.com and (error or 404) | www.aliyundoc.com と、error または 404 |
www.aliyundoc.com and failed_* | www.aliyundoc.com と、failed_ |
ワイルドカードマッチングは、末尾のアスタリスク (failed_*) のみをサポートしています。先頭のアスタリスク (*failed) はサポートされていません。
完全な検索構文リファレンスについては、「ログ検索の概要」をご参照ください。
フィールド指定検索
Field: Value または Field >= Value のような数値比較を使用して、特定のフィールドでフィルタリングします。複数のフィールド条件を and または or で結合するか、全文用語と組み合わせて使用します。
各ログエントリには、ログタイプを識別する組み込みの __topic__ フィールドが含まれています。__topic__ を使用して特定のログソースをターゲットにし、そのログタイプにフィールドフィルターを追加します。
例
重大な深刻度レベルのアラートログを検索します。
__topic__ : sas-security-log and level: serious特定の IP アドレスからの SSH ログインイベントを検索します。
__topic__:aegis-log-login and ip:1.2.XX.XX and warn_type:SSHLOGIN応答時間が1秒を超える内部 DNS クエリを検索します。
__topic__:local-dns and time_usecond > 1000000応答時間が1秒から10秒の間の内部 DNS クエリを検索します。
__topic__:local-dns and time_usecond in [1000000,10000000]分析構文
分析部分は SQL-92 ステートメントを使用します。from log 句は、標準 SQL の from <table name> と同等であり、省略できます。
デフォルトでは、クエリは最初の100個のログエントリを返します。これを変更するには、LIMIT 句を使用します。詳細については、「LIMIT 句」をご参照ください。
サポートされている SQL 関数の完全なリストについては、「ログ分析の概要」をご参照ください。
時間ベースのクエリ
すべてのログエントリには、ログタイムスタンプを UNIX タイムスタンプ (1970年1月1日 00:00:00 協定世界時 (UTC) からの経過秒数) として保存する組み込みの __time__ フィールドがあります。クエリ結果に表示する前に、このフィールドを変換します。
特定の IP からの最新のログインイベントの取得
IP 1.2.XX.XX からの最新のログインイベント10件を、人間が判読できるタイムスタンプで返します。
__topic__: aegis-log-login and ip: 1.2.XX.XX
| select date_format(__time__, '%Y-%m-%d %H:%i:%s') as time, warn_ip, warn_type
order by __time__ desc
limit 10各ログインからの経過日数の計算
各ログインイベントの経過日数を表示する days_passed 列を追加します。
__topic__: aegis-log-login and ip: 1.2.XX.XX
| select date_format(__time__, '%Y-%m-%d %H:%i:%s') as time, warn_ip, warn_type ,
round((to_unixtime(now()) - __time__)/86400,1) as "days_passed"
order by __time__ desc
limit 10round((to_unixtime(now()) - __time__)/86400, 1) は次のように機能します。
to_unixtime(now())は現在時刻を UNIX タイムスタンプに変換します。__time__を減算して経過秒数を取得します。86400 (1日の秒数) で除算します。
round(..., 1)は結果を小数点以下1桁に四捨五入します。
デバイスごとの毎日のログインイベント数のカウント
ログインイベントを日ごとにグループ化し、毎日発生した数をカウントします。
__topic__: aegis-log-login and ip: 1.2.XX.XX
| select date_trunc('day', __time__) as dt,
count(1) as PV
group by dt
order by dtdate_trunc('day', __time__) は、各タイムスタンプをその日の開始に調整します。異なる時間単位でグループ化するには、'day' を 'second'、'minute'、'hour'、'week'、'month'、または 'year' に置き換えます。
5分ごとのログインイベント数のカウント
すべてのデバイスでイベントを5分間隔のバケットにグループ化します。
__topic__: aegis-log-login
| select from_unixtime(__time__ - __time__% 300) as dt,
count(1) as PV
group by dt
order by dt
limit 1000__time__ - __time__ % 300 は、各タイムスタンプを最も近い5分間隔の境界 (300秒) に切り捨てます。limit 1000 は最初の1,000個のバケットを取得し、約83時間分のデータをカバーします。
date_parse や date_format などのその他の時間関数については、「日付と時刻の関数」をご参照ください。
IP アドレスベースのクエリ
ログインログエントリの warn_ip フィールドには、ソース IP アドレスが保存されます。IP 地理位置情報関数を使用して、ログインの発生元を分析します。
特定のサーバーへのログインのソース国の特定
__topic__: aegis-log-login and uuid: 12344567
| SELECT ip_to_country(warn_ip) as country,
count(1) as "Number of logons"
group by countryip_to_country(warn_ip) は、ソース IP アドレスに対応する国を返します。
ログインを省または州別に分類
__topic__: aegis-log-login and uuid: 12344567
| SELECT ip_to_province(warn_ip) as province,
count(1) as "Number of logons"
group by provinceip_to_province(warn_ip) は、中国の IP アドレスの省を返します。中国以外の IP の場合、同等の省または州を返そうとしますが、結果を中国の地図にプロットすることはできません。
ログインの地理的分布のマッピング
__topic__: aegis-log-login and uuid: 12344567
| SELECT ip_to_geo(warn_ip) as geo,
count(1) as "Number of logons"
group by geo
limit 10000ip_to_geo(warn_ip) は、ソース IP アドレスの緯度と経度を返します。limit 10000 は、地理的プロット用に最大10,000エントリを取得します。
ip_to_provider (ISP ルックアップ) や ip_to_domain (パブリック IP とプライベート IP の検出) などの追加の IP 関数については、「IP 関数」をご参照ください。