diff --git a/docs/hardening.md b/docs/hardening.md index 9a7f3d841cb03080ef719dbcb99e7a53ed1fda1f..b3359b74bcfdd2b886ef105416ce6b4b10cd9ddc 100644 --- a/docs/hardening.md +++ b/docs/hardening.md @@ -41,7 +41,18 @@ kube_encrypt_secret_data: true kube_encryption_resources: [secrets] kube_encryption_algorithm: "secretbox" -kube_apiserver_enable_admission_plugins: ['EventRateLimit,AlwaysPullImages,ServiceAccount,NamespaceLifecycle,NodeRestriction,LimitRanger,ResourceQuota,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,PodNodeSelector,PodSecurity'] +kube_apiserver_enable_admission_plugins: + - EventRateLimit + - AlwaysPullImages + - ServiceAccount + - NamespaceLifecycle + - NodeRestriction + - LimitRanger + - ResourceQuota + - MutatingAdmissionWebhook + - ValidatingAdmissionWebhook + - PodNodeSelector + - PodSecurity kube_apiserver_admission_control_config_file: true # EventRateLimit plugin configuration kube_apiserver_admission_event_rate_limits: diff --git a/roles/kubernetes/control-plane/tasks/kubeadm-setup.yml b/roles/kubernetes/control-plane/tasks/kubeadm-setup.yml index 5f8c784453047cb741b3d7d5a458f708f1c2e3fb..d9f7304efb2cd918d0f790ebde4c7bb4c48e13f7 100644 --- a/roles/kubernetes/control-plane/tasks/kubeadm-setup.yml +++ b/roles/kubernetes/control-plane/tasks/kubeadm-setup.yml @@ -106,7 +106,7 @@ when: - kube_apiserver_admission_control_config_file - item in kube_apiserver_admission_plugins_needs_configuration - loop: "{{ kube_apiserver_enable_admission_plugins[0].split(',') }}" + loop: "{{ kube_apiserver_enable_admission_plugins }}" - name: kubeadm | Check if apiserver.crt contains all needed SANs shell: | diff --git a/roles/kubernetes/control-plane/templates/admission-controls.yaml.j2 b/roles/kubernetes/control-plane/templates/admission-controls.yaml.j2 index 0bb4517c2987b171229f17404a70decbbdec23d8..34f5f188ce6d58474978f26ee92f97575c2b2ae5 100644 --- a/roles/kubernetes/control-plane/templates/admission-controls.yaml.j2 +++ b/roles/kubernetes/control-plane/templates/admission-controls.yaml.j2 @@ -1,7 +1,7 @@ apiVersion: apiserver.config.k8s.io/v1 kind: AdmissionConfiguration plugins: -{% for plugin in kube_apiserver_enable_admission_plugins[0].split(',') %} +{% for plugin in kube_apiserver_enable_admission_plugins %} {% if plugin in kube_apiserver_admission_plugins_needs_configuration %} - name: {{ plugin }} path: {{ kube_config_dir }}/{{ plugin|lower }}.yaml diff --git a/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml b/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml index b7f9b2570a58d86c78cba966c8f63da5fd9d0487..242d6def91e712a0d0d3524e8826eaa204fe112f 100644 --- a/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml +++ b/roles/kubernetes/preinstall/tasks/0020-verify-settings.yml @@ -305,3 +305,11 @@ when: - kube_external_ca_mode - not ignore_assert_errors + +- name: Stop if using deprecated comma separated list for admission plugins + assert: + that: "',' not in kube_apiserver_enable_admission_plugins[0]" + msg: "Comma-separated list for kube_apiserver_enable_admission_plugins is now deprecated, use separate list items for each plugin." + when: + - kube_apiserver_enable_admission_plugins is defined + - kube_apiserver_enable_admission_plugins | length > 0 diff --git a/tests/files/packet_ubuntu20-calico-aio-hardening.yml b/tests/files/packet_ubuntu20-calico-aio-hardening.yml index c013f79545bf611efa2dca93367f6a09adb4e128..76340d8733529ec032b12debdfa10ea3d332cb94 100644 --- a/tests/files/packet_ubuntu20-calico-aio-hardening.yml +++ b/tests/files/packet_ubuntu20-calico-aio-hardening.yml @@ -36,7 +36,18 @@ kube_encrypt_secret_data: true kube_encryption_resources: [secrets] kube_encryption_algorithm: "secretbox" -kube_apiserver_enable_admission_plugins: ['EventRateLimit,AlwaysPullImages,ServiceAccount,NamespaceLifecycle,NodeRestriction,LimitRanger,ResourceQuota,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,PodNodeSelector,PodSecurity'] +kube_apiserver_enable_admission_plugins: + - EventRateLimit + - AlwaysPullImages + - ServiceAccount + - NamespaceLifecycle + - NodeRestriction + - LimitRanger + - ResourceQuota + - MutatingAdmissionWebhook + - ValidatingAdmissionWebhook + - PodNodeSelector + - PodSecurity kube_apiserver_admission_control_config_file: true # EventRateLimit plugin configuration kube_apiserver_admission_event_rate_limits: