我希望使用服务帐户来加固我的集群。现在所有的pod都在使用默认的服务帐户。我认为我的方法是为集群中当前的pod创建一个单独的服务帐户。对我来说,现在的困惑是理解我为每个pod分配的主题(即服务帐户)的角色/集群角色(权限)?对于一些pod,我将如何确定它是否需要访问集群API?
我的集群包含以下内容(为了保护隐私,我删除了ip):
kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nginx-ingress-ingress-nginx-controller 1/1 Running 0
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP <none> 443/TCP 123d
service/nginx-ingress-ingress-nginx-controller LoadBalancer 80:31180/TCP,443:31405/TCP 116d
service/nginx-ingress-ingress-nginx-controller-admission ClusterIP <none> 443/TCP 116d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-ingress-ingress-nginx-controller 1/1 1 1 116d
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-ingress-ingress-nginx-controller 1 1 1 7d19h
root@osboxes:/home/osboxes# kubectl get all -n <>
NAME READY STATUS RESTARTS AGE
pod/mariadb-0 1/1 Running 0 5d19h
pod/web2 1/1 Running 0 7d17h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mariadb ClusterIP <none> 3306/TCP 123d
service/web ClusterIP <none> 80/TCP 116d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/web2 1/1 1 1 7d17h
NAME DESIRED CURRENT READY AGE
replicaset.apps/web2-6f8d8bcc76 1 1 1 7d17h
NAME READY AGE
statefulset.apps/mariadb 1/1 123d
kubectl get all -n cert-manager
NAME READY STATUS RESTARTS AGE
pod/cert-manager-6b5c6b786d-cc448 1/1 Running 0 5d19h
pod/cert-manager-cainjector-6bc9d758b-sdb8l 1/1 Running 0 9d
pod/cert-manager-webhook-586d45d5ff-jsh54 1/1 Running 0 9d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/cert-manager ClusterIP <none> 9402/TCP 12d
service/cert-manager-webhook ClusterIP <none> 443/TCP 12d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/cert-manager 1/1 1 1 12d
deployment.apps/cert-manager-cainjector 1/1 1 1 12d
deployment.apps/cert-manager-webhook 1/1 1 1 12d
NAME DESIRED CURRENT READY AGE
replicaset.apps/cert-manager-6b5c6b786d 1 1 1 7d20h
replicaset.apps/cert-manager-6bbf595697 0 0 0 12d
replicaset.apps/cert-manager-788ff5c97d 0 0 0 7d21h
replicaset.apps/cert-manager-cainjector-6bc9d758b 1 1 1 12d
replicaset.apps/cert-manager-webhook-586d45d5ff 1 1 1 12d
除了更改默认服务帐户外,您还需要遵循NSA/CISA Kubernetes加固指南。
For Pod Security Enforcement:
在pod上强制执行安全需求可以本地完成通过以下两种机制:
- 一个名为Pod安全准入的beta版本特性-生产Kubernetes管理员应该采用Pod安全准入,作为在Kubernetes 1.23版本中默认启用。舱安全准入是基于对豆荚的分类,包括特权,基线,并提供了比psp上。关于Pod安全许可的更多信息可在2 .
- 一个被称为Pod安全策略(psp)的已弃用功能-管理员在过渡到Pod安全时使用psp准入可以使用附录C中的信息:Pod安全策略来
保护Pod服务帐户令牌:
默认情况下,Kubernetes在以下情况下自动提供服务帐户创建一个Pod,并在Pod中挂载帐户的秘密令牌运行时。许多容器化的应用程序不需要直接访问在Kubernetes业务流程发生时,将服务帐户迁移到该帐户透明的背景。如果应用程序受到威胁,Pods中的账户令牌可以被网络行为者收集并使用进一步妥协集群。当应用程序不需要时Kubernetes管理员应该直接访问服务帐户确保Pod规范禁用正在挂载的秘密令牌。这可以使用Pod的YAML规范中的"
automountServiceAccountToken: false
"指令来完成。在某些情况下,容器化应用程序使用已配置的服务帐户令牌来向外部服务(如云平台)进行身份验证。在这些在某些情况下,禁用帐户令牌可能是不可行的。相反,集群管理员应确保将RBAC实现到在集群内限制Pod权限
RBAC:
基于角色的访问控制(RBAC)是一种控制访问的方法基于个人用户角色的计算机或网络资源在你的组织内。
RBAC授权使用RBAC .authorization.k8s。io API组驱动授权决策,允许您动态配置