系列:7、 Kubernetes 安全性

Kubernetes 安全性

我们将讨论 Kubernetes 安全性。 当我们在使用 Kubernetes 时,出于安全原因,我们有时会希望限制网络的访问或限制某些用户查看或运行某些命令等。

为此,我们必须使用不同的 Kubernetes 概念。

1、Network Policy(网络策略)

如果我们想限制来自或去往 Pod 的网络流量,我们需要定义一个 NetworkPolicy。

例如,如果我们想限制特定端口(比如 80 )到我们的 nginx Pod 的流量 以及 如果我们想限制来自 nginx 端口(比如 8080 )的流量,我们需要分别定义 Ingress 和 Egress 定义。 网络策略与带有标签的 Pod 相匹配。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: nginx-network-policy
spec:
  podSelector:
    matchLabels:
      role: lb
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    ports:
    - protocol: TCP
      port: 80
  egress:
  - to:
    ports:
    - protocol: TCP
      port: 8080

因此,此 NetworkPolicy 将应用于任何具有标签“role:lb”、限制 80 端口流量和 8080 端口流量的 Pod。

2、RBAC

Role-based access control(基于角色控制)是一种根据组织内个人用户的角色来调节对计算机或网络资源的访问的方法。

想象一下,在您的公司中,您有 50 人在 IT 部门工作,分为开发人员、测试人员和 DevOps。如果某些资源仅适用于 DevOps 人员(例如控制平面资源,因此开发人员和测试人员不会在这些资源上犯任何错误)并且该资源不应该对其他角色可见,那么我们可以通过定义 RBAC 来限制他们的访问。

我们可以定义一个角色或集群角色。

该角色仅适用于特定的命名空间。

顾名思义,ClusterRole 是集群范围的,并且它是非命名空间的。

因此,如果您需要对特定命名空间进行访问控制,请定义角色,不定义 ClusterRole。

创建角色后,我们必须根据需要和/或使用情况将它们绑定到 RoleBinding 或 ClusterRoleBinding。

应该在“verb”参数上提供用户/角色可能被允许的操作,该参数可以是下面列出的任何一个:

[get, list, watch, create, update, patch, delete]

请注意,Kubernetes 建议使用服务帐户(非人类帐户尝试进行身份验证),因此我们也必须创建服务帐户。

RBAC 可以定义为命令式和声明式。

出于学习目的,让我们创建上面提到的 3 个不同的角色,开发人员、测试人员和管理员。 开发人员将有权获取、列出和更新“developers”命名空间中的 Deployment 和 Pod,测试人员将有权列出“testers”命名空间中的 Pod,DevOps 将有权列出集群范围内的所有 Pod .

让我们从创建一个名为“developers”的命名空间开始:

kubectl create namespace developers

在这里插入图片描述

然后让我们使用命令式方法创建角色开发者:

kubectl create role dev-role --verb=get,list,create --resource=deployments,pods -n developers

在这里插入图片描述

用声明的方式创建,如下:

rbac.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: developers
  name: dev-role
rules:
- apiGroups: [""]
  resources: ["pods","deployments"]
  verbs: ["get", "list", "create"]

现在,如果我们想对单个用户使用它,我们将只为一个用户“ege”创建一个角色绑定:
在这里插入图片描述

这只是为了向您展示它会如何做。 但正如前面所提到的,Kubernetes 建议使用服务帐户,这将仅适用于用户“ege”,但实际上,我们不希望它仅适用于用户,而是适用于整个角色。 所以我们需要为此创建一个服务帐户:

kubectl create serviceaccount dev-sa -n developers

在这里插入图片描述

注意: Role 和 RoleBinding 应该在它们将被使用的特定命名空间上创建,但服务帐户可以在不同的命名空间上。

现在让我们再次将我们的角色开发者与创建的服务帐户绑定。

kubectl create rolebinding dev-sa-rb --role=dev-role --serviceaccount=developers:dev-sa

在这里插入图片描述

如上所示,当我们与服务帐户绑定时,我们首先编写命名空间,然后编写服务帐户的名称,如开发人员:dev-sa。

dev-sa.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-sa-rb
  namespace: developers
subjects:
- kind: ServiceAccount
  name: dev-sa
  namespace: developers
roleRef:
  kind: Role
  name: dev-role
  apiGroup: rbac.authorization.k8s.io

下面继续创建test角色以及进行角色绑定

创建命名空间:

kubectl create namespace testers

在这里插入图片描述

现在让我们在“testers”命名空间中创建对 Pod 具有“list”权限的角色

kubectl create role tester-role --verb=list --resource=pods -n testers

在这里插入图片描述

创建testers的服务账号:

kubectl create serviceaccount tester-sa

在这里插入图片描述

kubectl create rolebinding tester-rb --role=tester-role --serviceaccount=testers:tester-sa -n testers

在这里插入图片描述

为 devops 创建集群角色:

kubectl create clusterrole devops-role --verb=list --resource=pods

在这里插入图片描述

给devops创建服务账号:

kubectl create serviceaccount devops-sa

在这里插入图片描述

查询现有角色:

kubectl get roles

在这里插入图片描述

默认空间内无角色

kubectl get roles -n developers

在这里插入图片描述

kubectl get roles -n testers

在这里插入图片描述

产看角色详细信息:

kubectl describe role dev-role -n developers

在这里插入图片描述

核查访问权限:
在这里插入图片描述

答案是yes,因为我们是自己集群的管理员。 要检查其他用户,我们需要添加“–as

kubectl auth can-i delete deployments --as tester-sa

在这里插入图片描述

该用户无相关权限。

3、Security Context(安全上下文)

安全上下文定义 Pod 或容器的权限和访问控制设置。

当我们想以特定用户身份运行 Pod 或 Container 时,我们会使用安全上下文。 所以我们可以通过添加安全上下文来定义运行 Pod 的用户。

路径是“.spec.securityContext”。

样例 YAML 文件:

pod-security-context.yaml

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  volumes:
  - name: sec-ctx-vol
    emptyDir: {}
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
    securityContext:
      allowPrivilegeEscalation: false

创建pod:

kubectl apply -f pod-security-context.yaml 

进入pod内:

kubectl exec -it security-context-demo  -- sh

在这里插入图片描述

我们可以在容器级别定义安全上下文。 请注意,容器级别的安全上下文将覆盖 Pod 级别。 例如:

pod-overide-sc.yaml

apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  securityContext:
    runAsUser: 1000
    runAsGroup: 2000
  containers:
  - name: busybox
    image: busybox
    command: ["sh", "-c", "sleep 1h"]
    securityContext:
      runAsUser: 2000

创建pod:

kubectl  apply -f pod-overide-sc.yaml

查看用户:

kubectl exec -it busybox -- sh

在这里插入图片描述

可以看到用户是2000

系列:1、Kubernetes 简介

系列:2、创建Kubernetes集群

系列:3、Kubectl 的使用

系列:4.1、Kubernetes 对象

系列:4.2、Kubernetes 工作负载

系列:4.3、Kubernetes 服务

系列:4.4、Kubernetes 存储

系列:4.5、Kubernetes 配置对象

系列:5、Kubernetes中的调度

系列:6、Kubernetes 的升级与部署策略

系列:7、 Kubernetes 安全性(本文)

系列:8、部署一个全栈应用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值