一 Kubetcl namespace 1.1 namespace描述 Kubernetes namespace提供了將一組相關資源組合在一起的機制。在Red Hat OpenShift容器平臺中,project是一個帶有附加註釋的Kubernetes namespace。 namespace提供以 ...
一 Kubetcl namespace
1.1 namespace描述
Kubernetes namespace提供了將一組相關資源組合在一起的機制。在Red Hat OpenShift容器平臺中,project是一個帶有附加註釋的Kubernetes namespace。 namespace提供以下特性:- 命名資源,以避免基本的命名衝突;
- 將管理許可權授予受信任的用戶;
- 限制用戶資源消耗的能力;
- 用戶和用戶組隔離。
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:oauth1.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 :default2.2 查看本地policy
儘管本地角色列表及其關聯的規則集在本地策略中是不可查看的,但是所有預設角色仍然適用,並且可以添加到用戶或組中,cluster-admin預設角色除外。但是,本地綁定是可見的。 可通過以下命令查看當前的本地綁定,其中顯示綁定到不同角色的用戶和組。 [root@demo ~]# oc describe policyBindings :default 提示:預設情況下,在本地策略中,只會列出admin角色的綁定。但是,如果將其他預設角色添加到本地策略中的用戶和組,也會列出它們。2.3 管理role綁定
向用戶或組添加或綁定角色,從而實現向用戶或組提供角色授予的相關訪問許可權。可以使用oc adm policy命令在用戶和組之間添加和刪除角色。 當使用以下操作管理本地策略的用戶和組角色時,可以使用-n選項指定項目。如果沒有指定,則使用當前項目。 常見管理本地策略操作:三 安全上下文約束(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 admin4.4 身份驗證和授權
身份驗證層標識與對OpenShift容器平臺API的請求相關聯的用戶,然後授權層使用關於請求用戶的身份信息來確定是否應該允許該請求。- user和group
- Authentication Tokens
4.5 身份驗證類型
本環境中,身份驗證由HTPasswdIdentityProvider模塊提供,該模塊根據使用htpasswd命令生成的文件驗證用戶名和密碼。 OpenShift容器平臺支持的其他認證類型包括:- Basic Authentication (Remote)
- Request Header Authentication
- Keystone Authentication
- LDAP Authentication
- GitHub Authentication
五 管理項目及賬戶
5.1 前置準備
準備完整的OpenShift集群,參考《003.OpenShift網路》2.1。5.2 本練習準備
[student@workstation ~]$ lab secure-resources setup5.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登錄,並部署應用,會出現如下提示:
5.10 驗證部署
1 [student@workstation ~]$ oc get pods
結論:由上可知,部署失敗是因為容器映像需要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" cr