如何为K8S生产系统配置安全管理?

PX-Security:针对Kubernetes持久卷的多租户授权、身份验证和RBAC

PX-Security演示视频链接
https://v.qq.com/x/page/s30609pfmuq.html

安全对于企业来说至关重要,对于运行在Kubernetes上的基于微服务的应用来说更是如此。
Kubernetes提供RBAC授权,根据不同角色设定,管理Kubernetes内部特定资源的访问权限。这些机制对于管理Kubernetes的特定对象(如服务、命名空间、配额等)的访问权限非常有用。但命名空间和pod的安全策略本身,不足以限制谁有权限可以请求更改底层数据管理系统。

许多企业通过CNI或CSI等API,调用其他的平台能力来提供网络和存储基础。Kubernetes所缺乏的是将RBAC扩展到这些系统的能力,需要外部系统来确保授权和认证功能的实现。

这就是为什么Portworx与Kubernetes携手,通过对支撑Kubernetes中PVCs的持久卷,进行访问角色控制,来提供RBAC、加密和控制权限,这将创建一个无缝的保护层,为您的PVCs提供以下保护:

  1. 同一命名空间中的用户可以受到其角色的限制,比如他们可以具有读、写、管理员或其他定义的访问权限。
  2. 用户可以通过Token自动进行身份验证,这样审计请求的授权就可以针对特定命名空间来进行。
  3. 可以将用户置于基于租户的命名空间中,从而为访问PVCs提供安全的多租户。
  4. 即使用户看到存储类,也不意味着他们被授权创建PVC。
  5. 将Portworx RBAC与加密一起使用,意味着数据在host上是安全的,命名空间内的非授权用户不能访问数据。
  6. 如果一个请求来自Kubernetes外部而没有Token,它将被阻止。

要深入了解Portworx能为您的Kubernetes平台提供什么,可以查看Portworx网站上的安全参考体系架构。我们将重点讨论一些主题,比如如何设置PX-Security,以及如何使用Token对具有相应持久卷访问权限的角色用户进行身份验证。
首先,Portworx通过使用Token支持RBAC。在本文中,PX-Security将使用存储在Kubernetes Secrets中的Token,这些Token提供了最灵活的操作,且不牺牲任何安全性。

开始吧!

在我们讨论什么是Token以及如何使用它之前,有一点需要注意,对Portworx的每个请求都是使用存储在Token中的信息进行身份验证和授权的。其中包含关于用户及其角色所需所有相关的验证和签名的信息。因此,我们配置了PX-Security后,我们会创建Token。

让我们来配置PX-Security来达到安全性。请访问 https://central.portworx.com

点击安装并运行。填写安装程序要求的信息,完成后下载你的YAML文件,将文件保存以便后续做编辑。

接下来,我们将创建用于PX-Security的安全共享的Secrets。我们必须首先创建这些共享的Secrets,因为存储管理员将使用它们来生成和验证Token。出于安全原因,这些数据被存储在Kube-system命名空间中的Kubernetes Secrets中,只有少量的管理员和应用程序可以访问该命名空间。

PORTWORX_AUTH_SYSTEM_KEY=$(cat /dev/urandom | base64 | fold -w 65 | head -n 1)
PORTWORX_AUTH_STORK_KEY=$(cat /dev/urandom | base64 | fold -w 64 | head -n 1)
PORTWORX_AUTH_SHARED_SECRET=$(cat /dev/urandom | base64 | fold -w 64 | head -n 1)

运行以下命令将这些值放入Kubernetes Secret中:

kubectl -n kube-system create secret generic pxkeys     --from-literal=system-secret=$PORTWORX_AUTH_SYSTEM_KEY     --from-literal=stork-secret=$PORTWORX_AUTH_STORK_KEY     --from-literal=shared-secret=$PORTWORX_AUTH_SHARED_SECRET

您可以使用以下命令测试Kubernetes中的共享-secret。

kubectl -n kube-system get secret pxkeys -o json | jq -r ‘.data."shared-secret"‘ | base64 -d

打开您的YAML文件,找到PortworxDaemonset,可以看args, 在image:portworx/oci-monitor下。这里我们将添加安全参数(粗体)和PX-Security需要的Secrets:

- name: portworx
  image: portworx/oci-monitor:2.1.5
  imagePullPolicy: Always
  args:
    ["-c", "px-cluster",
     "-s", "/dev/xvdf",
     "-secret_type", "k8s",
     "-b",
     "-x", "kubernetes",
     "-jwt_issuer", "example-domain.com"]
  env:
    - name: "AUTO_NODE_RECOVERY_TIMEOUT_IN_SECS"
      value: "1500"
    - name: "PX_TEMPLATE_VERSION"
      value: "v4"
    - name: "PORTWORX_AUTH_JWT_SHAREDSECRET"
      valueFrom:
        secretKeyRef:
          name: pxkeys
          key: shared-secret
    - name: "PORTWORX_AUTH_SYSTEM_KEY"
      valueFrom:
        secretKeyRef:
          name: pxkeys
          key: system-secret
   - name: "PORTWORX_AUTH_STORK_KEY"
     valueFrom:
       secretKeyRef:
          name: pxkeys
          key: stork-secret

我们还需要找到Stork部署和编辑环境以包含我们的共享secret。见下文。

     containers:
  - command:
    - /stork
    - --driver=pxd
    - --verbose
    - --leader-elect=true
    - --health-monitor-interval=120
    imagePullPolicy: Always
    image: openstorage/stork:2.2.5
    env:
    - name: "PX_SERVICE_NAME"
      value: "portworx-api"
    - name: "PX_SHARED_SECRET"
      valueFrom:
         secretKeyRef:
            name: pxkeys
            key: stork-secret

完成这两个步骤后,保存YAML文件。现在,我们需要创建我们在Portworx安装YAML中引用的共享Secret。

接下来,使用下载和编辑过的YAML文件创建Portworx集群。

$ kubectl apply-f px-sec-cluster-spec.yaml
$ kubectl get po -n kube-system -l name=portworx
NAME             READY STATUS RESTARTS   AGE
portworx-4vmcx   1/1 Running 0          3m54s
portworx-hwrxh   1/1 Running 0          3m54s
portworx-rbqzk   1/1 Running 0          3m54s

用户和Token

我们需要定义几个用户并为他们生成Token。通常,这些用户有分配给他们的属性,这些属性定义了他们的用户类型。

首先,我们将创建一个存储管理员,该管理员具有全部权限。这样的管理员应该只有一两个。

使用以下内容创建一个名为admin.yaml的文件:

name: Storage Administrator
email: [email protected]
sub: [email protected]/storageadmin
roles: ["system.admin"]
groups: ["*"]

接下来,我们将创建一个Kubernetes用户,该用户作为一个验证客户,Kubernetes允许该用户与Portworx交互,并且这些请求来自Kubernetes。您的存储管理员需要设置此用户。

使用以下内容创建一个名为kubernetes.yaml的文件:

name: Kubernetes
email: [email protected]
sub: [email protected]/kubernetes
roles: ["system.user"]
groups: ["kubernetes"]

最后,我们将创建一个仅能看 (view-only) 权限的用户,用于演示Portworx如何限制对底层数据管理API的访问。

使用以下内容创建一个名为viewer.yaml的文件:

name: Viewer
email: [email protected]
sub: [email protected]/viewer
roles: ["system.view"]
groups: ["viewers"]

注意:Sub标记是该用户的唯一标识符,根据JWT标准,不能与其他Token共享。这个值被Portworx用来跟踪资源的所有权。如果电子邮件也用作唯一Sub标识符,请确保它不被任何其他Token使用。

请注意:有一个用户的角色是system.admin,另一个用户的角色是system.user,最后一个用户的角色是system.view。这些角色在PX-Security中是默认的,但也可以根据需要创建其他角色。我们来演示用户如何使用Portworx资源,如创建或删除卷。这跟该用户在Kubernetes RBAC的配置无关。

也就是说,具有system.view的用户也许能够在Kubernetes中内列出和创建PVC对象,但如果他们试图直接使用Portworx创建卷,将会失败。我们还将演示,为什么能够创建PVC对象的用户在此安全模式中实际上无法获得PV,除非该用户拥有由存储管理员配置的有效Token,来验证其角色和权限。

配置好了这些具备相关权限的用户,我们就可以使用我们的共享Secret和Portworx客户端工具pxctl,为这些用户生成自签名证书。

注意:您可以创建自己的应用来生成Token,也可以基于我们的开源golang示例程序openstorage-sdk-auth

在这个场景中,我们将使用共享Secret和pxctl auth token generate命令。让我们为上述两个用户创建Token。

首先,获取共享Secret。

PORTWORX_AUTH_SHARED_SECRET=$(kubectl -n kube-system get secret pxkeys -o json     | jq -r ‘.data."shared-secret"‘     | base64 -d)

接下来,配置Admin Token。首先是SSH,到Portworx节点,这样就可以使用pxctl命令。

$ PX_POD=$(kubectl get pods -l name=portworx -n kube-system -o jsonpath=‘{.items[0].metadata.name}‘)
$ kubectl exec -it -n kube-system $PX_POD  bash

然后,使用admin.yaml和共享Secret创建admin Token。

注意:确保将auth_config文件和PORTWORX_AUTH_SHARED_SECRET 复制到正在使用pxctl的Portworx容器中。

ADMIN_TOKEN=$(/opt/pwx/bin/pxctl auth token generate    --auth-config=admin.yaml    --issuer=example-domain.com    --shared-secret=$PORTWORX_AUTH_SHARED_SECRET    --token-duration=1y)
$ pxctl context create admin --token $ADMIN_TOKEN

接下来,配置Kubernetes Token。

KUBE_TOKEN=$(/opt/pwx/bin/pxctl auth token generate    --auth-config=kubernetes.yaml    --issuer=example-domain.com    --shared-secret=$PORTWORX_AUTH_SHARED_SECRET    --token-duration=1y)

接下来,配置Viewer token。

VIEWER_TOKEN=$(/opt/pwx/bin/pxctl auth token generate    --auth-config=viewer.yaml    --issuer=example-domain.com    --shared-secret=$PORTWORX_AUTH_SHARED_SECRET    --token-duration=1y)
$ pxctl context create viewer --token $VIEWER_TOKEN

现在我们已经创建了用户环境(Context),比如Portworx的Kubectl环境,来供两个用户使用,我们可以作为其中一个用户与Portworx系统进行交互。

注意,您可以使用$pxctl contextlist列出所有环境:

$ pxctl context set viewer
$ pxctl volume create --size 5 myvol
VolumeCreate: Access denied to roles: [system.view]

发生了什么?请记住,我们为具有system.view角色的Viewer设置了用户环境。这是Portworx的默认角色,只能运行只读命令,不具备写操作的权限,因此访问被拒绝。

如何与Kubernetes一起使用?

为了让Kubernetes的用户使用PX-Security,用户必须在向集群发出请求时使用自己的Token。一种方法是让管理员在Kubernetes存储类中配置Token。管理员可以在Portworx命名空间中名为px-k8-user的Secret中设置保存Secret Token。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: px-storage-repl-1
provisioner: kubernetes.io/portworx-volume
parameters:
  repl: "1"
  openstorage.io/auth-secret-name: px-k8s-user
  openstorage.io/auth-secret-namespace: portworx
allowVolumeExpansion: true

如果您正在使用CSI,请确保设置其他的参数。

注意:这目前只在通过Portworx使用CSI时有效。

parameters:
  repl: "1"
  csi.storage.k8s.io/provisioner-secret-name: px-k8s-user
  csi.storage.k8s.io/provisioner-secret-namespace: portworx
  csi.storage.k8s.io/node-publish-secret-name: px-k8s-user
  csi.storage.k8s.io/node-publish-secret-namespace: portworx
  csi.storage.k8s.io/controller-expand-secret-name: px-k8s-user
  csi.storage.k8s.io/controller-expand-secret-namespace: portworx

完成此操作后,具备访问存储类权限的用户可以创建卷。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
   name: mysql-data
spec:
   storageClass: px-storage-repl-1
   accessModes:
     - ReadWriteOnce
   resources:
     requests:
       storage: 12Gi

多租户架构

当您创建上述PVC时,它将使用KubernetesToken作为用户进行身份验证,从而确保该Kubernetes用户是发出请求的用户。这很好,但是多租户环境下,他们都可以使用存储类,因此我们需要一种方法来在不同的命名空间中使用多租户的Token。这是因为Kubernetes提供了使用命名空间隔离帐户资源的好方法,但您需要更安全的多租户解决方案。Portworx可以通过为应用存储卷添加访问控制来达到多租户安全管理。使用PX-Security进行多租户管理,可以执行以下操作。

首先,为租户创建一个命名空间。

$ kubectl create namespace tenant-a-ns

使用以下创建一个名为tenant-a.yaml 的文件:

name: tenant-a
email: [email protected]
sub: [email protected]/tenant
roles: ["system.user"]
groups: ["developers"]

使用tenant-name.yaml为Kubernetes创建一个token:

TENANT_A_TOKEN=$(/opt/pwx/bin/pxctl auth token generate     --auth-config=tenant-a.yaml     --issuer=example-domain.com     --shared-secret=$PORTWORX_AUTH_SHARED_SECRET     --token-duration=1y)

将该租户的Kubernetes Token保存在一个名为<tenant namespace>/px-k8 -user的Secret中:

$ kubectl -n tenant-a-ns create secret   generic px-k8s-user   --from-literal=auth-token=$TENANT_A_TOKEN

现在可以设置Kubernetes存储类,通过使用这个Secret,来获得Token权限,并与Portworx开始通讯。

下面的CSI存储类一旦创建,将使您的多租户能够使用存储在其命名空间中的Secret中的Token,来创建卷,方法是在命名空间中查找Secret。在使用CSI时,存储类将引用三种受支持操作的secret:provision, node-publish(mount/unmount), and controller-expand。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: px-storage
provisioner: pxd.portworx.com
parameters:
  repl: "1"
  csi.storage.k8s.io/provisioner-secret-name: px-k8s-user
  csi.storage.k8s.io/provisioner-secret-namespace: ${pvc.namespace}
  csi.storage.k8s.io/node-publish-secret-name: px-k8s-user
  csi.storage.k8s.io/node-publish-secret-namespace: ${pvc.namespace}
  csi.storage.k8s.io/controller-expand-secret-name: px-k8s-user
  csi.storage.k8s.io/controller-expand-secret-namespace: ${pvc.namespace}
allowVolumeExpansion: true

请注意 ${pvc.namespace}。这将确保CSI控制器获得正确的Token,该Token与PVC的命名空间相关联。您现在就有了一个基于Token身份验证的多租户解决方案。

我们在本Blog中有一部分没有介绍的PX-Security功能就是Portworx卷的加密。您可以在这里(how to work with Encrypted PVCs)查看更多的关于PVC加密的文档 。您可以将Portworx RBAC与卷加密结合使用,来使Kubernetes中的数据更加安全。

原文地址:https://blog.51cto.com/14572152/2469145

时间: 2024-10-09 15:24:03

如何为K8S生产系统配置安全管理?的相关文章

K8S生产环境中实践高可靠的配置和技巧都有哪些?

K8S环境中实践高可靠的配置和技巧都有哪些? 磁盘类型及大小 磁盘类型: 推荐使用ssd 磁盘 对于worker节点,创建集群时推荐使用挂载数据盘.这个盘是专门给/var/lib/docker 存放本地镜像.可以避免后续因镜像太多而造成磁盘根目录容量不够的情况.在运行一段时间后,本地会存在很多无用的镜像.比较快捷的方式就是,先下线这台机器,重新构建这个磁盘,然后再上线. 磁盘大小: kubernetes节点需要的磁盘空间也不小,Docker镜像.系统日志.应用日志都保存在磁盘上.创建kubern

生产环境容器落地最佳实践 - JFrog 内部K8s落地旅程

引言 Kubernetes已经成为市场上事实上领先的编配工具,不仅对技术公司如此,对所有公司都是如此,因为它允许您快速且可预测地部署应用程序.动态地伸缩应用程序.无缝地推出新特性,同时有效地利用硬件资源. 本期我们将回顾采用Kubernetes作为容器编排工具的公司所面临的复杂性和挑战.我们希望我们提供的经验教训.最佳实践和技巧将帮助您在前往K8s旅途中起步并继续前进. 本期将介绍关于在Kubernetes生产环境的最佳实践,包括:: 为上K8s容器云准备好应用程序 在Kubernetes中获得

centos7部署k8s

1.1 初始配置 1.1.1 关闭selinux和firewalld:初始化脚本 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config grep SELINUX=disabled /etc/selinux/config setenforce 0 getenforce systemctl stop firewalld systemctl disable firewalld 1.1.2 关闭swap交换分区(也可以不关闭

Docker学习(十一)Docker系列结束-新的开始K8S

Docker学习(十一)Docker系列结束-新的开始K8S 标签(空格分隔): docke k8s Docker系列结束 上一篇讲到使用docker官方提供的容器编排工具docker-compose,但是docker-compose强调的是单机机进行容器编排,使用起来比较受限,对于一些大公司,应用不是部署在一台机器上的,在这种情况下,Docker-compose就无能为力了,在这样的情况下,需要使用集群容器编排工具,比如,google的Kubernetes(k8s),官方提供的Docker S

GigaOm市场报告全球第一的K8S存储平台Portworx发布Essentials免费版本

GigaOm市场报告全球第一的K8S存储平台Portworx发布Essentials免费版本!GigaOm最新发布了Kubernetes数据存储平台的市场报告:Portworx被评为全球第一的数据存储平台. 报告链接: https://ask.portworx.com/portworx-number-one-data-storage-platform-kubernetes-report/?utm_medium=website&utm_source=blog&utm_campaign=202

Canonical 开源 MicroK8 | 云原生生态周报 Vol. 25

作者 | 天元.进超.衷源 业界要闻 1.Canonical 开源 MicroK8 面向工作站和边缘/物联网的零运维 Kubernetes!MicroK8 是 Canonical 提供的一款功能强大的企业级 Kubernetes 发行版,我们认为它是市面上最小巧最快速的多节点 Kubernetes. 2.2019 中国开源年会即将开启 2019 中国开源年会(COSCon'19)为业界最具影响力的开源年度盛会,将于 11 月 2 日至 3 日在华东师范大学?(上海普陀区中山北路校区)由开源社举办

生产安全管理解决方案

一.方案概述 生产安全管理是企业生产管理的重要组成部分,组织实施好企业安全管理规划.指导.检查和决 策,保证生产处于最佳安全状态是安全管理的重要内容和职责. H3 BPM企业生产安 全管理解决方案是一套专门为企业安全生产运作管理和监督提供信息决策支持服务的管理平台,方案以实际生产需求为指导,以流程管理为 基础,采用PDCA闭环控制,引入80/20理论.系统原理.整分合原理.封闭原理和反馈原理等思想理念,分析 了OHSAS18001标准.安全标准 化的各管理要素要求,适用于OHSAS18001体系

Kubernetes(k8s)生产级实践指南 从部署到核心应用

第1章 课程简介[学前须知]本章对这门课程进行说明,包括:课程整体设计思路.课程使用的技术介绍.课程的学习规划.高效学习的方式方法等. 第2章 kubernetes快速入门[k8s必知必会]本章中将从核心概念.架构设计.认证授权以及集群搭建方案对比几方面,带领大家快速掌握kubernetes的重要知识点,助力快速入门. 第3章 高可用集群搭建---kubeadm方式[集群落地方案1]本章中将讲解,如何使用kubeadm自动化的方式,搭建最新版本的kubernetes高可用集群.以三个master

生产环境二进制k8s集群扩容node节点的实践

K8s二进制生产环境扩容node节点由于项目微服务也是部署在k8s集群中去维护的,所以扩容node节点也是必要的联系,扩容node节点一定要保证你整个集群的容器环境的网络都是互通的,这也是很重要的一步,这里我根据自己的经验去扩容,仅供参考首先我这里是安装的二进制方式去部署的k8s集群,进行扩容node的时候,也是非常方便的扩容node节点分为两步,第一步先将我们旧的node节点上的配置先去拷贝到我们新的节点上,第二点就是将我们的容器网络环境打通这里我是直接扩容两个node节点.第一步: 我们先去