ガバナンス仕様言語(GSL)
CloudGuardガバナンス指定言語(GSL)は、ポスチャマネジメントルールを定義するための構文であり、CloudGuardポスチャマネジメントのルールセットに含めることができます。GSL は、さまざまなクラウドプロバイダ(AWS、Azure、GCP、Alibaba Cloud、Kubernetes など) のドメイン固有の機能を追加する一連の関数によって拡張されるコア言語で構成されます。これらの関数には、IP アドレスとネットワーク、インスタンスなどのクラウドエンティティ、文字列一致、日付& 時刻などが含まれます。
使用事例
GSL は、クラウド環境で実行して評価できるコンプライアンスルールとインテリジェンスクエリを作成するために使用されます。CloudGuard には、GSL Builder またはGSL Editor と呼ばれるグラフィカルインタフェースがあり、関連するコンテキスト内でのルールの構築に役立ちます。詳細については、GSLビルダーを参照してください。
規則構文
GSL ルールの形式は次のとおりです。
|
Target は、ルールがチェックするクラウドエンティティタイプです(例: instance やSecurityGroup)。各ルールは、1 つのターゲットのみをチェックできます。
where キーワードを使用して追加するエンティティのより小さなセットに一致するようにターゲットを修飾できます。
ターゲットの正式な定義は次のとおりです。
|
各変数の意味は以下のとおりです。
entity_type - CloudGuard が確認するピボットクラウドエンティティタイプ(インスタンス、SecurityGroup、ELB など)。
expression - ターゲットエンティティタイプで一致する任意の複雑なGSL 式を指定できます。
例:
|
|
Condition は、ルールの実際の本質です。これには、CloudGuard が検査する対象のアトリビュートが含まれます。この条件は、ターゲットに関連する複数の属性をテストする複雑なGSL 式にすることができます。
コンテキストトラベル
配カラムを参照するコマンド(with, contain, contain-any, contain-all, contain-none, groupBy
など) を使用すると、配カラム内部オブジェクトで検索するアクションを実行できます。
配カラムコマンドを使用するたびに、新しいコンテキストを作成し、配カラムの詳細を削除します。ある意味では、配カラム自体も配カラムになり得る配カラムの子オブジェクトの深部を移動します。これはchild context travel と呼ばれます。
コマンドを使用して、親コンテキストを参照し、親配カラムに戻ることができます。
これを行うには、いくつかのタイプのコマンドを使用できます。各コマンドには、テキスト表現とシンボル表現があります。
コマンド記号 | コマンドテキスト | 説明 |
---|---|---|
$ | this() | 現在の配カラムコンテキストレベルを参照します。 GSL クエリ内で到達した現在の配カラム |
~ | root() | 配カラムコンテキストの最上位レベルを参照します。 GSL クエリのルートレベルは、アセット自体です。 |
^ | parent(n) | 現在の配カラムコンテキストの上のn レベルを参照します。 |
複数のコンテキストレベルを移動するには、複数のシンボル(^^ または^^^) を入力するか、 parent(2) やparent(3) など) と同等のテキストを使用します。
式
% ワイルドカードは、ゼロ個以上の文字を示します。
たとえば、like '%er' は文字列'smarter'、'lover'、'her' などと一致します。
% ワイルドカードは、式に何度でも表示できます。たとえば、'%DB%' のように、'MongoDB'、'DB123'、'prodDB_111' に一致します。
ワイルドカードは、Like およびUnlike とともに使用されます。
これらの式は次の形式です。
|
各変数の意味は以下のとおりです。
property_name - テスト対象のエンティティの関連するプロパティ
comparison_operator - 演算子の1 つ: = , < , >, !=, <=, >= like
expected_value -テストする式です(文字列、数値、別のプロパティ、または関数の結果を指定できます)。
例:
|
|
|
Like 比較演算子
GSL like 演算子は、SQL の'like' 構文に非常に似ています。テキストをワイルドカード(%) と一致させることができます。文字列値と同様に動作します。
同様の比較は大文字と小文字を区別せず、'a' like 'A' が真であることを意味します。
例:
|
Unlike 比較演算子
unlike 演算子は、like の反対です。
キーワードhave は必須ではありません。ルールを読みやすくします。GSL パーサーは、ルールを処理するときに、実際にそれを削除します。
つまり、2 番目の例は次のように記述できます。
|
これは、人間/監査人も読みやすいルールを記述する方法として提供されています。
組み込み関数'in' は、指定されたオブジェクトのプロパティ値がユーザ定義値のリストにあることを検証します。
構文:
|
例:
|
|
|
このルールは、タイプリストのプロパティに特定の項目が含まれていることを確認します。構文を使用すると、複雑な式を構築して項目を検索/一致させることができます。
構文:
|
各変数の意味は以下のとおりです。
property_name -は、テスト対象のエンティティのプロパティです。
containment-operator 以下のいずれかになります。
contain またはcontain-any は構文的に同一で、論理値True またはFalse の結果を返します。
これらのオプションは、「適切な」英語文法を達成できるように提供されています。コレクションエレメントのいずれかが照会式を満たす場合、包含ステートメント全体が満たされたものと見なされます。
contain-all 式を満たすためにコレクション内のすべての要素が必要であり、論理値のTrue またはFalse の結果を返します。
contain-none 式を満たすためにコレクション内のいずれのエレメントも必要とせず、論理値のTrue またはFalse の結果を返します。
with contain と似ていますが、式に一致する要素のリストを返します(リスト内の項目数をカウントできます)。
Expression 角括弧ブロック(
[ ]
) 内には、任意の複雑なGSL 式を指定できます。各コレクションitem をテストするクエリを定義します。リストが空の場合、式はFalseを返します。
例:
SecurityGroups のinboundRules コレクションの各ルールを反復します。各ルールは、port およびscope のプロパティと照合されます。
SecurityGroup should have inboundRules with [port=22 and scope='0.0.0.0/0']
この例はnested expression - nics コレクション内の各nic を反復処理する外側の'with' で、内側の'contain-any' は各セキュリティグループを反復処理します。
Instance should not have nics with [securityGroups contain-any [name='default']]
これらの式は、プロパティが存在し、空ではないことを確認します。
CloudGuardは、空のコレクション、空のオブジェクト、NULL、0、または空ストリングを含む、プロパティタイプが空かどうかを識別できます。
構文:
|
例:
以下は同等です。
Instance should have vpc
Instance should vpc
Instance should have not vpc isEmpty()
以下は同等です。
SecurityGroup where outboundRules...
SecurityGroup where outboundRules.length >0
これらは、エンティティ名または要素のテキストと一致する 正規表現 です。
構文:
|
例:
|
演算子and、or、not、(<expr>) を使用して、複数の単純な式から複雑な式を構築できます。
AND
and キーワードの両側がtrue であることを確認します。
構文:
|
例:
インスタンスは、プロパティ(name) の存在とコレクション(tags) 内の要素の存在の両方を満たす必要があります。また、2 つの別々のルールとして記述することもできます。
Instance should have name and tags with [key='owner']
各要素として論理的に分割できないルールは、両方の条件を考慮して検証されます。
SecurityGroup should not have inboundRules with [port=22 and scope='0.0.0.0/0']
または
or キーワードの両側がtrue 式であることを確認します。
構文:
|
例:
|
NOT
次の式がfalse の場合は、満たされます(true を返します)。また、その逆も同様です。
構文:
|
例:
|
括弧
複数のAND およびOR 式を含む複雑な式では、あいまいさを取り除くために、括弧"("""]" を使用してください。
構文:
|
例:
|
注:
括弧がない場合、このルールはambiguous になります。
|
なぜなら、私たちが意味するかどうかは明確ではないからです。
SecurityGroup は(inboundRules またはoutboundRules) しないでください。
SecurityGroup は(inboundRules ではなく) または(outboundRules) 必要です。
パーサはオプションの1 つを使用しますが、ドキュメント化されていないデフォルト実装に依存せず、代わりに'( )' を使用して式を明確にすることをお勧めします。
この式は、項目のリストをカラム挙します(GSL ルールの以下の節によって定義されます)。この式は、items およびwith キーワードとともに使用できます。その後、追加の式を追加できます。操作の対象は、項目のリスト全体です。リスト内の1 つ以上の項目がルール条件に失敗した場合、ルール評価の結果は失敗します(ただし、評価では、これは1 つの失敗と見なされます)。
リスト式をgroupBy キーワードとともに使用して、カラム挙リスト内の項目数を評価することもできます。グループ化は、(リストタイプデータエンティティ内の) 項目を特定の属性によって集約し、それを論理式で使用できます。
構文:
|
例:
これはインスタンスのリストをカラム挙し、その数が制限未満であることを確認します。
List<Instance> should have items length() < 50
with キーワードは、リストがカラム挙される前に特定の名前のリストをフィルタリングするために使用され、その結果が条件付きでチェックされます。
List<Instance> should have items with [name like 'db'] length() < LIMIT
これにより、各 VPC のセキュリティグループがカラム挙され、それぞれに 100 未満 (AWS の制限) があることが確認されます。
List<SecurityGroup> should have items groupBy [vpc.id] contain-all [values length() < 100]
データタイプ
GSLには、文字列(テキスト値)と数値の構文が異なります。
文字列は一重引用符で囲まれます。例えば、'my string value' などです。
数字は引用符なしで書かれます。
例:
|
リストエンティティには長さプロパティ(entity.length) があります。たとえば、上の例ではinboundRules です。または、length() 関数を使用します。
例:
|
|
関数
コアGSL 構文は、次のような複数の領域でドメイン固有の機能を提供する内部関数によって拡張されています。IP アドレス、日付、文字列の一致。
構文:
|
各変数の意味は以下のとおりです。
property_name は、操作したいプロパティ/オブジェクトです(オブジェクト指向言語の関数に似ています)。
function_name は、上記のリストパラムからの関数の名前であり、関数のタイプに応じて必要なパラメータを区切ります。
一般的な機能
プロパティタイプに応じて、オブジェクト/プロパティが空かどうかを確認します。空のコレクションと空のオブジェクト(およびNULL 値、0 の空の文字列) に対してfalse を返します。
パラメータ:
なし
例:
以下は同等です。
|
|
リストの長さを返します。この関数には、>, <, =, >=, <=, != というコンパレータを使用します。
パラメータ:
なし
例:
|
true を返すと、属性値が指定された値のリストに含まれます。
パラメータ:
一致する値のリスト。
例:
|
提供されたセパレータに基づいて文字列を分割し、配カラムに変換します。
パラメータ:
ポジション | 説明 | 数値 |
---|---|---|
1 | セパレータ | 文字列を分割するときに使用する区切り文字 |
例:
インスタンス名の形式がx-y-z であることを確認します(x、y、z にさらにテストを適用できます)。
|
複数の文字列を1 つの文字列に連結します。この関数は、エンティティ属性を動的に連結する場合に役立ちます。
パラメータ:
ポジション | 説明 | 数値 |
---|---|---|
1 | セパレータ | 文字列を連結するときに使用する区切り文字 |
... | 文字列 | 連結する文字列 |
例:
インスタンス名が"PROD-<Instance ID>
" の形式であることを確認します(例: PROD-i-a0b01c01
)。
|
属性値に環境ID が含まれているか、それと等しい場合はtrue を返します。
パラメータ:
なし
例:
|
ネットワーク機能- 一般
パブリックにルーティング可能な(つまり、non-RFC 1918 [1]) IPv4 アドレスの存在をチェックします。
この関数はコンテキストに依存します。
isPublicCIDR がcloud "workload" resource (つまり、一般的にNIC に関連付けられているEC2 などの仮想デバイスエンティティ) を直接参照する場合、isPublicCIDR=true は、ワークロードリソースに1 つ以上のパブリックにルーティング可能なIPv4 アドレスに現在関連付けられている1 つ以上のNIC があることを示します。この文脈では、関数は括弧なしで参照する必要があります(isPublicCIDR, )。 isPublicCIDR() ).
例:
このコンプライアンスルールは、1 つ以上のパブリックにルーティング可能な IPv4 アドレスに現在関連付けられている 1 つ以上の NIC を持つ EC2 インスタンスにのみ適用されます。
|
isPublicCIDR がクラウド" workload" resource - たとえば、リストに似たアクセスルールのセット(SG、NSG、NACL など)、または特定のアクセスルール(SG ルール、NACL ルール、ルートテーブルルートなど) を直接参照する場合、isPublicCIDR()=true は、ルールのscope またはsource (つまり、外部エンドポイント) がパブリックにルーティング可能な(非RFC1918) IPv4 アドレスまたはCIDR プレフィックスであることを示します。この文脈では、関数は括弧(isPublicCIDR(), ) で参照する必要があります。 isPublicCIDR).
パブリッククラウドリソースが、パブリックIPアドレスを持つパブリッククラウドリソースに間接的に関連付けられている場合、または使用中である場合でも、パブリッククラウド識別子(AWSのセキュリティグループIDなど)は必ずisPrivateCIDRとして解釈されます。例えば、ルール
|
"Compliance"SG-IDソースを持つセキュリティグループアクセスルールの検索は、そのソースSG-IDがパブリックIPアドレスを持つクラウドリソースで使用されているかどうかに関係なく、常に返されます。
例:
このコンプライアンスルールは、パブリックにルーティング可能な IPv4 アドレスまたは CIDR プレフィックスからの任意のプロトコル / ポートの組み合わせへの入力を許可する少なくとも 1 つの Inbound アクセスルールを含む、少なくとも 1 つのセキュリティグループに現在関連付けられている EC2 インスタンスにのみ適用されます。
|
注 - ワークロードリソース(EC2 など) に直接的に適用される場合、isPublicCIDR の値は、セキュリティグループまたはアクセスルールに関連する条件によってnot affected になります。アクセスルール関連の構造体(SG、NACL など)に直接適用される場合、isPublicCIDR() の値は、NIC とIP アドレスの関連付けによってnot affected になります。
パラメータ:
なし
提供されたCIDR 内の可能なIP アドレスの数をカウントします。ブロードキャストアドレスを削除する
パラメータ:
なし
例:
|
IP アドレスまたはCIDR ネットワーク上で動作し、提供されたネットワークのいずれかに完全に含まれているかどうかをテストします。
パラメータ:
テストするネットワークを表すCIDR のリスト
例:
このルールは、非ローカルまたは「フレンドリ」ネットワークからのSSH 接続がないことを確認します。'1.2.3.4/10','5.6.7.8/24'
|
IP アドレスまたはCIDR ネットワーク上で動作し、提供されたネットワークのいずれかと重複しているかどうかをテストします。
パラメータ:
テストするネットワークを表すCIDR のリスト
例:
この例では、'10.1.2.0/24','192.168.100.0/24' (内部) ネットワークはVPC とピア接続されたサードパーティに属しています。これらのネットワークがサーバにSSH することを許可していないことを確認しましょう。
|
フィールドがCIDR 形式かどうかをチェックします。
パラメータ:
なし
例:
|
属性がセキュリティグループを参照しているかどうかを確認します。
一部の属性には、複数のタイプのオブジェクト(つまり、セキュリティグループまたはCIDR)を含めることができます。この関数は、値がセキュリティグループかどうかを判断するために使用されます。
パラメータ:
なし
例:
この例では、セキュリティグループは、CIDRではなく、別のセキュリティグループからのトラフィックのみを許可するようにします。
|
AWS NACL および MS Azure NSG のネットワーク関数
AWS NACL とMS Azure NSG には、異なるファイアウォールセマンティクスがあります。
ファイアウォールルールは順序付けされており、明示的な'DROP' を含む場合があります。これにより、ルールの順序が重要になります。
これらの関数は、ルールのリストを操作します。
このファイアウォールによって保護されている関連ポートに接続できるIP アドレス(ホスト) の数を返します。
パラメータ
ポジション | 説明 | 数値 |
---|---|---|
1 | ポート番号(必須) | 22、80などの任意の有効なポート番号 |
例:
このルールは、過度に許可されたポート22 (256 を超えるアドレスに許可される) を持たないようにします。AzureVirtual Machines のルールです。
|
このファイアウォールによって保護されている関連ポートに接続できるパブリックIP アドレス(ホスト) の数を返します。
パラメータ:
ポジション | 説明 | 数値 |
---|---|---|
1 | ポート番号(必須) | 22、80などの任意の有効なポート番号 |
例:
このルールは、過度に許可されたポート22 (256 を超えるアドレスに許可される) を持たないようにします。AzureVirtual Machines のルールです。
|
指定されたIP アドレス/CIDR が指定されたポートへの接続を許可されている場合はtrue を返します。
このメソッドは、提供されたCIDR 内のアドレスのいずれか/一部が接続を許可されている場合にtrue を返します。
パラメータ:
ポジション | 説明 | 数値 |
---|---|---|
1 | ポート番号(必須) | 22、80などの任意の有効なポート番号 |
2 | テストするCIDR (少なくとも1 は必須) | 1.2.3.4/24のようなCIDR構文 |
... | 他のオプションのCIDR | 1.2.3.4/24のようなCIDR構文 |
例:
このルールは、'1.2.3.0/24','5.5.6.7/32'などの不正なサードパーティネットワークからのSSHアクセスを防止します。
|
指定されたポートが内部IP アドレスによってのみアクセス可能な場合にtrue を返します。
このメソッドは、提供されたCIDR 内のアドレスのいずれか/一部が接続を許可されている場合にtrue を返します。
パラメータ:
ポジション | 説明 | 数値 |
---|---|---|
1 | ポート番号(必須) | 22、80 などの任意の有効なポート番号。 |
... | プライベートとしてマークする追加のCIDR(オプション) | 1.2.3.4/24のようなCIDR構文 |
例:
このルールは、パブリック IP アドレスからの SSH アクセスを防止します。
|
リソース関数
これらの関数は、アセットのプロパティの値を返します。特に、アセットのセカンダリ値(EC2 インスタンスに割り当てられたSG のルールアドレスの値など) を返すことができます。
注 -これらの機能は、Terraformプランでのみサポートされ、後ですべてのプラットフォームに拡張する予定です。
フィールドと値に基づいて、リソースの最初のインスタンスを返します。
パラメータ:
ポジション
説明
値
1
resourceType
アセットプロパティ ('subnet' や 'aws_vpc' など)
2
resourceFieldValue
リソースプロパティの値
3
resourceFieldName
リソースプロパティの名前
例:
Instance should have getResource('Subnet', subnet_name, 'name') with [cidr = '172.31.32.0/20']
型とID を指定して、リソースの最初のインスタンスを返します。
これは上記のインスタンスと似ていますが、フィールドは指定されたアセットタイプのID であると見なされます。
パラメータ:
ポジション
説明
値
1
resourceType
アセットプロパティ ('subnet' や 'aws_vpc' など)
2
resourceId
返されるリソースID (例: subnet_id)
例:
Instance should have getResource('Subnet', subnet_id) with [cidr = '172.31.32.0/20']
aws_security_group should have getResource('aws_vpc', vpc_id) getValue('enable_dns_hostnames') = true
この関数は、フィールドと値に基づいて、リソースのインスタンスのリストを返します。これはgetResource (上記) と似ていますが、フィールドと値に一致するすべてのインスタンスのリストを返します。
パラメータ:
ポジション | 説明 | 値 |
---|---|---|
1 | resourceType | アセットプロパティ ('subnet' や 'aws_vpc' など) |
2 | resourceFieldValue | リソースプロパティの値(オプション値) |
3 | resourceFieldName | リソースプロパティの名前(オプション値) |
例:
|
パスを指定して、オブジェクトの値を返します。
パラメータ:
ポジション | 説明 | 値 |
---|---|---|
1 | パス | リソースへのパス('vpc.cidr' など) |
例:
|
指定されたパスパラメータと一致する値の配カラムを返します。
パラメータ:
ポジション | 説明 | 値 |
---|---|---|
1 | パス | リソースへのパス。例: 'vpc.cidr' |
例:
|
AWS NACL、AWSSecurity Group、MS Azure Network Security Group、およびGCPSecurity Group アセットをサポートします。
ポートリストの一部である少なくとも1 つのポートが、関連する設定範囲内に存在することを確認します。
パラメータ:
ポジション | 説明 | 値 |
---|---|---|
1 | ポート番号またはGenericList | GenericList または22、80 などの任意の有効なポート番号。 |
例:
|
|
時間関数
date プロパティ(UNIX 時間形式) が、目的の相対時間より前(意味が小さい) かどうかをテストします。
時間は、ルールの作成日ではなく、リアルタイム/評価時間に関連し、サポートされている時間単位のいずれかを使用して定義できます。
パラメータ:
名前 | 説明 | 数値 |
---|---|---|
カウント | 単位数、負の数は過去の日付に解決されます。 | 次のような任意の正または負の数。-5, 10, ... |
単位 | 測定単位 | 文字列- 'minutes'、'hours'、'days'、'months' |
例:
これにより、3 か月以上前にインスタンスが起動されなかったことが確認されます。
|
date プロパティ(UNIX 時間形式) が、目的の相対時間と等しいか、それより大きいかをテストします。
時間は、ルールを記述した日付ではなく、リアルタイム/評価時間を基準としており、サポートされている任意の時間単位を使用して定義できます。
注 - before() とは異なり、includes も希望する時刻です。
パラメータ:
名前 | 説明 | 数値 |
---|---|---|
カウント | 単位数、負の数は過去の日付に解決されます。 | 次のような正または負の数: -5,10, ... |
単位 | 測定単位 | 文字列- 'minutes'、'hours'、'days'、'months' |
例:
過去2週間以内に起動されたインスタンスについて何かを実行します。..
|
Best Practice - 固定(非相対)時間を使用するには、UNIX 日付/時間形式との標準数値比較を使用できます。 たとえば、2016年1 月1 日より前に作成された(UNIX 時刻1451606400 に変換される) すべてのインスタンスを処理するには、次のようにします。
|
2 つの日付間の時間差を、選択した時間単位で返します(outputUnit)。
パラメータ:
ポジション | 説明 | 数値 |
---|---|---|
secondDate | 比較するもう一方の日付 | 日付(文字列) |
outputUnit | 出力の希望時間単位 | 'seconds', 'minutes', 'hours', 'days', 'months', 'years' (文字列) |
日付形式:
Unix 時間(秒単位の時間)
YYYY-MM-DDTHH:mm:ss.SSSZ
YYYY-MM-DDTHH:mm:ss.SSSSSSSZ
YYYY-MM-DDTHH:mm
YYYY-MM-DD
MM-DD-YYYY
MM/DD/YYYY HH:mm:ss
月(文字列) DD, YYYY HH:mm:ss
ヒント:
ローカル時刻で日付を作成するには、'2019-06-11T00:00' のように時刻を明示的に含めます。
時刻を指定せずに日付を作成すると、UTCで設定された日付が取得されます。
例:
ユーザ(IamUser) の作成日(createDate) が入力日から90 日以内('2022-01-17T11:09:00.000Z') かどうかを確認します。
|
ユーザ(User) の作成時刻(createdDateTime) と入力日付の時間差が10 分に等しいかどうかを確認します。
|
RamUser のupdateDate が入力日から20 日以内であるかどうかを確認します。
|