title: 安全加固指南 - v2.1 description: 本文讲解了如何使您的集群符合互联网安全中心发布的 Kubernetes 安全基准,保护集群中节点的安全。安装 Kubernetes 之前,请按照本指南进行操作。加固指南旨在与特定版本的 CIS Kubernetes Benchmark,Kubernetes 和 Rancher 一起使用。 keywords:

  • rancher
  • rancher中文
  • rancher中文文档
  • rancher官网
  • rancher文档
  • Rancher
  • rancher 中文
  • rancher 中文文档
  • rancher cn
  • 安全
  • 安全加固指南
  • 安全加固指南 - v2.1

本文讲解了如何使您的集群符合互联网安全中心发布的 Kubernetes 安全基准,保护集群中节点的安全。安装 Kubernetes 之前,请按照本指南进行操作。

加固指南旨在与特定版本的 CIS Kubernetes Benchmark,Kubernetes 和 Rancher 一起使用:

加固指南版本 Rancher 版本 CIS Benchmark 版本 Kubernetes 版本
加固指南 v2.1 Rancher v2.1.x Benchmark v1.3.0 Kubernetes 1.11

单击这里下载 PDF 版本的加固指南

下面的安全加固指南是针对在生产环境的 Rancher v2.1.x 中使用 Kubernetes 1.11 版本的集群。它概述了如何满足互联网安全中心(CIS)提出的 Kubernetes 安全标准。

有关如果根据官方 CIS 基准评估集群的更多详细信息,请参阅CIS Benchmark Rancher 自测指南 - Rancher v2.1

Profile Definitions

The following profile definitions agree with the CIS benchmarks for Kubernetes.

A profile is a set of configurations that provide a certain amount of hardening. Generally, the more hardened an environment is, the more it affects performance.

Level 1

Items in this profile intend to:

  • offer practical advice appropriate for the environment;
  • deliver an obvious security benefit; and
  • not alter the functionality or utility of the environment beyond an acceptable margin

Level 2

Items in this profile extend the “Level 1” profile and exhibit one or more of the following characteristics:

  • are intended for use in environments or use cases where security is paramount
  • act as a defense in depth measure
  • may negatively impact the utility or performance of the technology

1.1 - Rancher HA Kubernetes cluster host configuration

1.1.1 - Configure default sysctl settings on all hosts

Profile Applicability

  • Level 1

Description

Configure sysctl settings to match what the kubelet would set if allowed.

Rationale

We recommend that users launch the kubelet with the --protect-kernel-defaults option. The settings that the kubelet initially attempts to change can be set manually.

This supports the following control:

  • 2.1.7 - Ensure that the --protect-kernel-defaults argument is set to true (Scored)

Audit

  • Verify vm.overcommit_memory = 1
  1. sysctl vm.overcommit_memory
  • Verify kernel.panic = 10
  1. sysctl kernel.panic
  • Verify kernel.panic_on_oops = 1
  1. sysctl kernel.panic_on_oops

Remediation

  • Set the following parameters in /etc/sysctl.conf on all nodes:
  1. vm.overcommit_memory=1
  2. kernel.panic=10
  3. kernel.panic_on_oops=1
  • Run sysctl -p to enable the settings.

1.1.2 - Install the encryption provider configuration on all control plane nodes

Profile Applicability

  • Level 1

Description

Create a Kubernetes encryption configuration file on each of the RKE nodes that will be provisioned with the controlplane role:

Rationale

This configuration file will ensure that the Rancher RKE cluster encrypts secrets at rest, which Kubernetes does not do by default.

This supports the following controls:

  • 1.1.34 - Ensure that the --experimental-encryption-provider-config argument is set as appropriate (Scored)
  • 1.1.35 - Ensure that the encryption provider is set to aescbc (Scored)

Audit

On the control plane hosts for the Rancher HA cluster run:

  1. stat /etc/kubernetes/encryption.yaml

Ensure that:

  • The file is present
  • The file mode is 0600
  • The file owner is root:root
  • The file contains:
  1. apiVersion: v1
  2. kind: EncryptionConfig
  3. resources:
  4. - resources:
  5. - secrets
  6. providers:
  7. - aescbc:
  8. keys:
  9. - name: key1
  10. secret: <32-byte base64 encoded string>
  11. - identity: {}

Where aescbc is the key type, and secret is populated with a 32-byte base64 encoded string.

Remediation

  • Generate a key and an empty configuration file:
  1. head -c 32 /dev/urandom | base64 -i -
  2. touch /etc/kubernetes/encryption.yaml
  • Set the file ownership to root:root and the permissions to 0600
  1. chown root:root /etc/kubernetes/encryption.yaml
  2. chmod 0600 /etc/kubernetes/encryption.yaml
  • Set the contents to:
  1. apiVersion: v1
  2. kind: EncryptionConfig
  3. resources:
  4. - resources:
  5. - secrets
  6. providers:
  7. - aescbc:
  8. keys:
  9. - name: key1
  10. secret: <32-byte base64 encoded string>
  11. - identity: {}

Where secret is the 32-byte base64-encoded string generated in the first step.

1.1.3 - Install the audit log configuration on all control plane nodes.

Profile Applicability

  • Level 1

Description

Place the configuration file for Kubernetes audit logging on each of the control plane nodes in the cluster.

Rationale

The Kubernetes API has audit logging capability that is the best way to track actions in the cluster.

This supports the following controls:

  • 1.1.15 - Ensure that the --audit-log-path argument is set as appropriate (Scored)
  • 1.1.16 - Ensure that the --audit-log-maxage argument is as appropriate (Scored)
  • 1.1.17 - Ensure that the --audit-log-maxbackup argument is set as appropriate (Scored)
  • 1.1.18 - Ensure that the --audit-log-maxsize argument is set as appropriate (Scored)
  • 1.1.37 - Ensure that the AdvancedAuditing argument is not set to false (Scored)

Audit

On each control plane node, run:

  1. stat /etc/kubernetes/audit.yaml

Ensure that:

  • The file is present
  • The file mode is 0600
  • The file owner is root:root
  • The file contains:
  1. apiVersion: audit.k8s.io/v1beta1
  2. kind: Policy
  3. rules:
  4. - level: Metadata

Remediation

On nodes with the controlplane role:

  • Generate an empty configuration file:
  1. touch /etc/kubernetes/audit.yaml
  • Set the file ownership to root:root and the permissions to 0600
  1. chown root:root /etc/kubernetes/audit.yaml
  2. chmod 0600 /etc/kubernetes/audit.yaml
  • Set the contents to:
  1. apiVersion: audit.k8s.io/v1beta1
  2. kind: Policy
  3. rules:
  4. - level: Metadata

1.1.4 - Place Kubernetes event limit configuration on each control plane host

Profile Applicability

  • Level 1

Description

Place the configuration file for Kubernetes event limit configuration on each of the control plane nodes in the cluster.

Rationale

Set up the EventRateLimit admission control plugin to prevent clients from overwhelming the API server. The settings below are intended as an initial value and may need to be adjusted for larger clusters.

This supports the following control:

  • 1.1.36 - Ensure that the admission control plugin EventRateLimit is set (Scored)

Audit

On nodes with the controlplane role run:

  1. stat /etc/kubernetes/admission.yaml
  2. stat /etc/kubernetes/event.yaml

For each file, ensure that:

  • The file is present
  • The file mode is 0600
  • The file owner is root:root

For admission.yaml ensure that the file contains:

  1. apiVersion: apiserver.k8s.io/v1alpha1
  2. kind: AdmissionConfiguration
  3. plugins:
  4. - name: EventRateLimit
  5. path: /etc/kubernetes/event.yaml

For event.yaml ensure that the file contains:

  1. apiVersion: eventratelimit.admission.k8s.io/v1alpha1
  2. kind: Configuration
  3. limits:
  4. - type: Server
  5. qps: 500
  6. burst: 5000

Remediation

On nodes with the controlplane role:

  • Generate an empty configuration file:
  1. touch /etc/kubernetes/admission.yaml
  2. touch /etc/kubernetes/event.yaml
  • Set the file ownership to root:root and the permissions to 0600
  1. chown root:root /etc/kubernetes/admission.yaml
  2. chown root:root /etc/kubernetes/event.yaml
  3. chmod 0600 /etc/kubernetes/admission.yaml
  4. chmod 0600 /etc/kubernetes/event.yaml
  • For admission.yaml set the contents to:
  1. apiVersion: apiserver.k8s.io/v1alpha1
  2. kind: AdmissionConfiguration
  3. plugins:
  4. - name: EventRateLimit
  5. path: /etc/kubernetes/event.yaml
  • For event.yaml set the contents to:
  1. apiVersion: eventratelimit.admission.k8s.io/v1alpha1
  2. kind: Configuration
  3. limits:
  4. - type: Server
  5. qps: 500
  6. burst: 5000

2.1 - Rancher HA Kubernetes Cluster Configuration via RKE

(See Appendix A. for full RKE cluster.yml example)

2.1.1 - Configure kubelet options

Profile Applicability

  • Level 1

Description

Ensure Kubelet options are configured to match CIS controls.

Rationale

To pass the following controls in the CIS benchmark, ensure the appropriate flags are passed to the Kubelet.

  • 2.1.6 - Ensure that the --streaming-connection-idle-timeout argument is not set to 0 (Scored)
  • 2.1.7 - Ensure that the --protect-kernel-defaults argument is set to true (Scored)
  • 2.1.8 - Ensure that the --make-iptables-util-chains argument is set to true (Scored)
  • 2.1.10 - Ensure that the --event-qps argument is set to 0 (Scored)

Audit

Inspect the Kubelet containers on all hosts and verify that they are running with the following options:

  • --streaming-connection-idle-timeout=<duration greater than 0>
  • --protect-kernel-defaults=true
  • --make-iptables-util-chains=true
  • --event-qps=0

Remediation

  • Add the following to the RKE cluster.yml kubelet section under services:
  1. services:
  2. kubelet:
  3. extra_args:
  4. streaming-connection-idle-timeout: "<duration>"
  5. protect-kernel-defaults: "true"
  6. make-iptables-util-chains: "true"
  7. event-qps: "0"

Where <duration> is in a form like 1800s.

  • Reconfigure the cluster:
  1. rke up --config cluster.yml

2.1.2 - Configure kube-api options

Profile Applicability

  • Level 1

Description

Ensure the RKE configuration is set to deploy the kube-api service with the options required for controls.

Rationale

To pass the following controls for the kube-api server ensure RKE configuration passes the appropriate options.

  • 1.1.1 - Ensure that the --anonymous-auth argument is set to false (Scored)
  • 1.1.8 - Ensure that the --profiling argument is set to false (Scored)
  • 1.1.9 - Ensure that the --repair-malformed-updates argument is set to false (Scored)
  • 1.1.11 - Ensure that the admission control plugin AlwaysPullImages is set (Scored)
  • 1.1.12 - Ensure that the admission control plugin DenyEscalatingExec is set (Scored)
  • 1.1.14 - Ensure that the admission control plugin NamespaceLifecycle is set (Scored)
  • 1.1.15 - Ensure that the --audit-log-path argument is set as appropriate (Scored)
  • 1.1.16 - Ensure that the --audit-log-maxage argument is set as appropriate (Scored)
  • 1.1.17 - Ensure that the --audit-log-maxbackup argument is set as appropriate (Scored)
  • 1.1.18 - Ensure that the --audit-log-maxsize argument is set as appropriate (Scored)
  • 1.1.23 - Ensure that the --service-account-lookup argument is set to true (Scored)
  • 1.1.24 - Ensure that the admission control plugin PodSecurityPolicy is set (Scored)
  • 1.1.34 - Ensure that the --experimental-encryption-provider-config argument is set as appropriate (Scored)
  • 1.1.35 - Ensure that the encryption provider is set to aescbc (Scored)
  • 1.1.36 - Ensure that the admission control plugin EventRateLimit is set (Scored)
  • 1.1.37 - Ensure that the AdvancedAuditing argument is not set to false (Scored)

Audit

  • On nodes with the controlplane role inspect the kube-apiserver containers:

    1. docker inspect kube-apiserver
  • Look for the following options in the command section of the output:

  1. --anonymous-auth=false
  2. --profiling=false
  3. --repair-malformed-updates=false
  4. --service-account-lookup=true
  5. --enable-admission-plugins= "ServiceAccount,NamespaceLifecycle,LimitRanger,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds,AlwaysPullImages,DenyEscalatingExec,NodeRestriction,EventRateLimit,PodSecurityPolicy"
  6. --experimental-encryption-provider-config=/etc/kubernetes/encryption.yaml
  7. --admission-control-config-file=/etc/kubernetes/admission.yaml
  8. --audit-log-path=/var/log/kube-audit/audit-log.json
  9. --audit-log-maxage=5
  10. --audit-log-maxbackup=5
  11. --audit-log-maxsize=100
  12. --audit-log-format=json
  13. --audit-policy-file=/etc/kubernetes/audit.yaml
  • In the volume section of the output ensure the bind mount is present:
  1. /var/log/kube-audit:/var/log/kube-audit

Remediation

  • In the RKE cluster.yml add the following directives to the kube-api section under services:
  1. services:
  2. kube-api:
  3. pod_security_policy: true
  4. extra_args:
  5. anonymous-auth: "false"
  6. profiling: "false"
  7. repair-malformed-updates: "false"
  8. service-account-lookup: "true"
  9. enable-admission-plugins: "ServiceAccount,NamespaceLifecycle,LimitRanger,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds,AlwaysPullImages,DenyEscalatingExec,NodeRestriction,EventRateLimit,PodSecurityPolicy"
  10. experimental-encryption-provider-config: /etc/kubernetes/encryption.yaml
  11. admission-control-config-file: "/etc/kubernetes/admission.yaml"
  12. audit-log-path: "/var/log/kube-audit/audit-log.json"
  13. audit-log-maxage: "5"
  14. audit-log-maxbackup: "5"
  15. audit-log-maxsize: "100"
  16. audit-log-format: "json"
  17. audit-policy-file: /etc/kubernetes/audit.yaml
  18. extra_binds:
  19. - "/var/log/kube-audit:/var/log/kube-audit"
  • Reconfigure the cluster:
  1. rke up --config cluster.yml

2.1.3 - Configure scheduler options

Profile Applicability

  • Level 1

Description

Set the appropriate options for the Kubernetes scheduling service.

Rationale

To address the following controls on the CIS benchmark, the command line options should be set on the Kubernetes scheduler.

  • 1.2.1 - Ensure that the --profiling argument is set to false (Scored)
  • 1.2.2 - Ensure that the --address argument is set to 127.0.0.1 (Scored)

Audit

  • On nodes with the controlplane role: inspect the kube-scheduler containers:
  1. docker inspect kube-scheduler
  • Verify the following options are set in the command section.
  1. --profiling=false
  2. --address=127.0.0.1

Remediation

  • In the RKE cluster.yml file ensure the following options are set:
  1. services:
  2. scheduler:
  3. extra_args:
  4. profiling: "false"
  5. address: "127.0.0.1"
  • Reconfigure the cluster:
  1. rke up --config cluster.yml

2.1.4 - Configure controller options

Profile Applicability

  • Level 1

Description

Set the appropriate arguments on the Kubernetes controller manager.

Rationale

To address the following controls the options need to be passed to the Kubernetes controller manager.

  • 1.3.1 - Ensure that the --terminated-pod-gc-threshold argument is set as appropriate (Scored)
  • 1.3.2 - Ensure that the --profiling argument is set to false (Scored)
  • 1.3.7 - Ensure that the --address argument is set to 127.0.0.1 (Scored)

Audit

  • On nodes with the controlplane role inspect the kube-controller-manager container:
  1. docker inspect kube-controller-manager
  • Verify the following options are set in the command section:
  1. --terminated-pod-gc-threshold=1000
  2. --profiling=false
  3. --address=127.0.0.1

Remediation

  • In the RKE cluster.yml file ensure the following options are set:
  1. services:
  2. kube-controller:
  3. extra_args:
  4. profiling: "false"
  5. address: "127.0.0.1"
  6. terminated-pod-gc-threshold: "1000"
  • Reconfigure the cluster:
  1. rke up --config cluster.yml

2.1.5 - Configure addons and PSPs

Profile Applicability

  • Level 1

Description

Configure a restrictive PodSecurityPolicy (PSP) as the default and create role bindings for system level services to use the less restrictive default PSP.

Rationale

To address the following controls, a restrictive default PSP needs to be applied as the default. Role bindings need to be in place to allow system services to still function.

  • 1.7.1 - Do not admit privileged containers (Not Scored)
  • 1.7.2 - Do not admit containers wishing to share the host process ID namespace (Not Scored)
  • 1.7.3 - Do not admit containers wishing to share the host IPC namespace (Not Scored)
  • 1.7.4 - Do not admit containers wishing to share the host network namespace (Not Scored)
  • 1.7.5 - Do not admit containers with allowPrivilegeEscalation (Not Scored)
  • 1.7.6 - Do not admit root containers (Not Scored)
  • 1.7.7 - Do not admit containers with dangerous capabilities (Not Scored)

Audit

  • Verify that the cattle-system namespace exists:
  1. kubectl get ns |grep cattle
  • Verify that the roles exist:
  1. kubectl get role default-psp-role -n ingress-nginx
  2. kubectl get role default-psp-role -n cattle-system
  3. kubectl get clusterrole psp:restricted
  • Verify the bindings are set correctly:
  1. kubectl get rolebinding -n ingress-nginx default-psp-rolebinding
  2. kubectl get rolebinding -n cattle-system default-psp-rolebinding
  3. kubectl get clusterrolebinding psp:restricted
  • Verify the restricted PSP is present.
  1. kubectl get psp restricted

Remediation

  • In the RKE cluster.yml file ensure the following options are set:
  1. addons: |
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: Role
  4. metadata:
  5. name: default-psp-role
  6. namespace: ingress-nginx
  7. rules:
  8. - apiGroups:
  9. - extensions
  10. resourceNames:
  11. - default-psp
  12. resources:
  13. - podsecuritypolicies
  14. verbs:
  15. - use
  16. ---
  17. apiVersion: rbac.authorization.k8s.io/v1
  18. kind: RoleBinding
  19. metadata:
  20. name: default-psp-rolebinding
  21. namespace: ingress-nginx
  22. roleRef:
  23. apiGroup: rbac.authorization.k8s.io
  24. kind: Role
  25. name: default-psp-role
  26. subjects:
  27. - apiGroup: rbac.authorization.k8s.io
  28. kind: Group
  29. name: system:serviceaccounts
  30. - apiGroup: rbac.authorization.k8s.io
  31. kind: Group
  32. name: system:authenticated
  33. ---
  34. apiVersion: v1
  35. kind: Namespace
  36. metadata:
  37. name: cattle-system
  38. ---
  39. apiVersion: rbac.authorization.k8s.io/v1
  40. kind: Role
  41. metadata:
  42. name: default-psp-role
  43. namespace: cattle-system
  44. rules:
  45. - apiGroups:
  46. - extensions
  47. resourceNames:
  48. - default-psp
  49. resources:
  50. - podsecuritypolicies
  51. verbs:
  52. - use
  53. ---
  54. apiVersion: rbac.authorization.k8s.io/v1
  55. kind: RoleBinding
  56. metadata:
  57. name: default-psp-rolebinding
  58. namespace: cattle-system
  59. roleRef:
  60. apiGroup: rbac.authorization.k8s.io
  61. kind: Role
  62. name: default-psp-role
  63. subjects:
  64. - apiGroup: rbac.authorization.k8s.io
  65. kind: Group
  66. name: system:serviceaccounts
  67. - apiGroup: rbac.authorization.k8s.io
  68. kind: Group
  69. name: system:authenticated
  70. ---
  71. apiVersion: extensions/v1beta1
  72. kind: PodSecurityPolicy
  73. metadata:
  74. name: restricted
  75. spec:
  76. requiredDropCapabilities:
  77. - NET_RAW
  78. privileged: false
  79. allowPrivilegeEscalation: false
  80. defaultAllowPrivilegeEscalation: false
  81. fsGroup:
  82. rule: RunAsAny
  83. runAsUser:
  84. rule: MustRunAsNonRoot
  85. seLinux:
  86. rule: RunAsAny
  87. supplementalGroups:
  88. rule: RunAsAny
  89. volumes:
  90. - emptyDir
  91. - secret
  92. - persistentVolumeClaim
  93. - downwardAPI
  94. - configMap
  95. - projected
  96. ---
  97. apiVersion: rbac.authorization.k8s.io/v1
  98. kind: ClusterRole
  99. metadata:
  100. name: psp:restricted
  101. rules:
  102. - apiGroups:
  103. - extensions
  104. resourceNames:
  105. - restricted
  106. resources:
  107. - podsecuritypolicies
  108. verbs:
  109. - use
  110. ---
  111. apiVersion: rbac.authorization.k8s.io/v1
  112. kind: ClusterRoleBinding
  113. metadata:
  114. name: psp:restricted
  115. roleRef:
  116. apiGroup: rbac.authorization.k8s.io
  117. kind: ClusterRole
  118. name: psp:restricted
  119. subjects:
  120. - apiGroup: rbac.authorization.k8s.io
  121. kind: Group
  122. name: system:serviceaccounts
  123. - apiGroup: rbac.authorization.k8s.io
  124. kind: Group
  125. name: system:authenticated
  • Reconfigure the cluster:
  1. rke up --config cluster.yml

3.1 - Rancher Management Control Plane Installation

3.1.1 - Disable the local cluster option

Profile Applicability

  • Level 2

Description

When deploying Rancher, disable the local cluster option on the Rancher Server.

NOTE: This requires Rancher v2.1.2 or above.

Rationale

Having access to the local cluster from the Rancher UI is convenient for troubleshooting and debugging; however, if the local cluster is enabled in the Rancher UI, a user has access to all elements of the system, including the Rancher management server itself. Disabling the local cluster is a defense in depth measure and removes the possible attack vector from the Rancher UI and API.

Audit

  • Verify the Rancher deployment has the --add-local=false option set.
  1. kubectl get deployment rancher -n cattle-system -o yaml |grep 'add-local'
  • In the Rancher UI go to Clusters in the Global view and verify that no local cluster is present.

Remediation

  • Upgrade to Rancher v2.1.2 via the Helm chart. While performing the upgrade, provide the following installation flag:
  1. --set addLocal="false"

3.1.2 - Enable Rancher Audit logging

Profile Applicability

  • Level 1

Description

Enable Rancher’s built-in audit logging capability.

Rationale

Tracking down what actions were performed by users in Rancher can provide insight during post mortems, and if monitored proactively can be used to quickly detect malicious actions.

Audit

  • Verify that the audit log parameters were passed into the Rancher deployment.
  1. kubectl get deployment rancher -n cattle-system -o yaml | grep auditLog
  • Verify that the log is going to the appropriate destination, as set by auditLog.destination

    • sidecar:

      1. List pods:

        1. kubectl get pods -n cattle-system
      2. Tail logs:

        1. kubectl logs <pod> -n cattle-system -c rancher-audit-log
    • hostPath

      1. On the worker nodes running the Rancher pods, verify that the log files are being written to the destination indicated in auditlog.hostPath.

Remediation

Upgrade the Rancher server installation using Helm, and configure the audit log settings. The instructions for doing so can be found in the reference section below.

Reference

3.2 - Rancher Management Control Plane Authentication

3.2.1 - Change the local administrator password from the default value

Profile Applicability

  • Level 1

Description

The local administrator password should be changed from the default.

Rationale

The default administrator password is common across all Rancher installations and should be changed immediately upon startup.

Audit

Attempt to login into the UI with the following credentials:

  • Username: admin
  • Password: admin

The login attempt must not succeed.

Remediation

Change the password from admin to a password that meets the recommended password standards for your organization.

3.2.2 - Configure an Identity Provider for Authentication

Profile Applicability

  • Level 1

Description

When running Rancher in a production environment, configure an identity provider for authentication.

Rationale

Rancher supports several authentication backends that are common in enterprises. It is recommended to tie Rancher into an external authentication system to simplify user and group access in the Rancher cluster. Doing so assures that access control follows the organization’s change management process for user accounts.

Audit

  • In the Rancher UI, select Global
  • Select Security
  • Select Authentication
  • Ensure the authentication provider for your environment is active and configured correctly

Remediation

Configure the appropriate authentication provider for your Rancher installation according to the documentation found at the link in the reference section below.

Reference

3.3 - Rancher Management Control Plane RBAC

3.3.1 - Ensure that administrator privileges are only granted to those who require them

Profile Applicability

  • Level 1

Description

Restrict administrator access to only those responsible for managing and operating the Rancher server.

Rationale

The admin privilege level gives the user the highest level of access to the Rancher server and all attached clusters. This privilege should only be granted to a few people who are responsible for the availability and support of Rancher and the clusters that it manages.

Audit

The following script uses the Rancher API to show users with administrator privileges:

  1. #!/bin/bash
  2. for i in $(curl -sk -u 'token-<id>:<secret>' https://<RANCHER_URL>/v3/users|jq -r .data[].links.globalRoleBindings); do
  3. curl -sk -u 'token-<id>:<secret>' $i| jq '.data[] | "\(.userId) \(.globalRoleId)"'
  4. done

The admin role should only be assigned to users that require administrative privileges. Any role that is not admin or user should be audited in the RBAC section of the UI to ensure that the privileges adhere to policies for global access.

The Rancher server permits customization of the default global permissions. We recommend that auditors also review the policies of any custom global roles.

Remediation

Remove the admin role from any user that does not require administrative privileges.

3.4 - Rancher Management Control Plane Configuration

3.4.1 - Ensure only approved node drivers are active

Profile Applicability

  • Level 1

Description

Ensure that node drivers that are not needed or approved are not active in the Rancher console.

Rationale

Node drivers are used to provision compute nodes in various cloud providers and local IaaS infrastructure. For convenience, popular cloud providers are enabled by default. If the organization does not intend to use these or does not allow users to provision resources in certain providers, the drivers should be disabled. This will prevent users from using Rancher resources to provision the nodes.

Audit

  • In the Rancher UI select Global
  • Select Node Drivers
  • Review the list of node drivers that are in an Active state.

Remediation

If a disallowed node driver is active, visit the Node Drivers page under Global and disable it.


Appendix A - Complete RKE cluster.yml Example

  1. nodes:
  2. - address: 18.191.190.205
  3. internal_address: 172.31.24.213
  4. user: ubuntu
  5. role: ["controlplane", "etcd", "worker"]
  6. - address: 18.191.190.203
  7. internal_address: 172.31.24.203
  8. user: ubuntu
  9. role: ["controlplane", "etcd", "worker"]
  10. - address: 18.191.190.10
  11. internal_address: 172.31.24.244
  12. user: ubuntu
  13. role: ["controlplane", "etcd", "worker"]
  14. services:
  15. kubelet:
  16. extra_args:
  17. streaming-connection-idle-timeout: "1800s"
  18. protect-kernel-defaults: "true"
  19. make-iptables-util-chains: "true"
  20. event-qps: "0"
  21. kube-api:
  22. pod_security_policy: true
  23. extra_args:
  24. anonymous-auth: "false"
  25. profiling: "false"
  26. repair-malformed-updates: "false"
  27. service-account-lookup: "true"
  28. enable-admission-plugins: "ServiceAccount,NamespaceLifecycle,LimitRanger,PersistentVolumeLabel,DefaultStorageClass,ResourceQuota,DefaultTolerationSeconds,AlwaysPullImages,DenyEscalatingExec,NodeRestriction,EventRateLimit,PodSecurityPolicy"
  29. experimental-encryption-provider-config: /etc/kubernetes/encryption.yaml
  30. admission-control-config-file: "/etc/kubernetes/admission.yaml"
  31. audit-log-path: "/var/log/kube-audit/audit-log.json"
  32. audit-log-maxage: "5"
  33. audit-log-maxbackup: "5"
  34. audit-log-maxsize: "100"
  35. audit-log-format: "json"
  36. audit-policy-file: /etc/kubernetes/audit.yaml
  37. extra_binds:
  38. - "/var/log/kube-audit:/var/log/kube-audit"
  39. scheduler:
  40. extra_args:
  41. profiling: "false"
  42. address: "127.0.0.1"
  43. kube-controller:
  44. extra_args:
  45. profiling: "false"
  46. address: "127.0.0.1"
  47. terminated-pod-gc-threshold: "1000"
  48. addons: |
  49. apiVersion: rbac.authorization.k8s.io/v1
  50. kind: Role
  51. metadata:
  52. name: default-psp-role
  53. namespace: ingress-nginx
  54. rules:
  55. - apiGroups:
  56. - extensions
  57. resourceNames:
  58. - default-psp
  59. resources:
  60. - podsecuritypolicies
  61. verbs:
  62. - use
  63. ---
  64. apiVersion: rbac.authorization.k8s.io/v1
  65. kind: RoleBinding
  66. metadata:
  67. name: default-psp-rolebinding
  68. namespace: ingress-nginx
  69. roleRef:
  70. apiGroup: rbac.authorization.k8s.io
  71. kind: Role
  72. name: default-psp-role
  73. subjects:
  74. - apiGroup: rbac.authorization.k8s.io
  75. kind: Group
  76. name: system:serviceaccounts
  77. - apiGroup: rbac.authorization.k8s.io
  78. kind: Group
  79. name: system:authenticated
  80. ---
  81. apiVersion: v1
  82. kind: Namespace
  83. metadata:
  84. name: cattle-system
  85. ---
  86. apiVersion: rbac.authorization.k8s.io/v1
  87. kind: Role
  88. metadata:
  89. name: default-psp-role
  90. namespace: cattle-system
  91. rules:
  92. - apiGroups:
  93. - extensions
  94. resourceNames:
  95. - default-psp
  96. resources:
  97. - podsecuritypolicies
  98. verbs:
  99. - use
  100. ---
  101. apiVersion: rbac.authorization.k8s.io/v1
  102. kind: RoleBinding
  103. metadata:
  104. name: default-psp-rolebinding
  105. namespace: cattle-system
  106. roleRef:
  107. apiGroup: rbac.authorization.k8s.io
  108. kind: Role
  109. name: default-psp-role
  110. subjects:
  111. - apiGroup: rbac.authorization.k8s.io
  112. kind: Group
  113. name: system:serviceaccounts
  114. - apiGroup: rbac.authorization.k8s.io
  115. kind: Group
  116. name: system:authenticated
  117. ---
  118. apiVersion: extensions/v1beta1
  119. kind: PodSecurityPolicy
  120. metadata:
  121. name: restricted
  122. spec:
  123. requiredDropCapabilities:
  124. - NET_RAW
  125. privileged: false
  126. allowPrivilegeEscalation: false
  127. defaultAllowPrivilegeEscalation: false
  128. fsGroup:
  129. rule: RunAsAny
  130. runAsUser:
  131. rule: MustRunAsNonRoot
  132. seLinux:
  133. rule: RunAsAny
  134. supplementalGroups:
  135. rule: RunAsAny
  136. volumes:
  137. - emptyDir
  138. - secret
  139. - persistentVolumeClaim
  140. - downwardAPI
  141. - configMap
  142. - projected
  143. ---
  144. apiVersion: rbac.authorization.k8s.io/v1
  145. kind: ClusterRole
  146. metadata:
  147. name: psp:restricted
  148. rules:
  149. - apiGroups:
  150. - extensions
  151. resourceNames:
  152. - restricted
  153. resources:
  154. - podsecuritypolicies
  155. verbs:
  156. - use
  157. ---
  158. apiVersion: rbac.authorization.k8s.io/v1
  159. kind: ClusterRoleBinding
  160. metadata:
  161. name: psp:restricted
  162. roleRef:
  163. apiGroup: rbac.authorization.k8s.io
  164. kind: ClusterRole
  165. name: psp:restricted
  166. subjects:
  167. - apiGroup: rbac.authorization.k8s.io
  168. kind: Group
  169. name: system:serviceaccounts
  170. - apiGroup: rbac.authorization.k8s.io
  171. kind: Group
  172. name: system:authenticated