AKS で Azure Policy を使ってコンプライアンス管理

Azure Kubernetes Service (AKS) において、Azure Policy と連携させることで Kubernetes クラスターのコンプライアンスの状態を管理することができます。

<https://docs.microsoft.com/ja-jp/azure/governance/policy/concepts/policy-for-kubernetes>

少し長めの内容ですが、まずは上記のドキュメントを見ておいていただけると良いと思います。

# 環境

* Azure Kubernetes Service (1.20.9)

# 試してみる

## Azure Policy の作成

AKS クラスターを配置するリソースグループにて、Azure Policy を作成します。今回は下記の三つのポリシーを作成しました。

1. Azure Kubernetes Service のリソース ログを有効にする必要がある
2. Kubernetes Service (AKS) 用の Azure Policy アドオンをクラスターにインストールして有効にする必要がある
3. Kubernetes クラスター内で許可されたコンテナー イメージのみを実行する

手順については、ドキュメントの下記部分を参照ください。

<https://docs.microsoft.com/ja-jp/azure/governance/policy/concepts/policy-for-kubernetes#assign-a-policy-definition>

## AKS Cluster (A) - Azure Policy の連携を有効化

Azure Policy 連携のアドオンを追加した状態で AKS クラスター (A) を作成します。具体的には、AKS クラスター作成時の \[統合\] タブで Azure Policy を `有効` にします。

<https://docs.microsoft.com/ja-jp/azure/aks/kubernetes-walkthrough-portal>

しばらく後、Azure Portal でポリシーの準拠状態を確認すると、1. のポリシー以外は準拠できている状態が確認できます。

![](https://storage.googleapis.com/zenn-user-upload/adbf13b21d861a5e7b7e6575.png)

:::message
Azure Policy の準拠確認が行われるまで 30 分以上要する場合があります。気長に待つことをオススメします。
:::

## AKS Cluster (B) - Azure Policy の連携を無効で作成

今度は Azure Policy 連携のアドオンを追加しない状態で AKS クラスター (B) を作成します。

先ほどの AKS クラスター作成時の \[統合\] タブで Azure Policy を `無効` のままにすれば OK です。

しばらく後、Azure Portal でポリシーの準拠状態を確認すると、片方の AKS クラスターが 2. のポリシーに準拠できていない状態が確認できます。

![](https://storage.googleapis.com/zenn-user-upload/e085d0dfc085402cf352a926.png)

## AKS Cluster (B) - Azure Policy の連携を有効化

先ほど Azure Policy を無効にして作成した AKS クラスター (B) にて、ポリシーに準拠させるために Azure Policy 連携を有効にします。

手順については、下記マニュアルの「上記の前提条件ステップが完了したら、管理する AKS クラスターに Azure Policy アドオンをインストールします。」の箇所を参照してください。

<https://docs.microsoft.com/ja-jp/azure/governance/policy/concepts/policy-for-kubernetes#install-azure-policy-add-on-for-aks>

またしばらく後に確認すると、ポリシーに準拠したことが確認できると思います。

![](https://storage.googleapis.com/zenn-user-upload/3c2a7f3c21129c08ce14f47b.png)

なお、1. のポリシーに準拠ができていないので、サマリ部分にある「準拠している」リソースはゼロになっていますね。

こんな感じで、設定したコンプライアンス的なポリシーに準拠しているかどうか、管理することができます。

# 参考資料

AKS 絡みのビルトイン Azure Policy は、下記のドキュメントで確認することができます。かなり色々な種類のポリシーが用意されていますね！

<https://docs.microsoft.com/ja-jp/azure/governance/policy/samples/built-in-policies#kubernetes>

また、Azure Policy と連携させておくことで、「`privileged: true` を要求する Pod は起動させない」といった制約を課すことも可能になります。

<https://docs.microsoft.com/ja-jp/azure/aks/use-azure-policy>

## しくみ

<https://kubernetes.io/blog/2019/08/06/opa-gatekeeper-policy-and-governance-for-kubernetes/>

用意され割り当てわれた Azure Policy に応じて、Gatekeeper の CRD (Custom Resource Difinition) が作成されます。この CRD を通して Open Policy Agent (OPA) の仕組みによってポリシーの準拠が判断される感じです。

```
> kubectl get crd
NAME                                                       CREATED AT
configs.config.gatekeeper.sh                               2021-10-05T11:08:06Z
constraintpodstatuses.status.gatekeeper.sh                 2021-10-05T11:08:06Z
constrainttemplatepodstatuses.status.gatekeeper.sh         2021-10-05T11:08:06Z
constrainttemplates.templates.gatekeeper.sh                2021-10-05T11:08:06Z
k8sazurecontainerallowedimages.constraints.gatekeeper.sh   2021-10-05T11:41:59Z
```

ちなみに、このポリシーの Kubernetes (というか OPA) 側の動作に使われているのが Rego という言語になります。内部構造を深く追いたい方は、下記のようなドキュメントや OPA に関する資料が参考になると思いますです。

<https://www.openpolicyagent.org/docs/latest/>

<https://www.openpolicyagent.org/docs/latest/policy-language/>

# 終わりに

実験段階では Kubernetes のセキュリティがザルになりがち (反省) ですが、実際の運用段階においてはこういうセキュリティ的な仕組みを入れておくと良いですね！