Policies > Security Posture > Profiles & Rulesの下にカスタムルールを構築します AWS、Azure、および Google Cloud リソースのセキュリティ評価のためのドメイン固有言語 (DSL)。
以下の構文図は、DSLステートメントを記述するための一般的な規則を示しています。

ルール形式: <entity> [where <condition>] should [not] have <condition>
例えば、
S3Bucket should not have any ACL in (10.0.0.0)
IAMUser where Name eq “root” should have Password.Enabled eq true and MFAActive eq true
Entity
エンティティは、ルールが何に対してチェックを行うかを定義します。それは 単独でも、条件を付けてエンティティをさらに特定することもできます。

エンティティを使う例をいくつか示します。
| <entity>は を持つべきである<condition> | S3Bucket LoggingEnabled が有効になっている必要があります AADuser Type eq “Guest” を持つべきではない |
| <entity><condition> 「where」条件は、結果を絞り込むためにエンティティをさらに詳細に定義します。 | IAMUser ここで、Name が「root」で、MFAActive が true の場合。 AWS CloudTrails で [ MultiRegionTrailEnabled eq true ] が有効な場合 |
サポートされているエンティティと属性の完全なリストについては、以下を参照してください。
Condition
条件とは、ルールが定める基準です。 結果を絞り込むために、エンティティと照合します。

次の表に、条件を使用する例を示します。 この表に記載されている形式は、すべての物件に適用されます。
| <property> | AWSは CloudTrails |
| <property>[関数()]<operator><value> | IAMUser は Name eq “root” IAMUser は Policies.Managed len() eq 0 |
| <property>を含む/含む<condition> | AWSは IAMUsers with [ Name eq “root” ] |
| <property>in/notin (,,)<value1><value2><value3> | IAMUser は Name in ( “root”, “name2” ) |
| リストとシーケンスのプロパティに量指定子を使う | IAMUser は atleast one Password eq “1234” |
| 複雑な条件の場合は and、or、not ( ) を使います | IAMUser は (Name eq “root”) and (MFAActive eq true) |
Function
ルール内で、エンティティに関する特定の情報を検索するための機能。 関数は次の構文を使用します。
<entity> <function>(<argument>)
例えば、
S3Bucket should have Tags len ( ) gt 0
Protocol in ("-1", "tcp")
以下の表は、ルールで使用できる機能の完全なリストを示しています。 ルール内。
| Function | 物件の種類 | Arguments | プロパティの型を返します | デスクリプション |
|---|---|---|---|---|
| len | list, string | none | number | 文字列またはリストの長さを返します。 |
| numhosts | ip | none | number | サブネット内のホスト数。 |
| isPrivate | ip | none | boolean | IPアドレスがプライベートかどうか(IPy)。 |
| isPublic | ip | none | boolean | IPアドレスがパブリックかどうか(IPy)。 |
| divisibleby | number | number | boolean | 左辺の数が引数で割り切れるかどうか。 |
| 中、何も | 文字列、ブール値、IPアドレス、数値 | list | boolean | 左辺の値がリストに含まれているかどうか(長いORのショートカット)。 |
| has | list | list | boolean | LHSリストに、引数として渡されたリストのいずれかが含まれているかどうか。 |
| isLaterThan | 番号(日付) | 数、単位 | boolean | 左辺の数値(日付)が現在時刻から数値単位(引数)以上経過しているかどうか。例えば、isLaterThan ( -1, “days”) は、LHS が (スキャン時点から) 1 日前より後であることを意味します。単位は、秒、分、時間、日、週のいずれかでなければなりません。 「days」が最も一般的です。 |
| isEarlierThan | 番号(日付) | 数、単位 | boolean | 左辺の数値(日付)が現在時刻±数値単位(引数)より前かどうか。例えば、Password.LastUsedTime isEarlierThan ( -90, “days”))。単位は、秒、分、時間、日、週のいずれかでなければなりません。 「days」が最も一般的です。 |
Property
プロパティは ルールがチェックする条件を定義し、ルールがチェックする対象を絞り込むために使用されます。 プロパティは「.」を使うことができます。例: MFADevices.Virtualルールはすべての仮想デバイスをチェックします。
構文形式は以下のとおりです。
<entity> should [not] have <property>...
<entity> where <property>...
以下の表は、プロパティの種類と、それらがサポートする関数の一覧を示しています。
| 物件の種類 | 演算子と関数 | 例 |
|---|---|---|
| list | in、notin、contain、with、len() | 名前が「root」に等しいIAMユーザー |
| sequence | 中、何も | MFADevices in ( “ID1”, “ID2” ) |
| string | eq、neq、like、not like、len() | Name eq “root” |
| number | eq (=), neq (!=), gt (>), gte (>=), lt (<), lte (<=) | トピックの購読者数 len() > 0 |
| boolean | eq, neq | Password.Enabled eq true |
| ip | eq, neq | [ ip eq 0.0.0.0/0 ] の IPRanges |
コンプライアンス規則
Netskopeは、IaaSおよびSaaS環境のセキュリティ体制がコンプライアンスに準拠しているかどうかを確認するための、事前定義されたルールの一覧を提供します。定義済みのルール一覧については、以下を参照してください。
DSL ルールを書くためによくある要素を使う
以下の要素は一般的に DSLルールに含まれています。
with– 任意のリスト内の要素にアクセスする。- “.“
where評価対象資産を制限する。- 演算子 – 例: eq、gte、gt、lt、lte、neq。
- 関数 – Such as、like、has、in、len、isEarlierThan、isLaterThan、len。
- 数値範囲構文 – 例えば、ポート137とポート138をチェックするには、構文に以下を含めます。
FromPort lte 138 and ToPort gte 13
注記
ポート範囲に137、138、またはその両方が含まれるセキュリティグループまたはファイアウォールルールセットに一致します。
カスタムDSLルール作成のベストプラクティス
カスタムDSLルールを作成する際には、以下のベストプラクティスが推奨されます。
- 既存の事前定義ルールを確認することから始めます。 定義済みのルールでIaaSリソースに必要なチェックを実行できる場合は、そのルールをカスタムプロファイルに追加してください。
- 既存のルールが要件を部分的に満たす場合は、その既存のルールをコピーして修正してください。
- クラウドサービスプロバイダー(CSP)側とNetskopeがサポートするエンティティにおけるプロパティの種類と期待値を確認してください。種類や階層構造は異なる場合があります。プロパティの種類と値を確認するには:
- CSP側 CLIを介してCSPテスト環境にアクセスします。
- Netskope側では Inventory API を使用します。 例えば、AWS 実行中の S3 バケット リソースの詳細を取得するには、
curl --request GET "https://&lt;tenant_url&gt;/api/v1/public_cloud/inventory?token=NS_API_TOKEN&amp;limit=10&amp;skip=0&amp;resource_name=&lt;name_of_asset&gt;&amp;resource_type=S3Bucket" | python -mjson.tool
- 新しいカスタムルールを以下のコマンドを実行してテストします:
curl --location --request POST "https://<tenant_url>/api/v1/public_cloud/rule_evaluate?token=NS_API_TOKEN" --header 'Content-Type: application/json' --data-raw '{ "cloud_provider": "aws", "rule_code": "S3Bucket should not have Access eq "Public"", "instance": "NS_UI_CONNECTION_INSTANCE", "resource_ids": [ ] }'インスタンス名が、AWSテナントスタックで設定されている名前と一致していることを確認してください。
- テスト結果に基づいてルールをデバッグする。Netskope 、ルールをテストすることを推奨します。 少なくとも2つのプロパティ値でテストを行い、一方はルールに一致し、もう一方は一致しないようにします。 たとえば、ルート、管理者、非管理者などのさまざまなユーザーをテストします。 ポリシーをテストするときは、インライン ポリシーとマネージド ポリシーの両方をテストします。
- ルール出力における偽陽性および偽陰性を考慮し、ルールを改善する。
- ルールに「where」句を含めてください。例えば、過去90日間ログインしていない非rootユーザーにフラグを立てるには、次のようなルールを作成します。
IAMUser where RootUser eq False and LastUsedTime isEarlierThan ( -90, "days" )
- CSPエンティティとその設定方法を必ず理解しておいてください。値が欠落していないことを確認するためには、プロパティに許容されるすべての値を把握しておくことが重要です。例えば、TCPプロトコルをチェックするには、tcpのみ(「tcp」)に加えて、-1として保存されるワイルドカード「すべてのプロトコル」があることを理解する必要があります。
属性フィールドでサポートされているすべての値を理解するには、NetskopeのドキュメントとCSPのドキュメントを参照してください。
- ルールに「where」句を含めてください。例えば、過去90日間ログインしていない非rootユーザーにフラグを立てるには、次のようなルールを作成します。

