主頁 > 作業系統 > 005.OpenShift訪問控制-權限-角色

005.OpenShift訪問控制-權限-角色

2020-09-16 00:18:21 作業系統

一 Kubetcl namespace

1.1 namespace描述

Kubernetes namespace提供了將一組相關資源組合在一起的機制,在Red Hat OpenShift容器平臺中,project是一個帶有附加注釋的Kubernetes namespace, namespace提供以下特性:
  1. 命名資源,以避免基本的命名沖突;
  2. 將管理權限授予受信任的用戶;
  3. 限制用戶資源消耗的能力;
  4. 用戶和用戶組隔離,

1.2 project

project提供了一種機制,通過這種機制可以管理普通用戶對資源的訪問,project允許一組用戶獨立于其他組組織和管理其內容,必須允許用戶訪問專案,如果允許創建專案,用戶將自動訪問自己的專案, 專案可以有單獨的name、display name和description, name是專案的唯一識別符號,在使用CLI工具或API時都是基于name,name的最大長度為63個字符, display name是專案在web控制臺中顯示的方式(默認為name), description是專案的更詳細描述,并且在web控制臺中也可見, 以下組件適用于專案:
  • Object:pod、service、rc等;
  • Policies:決定用戶可以或不能對物件執行哪些操作的規則;
  • Constraints:可以限制的每種物件的配額,

1.3 cluster管理

集群管理員可以創建專案并將專案的管理權限委托給任何用戶,在OpenShift容器平臺中,專案用于對相關物件進行分組和隔離, 管理員可以讓用戶訪問某些專案,允許他們創建自己的專案,并在單個專案中賦予他們管理權限, 管理員可以將角色應用于允許或限制其創建專案能力的用戶和組,同時可以在用戶初始登錄之前分配角色, 限制專案創建:從通過身份驗證的用戶和組中洗掉self-provisioning集群角色,將拒絕任何新專案的權限, [root@master ~]$ oc adm policy remove-cluster-role-from-group \ self-provisioner \ system:authenticated \ system:authenticated:oauth 授予專案創建:專案創建授予具有self-供應者角色和self-provisione集群角色系結的用戶,默認情況下,所有經過身份驗證的用戶都可以使用這些角色, [root@master ~]$ oc adm policy add-cluster-role-to-group \ self-provisioner \ system:authenticated \ system:authenticated:oauth

1.4 創建project

如果專案創建權限被授予用戶,則可以使用oc命令創建project, [root@master ~]$ oc new-project demoproject \ --description="Demonstrate project creation" \ --display-name="demo_project"

二 OpenShift角色

2.1 角色概述

role具有不同級別的訪問和策略,包括集群和本地策略,user和group可以同時與多個role關聯,運行oc description命令查看角色及其系結的詳細資訊, 在集群策略中具有cluster-admin預設角色的用戶可以查看集群策略和所有本地策略,在給定的本地策略中具有admin預設角色的用戶可以基于per-project查看策略, 可通過以下命令查看當前的集群系結集,其中顯示系結到不同角色的用戶和組, [root@demo ~]# oc describe clusterPolicyBindings :default

2.2 查看本地policy

盡管本地角色串列及其關聯的規則集在本地策略中是不可查看的,但是所有預設角色仍然適用,并且可以添加到用戶或組中,cluster-admin預設角色除外,但是,本地系結是可見的, 可通過以下命令查看當前的本地系結,其中顯示系結到不同角色的用戶和組, [root@demo ~]# oc describe policyBindings :default 提示:默認情況下,在本地策略中,只會列出admin角色的系結,但是,如果將其他默認角色添加到本地策略中的用戶和組,也會列出它們,

2.3 管理role系結

向用戶或組添加或系結角色,從而實作向用戶或組提供角色授予的相關訪問權限,可以使用oc adm policy命令在用戶和組之間添加和洗掉角色, 當使用以下操作管理本地策略的用戶和組角色時,可以使用-n選項指定專案,如果沒有指定,則使用當前專案, 常見管理本地策略操作:
命令 描述
oc adm policy who-can verb resource 設定哪些用戶可以對資源執行操作
oc adm policy add-role-to-user role username 將指定角色系結到指定用戶
oc adm policy remove-role-from-user role username 從指定用戶中移除給定角色
oc adm policy remove-user username 洗掉指定的用戶及其所有角色
oc adm policy add-role-to-group role groupname 將指定的角色系結到指定的組
oc adm policy remove-role-fromgroup role groupname 從指定組中移除給定角色
oc adm policy remove-group groupname 洗掉指定的組及其所有角色
還可以使用如下所示的的操作管理cluster policy的role binding,這類命令不需要-n選項,因為cluster policy不在namespace級別上操作, 常見管理cluster policy操作:
命令 描述
oc adm policy add-cluster-role-to-user role username 將集群中所有專案的指定角色系結到指定用戶
oc adm policy remove-cluster-role-from-user role username 為集群中的所有專案從指定用戶中洗掉指定角色
oc adm policy add-cluster-role-togroup role groupname 為集群中的所有專案將指定的角色系結到指定的組
oc adm policy remove-cluster-role-from-group role groupname 從集群中所有專案的指定組中移除給定角色
提示:oc policy命令應用于當前專案,而oc adm policy命令應用于集群范圍的操作, 示例:在example專案中為developer用戶提供admin角色, [root@demo ~]# oc adm policy add-role-to-user admin developer -n example [root@demo ~]# oc describe policybindings :default -n example #檢查系結

三 安全背景關系約束(SCCS)

3.1 SCCS概述

OpenShift提供安全背景關系約束(SCCS),它控制pod可以執行的操作和它可以訪問的資源,默認情況下,任何容器的執行都只授予受限制的SCC定義的功能, SCCS相關命令:
  1 [user@demo ~]$ oc get scc			                        #列出可用的SCC
  2 [user@demo ~]$ oc describe scc scc_name		                #現實特定SCC詳細資訊
  3 [user@demo ~]$ oc adm policy add-scc-to-user scc_name user_name
  4 [user@demo ~]$ oc adm policy add-scc-to-group scc_name group_name	#要授予用戶或組特定的SCC
  5 [user@demo ~]$ oc adm policy remove-scc-from-user scc_name user_name
  6 [user@demo ~]$ oc adm policy remove-scc-from-group scc_name group_name	#從特定的SCC中洗掉用戶或組

四 服務賬戶

4.1 服務賬戶

service account提供了一種靈活的方法來控制API訪問,而無需共享常規用戶的憑據,如果應用程式需要訪問受限制的SCC未授予的功能,可創建一個新的、特定的service account并將其添加到適當的SCC中, 例如,在預設情況下,OpenShift不支持部署需要提升特權的應用程式,若有此需求,可創建一個service account,修改dc,然后添加service account至SCC, 示例:將anyuid配置為在容器中作為root用戶運行, [user@demo ~]$ oc create serviceaccount useroot #創建一個名為useroot的新服務帳戶 [user@demo ~]$ oc patch dc/demo-app \ --patch '{"spec":{"template":{"spec":{"serviceAccountName": "useroot"}}}}' #修改應用程式的DC [user@demo ~]$ oc adm policy add-scc-to-user anyuid -z useroot #將useroot服務帳戶添加到anyuid SCC中,作為容器中的根用戶運行

4.2 Web管理user成員

OCP平臺的默認配置是,在用戶首次登錄成功時,自動創建該用戶物件, 要管理允許訪問專案的用戶,請以專案管理員或集群管理員的身份登錄到web控制臺,并選擇要管理的專案,在左側窗格中,單擊Resources——>membership進入專案member頁面, 在Users列中,在突出顯示的文本框中輸入用戶名,在“添加另一個角色”列中,從用戶所在行的串列中選擇一個角色,然后單擊“添加”,

4.3 Cli管理user成員

CLI中如果自動創建物件功能被關閉,集群管理員可通過如下方式創建新用戶: [root@master ~]$ oc create user demo-user 同時還需要在身份認證軟體中創建用戶,如為HTPasswdIdentityProvider才用戶命令如下: [root@master ~]$ htpasswd /etc/origin/openshift-passwd demo-user 要向用戶添加專案角色,首先使用oc project命令輸入專案,然后使用oc policy add-role-to-user命令: [root@master ~]$ oc policy add-role-to-user edit demo-user 要從用戶中洗掉專案角色,使用oc policy remove-role-from-user命令: [root@master ~]$ oc policy remove-role-from-user edit demo-user 并不是所有OpenShift角色都由專案限定范圍,要分配這些規則,請使用oc adm policy command命令, [root@master ~]$ oc adm policy add-cluster-role-to-user cluster-admin admin

4.4 身份驗證和授權

身份驗證層標識與對OpenShift容器平臺API的請求相關聯的用戶,然后授權層使用關于請求用戶的身份資訊來確定是否應該允許該請求,
  • user和group
OCP容器平臺中的用戶是一個可以向OpenShift API發出請求的物體,通常,這表示與OpenShift互動的develop或administrator的帳戶, 可以將用戶分配給一個或多個組,每個組表示一組特定的角色(或權限),當需要通過管理授權策略給多個客戶授權時候,group會比較合適,例如允許訪問專案中的物件,而不是單獨授予用戶,
  • Authentication Tokens
API呼叫必須使用訪問令牌或X.509證書進行身份驗證,會話token表示用戶,并且是短期的,默認情況下在24小時內到期, 可以通過運行oc whoami命令來驗證經過身份驗證的用戶, [root@master ~]$ oc login -u demo-user [root@master ~]$ oc whoami demo-user

4.5 身份驗證型別

本環境中,身份驗證由HTPasswdIdentityProvider模塊提供,該模塊根據使用htpasswd命令生成的檔案驗證用戶名和密碼, OpenShift容器平臺支持的其他認證型別包括:
  • Basic Authentication (Remote)
一種通用的后端集成機制,允許用戶使用針對遠程標識提供者驗證的憑據登錄到OpenShift容器平臺,用戶將他們的用戶名和密碼發送到OpenShift容器平臺,OpenShift平臺通過到服務器的請求驗證這些憑據,并將憑據作為基本的Auth頭傳遞,這要求用戶在登錄程序中向OpenShift容器平臺輸入他們的憑據,
  • Request Header Authentication
用戶使用請求頭值(如X-RemoteUser)登錄到OpenShift容器平臺,它通常與身份驗證代理結合使用,身份驗證代理對用戶進行身份驗證,然后通過請求頭值為OpenShift容器平臺提供用戶標識,
  • Keystone Authentication
Keystone是一個OpenStack專案,提供標識、令牌、目錄和策略服務,OpenShift容器平臺與Keystone集成,通過配置OpenStack Keystone v3服務器將用戶存盤在內部資料庫中,從而支持共享身份驗證,這種配置允許用戶使用Keystone憑證登錄OpenShift容器平臺,
  • LDAP Authentication
用戶使用他們的LDAP憑證登錄到OpenShift容器平臺,在身份驗證期間,LDAP目錄將搜索與提供的用戶名匹配的條目,如果找到匹配項,則嘗試使用條目的專有名稱(DN)和提供的密碼進行簡單系結,
  • GitHub Authentication
GitHub使用OAuth,它允許與OpenShift容器平臺集成使用OAuth身份驗證來促進令牌交換流,這允許用戶使用他們的GitHub憑證登錄到OpenShift容器平臺,為了防止使用GitHub用戶id的未授權用戶登錄到OpenShift容器平臺集群,可以將訪問權限限制在特定的GitHub組織中,

五 管理專案及賬戶

5.1 前置準備

準備完整的OpenShift集群,參考《003.OpenShift網路》2.1,

5.2 本練習準備

[student@workstation ~]$ lab secure-resources setup

5.3 創建htpasswd賬戶

  1 [kiosk@foundation0 ~]$ ssh root@master
  2 [root@master ~]# htpasswd -b /etc/origin/master/htpasswd user1 redhat
  3 [root@master ~]# htpasswd -b /etc/origin/master/htpasswd user2 redhat
  4 #添加基于htpasswd形式的user1和user2,密碼都為redhat,

5.4 設定策略

  1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com	#使用管理員登錄
  2 [student@workstation ~]$ oc adm policy remove-cluster-role-from-group \
  3 self-provisioner system:authenticated:oauth
  4 #洗掉所有賦予普通創建專案的功能,該命令可參考本環境如下目錄中的命令,
  5 [student@workstation ~]$ cat /home/student/DO280/labs/secure-resources/configure-policy.sh
  6 #!/bin/bash
  7 oc adm policy remove-cluster-role-from-group \
  8     self-provisioner system:authenticated system:authenticated:oauth

5.5 驗證策略

  1 [student@workstation ~]$ oc login -u user1 -p redhat https://master.lab.example.com	#使用普通用戶user1登錄
  2 [student@workstation ~]$ oc new-project test					#測驗創建project
  3 Error from server (Forbidden): You may not request a new project via this API.

5.6 創建專案

  1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com	#使用集群管理員登錄
  2 [student@workstation ~]$ oc new-project project-user1				#創建兩個專案
  3 [student@workstation ~]$ oc new-project project-user2

5.7 將專案與user關聯

  1 #選擇專案1
  2 Now using project "project-user1" on server "https://master.lab.example.com:443".
  3 [student@workstation ~]$ oc policy add-role-to-user admin user1		#將user1添加為專案1的管理員
  4 role "admin" added: "user1"
  5 [student@workstation ~]$ oc policy add-role-to-user edit user2		#將user2添加為專案1的開發員
  6 role "edit" added: "user2"
  7 
  8 [student@workstation ~]$ oc project project-user2			        #選擇專案2
  9 Now using project "project-user2" on server "https://master.lab.example.com:443".
 10 [student@workstation ~]$ oc policy add-role-to-user edit user2		#將user2添加為專案2的開發員
 11 role "edit" added: "user2"

5.8 驗證訪問

  1 [student@workstation ~]$ oc login -u user1 -p redhat https://master.lab.example.com	#使用user1登錄
  2 [student@workstation ~]$ oc project project-user1					#驗證專案1的訪問
  3 Already on project "project-user1" on server "https://master.lab.example.com:443".
  4 [student@workstation ~]$ oc project project-user2					#驗證專案2的訪問
  5 error: You are not a member of project "project-user2".
  6 You have one project on this server: project-user1
  7 
  8 [student@workstation ~]$ oc login -u user2 -p redhat https://master.lab.example.com	#使用user2登錄
  9 [student@workstation ~]$ oc project project-user1
 10 Already on project "project-user1" on server "https://master.lab.example.com:443".	#驗證專案1的訪問
 11 [student@workstation ~]$ oc project project-user2
 12 Now using project "project-user2" on server "https://master.lab.example.com:443".	#驗證專案2的訪問

5.9 部署特權應用

  1 [student@workstation ~]$ oc login -u user2 -p redhat https://master.lab.example.com
  2 [student@workstation ~]$ oc project project-user1
  3 Now using project "project-user1" on server "https://master.lab.example.com:443".
  4 [student@workstation ~]$ oc new-app --name=nginx --docker-image=registry.lab.example.com/nginx:latest
  5 #使用在專案1上不具備admin權限的用戶user2登錄,并部署應用,會出現如下提示:
clipboard

5.10 驗證部署

  1 [student@workstation ~]$ oc get pods
clipboard 結論:由上可知,部署失敗是因為容器映像需要root用戶,pod以CrashLoopBackOff或錯誤狀態結束,

5.11 故障排除

若要解決此故障需要減少特定專案的安全限制, 要使用特權訪問運行容器,可創建一個允許pod使用作業系統普通用戶運行的service account, 如下部分需要具有專案管理員特權的用戶執行,而另一些操作需要具有集群管理員特權的用戶執行, 本環境中,相關操作命令可以從/home/student/DO280/labs/secure-resources檔案夾中的configure-sc.sh腳本運行或復制,
  1 [student@workstation ~]$ oc login -u user1 -p redhat https://master.lab.example.com	#使用專案1的admin賬戶登錄 
  2 [student@workstation ~]$ oc create serviceaccount useroot		  #創建服務賬戶
  3 serviceaccount "useroot" created
  4 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com	#使用集群管理員登錄
  5 [student@workstation ~]$ oc project project-user1			  #選擇專案1
  6 Already on project "project-user1" on server "https://master.lab.example.com:443".
  7 [student@workstation ~]$ oc adm policy add-scc-to-user anyuid -z useroot  #設定SCC策略
  8 scc "anyuid" added to: ["system:serviceaccount:project-user1:useroot"]    #將服務帳戶與anyuid安全背景關系關聯,此操作需要集群管理員用戶,
  9 [student@workstation ~]$ oc login -u user2 -p redhat https://master.lab.example.com	#切換user2用戶
 10 [student@workstation ~]$ oc project project-user1
 11 Already on project "project-user1" on server "https://master.lab.example.com:443".
 12 [student@workstation ~]$ oc patch dc nginx --patch='{"spec":{"template":{"spec":{"serviceAccountName": "useroot"}}}}'
#更新負責管理nginx的dc資源,任何開發人員用戶都可以執行此操作,本環境中,相關操作命令可以從/home/student/DO280/labs/secure-resources檔案夾中的configure-sc.sh腳本運行或復制,

5.12 驗證確認

  1 [student@workstation ~]$ oc get pods
  2 NAME            READY     STATUS    RESTARTS   AGE
  3 nginx-2-98k8f   1/1       Running   0          3m
  4 

5.13 暴露服務

  1 [student@workstation ~]$ oc expose svc nginx
  2 route "nginx" exposed
  3 [student@workstation ~]$ oc get svc
  4 NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
  5 nginx     ClusterIP   172.30.118.63   <none>        80/TCP    13m
  6 [student@workstation ~]$ oc get route
  7 NAME      HOST/PORT                                  PATH      SERVICES   PORT      TERMINATION   WILDCARD
  8 nginx     nginx-project-user1.apps.lab.example.com             nginx      80-tcp                  None

5.14 測驗訪問

  1 [student@workstation ~]$ curl -s http://nginx-project-user1.apps.lab.example.com

5.15 策略洗掉演示

  1 [student@workstation ~]$ oc login -u admin -p redhat
  2 [student@workstation ~]$ oc adm policy add-cluster-role-to-group self-provisioner system:authenticated system:authenticated:oauth
  3 cluster role "self-provisioner" added: ["system:authenticated" "system:authenticated:oauth"]
  4 [student@workstation ~]$ oc delete project project-user1
  5 project "project-user1" deleted
  6 [student@workstation ~]$ oc delete project project-user2
  7 [root@master ~]# htpasswd -D /etc/origin/master/htpasswd user1 
  8 [root@master ~]# htpasswd -D /etc/origin/master/htpasswd user2
#為所有常規用戶重新啟用專案創建,即重置為初始狀態,本環境中,相關操作命令可以從/home/student/DO280/labs/secure-resources檔案夾中的restore-policy.sh腳本運行或復制,

六 管理加密資訊

6.1 secret特性

Secret物件型別提供了一種機制來保存敏感資訊,如密碼、OCP客戶端組態檔、Docker組態檔和私有倉庫憑據,Secrets將敏感內容與Pod解耦,可以使用Volume插件將Secrets掛載到容器上,或者系統可以使用Secrets代表pod執行操作, Secrets的主要特征包括:
  • Secrets data可以獨立于其定義參考,
  • Secrets data Volume由臨時檔案存盤支持,
  • 可以在名稱空間中共享Secrets data,

6.2 創建Secrets

在依賴于該Secrets的pod之前創建一個Secrets,
  1 [user@demo ~]$ oc create secret generic secret_name \
  2 --from-literal=key1=secret1 \
  3 --from-literal=key2=secret2	#用secret data創建secret物件
  4 [user@demo ~]$ oc secrets add --for=mount serviceaccount/serviceaccount-name \
  5 secret/secret_name		#更新pod的服務帳戶,允許參考該secrets,
例如,允許一個運行在指定服務帳戶下的pod掛載一個secrets 創建一個pod,該pod使用環境變數或資料卷作為檔案的方式使用該secret,通常使用模板完成,

6.3 使用secret暴露Pod

secrets可以作為資料卷掛載,也可以作為環境變數以便供pod中的容器使用, 例如,要向pod公開一個secrets,首先創建一個secrets并將username和password以k/v形式配置,然后將鍵名分配給pod的YAML檔案env定義, 示例:創建名為demo-secret的secrets,它定義用戶名和密碼為username/demo-user, [user@demo ~]$ oc create secret generic demo-secret \ --from-literal=username=demo-user 要使用前面的secret作為MySQL資料庫pod的資料庫管理員密碼,請定義環境變數,并參考secret名稱和密碼,
  1 env:
  2   - name: MYSQL_ROOT_PASSWORD
  3     valueFrom:
  4       secretKeyRef:
  5        key: username
  6        name: demo-secret

6.4 web端管理secret

從web控制臺管理secret: 1. 以授權用戶身份登錄到web控制臺, 2. 創建或選擇一個專案來承載secret, 3. 導航到resource——>secrets,

6.5 Secret使用場景

  • password和user names
敏感資訊(如password和user name)可以存盤在一個secret中,該secret被掛載為容器中的資料卷,資料顯示為位于容器的資料卷目錄中的檔案中的內容,然后,應用程式(如資料庫)可以使用這些secret對用戶進行身份驗證,
  • 傳輸層安全性(TLS)和密鑰對
通過讓集群將簽名證書和密鑰對生成到專案名稱空間中的secret中,可以實作對服務的通信的保護,證書和密鑰對使用PEM格式存盤以類似tls.crt和tls.key的格式存盤在secret的pod中,

七 ConfigMap物件

7.1 ConfigMap概述

ConfigMaps物件類似于secret,但其設計目的是支持處理不包含敏感資訊的字串,ConfigMap物件持有配置資料的鍵值對,這些配置資料可以在pods中使用,或者用于存盤系統組件(如控制器)的配置資料, ConfigMap物件提供了將配置資料注入容器的機制,ConfigMap存盤精細的粒度資訊,比如單個屬性,或者詳細資訊,比如整個組態檔或JSON blob,

7.2 CLI創建ConfigMap

可以使用--from-literal選項從CLI創建ConfigMap物件, 示例:創建一個ConfigMap物件,該物件將IP地址172.20.30.40分配給名為serverAddress的ConfigMap密鑰,
  1 [user@demo ~]$ oc create configmap special-config \
  2 --from-literal=serverAddress=172.20.30.40
  3 [user@demo ~]$ oc get configmaps special-config -o yaml		#查看configMap
  4 apiVersion: v1
  5 data:
  6   key1: serverAddress=172.20.30.40
  7 kind: ConfigMap
  8 metadata:
  9   creationTimestamp: 2017-07-10T17:13:31Z
 10   name: special-config
 11 ……
 12 在配置映射的pod定義中填充環境變數APISERVER,
 13 env:
 14   - name: APISERVER
 15       valueFrom:
 16         configMapKeyRef:
 17           name: special-config
 18           key: serverAddress

7.3 web管理ConfigMap

從web控制臺管理ConfigMap物件: 1. 以授權用戶身份登錄到web控制臺, 2. 創建或選擇一個專案來承載ConfigMap, 3. 導航到資源→配置映射,

八 加密練習

8.1 前置準備

準備完整的OpenShift集群,參考《003.OpenShift網路》2.1,

8.2 本練習準備

[student@workstation ~]$ lab secure-secrets setup

8.3 創建專案

  1 [student@workstation ~]$ oc login -u developer -p redhat
  2 [student@workstation ~]$ cd /home/student/DO280/labs/secure-secrets/
  3 [student@workstation secure-secrets]$ less mysql-ephemeral.yml		#匯入本環境MySQL模板
clipboard clipboard 模板解讀: 該mysql-ephemeral.yml模板檔案,包含openshift專案中的mysql臨時模板,pod所需的其他環境變數由模板引數初始化,并具有默認值, 但沒有secret定義,后續操作將手動創建模板所需的secret, 根據模板的要求,創建一個包含MySQL容器image使用的憑證的secret,將這個secret命名為mysql,
  • 應用程式訪問的資料庫用戶名由database-user定義,
  • 資料庫用戶的密碼由database-password定義,
  • 資料庫管理員密碼由database-root-password定義

8.4 創建新secret

  1 [student@workstation secure-secrets]$ oc create secret generic mysql \
  2 --from-literal='database-user'='mysql' \
  3 --from-literal='database-password'='redhat' \
  4 --from-literal='database-root-password'='do280-admin'
  5 [student@workstation secure-secrets]$ oc get secret mysql -o yaml	#確認secret
clipboard

8.5 創建應用

  1 [student@workstation secure-secrets]$ oc new-app --file=mysql-ephemeral.yml
  2 [student@workstation secure-secrets]$ oc get pods		#確認應用
  3 NAME            READY     STATUS    RESTARTS   AGE
  4 mysql-1-j4fnz   1/1       Running   0          1m

8.6 埠轉發

  1 [student@workstation secure-secrets]$ cd
  2 [student@workstation ~]$ oc port-forward mysql-1-j4fnz 3306:3306
提示:驗證完成之前forward不要關閉,

8.7 確認驗證

  1 [student@workstation ~]$ mysql -uroot -pdo280-admin -h127.0.0.1	#新開終端測驗MySQL
clipboard

九 管理security policy

9.1 OCP authorization授權

OCP定義了用戶可以執行的兩組主要操作: 與專案相關的操作(也稱為本地策略):project-related 與管理相關的操作(也稱為集群策略):administration-related 由于這兩種策略都有大量可用的操作,所以將一些操作分組并定義為角色,
默認角色 描述
cluster-admin 此角色中的所有用戶都可以管理OpenShift集群,
cluster-status 此角色中的所有用戶都提供對集群資訊的只讀訪問,
為管理本地政策,OCP提供以下角色:
默認角色 描述
edit 角色中的用戶可以從專案中創建、更改和洗掉公共應用程式資源,比如service和dc, 但是不能對限制范圍和配額等管理資源采取行動,也不能管理對專案的訪問權限,
basic-user 角色中的用戶具有對專案的讀訪問權,
self-provisioner 角色中的用戶可以創建新專案,這是一個集群角色,而不是專案角色,
admin 角色中的用戶可以管理專案中的所有資源,包括授予對專案的其他用戶的訪問權
除了能夠創建新應用程式之外,admin角色還允許用戶訪問專案資源,比如配額和限制范圍, edit角色允許用戶在專案中充當開發人員,但要在專案管理員配置的約束下作業,

9.2 相關命令

  1 向集群用戶添加角色
  2 $ oc adm policy add-cluster-role-to-user cluster-role username
  3 示例:將普通用戶更改為集群管理員,
  4 $ oc adm policy add-cluster-role-to-user cluster-role username
  5 從用戶中洗掉集群角色
  6 $ oc adm policy remove-cluster-role-from-user cluster-role username
  7 示例:將集群管理員更改為普通用戶,
  8 $ oc adm policy remove-cluster-role-from-user cluster-admin username
  9 將指定的用戶系結到專案中的角色
 10 $ oc adm policy add-role-to-user role-name username -n project
 11 示例:在WordPress專案中dev用戶系結basic-user角色,
 12 $ oc adm policy add-role-to-user basic-user dev -n wordpress

9.3 權限及規則

OpenShift將一組規則集合成一個角色,規則由謂詞和資源定義,如create user是OpenShift中的一條規則,它是一個名為cluster-admin的角色的所擁有的權限的一部分,
  1 $ oc adm policy who-can delete user

9.4 user型別

與OCP的互動基于用戶,OCP的user物件表示可以通過向該用戶或用戶組添加角色來從而實作相應權限的授予, Regular users:通常以這種用戶型別與OCP互動,常規用戶用User物件表,例如,user1,user2, System users:通常在安裝OCP中定義基礎設施時自動創建的,主要目的是使基礎設施能夠安全地與API互動,包括集群管理員(可以訪問所有內容)、每個節點的用戶、路由器和內部倉庫使用的用戶,以及各種其他用戶,還存在一個匿名系統用戶,默認情況下,該用戶用于未經身份驗證的請求,system user主要包括:system:admin、system:openshift-registry和system:node:node1.example.com, Service accounts:這些是與專案關聯的特殊系統用戶,有些是在第一次創建專案時自動創建的,專案管理員可以創建多個,以便定義對每個專案內容的訪問,Service accounts由ServiceAccount物件表示,Service accounts主要包括:system:serviceaccount:default:deployer和system:serviceaccount:foo:builder, 每個用戶在訪問OpenShift容器平臺之前必須進行身份驗證,沒有身份驗證或身份驗證無效的API請求將使用匿名系統用戶身份驗證來請求服務,身份驗證成功后,策略確定用戶被授權做什么,

9.5 安全背景關系約束(SCCS)

OpenShift提供了一種名為安全背景關系約束的安全機制,它限制對資源的訪問,但不限制OpenShift中的操作, SCC限制從OpenShift中運行的pod到主機環境的訪問:
  • 運行特權容器
  • 請求容器的額外功能
  • 使用主機目錄作為卷
  • 更改容器的SELinux背景關系
  • 更改用戶ID
社區開發的一些容器可能需要放松安全背景關系約束,因為它們可能需要訪問默認禁止的資源,例如檔案系統、套接字或訪問SELinux背景關系, OpenShift定義的安全背景關系約束(SCCs)可以使用以下命令作為集群管理員列出, $ oc get scc SCC通常有以下7中SCCS:
  • anyuid
  • hostaccess
  • hostmount-anyuid
  • nonroot
  • privileged
  • restricted(默認)
$ oc describe scc anyuid #查看某一種SCC詳情 OpenShift創建的所有容器都使用restricted型別的SCC,它提供了對OpenShift外部資源的有限訪問, 對于anyuid安全背景關系,run as user策略被定義為RunAsAny,表示pod可以作為容器中可用的任何用戶ID運行,這允許需要特定用戶使用特定用戶ID運行命令的容器, 要將容器更改為使用不同的SCC運行,需要創建系結到pod的服務帳戶, $ oc create serviceaccount service-account-name #首先創建服務賬戶 $ oc adm policy add-scc-to-user SCC -z service-account #將服務帳戶與SCC關聯 要確定哪個帳戶可以創建需要更高安全性要求的pod,可以使用scc-subject-review子命令, $ oc export pod pod-name > output.yaml $ oc adm policy scc-subject-review -f output.yaml

9.6 OpenShift與SELinux

OpenShift要求在每個主機上啟用SELinux,以便使用強制訪問控制提供對資源的安全訪問,同樣,由OpenShift管理的Docker容器需要管理SELinux背景關系,以避免兼容性問題, 為了最小化在不支持SELinux的情況下運行容器的風險,可以創建SELinux背景關系策略, 為了更新SELinux背景關系,可以使用現有的SCC作為起點生成一個新的SCC, $ oc export scc restricted > custom_selinux.yml #匯出默認的SCC 編輯匯出的YAML檔案以更改SCC名稱和SELinux背景關系, $ oc create -f yaml_file #使用修改后的ymal重新創建一個SCC

9.7 特權容器

有些容器可能需要訪問主機的運行時環境,S2I構建器容器需要訪問宿主docker守護行程來構建和運行容器, 例如,S2I構建器容器是一類特權容器,它要求訪問超出其自身容器的限制,這些容器可能會帶來安全風險,因為它們可以使用OpenShift節點上的任何資源,通過創建具有特權訪問權的服務帳戶,可以使用SCCs啟用特權容器的訪問,

十 資源訪問控制綜合實驗

10.1 前置準備

準備完整的OpenShift集群,參考《003.OpenShift網路》2.1,

10.2 本練習準備

  1 [student@workstation ~]$ lab secure-review setup

10.3 創建用戶

  1 [root@master ~]# htpasswd /etc/origin/master/htpasswd user-review
  2 New password: 【redhat】
  3 Re-type new password: 【redhat】

10.4 修改策略

  1 [student@workstation ~]$ oc login -u admin -p redhat
  2 [student@workstation ~]$ oc adm policy remove-cluster-role-from-group \
  3 self-provisioner system:authenticated system:authenticated:oauth
  4 禁用所有常規用戶的專案創建功能

10.5 確認驗證

  1 [student@workstation ~]$ oc login -u user-review -p redhat
  2 [student@workstation ~]$ oc new-project test			#普通用戶無法創建專案
  3 Error from server (Forbidden): You may not request a new project via this API.

10.6 創建專案

  1 [student@workstation ~]$ oc login -u admin -p redhat
  2 [student@workstation ~]$ oc new-project secure-review		#使用管理員創建專案

10.7 授權用戶

  1 [student@workstation ~]$ oc project secure-review
  2 Already on project "secure-review" on server "https://master.lab.example.com:443".
  3 [student@workstation ~]$ oc policy add-role-to-user edit user-review	#將edit的role和user-review進行關聯

10.8 測驗訪問

  1 [student@workstation ~]$ oc login -u user-review -p redhat
  2 [student@workstation ~]$ oc project secure-review		#測驗訪問
  3 Already on project "secure-review" on server "https://master.lab.example.com:443".

10.9 檢查模板

  1 [student@workstation ~]$ cd /home/student/DO280/labs/secure-review/
  2 [student@workstation secure-review]$ less mysql-ephemeral.yml
clipboard 模板解讀: 該mysql-ephemeral.yml模板檔案,包含openshift專案中的mysql臨時模板,pod所需的其他環境變數由模板引數初始化,并具有默認值, 但沒有secret定義,后續操作將手動創建模板所需的secret, 根據模板的要求,創建一個包含MySQL容器image使用的憑證的secret,將這個secret命名為mysql,
  • 應用程式訪問的資料庫用戶名由database-user定義,
  • 資料庫用戶的密碼由database-password定義,
  • 資料庫管理員密碼由database-root-password定義
使用user-review developer用戶創建一個名為mysql的secret,這個secret應該存盤用戶名mysql、密碼redhat和資料庫管理員密碼do280-admin, 資料庫用戶名由database-user定義,此用戶的密碼由mysql secret密鑰定義, 資料庫管理員密碼由database-root-password定義,

10.10 創建secret

  1 [student@workstation secure-review]$ oc create secret generic mysql \
  2 --from-literal='database-user'='mysql' \
  3 --from-literal='database-password'='redhat' \
  4 --from-literal='database-root-password'='do280-admin'
  5 [student@workstation secure-review]$ oc get secret mysql -o yaml	#確認驗證secret

10.11 部署應用

  1 [student@workstation secure-review]$ oc new-app --file=mysql-ephemeral.yml
  2 [student@workstation secure-review]$ oc get pods
  3 NAME            READY     STATUS    RESTARTS   AGE
  4 mysql-1-2lr7t   1/1       Running   0          31s

10.12 轉發埠

  1 [student@workstation ~]$ oc port-forward mysql-1-2lr7t 3306:3306

10.13 測驗訪問

  1 [student@workstation ~]$ mysql -umysql -predhat -h127.0.0.1

10.14 部署phpmyadmin應用

使用內部倉庫registry.lab.example.com的image部署phpmyadmin:4.7容器,phpmyadmin:4.7容器需要名為PMA_HOST的環境變數來提供MySQL服務器的IP地址, 使用模板創建一個基于FQND的MySQL pod的service, 為使用模板創建的MySQL服務器pod使用服務FQDN,該模板是mysql.secure-review.svc.cluster.local,
  1 [student@workstation ~]$ oc new-app --name=phpmyadmin \
  2 --docker-image=registry.lab.example.com/phpmyadmin/phpmyadmin:4.7 \
  3 -e PMA_HOST=mysql.secure-review.svc.cluster.local
clipboard 結論:該命令會發出警告,提示需要root特權,默認情況下,OpenShift不支持使用作業系統的root用戶運行容器,

10.15 查看pod

  1 [student@workstation ~]$ oc get pods
  2 NAME                 READY     STATUS    RESTARTS   AGE
  3 mysql-1-2lr7t        1/1       Running   0          8m
  4 phpmyadmin-1-v7tl7   0/1       Error     2          1m
  5 因為沒有root權限,因此部署失敗,需要提權,

10.16 授予權限

  1 [student@workstation ~]$ oc login -u admin -p redhat			#使用管理員登錄
  2 [student@workstation ~]$ oc create serviceaccount phpmyadmin-account	#首先創建服務賬戶
  3 [student@workstation ~]$ oc adm policy add-scc-to-user anyuid -z phpmyadmin-account
  4 scc "anyuid" added to: ["system:serviceaccount:secure-review:phpmyadmin-account"]	#將服務帳戶與anyuid安全背景關系關聯

10.17 更新應用

  1 [student@workstation ~]$ oc patch dc phpmyadmin --patch='{"spec":{"template":{"spec":{"serviceAccountName": "phpmyadmin-account"}}}}'
#更新負責管理phpmyadmin的dc資源,任何開發人員用戶都可以執行此操作, 本環境中,相關操作命令可以從/home/student/DO280/labs/secure-review檔案夾中的patch-dc.sh腳本運行或復制,

10.18 確認驗證

  1 [student@workstation ~]$ oc login -u user-review -p redhat
  2 [student@workstation ~]$ oc get pods			#確認pod是否正常
  3 NAME                 READY     STATUS    RESTARTS   AGE
  4 mysql-1-2lr7t        1/1       Running   0          13m
  5 phpmyadmin-2-bdjvq   1/1       Running   0          1m

10.19 暴露服務

  1 [student@workstation ~]$ oc expose svc phpmyadmin --hostname=phpmyadmin.apps.lab.example.com

10.20 訪問測驗

  1 [student@workstation ~]$ curl -s http://phpmyadmin.apps.lab.example.com

10.21 確認及洗掉

  1 [student@workstation ~]$ lab secure-review grade		#環境腳本判斷
  2 [student@workstation ~]$ oc login -u admin -p redhat
  3 [student@workstation ~]$ oc adm policy add-cluster-role-to-group \
  4 self-provisioner system:authenticated system:authenticated:oauth
  5 [student@workstation ~]$ oc delete project secure-review
  6 [student@workstation ~]$ ssh root@master htpasswd -D \
  7 /etc/origin/master/htpasswd user-review			#洗掉用戶
  8 [student@workstation ~]$ oc delete user user-review		#洗掉專案

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/51053.html

標籤:Linux

上一篇:鍵盤俠Linux干貨| 使用Nginx創建一個私人網盤

下一篇:CentOS 7中yum安裝程式無法從鏡像中下載的解決方法

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more