業界標準(PCI DSS、HIPAA、SOC2など)やベストプラクティスへの準拠は、企業が業界コンプライアンス遵守にとって必須であるだけでなく、顧客の信頼を勝ち取るための強固なセキュリティを実現・証明するための手段でもあります。
CloudGuard コンプライアンスエンジンは、パブリッククラウドにおけるコンプライアンスとセキュリティのベストプラクティスの追跡、レポート、実施をワンクリックで簡素化します。パブリッククラウド環境における包括的なコンプライアンス管理を実現し、企業はコンプライアンスポスチャーの評価、リスクとギャップの特定、問題の修正、コンプライアンス要件の実施、監査におけるコンプライアンスの証明などを行うことができます。CloudGuard コンプライアンスエンジンは、CloudGuardの最先端のルールエンジン上に構築されています。ルールは、GSL(Governance Specification Language)と呼ばれる新しい革新的なポリシー言語を使って指定され、GSLで書かれたルールは、誰でも簡単に読み、理解することができます。
GSLの例:
- RDS should have isStorageEncrypted = true
- RDS のストレージが暗号化されているかどうかをチェック
- Instance should not have inboundRules with [port = 22 and protocol in ('TCP','All') and scope numberOfHosts() > 32]
- SSHポート(22)が開いているインスタンスが、広いネットワークスコープに公開されてはならないことを確認
GSLエンティティモデルデータのソースとタイプ
- “Collected” 対象エンティティのメタデータをパブリッククラウド API から直接取得
- “Enriched” 論理的に隣接する別のパブリッククラウドリソースから取得したメタデータ。ターゲットエンティティモデルに永続的に埋め込まれる
- “Enriched”(^n)パブリッククラウドリソースから供給されたメタデータ。“Enriched”データのソースに論理的に隣接しているメタデータ。最大11~12レベルの深さまで可能
- “Derived” “Collected”メタデータと“Enriched”メタデータに基づき、CGバックエンドで計算された合成値(syntheticバリュー)
- “Interpolated” (オプション) 外部評価プロセスによって生成された非構成データ。ターゲットエンティティモデルに永続的に埋め込まれる
GSL関数
- isEmpty()
- オブジェクト/プロパティがNullかどうかをチェック
- 例:SecurityGroup where name like 'default' should have inboundRules isEmpty() and outboundRules isEmpty()
- length()
- リストの長さを返す
- 例:SecurityGroup should not have inboundRules length()>5
- in()
- 指定されたリストに属性が含まれている場合に真を返す
- 例:Instance should have image in('ami-01bbe152bf19d0289’,’ami-a0cfeed8’)
- “Derived”データ、isPublic (booleanタイプ)の判断基準はRFC 1918 IPアドレスとアソシエイトされたかどうか
- NumberofHosts()
- CIDR内の可能なIPの数
- 例:sgはワイドスコープのネットワークからsshができないをチェック
Instance where isPublic=true should not have inboundRules contain [ port<=22 and portTo>=22 and protocol in ('TCP', 'ALL') and scope isPublic() and scope numberOfHosts()>=0 ]
SecurityGroup should not have inboundRules with [ port<=22 and portTo>=22 and scope numberOfHosts()>256]
- containedInNetworks()
- CIDRのリストを受け取り、IPまたはCIDRが完全に含まれているかどうかをチェック
- 例:特定のIPからのみBastionホストへの接続を許可
Instance where tags with [ key='role' and value='bastion' ] should have inboundRules contain-all [ scope containedInNetworks('173.240.160.0/21', '173.240.168.0/22') ]
- before()
- この関数に与えられた時間よりも小さいかどうかをテスト
Instance should have launchTime before('-200', 'days')
- after()
- この関数に与えられた時間よりも大きいかどうかをテスト
IamUser should not have passwordLastUsed after ('-90', 'days')
- 非相関時間
- Unixタイムフォーマットでのタイムスタンプの比較
- 比較式 (=,<,>,!=,<=,>=,like)
- 特定のタグキーを持つインスタンスは、特定の値を持つべきではない
Instance should not have tags with [ key='tier' and value like '%webserver%' ]
- 含む式 (contain or contain-any, contain-all, contain-none)
- デフォルトのSGを持つインスタンスを抽出
Instance should not have nics contain-any [ securityGroups with [ name='default' ] ]
- 指定されるIAM role or policyを持つインスタンスを抽出
Instance should have roles contain-none [ combinedPolicies with [ id='arn:aws:iam::086071956115:policy/HSBC-Low' ] ]
Instance should have roles contain-none [ combinedPolicies with [ id='arn:aws:iam::086071956115:role/ecsInstanceRole' ] ]
- 正規表現式
- S3Bucket should have name regexMatch /\/gsltraining.*\//
実例
Azure
|
主要ルールターゲット
|
目的
|
GSL
|
マネージドSQLサーバ
|
マネージドSQLサーバは、ネイティブファイアウォールのルールごとに1つのIPのみを持つ必要があります。
|
SQLServer should not have firewallRules contain-any [ numberOfAddressesInRange>1 ]
|
AWS
|
インスタンス
|
タグやラベルの使用例:
- 個々のチームまたはコストセンターが使用するリソースを識別
- デプロイメント環境(Prod、Test、Dev)の区別
- 所有者、状態ラベルを識別
- コスト配分と請求の内訳に使用
|
Instance should have tags with [ key='Environment' and value in('prod', 'test', 'dev') ]
|
Google Cloud
|
インスタンス
|
VMInstance should have labels with [ key='Environment' and value in('prod', 'test', 'dev') ]
|
AWS
|
セキュリティグループ
|
セキュリティグループは常に保護されたアセットを持つべきである。
|
SecurityGroup where name!='default' should not have networkAssetsStats contain-all [ count=0 ]
|