如何為K8S生產系統配置安全管理?
1. 同一名稱空間中的使用者可以受到其角色的限制,比如他們可以具有讀、寫、管理員或其他定義的訪問許可權。
2. 使用者可以透過Token自動進行身份驗證,這樣審計請求的授權就可以針對特定名稱空間來進行。
3. 可以將使用者置於基於租戶的名稱空間中,從而為訪問PVCs提供安全的多租戶。
4. 即使使用者看到儲存類,也不意味著他們被授權建立PVC。
5. 將Portworx RBAC與加密一起使用,意味著資料在host上是安全的,名稱空間內的非授權使用者不能訪問資料。
6. 如果一個請求來自Kubernetes外部而沒有Token,它將被阻止。
首先,Portworx透過使用Token支援RBAC。在本文中,PX-Security將使用儲存在Kubernetes Secrets中的Token,這些Token提供了最靈活的操作,且不犧牲任何安全性。
讓我們來配置PX-Security來達到安全性。請訪問 ,
點選安裝並執行。填寫安裝程式要求的資訊,完成後下載你的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 3m54sportworx-hwrxh 1/1 Running 0 3m54sportworx-rbqzk 1/1 Running 0 3m54s
使用者和Token
我們需要定義幾個使用者併為他們生成Token。通常,這些使用者有分配給他們的屬性,這些屬性定義了他們的使用者型別。
首先,我們將建立一個儲存管理員,該管理員具有全部許可權。這樣的管理員應該只有一兩個。
使用以下內容建立一個名為admin.yaml的檔案:
name: Storage Administratoremail: storageadmin@example.comsub: storageadmin@example.com/storageadmin roles: ["system.admin"]groups: ["*"]
接下來,我們將建立一個Kubernetes使用者,該使用者作為一個驗證客戶,Kubernetes允許該使用者與Portworx互動,並且這些請求來自Kubernetes。您的儲存管理員需要設定此使用者。
使用以下內容建立一個名為kubernetes.yaml的檔案:
name: Kubernetesemail: kubernetes@local.netsub: kubernetes@local.net/kubernetes roles: ["system.user"]groups: ["kubernetes"]
最後,我們將建立一個僅能看 (view-only) 許可權的使用者,用於演示Portworx如何限制對底層資料管理API的訪問。
使用以下內容建立一個名為viewer.yaml的檔案:
name: Vieweremail: viewer@example.comsub: viewer@example.com/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 myvolVolumeCreate: 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: 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,請確保設定其他的引數。
注意:這目前只在透過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: PersistentVolumeClaimapiVersion: 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: tenant@tenant-a.comsub: tenant@tenant-a.com/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: 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
請注意 ${pvc.namespace}。這將確保CSI控制器獲得正確的Token,該Token與PVC的名稱空間相關聯。您現在就有了一個基於Token身份驗證的多租戶解決方案。
我們在本Blog中有一部分沒有介紹的PX-Security功能就是Portworx卷的加密。您可以在這裡(how to work with Encrypted PVCs)檢視更多的關於PVC加密的文件 。您可以將Portworx RBAC與卷加密結合使用,來使Kubernetes中的資料更加安全。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69950566/viewspace-2674490/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SMT生產管理系統(E-PMS)
- 安全生產勞保穿戴監測系統
- 服裝生產管理軟體鞋帽生產系統的優點
- 築牢安全生產防線:AI智慧分析技術如何賦能企業安全生產管理?AI
- 製造業MES生產管理系統原始碼原始碼
- 安全生產作業現場違規行為識別預警系統
- 服裝生產製作型企業如何選擇ERP管理系統
- Laravel 生產實踐:為個人網站配置谷歌 reCAPTCHA 身份驗證系統Laravel網站谷歌APT
- ERP系統是如何提高生產效率的?
- 學生管理系統
- 集團施工企業安全生產費用數字化管理系統解決方案
- MES製造執行系統生產計劃管理
- 深圳公司精益生產融入安全管理
- 非生產系統如何完成精益轉型?
- Spring中如何為屬性配置檔案自動產生文件?Spring
- 精益生產管理系統,適合的才是最好的!
- 學生管理系統(springMVC)SpringMVC
- 如何配置伺服器的系統服務安全伺服器
- 在Linux中,如何配置和管理系統服務?Linux
- 生產車間如何做好精益生產管理培訓
- “安全生產月”專題報導:AI智慧監控技術如何助力安全生產AI
- 2020年危險化學品生產單位安全生產管理人員考試題及危險化學品生產單位安全生產管理人員答案解析
- 2021年危險化學品生產單位安全生產管理人員答案解析及危險化學品生產單位安全生產管理人員新版試題
- 【C++】學生管理系統C++
- JAVA學生宿舍管理系統Java
- ERP系統如何發揮作用,提高企業生產力?
- 如何從豐田生產系統的原則中受益?
- IT職場:如何系統地開展精益生產工作?
- 生產工時管理系統:提高效率的秘訣
- 杭州ERP生產管理系統開發的應用與優勢
- 生產型ERP管理系統 建設企業數字化工廠
- 2021年危險化學品生產單位安全生產管理人員證考試及危險化學品生產單位安全生產管理人員模擬考試題
- Python簡易學生管理系統Python
- (十)ArrayList&&學生管理系統
- ERP系統助力企業合理制定生產計劃,排產化繁為簡
- APS高階計劃排程系統和生產排產系統
- 房產中介管理ERP系統
- 使用nacos作為配置中心統一管理配置