利用可能なポリシー記述言語に TypeScript を追加
Shisho Cloud における検査ルールを記述するための言語として、従来の Rego に加えて TypeScript が利用できるようになりました。 これにより、組織のポリシーに合わせた独自の検査ルールを作成する際に、慣れ親しんだ言語を用いてルールを記述していただけます。 なお Flatt Security により標準提供される検査項目(マネージド検査項目)のルールは現在 Rego 版のみを提供しておりますが、TypeScript 版の提供については順次進めてまいります。

概要
このリリースにより、Shisho Cloud 上で自動実行される検査ルールを記述する言語として、TypeScript(及び JavaScript)を利用できるようになりました。
まずは TypeScript で記述された検査ルールの例をご覧ください。これは Google Cloud におけるネットワークのファイアウォールが、任意の IPv4 アドレス(0.0.0.0/0)から 22 番ポートへの SSH 接続を許可してしまっているかどうかを検査するルールです。
function decide(input: Input): Decision[] {
return input.googleCloud.projects
.map((project) =>
project.network.vpcNetworks.map((network) => {
const insecure_rules = network.firewallRules.filter(
allows_ssh_public_access,
);
const ok = insecure_rules.length === 0;
const decision: Decision = {
header: {
api_version: "decision.api.shisho.dev/v1beta",
kind: "network_ssh_access",
subject: network.metadata.id,
type: ok ? TYPE_ALLOW : TYPE_DENY,
severity: ok ? SEVERITY_INFO : SEVERITY_HIGH,
},
};
return decision;
}),
)
.flat();
}
function allows_ssh_public_access(rule: FirewallRule): boolean {
const SSH_PORT = 22;
return (
rule.direction === "INGRESS" &&
rule.sourceRanges.some((range) => range === "0.0.0.0/0") &&
rule.allowed.some(
({ ipProtocol, ports }) =>
(ipProtocol === "all" ||
ipProtocol === "tcp" ||
ipProtocol === "sctp") &&
ports.some(({ from_, to }) => from_ <= SSH_PORT && SSH_PORT <= to),
)
);
}
TypeScript に慣れ親しんだ方であれば、この検査ルールのロジックを理解することは難しくないでしょう。この検査ルールは allows_ssh_public_access を条件として、問題のあるファイアウォールルール insecure_rules を列挙します。そしてそれをもとに、検査結果を表すオブジェクト decision を生成します。ファイアウォールルールに問題があるかどうかを判定する関数 allows_ssh_public_access は、ソース IP 範囲に 0.0.0.0/0 が含まれているか、ポート範囲が 22 を含むかどうかなどを確認しています。
検査ルールのカスタマイズも簡単です。例として、「ソース IP 範囲に 0.0.0.0/0 を指定してはいけない」という拒否リスト方式の代わりに、「ソース IP 範囲は 192.0.2.0/24 のみ指定してよい」という許可リスト方式で検査したい場合を考えます。上記の検査ルールを許可リスト方式に変更するには、次のようにコードを書き換えるだけです:
return rule.direction === "INGRESS" &&
- rule.sourceRanges.some(range => range === "0.0.0.0/0") &&
+ rule.sourceRanges.some(range => range !== "192.0.2.0/24") &&
rule.allowed.some(({ ipProtocol, ports }) =>
カスタマイズできることはこれだけではありません。例えば 22 番以外のポート番号を検査対象に追加することも、簡単に実装できるでしょう。検査ルールのロジックが TypeScript のコードで表現されているからこそ、ロジックのあらゆる部分を自由にカスタマイズできます。
そして TypeScript の主要な特徴は、その名の通り型システムでしょう。通常のソフトウェア開発において型システムは様々な恩恵をもたらしますが、その多くは Shisho Cloud における検査ルールの実装でも享受できます。
型はしばしば、「入出力がどのような構造のデータであるか」に関するドキュメントの役割を果たします。Shisho Cloud における検査ルールとは、大まかには入力データ(Input)を受け取り検査結果の配列(Decision[]
