Open Policy Agent とは

Open Policy Agent とは

Open Policy Agent は、Kubernetes専用ツールではないが、以降はKubernetesで利用することを前提に説明を行う。

Policy as Code

その組織でのルールをコードで管理できるようにすること。Policy 定義からKubernetesマニフェストの定義チェックを行う。

IaC では、形式知をコード化してきた。 Policy as Code では「暗黙知」をコード化する、と言うイメージ

クラウドネイティブなチームを目指すには、必要不可欠。

なお、Policy as Code で検索を行うと、HashiCorp のSentinel が多く表示される。

Policy as Code with Terraform and Sentinel説明

  • (YouTube)
  • ポリシーとは
    • やってはいけないことや、定義しておかなければいけないことなどをチェックする構文
    • 本番環境は、こう言うインスタンスでなければいけない
    • 組織のルール(稼働時間とか)
  • ワークフローをIaC(Terraform)化
    • 人手でのワークフローから宣言的モデルに移ってきている
    • コードはレビューが必要になる → その解決策としてPolicy as Code
    • インシデント発生後の振り返りで新しいルールが発生する → これをCode化する必要がある
  • DevSecOps
  • Terraform向けPolicy

Open Policy Agent でKubernetesの何をチェックするのか

  • マニフェストをCI/CDプロセス内でチェックする
    • 社内ルール違反の有無をチェックする
    • Production Ready なリソース状態とする
    • セキュリティに配慮したリソース状態とする
  • マニフェストの構文チェック・ケアレスミスチェックをするツールは別にあるので、そのレベルのチェックは実施しない
    • Kubeval

使い方

conftest

Gatekeeper

The Rego Playground

Rule

package httpapi.authz

# 社員情報をインポート
import data.subordinates as subord

default allow = false

# 社員は自身の給与を参照できる
allow {
  some username
  input.method == "GET"
  input.path = ["finance", "salary", username]
  input.user == username
}

# マネージャーは部下の給与も参照できる
allow {
  some username
  input.method == "GET"
  input.path = ["finance", "salary", username]
  subord[input.user][_] == username
}

DATA

{
  "alice": ["bob"],
  "bob": [],
  "charlie": ["david"],
  "david": []
}

INPUT例1

{
    "method": "GET",
    "path": ["finance", "salary", "alice"],
    "user": "alice"
}

INPUT例2

{
    "method": "GET",
    "path": ["finance", "salary", "bob"],
    "user": "alice"
}

True にならない。。

links