本日も乙

ただの自己満足な備忘録。

HashicorpのSentinelを触ってみた

HashicorpからSentinelという新プロダクトがリリースされたので、Getting Startedをやってみました。

Sentinelとは

アクセスポリシーを評価するコードフレームワークで「Policy as Code」を実現しています。 アクセスポリシーの評価というと、AWSではAWS Config RulesGCPではCloud Audit Loggingがありますが、Sentinelは単体で使用するのではなく、他のHashicorp製品と組み合わせてコードに埋め込むことを想定しているようです。また、マルチクラウドで互換性があることもメリットがあります。

インストール

以下の実行環境で行いました。

$ wget https://releases.hashicorp.com/sentinel/0.1.0/sentinel_0.1.0_darwin_amd64.zip
$ unzip sentinel_0.1.0_darwin_amd64.zip
$ mv sentinel /usr/local/bin
$ sentinel --version
Sentinel Simulator v0.1.0

ポリシーの記述

policy.sentinelというファイル名でポリシーを作成します。

hour = 4
// 最低限のルール(main)が必要
main = rule { hour >= 0 and hour < 12 }

sentinel apply で実行します。

$ sentinel apply policy.sentinel
Pass

ポリシーを変えてみて実行すると、ポリシーに反しているため失敗します。

hour = 13
main = rule { hour >= 0 and hour < 12 }
$ sentinel apply policy.sentinel
Fail

Execution trace. The information below will show the values of all
the rules evaluated and their intermediate boolean expressions. Note that
some boolean expressions may be missing if short-circuit logic was taken.

FALSE - policy.sentinel:2:1 - Rule "main"
  TRUE - policy.sentinel:2:15 - hour >= 0
  FALSE - policy.sentinel:2:29 - hour < 12

以下のようにルールを分けて書くこともできます。

hour = 4

past_midnight = rule { hour >= 0 }
before_noon   = rule { hour < 12 }

main = rule {
    past_midnight and
    before_noon
}

色んな論理式を書くこともできます。詳細はドキュメントを参照ください。

user = "foo"
role = "admin"
roles = ["admin", "developer", "operator"]

is_user           = rule { user is "foo" }
is_belong_to_role = rule { roles contains role }
main = rule { is_user and is_belong_to_role }

プラグインをimportすることで記述表現が増えます。独自のプラグインも自作することができるようです。

import "strings"

request_path = "/admin?id=1&name=foo"

main = rule { strings.has_prefix(request_path, "/admin") }

テスト

テスティングフレームワークも備えています。

ポリシーを以下のように書き、

is_weekday = rule { day not in ["saturday", "sunday"] }
is_open_hours = rule { hour > 8 and hour < 17 }
main = rule { is_open_hours and is_weekday }

テストを test/policy/good.json に書きます。

{
  "global": {
    "day": "monday",
    "hour": 14
  }
}

sentinel test でテスト実行されます。

$ sentinel test
PASS - policy.sentinel
  PASS - test/policy/good.json

他Hashicorp製品との連携

まだSentinelが組み込まれていないため、ドキュメントに載っているサンプル例のみの情報です。 (私はまだConsulとTerraformしか触ったことがないため、NomadとVaultは省略します)。

Consulは、KVSに格納するKey/Valueをバリデーションしてくれるみたいです。 https://docs.hashicorp.com/sentinel/app/consul/

Terraformは、リソースの作成前にポリシーをチェックし、反した場合はリソースを作成しないようにできます。 https://docs.hashicorp.com/sentinel/app/terraform/

最後に

Sentinel単体だとあまり実用性がないように感じますが、他のHashicorp製品と組み合わせることで、威力を発揮するプロダクトだと思います。 しかし、エンタープライズ版のみ機能がサポートされるようですので、無料の範囲内で使う場合にはSentinelはあまり使わないのかもしれません。