Security Centerコンソールの [ログ分析] ページで、複数の複雑なシナリオでカスタムログクエリと分析を実行できます。 このトピックでは、クエリおよび分析ステートメントの構文について説明します。

概要

Security Centerコンソールで、[調査] > [ログ分析] を選択し、[検索と分析] にSQL文を入力して、カスタムログクエリと分析を実行します。 ログクエリステートメントは、検索構文と分析構文の2つの部分で構成され、縦棒 (|) で区切られています。

検索構文や分析構文を指定しなくても、カスタムログクエリと分析を実行できます。 次のリストに、検索構文と分析構文を示します。

  • 検索: キーワード、あいまい一致条件、数値、範囲、または組み合わせを使用して検索条件を生成できます。 Search部分の値がアスタリスク (*) または空の場合、指定された期間のデータはフィルタリングされません。 この場合、指定された期間のすべてのデータが分析に使用されます。
  • 分析: 検索結果または完全なデータに関する統計を計算および収集します。 Analytics部分の値が空の場合、クエリの結果は返されますが、統計は計算されません。

検索構文

Log Serviceの検索構文は、フルテキストクエリとフィールドクエリの両方をサポートしています。 クエリボックスは、複数行の検索や構文の強調表示などの機能をサポートしています。

  • フルテキストクエリ

    フィールドを指定しなくても、キーワードを入力してログを検索できます。 複数のキーワードを使用するには、各キーワードを引用符 (") のペアで囲み、スペースまたは演算子で区切ります。 例:

    • 複数のキーワードを指定したクエリ

      www.aliyundoc.com404を含むログを検索します。 例:

      www.aliyundoc.com 404

      または:

      www.aliyundoc.comと404
    • 条件付きクエリ

      www.aliyundoc.comエラーを含むログ、またはn www.aliyundoc.comと404を含むログを検索します。 例:

      www.aliyundoc.comと (エラーまたは404)
    • サフィックスベースのクエリ

      www.aliyundoc.comを含むログを検索し、failed_ で開始します。 例:

      www.aliyundoc.comと失敗_*
      フルテキストクエリは、アスタリスク (*) の付いたサフィックスのみをサポートします。 アスタリスク (*) の付いたプレフィックスはサポートされていません。
  • フィールドクエリ

    数値フィールドのデータは、Field:ValueまたはField ≧ Valueを使用してフィルタリングできます。 またはまたはを使用して、2つの形式を組み合わせることができます。 andおよびまたはで指定された組み合わせを使用して、フルテキストクエリで使用することもできます。

    Log Serviceは、フィールドに基づいたより正確なクエリをサポートします。

    • マルチフィールドクエリ

      重大度レベルが深刻なアラートログを検索します。 例:

      __topic__ : sas-security-log and level: serious

      IPアドレスが1.2.XX.XXのクライアントですべてのSSHログオンを検索します。 例:

      __topic __: aegis-log-loginとip:1.2.XX.XXとwarn_type:SSHLOGIN
      各ログには、ログトピックを示す __topic__ フィールドが含まれます。 ログはこのフィールドによって区別されます。 これらの例では、levelwarn_typeipなどのフィールドは、特定の種類のログのフィールドです。
    • 数値フィールドクエリ

      応答時間が1秒を超えるすべての内部DNSクエリログを検索します。 例:

      __topic __: local-dns and time_usecond > 1000000

      範囲ベースのクエリもサポートされています。 たとえば、範囲ベースのクエリを使用して、応答時間が1秒を超え10秒以下の内部DNSログを検索できます。 例:

      __topic __: local-[1000000,10000000] のdnsとtime_usecond

    構文の詳細については、「概要」をご参照ください。

Analyticsの構文

SQL-92文を使用して、ログの統計を分析および収集できます。 Log Service でサポートされている構文と機能の詳細は、「分析文法」を参照してください。

標準SQL構文のFROM tablename句は、analyticsステートメントから省略できます。 これは、FROM LOG句を省略できることを意味します。

デフォルトでは、Log Serviceは最初の100ログエントリを返します。 LIMIT構文を使用して、返すログエントリの数を変更できます。 詳細については、「LIMIT 構文」をご参照ください。

時間ベースのログ照会と分析

各ログエントリには、このログが生成された時刻を示す組み込みフィールド __time__ があります。 このフィールドは、時間ベースの統計分析を容易にする。 このフィールドの値は、1970年1月1日00:00:00 UTCのエポック時刻から経過した秒数を表すUNIXタイムスタンプです。 したがって、タイムスタンプを表示する前に、サポートされている形式に変換する必要があります。

  • 時間を選択して表示

    この例では、特定の時間範囲内で、IPアドレスが1.2.XX.XXの最後の10のログオンログを照会します。 戻り値には、時刻、送信元IPアドレス、およびログオンタイプが含まれます。 例:

    __topic __: aegis-log-loginとip: 1.2.XX.XX
    | select date_format(__time __, '% Y-% m-% d % H:% i:% s') as time, warn_ip, warn_type
    __time__ descによる注文
    制限10
  • 時間の計算
    __time__ を使用して、ログイン後の日数を計算します。 例:
    __topic __: aegis-log-loginとip: 1.2.XX.XX
    | select date_format(__time __, '% Y-% m-% d % H:% i:% s') as time, warn_ip, warn_type,
    ラウンド (((to_unixtime(now())) - __time__)/86400,1) を "days_passed" として
    __time__ descによる注文
    制限10

    この例では、round((to_unixtime(now()) - __time__)/86400, 1) を使用して計算を実行します。 まず、関数はto_unixtimeを使用して、now() によって返された時刻をUNIXタイムスタンプに変換します。 次に、計算値から組み込みの __time__ フィールドを減算して、経過した秒数を取得します。 次に、計算された値を1日の合計秒数である86400で除算します。 最後に、round(data, 1) 関数は、得られた値を小数点以下1桁に丸めて、各攻撃ログが生成されてから経過した日数を計算します。

  • 特定の時間に基づくグループ統計
    特定の時間範囲内のデバイスのログオン傾向を知りたい場合は、次のSQL文を実行します。
    __topic __: aegis-log-loginとip: 1.2.XX.XX
    | date_trunc('day', __time__) をdtとして選択し、PVとしてカウント (1)
    dtによるグループ
    dtによる注文

    組み込みの __time__ フィールドは、date_trunc('day', ..) 関数に渡され、時刻を日ごとに揃えます。 各ログエントリは、総数 (count(1)) の計算を容易にするために、それが属する日のパーティションにグループ化される。 ログエントリは、パーティションタイムブロックによってソートされます。 date_trunc関数の最初のパラメーターに他の値を使用して、secondminutehourweekmonthyearなどの他の時間単位に基づいてログエントリをグループ化できます。 関数の詳細については、「日付と時間の関数」をご参照ください。

  • グループ統計に基づく柔軟な時間
    アカウントのデバイスの5分あたりのログオン傾向など、時間グループ化のより柔軟なルールを知りたい場合は、次のSQLステートメントを実行します。
    __topic __: aegis-log-login
    | dtとしてfrom_unixtime(__time__ - __time __% 300) を選択し、PVとしてカウント (1)
    dtによるグループ
    dtによる注文
    制限1000                        

    この例では、組み込みの時間フィールドを使用して __time__ - __time __% 300を計算し、フォーマットにfrom_unixtime関数を使用します。 各ログエントリは5分 (300秒) のパーティションにグループ化され、総数 (count(1)) の計算を容易にします。 ログエントリは、最初の1,000ログエントリを取得するためにパーティション時間ブロックごとにソートされます。これは、最初の83時間のデータを選択することに相当します。

    時間に関連する関数の詳細は、「日付と時間の関数」をご参照ください。 たとえば、date_parse および date_format 関数は、時間の形式を別の形式に変換することができます。

クライアント IP アドレスベースのログクエリと分析

ログオンログエントリのwarn_ipフィールドは、ログオンの送信元ipアドレスを示します。

  • ログオンのソース国分布

    ユーザーがサーバーにログオンする元の国の分布を照会します。 例:

    __topic __: aegis-log-loginおよびuuid: 12344567
    | SELECT ip_to_country(warn_ip) を国として、「ログオン数」としてカウント (1)
    国別グループ

    この例では、ip_to_country関数を使用して、ログオンの送信元ipアドレスを指定するwarn_ipに対応する国を取得します。

  • ログオンのアイデンティティ分布
    ip_to_province関数を使用して、州に基づくログオンの詳細な分布を取得します。 例:
    __topic __: aegis-log-loginおよびuuid: 12344567
    | SELECT ip_to_province(warn_ip) as province,
             「ログオン数」としてカウント (1)
             group by province

    この例では、ip_to_province関数を使用して、IPアドレスが属するソース州を取得します。 IPアドレスが中国からのものでない場合、システムはIPアドレスの国の位置に基づいて、それを州または州に変換しようとします。 ただし、中国マップを選択した場合、州または州は表示されません。

  • ログオンの地熱分布

    ログオンの地熱分布を取得するには、ip_to_geo関数を使用します。

    __topic __: aegis-log-loginおよびuuid: 12344567
    | SELECT ip_to_geo(warn_ip) としてgeo、
             「ログオン数」としてカウント (1)
             group by geo
             limit 10000

    この例では、ip_to_geo関数を使用して、IPアドレスの緯度と経度を取得します。 最初の10,000ログエントリを取得するには、LIMITを10000に設定します。

    IPアドレスベースの機能の詳細については、「IP 機能」をご参照ください。 たとえば、ip_to_provider関数を使用してIPアドレスのプロバイダを取得し、ip_to_domain関数を使用してIPアドレスがパブリックかプライベートかを判断できます。