溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何為K8S生產(chǎn)系統(tǒng)配置安全管理

發(fā)布時(shí)間:2021-11-26 14:53:38 來源:億速云 閱讀:135 作者:柒染 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)如何為K8S生產(chǎn)系統(tǒng)配置安全管理,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

PX-Security:針對(duì)Kubernetes持久卷的多租戶授權(quán)、身份驗(yàn)證和RBAC
如何為K8S生產(chǎn)系統(tǒng)配置安全管理
安全對(duì)于企業(yè)來說至關(guān)重要,對(duì)于運(yùn)行在Kubernetes上的基于微服務(wù)的應(yīng)用來說更是如此。Kubernetes提供RBAC授權(quán),根據(jù)不同角色設(shè)定,管理Kubernetes內(nèi)部特定資源的訪問權(quán)限。這些機(jī)制對(duì)于管理Kubernetes的特定對(duì)象(如服務(wù)、命名空間、配額等)的訪問權(quán)限非常有用。但命名空間和pod的安全策略本身,不足以限制誰(shuí)有權(quán)限可以請(qǐng)求更改底層數(shù)據(jù)管理系統(tǒng)。許多企業(yè)通過CNI或CSI等API,調(diào)用其他的平臺(tái)能力來提供網(wǎng)絡(luò)和存儲(chǔ)基礎(chǔ)。Kubernetes所缺乏的是將RBAC擴(kuò)展到這些系統(tǒng)的能力,需要外部系統(tǒng)來確保授權(quán)和認(rèn)證功能的實(shí)現(xiàn)。這就是為什么Portworx與Kubernetes攜手,通過對(duì)支撐Kubernetes中PVCs的持久卷,進(jìn)行訪問角色控制,來提供RBAC、加密和控制權(quán)限,這將創(chuàng)建一個(gè)無(wú)縫的保護(hù)層,為您的PVCs提供以下保護(hù):

1.     同一命名空間中的用戶可以受到其角色的限制,比如他們可以具有讀、寫、管理員或其他定義的訪問權(quán)限。

2.     用戶可以通過Token自動(dòng)進(jìn)行身份驗(yàn)證,這樣審計(jì)請(qǐng)求的授權(quán)就可以針對(duì)特定命名空間來進(jìn)行。

3.     可以將用戶置于基于租戶的命名空間中,從而為訪問PVCs提供安全的多租戶。

4.     即使用戶看到存儲(chǔ)類,也不意味著他們被授權(quán)創(chuàng)建PVC。

5.     將Portworx RBAC與加密一起使用,意味著數(shù)據(jù)在host上是安全的,命名空間內(nèi)的非授權(quán)用戶不能訪問數(shù)據(jù)。

6.     如果一個(gè)請(qǐng)求來自Kubernetes外部而沒有Token,它將被阻止。

要深入了解Portworx能為您的Kubernetes平臺(tái)提供什么,可以查看Portworx網(wǎng)站上的安全參考體系架構(gòu)。我們將重點(diǎn)討論一些主題,比如如何設(shè)置PX-Security,以及如何使用Token對(duì)具有相應(yīng)持久卷訪問權(quán)限的角色用戶進(jìn)行身份驗(yàn)證。

首先,Portworx通過使用Token支持RBAC。在本文中,PX-Security將使用存儲(chǔ)在Kubernetes Secrets中的Token,這些Token提供了最靈活的操作,且不犧牲任何安全性。

如何為K8S生產(chǎn)系統(tǒng)配置安全管理
開始吧!在我們討論什么是Token以及如何使用它之前,有一點(diǎn)需要注意,對(duì)Portworx的每個(gè)請(qǐng)求都是使用存儲(chǔ)在Token中的信息進(jìn)行身份驗(yàn)證和授權(quán)的。其中包含關(guān)于用戶及其角色所需所有相關(guān)的驗(yàn)證和簽名的信息。因此,我們配置了PX-Security后,我們會(huì)創(chuàng)建Token。

讓我們來配置PX-Security來達(dá)到安全性。請(qǐng)?jiān)L問 https://central.portworx.com,

點(diǎn)擊安裝并運(yùn)行。填寫安裝程序要求的信息,完成后下載你的YAML文件,將文件保存以便后續(xù)做編輯。

接下來,我們將創(chuàng)建用于PX-Security的安全共享的Secrets。我們必須首先創(chuàng)建這些共享的Secrets,因?yàn)榇鎯?chǔ)管理員將使用它們來生成和驗(yàn)證Token。出于安全原因,這些數(shù)據(jù)被存儲(chǔ)在Kube-system命名空間中的Kubernetes Secrets中,只有少量的管理員和應(yīng)用程序可以訪問該命名空間。

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)

運(yùn)行以下命令將這些值放入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

您可以使用以下命令測(cè)試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下。這里我們將添加安全參數(shù)(粗體)和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部署和編輯環(huán)境以包含我們的共享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

完成這兩個(gè)步驟后,保存YAML文件?,F(xiàn)在,我們需要?jiǎng)?chuàng)建我們?cè)赑ortworx安裝YAML中引用的共享Secret。

接下來,使用下載和編輯過的YAML文件創(chuàng)建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          3m54sportworx-hwrxh   1/1 Running 0          3m54sportworx-rbqzk   1/1 Running 0          3m54s

用戶和Token

我們需要定義幾個(gè)用戶并為他們生成Token。通常,這些用戶有分配給他們的屬性,這些屬性定義了他們的用戶類型。

首先,我們將創(chuàng)建一個(gè)存儲(chǔ)管理員,該管理員具有全部權(quán)限。這樣的管理員應(yīng)該只有一兩個(gè)。

使用以下內(nèi)容創(chuàng)建一個(gè)名為admin.yaml的文件:

name: Storage Administratoremail: storageadmin@example.comsub: storageadmin@example.com/storageadmin
roles: ["system.admin"]groups: ["*"]

接下來,我們將創(chuàng)建一個(gè)Kubernetes用戶,該用戶作為一個(gè)驗(yàn)證客戶,Kubernetes允許該用戶與Portworx交互,并且這些請(qǐng)求來自Kubernetes。您的存儲(chǔ)管理員需要設(shè)置此用戶。

使用以下內(nèi)容創(chuàng)建一個(gè)名為kubernetes.yaml的文件:

name: Kubernetesemail: kubernetes@local.netsub: kubernetes@local.net/kubernetes
roles: ["system.user"]groups: ["kubernetes"]

最后,我們將創(chuàng)建一個(gè)僅能看 (view-only) 權(quán)限的用戶,用于演示Portworx如何限制對(duì)底層數(shù)據(jù)管理API的訪問。

使用以下內(nèi)容創(chuàng)建一個(gè)名為viewer.yaml的文件:

name: Vieweremail: viewer@example.comsub: viewer@example.com/viewer
roles: ["system.view"]groups: ["viewers"]

注意:Sub標(biāo)記是該用戶的唯一標(biāo)識(shí)符,根據(jù)JWT標(biāo)準(zhǔn),不能與其他Token共享。這個(gè)值被Portworx用來跟蹤資源的所有權(quán)。如果電子郵件也用作唯一Sub標(biāo)識(shí)符,請(qǐng)確保它不被任何其他Token使用。

請(qǐng)注意:有一個(gè)用戶的角色是system.admin,另一個(gè)用戶的角色是system.user,最后一個(gè)用戶的角色是system.view。這些角色在PX-Security中是默認(rèn)的,但也可以根據(jù)需要?jiǎng)?chuàng)建其他角色。我們來演示用戶如何使用Portworx資源,如創(chuàng)建或刪除卷。這跟該用戶在Kubernetes RBAC的配置無(wú)關(guān)。

也就是說,具有system.view的用戶也許能夠在Kubernetes中內(nèi)列出和創(chuàng)建PVC對(duì)象,但如果他們?cè)噲D直接使用Portworx創(chuàng)建卷,將會(huì)失敗。我們還將演示,為什么能夠創(chuàng)建PVC對(duì)象的用戶在此安全模式中實(shí)際上無(wú)法獲得PV,除非該用戶擁有由存儲(chǔ)管理員配置的有效Token,來驗(yàn)證其角色和權(quán)限。

配置好了這些具備相關(guān)權(quán)限的用戶,我們就可以使用我們的共享Secret和Portworx客戶端工具pxctl,為這些用戶生成自簽名證書。

注意:您可以創(chuàng)建自己的應(yīng)用來生成Token,也可以基于我們的開源golang示例程序openstorage-sdk-auth

在這個(gè)場(chǎng)景中,我們將使用共享Secret和pxctl auth token generate命令。讓我們?yōu)樯鲜鰞蓚€(gè)用戶創(chuàng)建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節(jié)點(diǎn),這樣就可以使用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創(chuàng)建admin Token。

注意:確保將auth_config文件和PORTWORX_AUTH_SHARED_SECRET 復(fù)制到正在使用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

現(xiàn)在我們已經(jīng)創(chuàng)建了用戶環(huán)境(Context),比如Portworx的Kubectl環(huán)境,來供兩個(gè)用戶使用,我們可以作為其中一個(gè)用戶與Portworx系統(tǒng)進(jìn)行交互。

注意,您可以使用$pxctl contextlist列出所有環(huán)境:

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

發(fā)生了什么?請(qǐng)記住,我們?yōu)榫哂衧ystem.view角色的Viewer設(shè)置了用戶環(huán)境。這是Portworx的默認(rèn)角色,只能運(yùn)行只讀命令,不具備寫操作的權(quán)限,因此訪問被拒絕。

如何與Kubernetes一起使用?

為了讓Kubernetes的用戶使用PX-Security,用戶必須在向集群發(fā)出請(qǐng)求時(shí)使用自己的Token。一種方法是讓管理員在Kubernetes存儲(chǔ)類中配置Token。管理員可以在Portworx命名空間中名為px-k8-user的Secret中設(shè)置保存Secret Token。

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

如果您正在使用CSI,請(qǐng)確保設(shè)置其他的參數(shù)。

注意:這目前只在通過Portworx使用CSI時(shí)有效。

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

完成此操作后,具備訪問存儲(chǔ)類權(quán)限的用戶可以創(chuàng)建卷。

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

多租戶架構(gòu)

當(dāng)您創(chuàng)建上述PVC時(shí),它將使用KubernetesToken作為用戶進(jìn)行身份驗(yàn)證,從而確保該Kubernetes用戶是發(fā)出請(qǐng)求的用戶。這很好,但是多租戶環(huán)境下,他們都可以使用存儲(chǔ)類,因此我們需要一種方法來在不同的命名空間中使用多租戶的Token。這是因?yàn)镵ubernetes提供了使用命名空間隔離帳戶資源的好方法,但您需要更安全的多租戶解決方案。Portworx可以通過為應(yīng)用存儲(chǔ)卷添加訪問控制來達(dá)到多租戶安全管理。使用PX-Security進(jìn)行多租戶管理,可以執(zhí)行以下操作。

首先,為租戶創(chuàng)建一個(gè)命名空間。

$ kubectl create namespace tenant-a-ns

使用以下創(chuàng)建一個(gè)名為tenant-a.yaml 的文件:

name: tenant-a
email: tenant@tenant-a.comsub: tenant@tenant-a.com/tenant
roles: ["system.user"]groups: ["developers"]

使用tenant-name.yaml為Kubernetes創(chuàng)建一個(gè)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保存在一個(gè)名為<tenant namespace>/px-k8 -user的Secret中:

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

現(xiàn)在可以設(shè)置Kubernetes存儲(chǔ)類,通過使用這個(gè)Secret,來獲得Token權(quán)限,并與Portworx開始通訊。

下面的CSI存儲(chǔ)類一旦創(chuàng)建,將使您的多租戶能夠使用存儲(chǔ)在其命名空間中的Secret中的Token,來創(chuàng)建卷,方法是在命名空間中查找Secret。在使用CSI時(shí),存儲(chǔ)類將引用三種受支持操作的secret:provision, node-publish(mount/unmount), and controller-expand。

apiVersion: storage.k8s.io/v1
kind: StorageClassmetadata:
  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

請(qǐng)注意 ${pvc.namespace}。這將確保CSI控制器獲得正確的Token,該Token與PVC的命名空間相關(guān)聯(lián)。您現(xiàn)在就有了一個(gè)基于Token身份驗(yàn)證的多租戶解決方案。

我們?cè)诒綛log中有一部分沒有介紹的PX-Security功能就是Portworx卷的加密。您可以在這里(how to work with Encrypted PVCs)查看更多的關(guān)于PVC加密的文檔 。您可以將Portworx RBAC與卷加密結(jié)合使用,來使Kubernetes中的數(shù)據(jù)更加安全。

關(guān)于如何為K8S生產(chǎn)系統(tǒng)配置安全管理就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

k8s
AI