ImagePolicyWebhookを有効にする手順を確認したメモ。実装はないので動かない。手順の確認のみ。
参考リンク
- https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#imagepolicywebhook
- https://github.com/killer-sh/cks-course-environment/tree/master/course-content/supply-chain-security/secure-the-supply-chain/whitelist-registries/ImagePolicyWebhook
手順
EKSの場合は、有効にされているAdmission Controllerは以下に記載があり、ImagePolicyWebhookは有効になっていないし、勝手に有効にすることもできない。
kubeadmで作成したクラスターの場合は、kube-apiserverのマニフェスト(/etc/kubernetes/manifests/kube-apiserver.yaml)を変更して有効にすればよい。
先にAdmission Controllerの設定ファイルを作成する。
root@cks-master:/etc/kubernetes/admission# ls -l total 24 -rw-r--r-- 1 root root 298 Jan 1 18:16 admission_config.yaml -rw-r--r-- 1 root root 1135 Jan 1 18:16 apiserver-client-cert.pem -rw-r--r-- 1 root root 1703 Jan 1 18:16 apiserver-client-key.pem -rw-r--r-- 1 root root 1132 Jan 1 18:16 external-cert.pem -rw-r--r-- 1 root root 1703 Jan 1 18:16 external-key.pem -rw-r--r-- 1 root root 815 Jan 1 18:16 kubeconf
admission_config.yaml
が設定ファイルで、実装への接続情報を記載するkubeconfgフォーマットのファイルのパスを指定する。
apiVersion: apiserver.config.k8s.io/v1 kind: AdmissionConfiguration plugins: - name: ImagePolicyWebhook configuration: imagePolicy: kubeConfigFile: /etc/kubernetes/admission/kubeconf allowTTL: 50 denyTTL: 50 retryBackoff: 500 defaultAllow: false
kubeconf
が実装への接続のための情報で、kubeconfigフォーマットで指定している。TLSを使う必要がある。
apiVersion: v1 kind: Config # clusters refers to the remote service. clusters: - cluster: certificate-authority: /etc/kubernetes/admission/external-cert.pem # CA for verifying the remote service. server: https://external-service:1234/check-image # URL of remote service to query. Must use 'https'. name: image-checker contexts: - context: cluster: image-checker user: api-server name: image-checker current-context: image-checker preferences: {} # users refers to the API server's webhook configuration. users: - name: api-server user: client-certificate: /etc/kubernetes/admission/apiserver-client-cert.pem # cert for the webhook admission controller to use client-key: /etc/kubernetes/admission/apiserver-client-key.pem # key matching the cert
kube-apiserverのマニフェストを変更する。ボリュームのマウントが必要なことに注意。
(省略) # - --enable-admission-plugins=NodeRestriction - --enable-admission-plugins=NodeRestriction,ImagePolicyWebhook - --admission-control-config-file=/etc/kubernetes/admission/admission_config.yaml (省略) volumeMounts: - mountPath: /etc/kubernetes/admission name: k8s-admission readOnly: true (省略) volumes: - hostPath: path: /etc/kubernetes/admission type: DirectoryOrCreate
動作を試す。実装に接続できないのでエラーになる。
root@cks-master:/etc/kubernetes/manifests# k run test --image=nginx Error from server (Forbidden): pods "test" is forbidden: Post "https://external-service:1234/check-image?timeout=30s": dial tcp: lookup external-service on 169.254.169.254:53: no such host
デフォルトの挙動をdefaultAllow: true
に変更する。
apiVersion: apiserver.config.k8s.io/v1 kind: AdmissionConfiguration plugins: - name: ImagePolicyWebhook configuration: imagePolicy: kubeConfigFile: /etc/kubernetes/admission/kubeconf allowTTL: 50 denyTTL: 50 retryBackoff: 500 defaultAllow: false
kube-apiserverを再起動してもう一度試す。
root@cks-master:/etc/kubernetes/manifests# k run test --image=nginx pod/test created