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

クエリの例
- 基本的なクエリ:
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): フィルタリングの対象となるプロパティ(例:
type、owner、service.port)。 - 演算子 (Operator): 条件を指定します(例:
=、!=、<、>)。 - 値 (Value): 一致させる値(例:
android、443)。
サポートされている演算子
=: 等しい。!=: 等しくない。<: より小さい(日付および数値フィールド用)。>: より大きい(日付および数値フィールド用)。~=: 正規表現(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)である必要がある条件を結合します
括弧によるグループ化
括弧 () は、論理的なグループ化を作成し、複雑なクエリにおける操作の順序を制御するために使用されます。
クエリ構成の例
-
複数条件のフィルタリング
John Doeが所有するAndroidアセットを検索します。type="android" AND owner="john.doe" -
複雑な条件のグループ化
John Doeが所有しているか、または本番環境(production)の所有者パターンに一致するモバイルアセット(AndroidまたはiOS)を検索します。(type="android" OR type="ios") AND (owner="john.doe" OR owner~="prod-.*") -
ネストされた条件のフィルタリング
HTTPまたはHTTPSのポートを持つドメインアセットを検索します。type="domain" AND (service.port="443" OR service.port=80)
高度なフィルタリング戦略
-
除外クエリ
テストチームや開発チームが所有していないドメインアセットを検索します。type="domain" AND owner!="test" AND owner!="dev" -
正規表現ベースの複雑なマッチング
複数の正規表現パターンに一致するサブドメインを検索します。(asset~=".*internal\.com" OR asset~=".*external\.org") AND type="subdomain" -
日付ベースのフィルタリング
2023年1月1日以降にLet's Encryptによって発行された証明書を検索します。certificate.date>"2023-01-01" AND certificate.issuer="Let\'s Encrypt"