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 を作成します。今回は下記の三つのポリシーを作成しました。
- Azure Kubernetes Service のリソース ログを有効にする必要がある
- Kubernetes Service (AKS) 用の Azure Policy アドオンをクラスターにインストールして有効にする必要がある
- Kubernetes クラスター内で許可されたコンテナー イメージのみを実行する
手順については、ドキュメントの下記部分を参照ください。
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. のポリシー以外は準拠できている状態が確認できます。
Azure Policy の準拠確認が行われるまで 30 分以上要する場合があります。気長に待つことをオススメします。
AKS Cluster (B) - Azure Policy の連携を無効で作成
今度は Azure Policy 連携のアドオンを追加しない状態で AKS クラスター (B) を作成します。
先ほどの AKS クラスター作成時の [統合] タブで Azure Policy を 無効
のままにすれば OK です。
しばらく後、Azure Portal でポリシーの準拠状態を確認すると、片方の AKS クラスターが 2. のポリシーに準拠できていない状態が確認できます。
AKS Cluster (B) - Azure Policy の連携を有効化
先ほど Azure Policy を無効にして作成した AKS クラスター (B) にて、ポリシーに準拠させるために Azure Policy 連携を有効にします。
手順については、下記マニュアルの「上記の前提条件ステップが完了したら、管理する AKS クラスターに Azure Policy アドオンをインストールします。」の箇所を参照してください。
またしばらく後に確認すると、ポリシーに準拠したことが確認できると思います。
なお、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 のセキュリティがザルになりがち (反省) ですが、実際の運用段階においてはこういうセキュリティ的な仕組みを入れておくと良いですね!