コンテンツにスキップ

インベントリの高度な検索

概要

高度な検索言語は、アセットを正確かつ効率的にクエリおよびフィルタリングするための、Pythonライクな柔軟な構文をユーザーに提供します。 この言語は フィールド 演算子 値(field operator value)の構造を使用して検索式を構築し、高度なアセット検出機能を実現します。 advanced_search_syntax_example.png

クエリの例

  • 基本的なクエリ: type="android"
  • 正規表現(Regex)マッチング: asset~=".*@mywebdomain\.com"
  • AND/OR クエリ: type="android" OR type="ios"
  • 複合クエリ: (type="android" OR type="ios") AND (owner="jhon.doe" OR owner~="prod-.*")

構文

フィールド-演算子-値の構造

各クエリは、以下の要素を使用して構築されます。

  • フィールド (Field): フィルタリングの対象となるプロパティ(例: typeownerservice.port)。
  • 演算子 (Operator): 条件を指定します(例: =!=<>)。
  • 値 (Value): 一致させる値(例: android443)。

サポートされている演算子

  • = : 等しい。
  • != : 等しくない。
  • < : より小さい(日付および数値フィールド用)。
  • > : より大きい(日付および数値フィールド用)。
  • ~= : 正規表現(Regex)検索。

サポートされているフィールド

サポートされているフィールド、その説明、および利用可能な値のリストを以下に示します。

フィールド 説明 サポートされている演算子 可能な値
ownership 内部アセット、買収アセット、サードパーティサービスのアセットを区別します =, != internal, third_party_service,acquisition,rejected ownership="internal"
type アセットのタイプでフィルタリングします =, != android, ios, subdomain, domain, ip, org, asn, tld, email, address, person, certificate, coordinates type="android"
owner アセットの所有者名でフィルタリングします =, !=, ~= 任意の文字列または正規表現 owner="john.doe" or owner~="prod-.*"
asset IPアドレス、モバイルアプリのパッケージ名、ドメイン名の値など、アセットのコンテンツで検索します。 =, !=, ~= 任意の文字列または正規表現 asset="example.com" or asset~=".*@domain\.com"
service.port サービスのポートでフィルタリングします =, !=, <, > 任意のポート番号 service.port=443 or service.port>80
service.protocol サービスのプロトコルでフィルタリングします =, !=, ~= 任意の文字列または正規表現 service.protocol="https"
whois.address WHOISのアドレスでフィルタリングします =, !=, ~= 任意の文字列または正規表現 whois.address="123 Main St"
whois.email WHOISのメールアドレスでフィルタリングします =, !=, ~= 任意の文字列または正規表現 whois.email="admin@example.com"
whois.org WHOISの組織名でフィルタリングします =, !=, ~= 任意の文字列または正規表現 whois.org="Example Corp"
dns.record DNSレコードタイプでフィルタリングします =, != 任意の文字列または正規表現 dns.record="MX"
dns.value DNS値でフィルタリングします =, !=, ~= 任意の文字列または正規表現 dns.value="mail.example.com"
dns.date 特定の日に変更されたDNSレコードを持つアセットをフィルタリングします <, >, = 有効な日付文字列は、YYYY-MM-DD形式である必要があります。 dns.date="2023-02-04" or dns.date>2023-01-01
fingerprint.name フィンガープリント名でフィルタリングします =, !=, ~= 任意の文字列または正規表現 fingerprint.name="Apache"
fingerprint.detail フィンガープリントの詳細でフィルタリングします =, !=, ~= 任意の文字列または正規表現 fingerprint.detail="2.4.41"
fingerprint.version フィンガープリントのバージョンでフィルタリングします =, !=, ~= 任意の文字列または正規表現 fingerprint.version="1.0.0"
fingerprint.date 特定の日に変更されたフィンガープリントを持つアセットをフィルタリングします <, >, = 有効な日付文字列は、YYYY-MM-DD形式である必要があります。 fingerprint.date="2023-02-04"
certificate.serial 証明書のシリアル番号でフィルタリングします =, !=, ~= 任意の文字列または正規表現 certificate.serial="123456"
certificate.issuer 証明書の発行者でフィルタリングします =, !=, ~= 任意の文字列または正規表現 certificate.issuer="Let's Encrypt"
certificate.subject 証明書のサブジェクトでフィルタリングします =, !=, ~= 任意の文字列または正規表現 certificate.subject="example.com"
certificate.date 証明書の日付でフィルタリングします <, >, = 有効な日付文字列は、YYYY-MM-DD形式である必要があります。 certificate.date="2023-02-04"
tag タグ名でフィルタリングします =, != 任意の文字列または正規表現 tag="production"
value タグの値でフィルタリングします =, != 任意の文字列または正規表現 value="critical"

複合クエリ

論理演算子

複合クエリでは、2つの主要な論理演算子を利用します。

  • AND: 両方の条件が真(True)である必要がある条件を結合します
  • OR: 少なくとも1つの条件が真(True)である必要がある条件を結合します

括弧によるグループ化

括弧 () は、論理的なグループ化を作成し、複雑なクエリにおける操作の順序を制御するために使用されます。

クエリ構成の例

  1. 複数条件のフィルタリング

    type="android" AND owner="john.doe"
    
    John Doeが所有するAndroidアセットを検索します。
  2. 複雑な条件のグループ化

    (type="android" OR type="ios") AND (owner="john.doe" OR owner~="prod-.*")
    
    John Doeが所有しているか、または本番環境(production)の所有者パターンに一致するモバイルアセット(AndroidまたはiOS)を検索します。
  3. ネストされた条件のフィルタリング

    type="domain" AND (service.port="443" OR service.port=80)
    
    HTTPまたはHTTPSのポートを持つドメインアセットを検索します。

高度なフィルタリング戦略

  1. 除外クエリ

    type="domain" AND owner!="test" AND owner!="dev"
    
    テストチームや開発チームが所有していないドメインアセットを検索します。
  2. 正規表現ベースの複雑なマッチング

    (asset~=".*internal\.com" OR asset~=".*external\.org") AND type="subdomain"
    
    複数の正規表現パターンに一致するサブドメインを検索します。
  3. 日付ベースのフィルタリング

    certificate.date>"2023-01-01" AND certificate.issuer="Let\'s Encrypt"
    
    2023年1月1日以降にLet's Encryptによって発行された証明書を検索します。