一 Kubetcl namespace1.1 namespace描述Kubernetes namespace提供了將一組相關(guān)資源組合在一起的機(jī)制。在Red Hat OpenShift容器平臺(tái)中,project是一個(gè)帶有附加注釋的Kubernetes namespace。
namespace提供以下特性:
1.2 projectproject提供了一種機(jī)制,通過這種機(jī)制可以管理普通用戶對(duì)資源的訪問。project允許一組用戶獨(dú)立于其他組組織和管理其內(nèi)容,必須允許用戶訪問項(xiàng)目。如果允許創(chuàng)建項(xiàng)目,用戶將自動(dòng)訪問自己的項(xiàng)目。
項(xiàng)目可以有單獨(dú)的name、display name和description。
name是項(xiàng)目的唯一標(biāo)識(shí)符,在使用CLI工具或API時(shí)都是基于name,name的最大長(zhǎng)度為63個(gè)字符。
display name是項(xiàng)目在web控制臺(tái)中顯示的方式(默認(rèn)為name)。
description是項(xiàng)目的更詳細(xì)描述,并且在web控制臺(tái)中也可見。
以下組件適用于項(xiàng)目:
1.3 cluster管理集群管理員可以創(chuàng)建項(xiàng)目并將項(xiàng)目的管理權(quán)限委托給任何用戶。在OpenShift容器平臺(tái)中,項(xiàng)目用于對(duì)相關(guān)對(duì)象進(jìn)行分組和隔離。
管理員可以讓用戶訪問某些項(xiàng)目,允許他們創(chuàng)建自己的項(xiàng)目,并在單個(gè)項(xiàng)目中賦予他們管理權(quán)限。
管理員可以將角色應(yīng)用于允許或限制其創(chuàng)建項(xiàng)目能力的用戶和組,同時(shí)可以在用戶初始登錄之前分配角色。
限制項(xiàng)目創(chuàng)建:從通過身份驗(yàn)證的用戶和組中刪除self-provisioning集群角色,將拒絕任何新項(xiàng)目的權(quán)限。
[root@master ~]$ oc adm policy remove-cluster-role-from-group \
self-provisioner \
system:authenticated \
system:authenticated:oauth
授予項(xiàng)目創(chuàng)建:項(xiàng)目創(chuàng)建授予具有self-供應(yīng)者角色和self-provisione集群角色綁定的用戶。默認(rèn)情況下,所有經(jīng)過身份驗(yàn)證的用戶都可以使用這些角色。
[root@master ~]$ oc adm policy add-cluster-role-to-group \
self-provisioner \
system:authenticated \
system:authenticated:oauth
1.4 創(chuàng)建project如果項(xiàng)目創(chuàng)建權(quán)限被授予用戶,則可以使用oc命令創(chuàng)建project。
[root@master ~]$ oc new-project demoproject \
--description="Demonstrate project creation" \
--display-name="demo_project"
二 OpenShift角色2.1 角色概述role具有不同級(jí)別的訪問和策略,包括集群和本地策略。user和group可以同時(shí)與多個(gè)role關(guān)聯(lián)。運(yùn)行oc description命令查看角色及其綁定的詳細(xì)信息。
在集群策略中具有cluster-admin缺省角色的用戶可以查看集群策略和所有本地策略。在給定的本地策略中具有admin缺省角色的用戶可以基于per-project查看策略。
可通過以下命令查看當(dāng)前的集群綁定集,其中顯示綁定到不同角色的用戶和組。
[root@demo ~]# oc describe clusterPolicyBindings :default
2.2 查看本地policy盡管本地角色列表及其關(guān)聯(lián)的規(guī)則集在本地策略中是不可查看的,但是所有缺省角色仍然適用,并且可以添加到用戶或組中,cluster-admin缺省角色除外。但是,本地綁定是可見的。
可通過以下命令查看當(dāng)前的本地綁定,其中顯示綁定到不同角色的用戶和組。
[root@demo ~]# oc describe policyBindings :default
提示:默認(rèn)情況下,在本地策略中,只會(huì)列出admin角色的綁定。但是,如果將其他默認(rèn)角色添加到本地策略中的用戶和組,也會(huì)列出它們。
2.3 管理role綁定向用戶或組添加或綁定角色,從而實(shí)現(xiàn)向用戶或組提供角色授予的相關(guān)訪問權(quán)限。可以使用oc adm policy命令在用戶和組之間添加和刪除角色。
當(dāng)使用以下操作管理本地策略的用戶和組角色時(shí),可以使用-n選項(xiàng)指定項(xiàng)目。如果沒有指定,則使用當(dāng)前項(xiàng)目。
常見管理本地策略操作:
還可以使用如下所示的的操作管理cluster policy的role binding,這類命令不需要-n選項(xiàng),因?yàn)閏luster policy不在namespace級(jí)別上操作。
常見管理cluster policy操作:
提示:oc policy命令應(yīng)用于當(dāng)前項(xiàng)目,而oc adm policy命令應(yīng)用于集群范圍的操作。
示例:在example項(xiàng)目中為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可以執(zhí)行的操作和它可以訪問的資源。默認(rèn)情況下,任何容器的執(zhí)行都只授予受限制的SCC定義的功能。
SCCS相關(guān)命令:
1 [user@demo ~]$ oc get scc #列出可用的SCC 2 [user@demo ~]$ oc describe scc scc_name #現(xiàn)實(shí)特定SCC詳細(xì)信息 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中刪除用戶或組 四 服務(wù)賬戶4.1 服務(wù)賬戶service account提供了一種靈活的方法來控制API訪問,而無需共享常規(guī)用戶的憑據(jù)。如果應(yīng)用程序需要訪問受限制的SCC未授予的功能,可創(chuàng)建一個(gè)新的、特定的service account并將其添加到適當(dāng)?shù)腟CC中。
例如,在缺省情況下,OpenShift不支持部署需要提升特權(quán)的應(yīng)用程序。若有此需求,可創(chuàng)建一個(gè)service account,修改dc,然后添加service account至SCC。
示例:將anyuid配置為在容器中作為root用戶運(yùn)行。
[user@demo ~]$ oc create serviceaccount useroot #創(chuàng)建一個(gè)名為useroot的新服務(wù)帳戶
[user@demo ~]$ oc patch dc/demo-app \
--patch '{"spec":{"template":{"spec":{"serviceAccountName": "useroot"}}}}' #修改應(yīng)用程序的DC
[user@demo ~]$ oc adm policy add-scc-to-user anyuid -z useroot #將useroot服務(wù)帳戶添加到anyuid SCC中,作為容器中的根用戶運(yùn)行
4.2 Web管理user成員OCP平臺(tái)的默認(rèn)配置是,在用戶首次登錄成功時(shí),自動(dòng)創(chuàng)建該用戶對(duì)象。
要管理允許訪問項(xiàng)目的用戶,請(qǐng)以項(xiàng)目管理員或集群管理員的身份登錄到web控制臺(tái),并選擇要管理的項(xiàng)目。在左側(cè)窗格中,單擊Resources——>membership進(jìn)入項(xiàng)目member頁面。
在Users列中,在突出顯示的文本框中輸入用戶名。在“添加另一個(gè)角色”列中,從用戶所在行的列表中選擇一個(gè)角色,然后單擊“添加”。
4.3 Cli管理user成員CLI中如果自動(dòng)創(chuàng)建對(duì)象功能被關(guān)閉,集群管理員可通過如下方式創(chuàng)建新用戶:
[root@master ~]$ oc create user demo-user
同時(shí)還需要在身份認(rèn)證軟件中創(chuàng)建用戶,如為HTPasswdIdentityProvider才用戶命令如下:
[root@master ~]$ htpasswd /etc/origin/openshift-passwd demo-user
要向用戶添加項(xiàng)目角色,首先使用oc project命令輸入項(xiàng)目,然后使用oc policy add-role-to-user命令:
[root@master ~]$ oc policy add-role-to-user edit demo-user
要從用戶中刪除項(xiàng)目角色,使用oc policy remove-role-from-user命令:
[root@master ~]$ oc policy remove-role-from-user edit demo-user
并不是所有OpenShift角色都由項(xiàng)目限定范圍。要分配這些規(guī)則,請(qǐng)使用oc adm policy command命令。
[root@master ~]$ oc adm policy add-cluster-role-to-user cluster-admin admin
4.4 身份驗(yàn)證和授權(quán)身份驗(yàn)證層標(biāo)識(shí)與對(duì)OpenShift容器平臺(tái)API的請(qǐng)求相關(guān)聯(lián)的用戶,然后授權(quán)層使用關(guān)于請(qǐng)求用戶的身份信息來確定是否應(yīng)該允許該請(qǐng)求。
OCP容器平臺(tái)中的用戶是一個(gè)可以向OpenShift API發(fā)出請(qǐng)求的實(shí)體。通常,這表示與OpenShift交互的develop或administrator的帳戶。
可以將用戶分配給一個(gè)或多個(gè)組,每個(gè)組表示一組特定的角色(或權(quán)限)。當(dāng)需要通過管理授權(quán)策略給多個(gè)客戶授權(quán)時(shí)候,group會(huì)比較合適。例如允許訪問項(xiàng)目中的對(duì)象,而不是單獨(dú)授予用戶。
API調(diào)用必須使用訪問令牌或X.509證書進(jìn)行身份驗(yàn)證,會(huì)話token表示用戶,并且是短期的,默認(rèn)情況下在24小時(shí)內(nèi)到期。
可以通過運(yùn)行oc whoami命令來驗(yàn)證經(jīng)過身份驗(yàn)證的用戶。
[root@master ~]$ oc login -u demo-user
[root@master ~]$ oc whoami
demo-user
4.5 身份驗(yàn)證類型本環(huán)境中,身份驗(yàn)證由HTPasswdIdentityProvider模塊提供,該模塊根據(jù)使用htpasswd命令生成的文件驗(yàn)證用戶名和密碼。
OpenShift容器平臺(tái)支持的其他認(rèn)證類型包括:
一種通用的后端集成機(jī)制,允許用戶使用針對(duì)遠(yuǎn)程標(biāo)識(shí)提供者驗(yàn)證的憑據(jù)登錄到OpenShift容器平臺(tái)。用戶將他們的用戶名和密碼發(fā)送到OpenShift容器平臺(tái),OpenShift平臺(tái)通過到服務(wù)器的請(qǐng)求驗(yàn)證這些憑據(jù),并將憑據(jù)作為基本的Auth頭傳遞。這要求用戶在登錄過程中向OpenShift容器平臺(tái)輸入他們的憑據(jù)。
用戶使用請(qǐng)求頭值(如X-RemoteUser)登錄到OpenShift容器平臺(tái)。它通常與身份驗(yàn)證代理結(jié)合使用,身份驗(yàn)證代理對(duì)用戶進(jìn)行身份驗(yàn)證,然后通過請(qǐng)求頭值為OpenShift容器平臺(tái)提供用戶標(biāo)識(shí)。
Keystone是一個(gè)OpenStack項(xiàng)目,提供標(biāo)識(shí)、令牌、目錄和策略服務(wù)。OpenShift容器平臺(tái)與Keystone集成,通過配置OpenStack Keystone v3服務(wù)器將用戶存儲(chǔ)在內(nèi)部數(shù)據(jù)庫中,從而支持共享身份驗(yàn)證。這種配置允許用戶使用Keystone憑證登錄OpenShift容器平臺(tái)。
用戶使用他們的LDAP憑證登錄到OpenShift容器平臺(tái)。在身份驗(yàn)證期間,LDAP目錄將搜索與提供的用戶名匹配的條目。如果找到匹配項(xiàng),則嘗試使用條目的專有名稱(DN)和提供的密碼進(jìn)行簡(jiǎn)單綁定。
GitHub使用OAuth,它允許與OpenShift容器平臺(tái)集成使用OAuth身份驗(yàn)證來促進(jìn)令牌交換流。這允許用戶使用他們的GitHub憑證登錄到OpenShift容器平臺(tái)。為了防止使用GitHub用戶id的未授權(quán)用戶登錄到OpenShift容器平臺(tái)集群,可以將訪問權(quán)限限制在特定的GitHub組織中。
五 管理項(xiàng)目及賬戶5.1 前置準(zhǔn)備準(zhǔn)備完整的OpenShift集群,參考《003.OpenShift網(wǎng)絡(luò)》2.1。
5.2 本練習(xí)準(zhǔn)備[student@workstation ~]$ lab secure-resources setup
5.3 創(chuàng)建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 設(shè)置策略1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab. #使用管理員登錄 2 [student@workstation ~]$ oc adm policy remove-cluster-role-from-group 3 self-provisioner system:authenticated:oauth 4 #刪除所有賦予普通創(chuàng)建項(xiàng)目的功能,該命令可參考本環(huán)境如下目錄中的命令。 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 驗(yàn)證策略1 [student@workstation ~]$ oc login -u user1 -p redhat https://master.lab. #使用普通用戶user1登錄 2 [student@workstation ~]$ oc new-project test #測(cè)試創(chuàng)建project 3 Error from server (Forbidden): You may not request a new project via this API. 5.6 創(chuàng)建項(xiàng)目1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab. #使用集群管理員登錄 2 [student@workstation ~]$ oc new-project project-user1 #創(chuàng)建兩個(gè)項(xiàng)目 3 [student@workstation ~]$ oc new-project project-user2 5.7 將項(xiàng)目與user關(guān)聯(lián)1 #選擇項(xiàng)目1 2 Now using project "project-user1" on server "https://master.lab.:443". 3 [student@workstation ~]$ oc policy add-role-to-user admin user1 #將user1添加為項(xiàng)目1的管理員 4 role "admin" added: "user1" 5 [student@workstation ~]$ oc policy add-role-to-user edit user2 #將user2添加為項(xiàng)目1的開發(fā)員 6 role "edit" added: "user2" 7 8 [student@workstation ~]$ oc project project-user2 #選擇項(xiàng)目2 9 Now using project "project-user2" on server "https://master.lab.:443". 10 [student@workstation ~]$ oc policy add-role-to-user edit user2 #將user2添加為項(xiàng)目2的開發(fā)員 11 role "edit" added: "user2" 5.8 驗(yàn)證訪問1 [student@workstation ~]$ oc login -u user1 -p redhat https://master.lab. #使用user1登錄 2 [student@workstation ~]$ oc project project-user1 #驗(yàn)證項(xiàng)目1的訪問 3 Already on project "project-user1" on server "https://master.lab.:443". 4 [student@workstation ~]$ oc project project-user2 #驗(yàn)證項(xiàng)目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. #使用user2登錄 9 [student@workstation ~]$ oc project project-user1 10 Already on project "project-user1" on server "https://master.lab.:443". #驗(yàn)證項(xiàng)目1的訪問 11 [student@workstation ~]$ oc project project-user2 12 Now using project "project-user2" on server "https://master.lab.:443". #驗(yàn)證項(xiàng)目2的訪問 5.9 部署特權(quán)應(yīng)用1 [student@workstation ~]$ oc login -u user2 -p redhat https://master.lab. 2 [student@workstation ~]$ oc project project-user1 3 Now using project "project-user1" on server "https://master.lab.:443". 4 [student@workstation ~]$ oc new-app --name=nginx --docker-image=registry.lab./nginx:latest 5 #使用在項(xiàng)目1上不具備admin權(quán)限的用戶user2登錄,并部署應(yīng)用,會(huì)出現(xiàn)如下提示: 5.10 驗(yàn)證部署 1 [student@workstation ~]$ oc get pods 結(jié)論:由上可知,部署失敗是因?yàn)槿萜饔诚裥枰猺oot用戶,pod以CrashLoopBackOff或錯(cuò)誤狀態(tài)結(jié)束。
5.11 故障排除若要解決此故障需要減少特定項(xiàng)目的安全限制。
要使用特權(quán)訪問運(yùn)行容器,可創(chuàng)建一個(gè)允許pod使用操作系統(tǒng)普通用戶運(yùn)行的service account。
如下部分需要具有項(xiàng)目管理員特權(quán)的用戶執(zhí)行,而另一些操作需要具有集群管理員特權(quán)的用戶執(zhí)行。
本環(huán)境中,相關(guān)操作命令可以從/home/student/DO280/labs/secure-resources文件夾中的configure-sc.sh腳本運(yùn)行或復(fù)制。
1 [student@workstation ~]$ oc login -u user1 -p redhat https://master.lab. #使用項(xiàng)目1的admin賬戶登錄 2 [student@workstation ~]$ oc create serviceaccount useroot #創(chuàng)建服務(wù)賬戶 3 serviceaccount "useroot" created 4 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab. #使用集群管理員登錄 5 [student@workstation ~]$ oc project project-user1 #選擇項(xiàng)目1 6 Already on project "project-user1" on server "https://master.lab.:443". 7 [student@workstation ~]$ oc adm policy add-scc-to-user anyuid -z useroot #設(shè)置SCC策略 8 scc "anyuid" added to: ["system:serviceaccount:project-user1:useroot"] #將服務(wù)帳戶與anyuid安全上下文關(guān)聯(lián),此操作需要集群管理員用戶。 9 [student@workstation ~]$ oc login -u user2 -p redhat https://master.lab. #切換user2用戶 10 [student@workstation ~]$ oc project project-user1 11 Already on project "project-user1" on server "https://master.lab.:443". 12 [student@workstation ~]$ oc patch dc nginx --patch='{"spec":{"template":{"spec":{"serviceAccountName": "useroot"}}}}' #更新負(fù)責(zé)管理nginx的dc資源,任何開發(fā)人員用戶都可以執(zhí)行此操作。本環(huán)境中,相關(guān)操作命令可以從/home/student/DO280/labs/secure-resources文件夾中的configure-sc.sh腳本運(yùn)行或復(fù)制。
5.12 驗(yàn)證確認(rèn)1 [student@workstation ~]$ oc get pods 2 NAME READY STATUS RESTARTS AGE 3 nginx-2-98k8f 1/1 Running 0 3m 4 5.13 暴露服務(wù)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. nginx 80-tcp None 5.14 測(cè)試訪問1 [student@workstation ~]$ curl -s http://nginx-project-user1.apps.lab. 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 六 管理加密信息6.1 secret特性Secret對(duì)象類型提供了一種機(jī)制來保存敏感信息,如密碼、OCP客戶端配置文件、Docker配置文件和私有倉庫憑據(jù)。Secrets將敏感內(nèi)容與Pod解耦??梢允褂肰olume插件將Secrets掛載到容器上,或者系統(tǒng)可以使用Secrets代表pod執(zhí)行操作。
Secrets的主要特征包括:
6.2 創(chuàng)建Secrets在依賴于該Secrets的pod之前創(chuàng)建一個(gè)Secrets。
1 [user@demo ~]$ oc create secret generic secret_name 2 --from-literal=key1=secret1 3 --from-literal=key2=secret2 #用secret data創(chuàng)建secret對(duì)象 4 [user@demo ~]$ oc secrets add --for=mount serviceaccount/serviceaccount-name 5 secret/secret_name #更新pod的服務(wù)帳戶,允許引用該secrets。 例如,允許一個(gè)運(yùn)行在指定服務(wù)帳戶下的pod掛載一個(gè)secrets
創(chuàng)建一個(gè)pod,該pod使用環(huán)境變量或數(shù)據(jù)卷作為文件的方式使用該secret,通常使用模板完成。
6.3 使用secret暴露Podsecrets可以作為數(shù)據(jù)卷掛載,也可以作為環(huán)境變量以便供pod中的容器使用。
例如,要向pod公開一個(gè)secrets,首先創(chuàng)建一個(gè)secrets并將username和password以k/v形式配置,然后將鍵名分配給pod的YAML文件env定義。
示例:創(chuàng)建名為demo-secret的secrets,它定義用戶名和密碼為username/demo-user。
[user@demo ~]$ oc create secret generic demo-secret \
--from-literal=username=demo-user
要使用前面的secret作為MySQL數(shù)據(jù)庫pod的數(shù)據(jù)庫管理員密碼,請(qǐng)定義環(huán)境變量,并引用secret名稱和密碼。
1 env: 2 - name: MYSQL_ROOT_PASSWORD 3 valueFrom: 4 secretKeyRef: 5 key: username 6 name: demo-secret 6.4 web端管理secret從web控制臺(tái)管理secret:
1. 以授權(quán)用戶身份登錄到web控制臺(tái)。
2. 創(chuàng)建或選擇一個(gè)項(xiàng)目來承載secret。
3. 導(dǎo)航到resource——>secrets。
6.5 Secret使用場(chǎng)景
敏感信息(如password和user name)可以存儲(chǔ)在一個(gè)secret中,該secret被掛載為容器中的數(shù)據(jù)卷。數(shù)據(jù)顯示為位于容器的數(shù)據(jù)卷目錄中的文件中的內(nèi)容。然后,應(yīng)用程序(如數(shù)據(jù)庫)可以使用這些secret對(duì)用戶進(jìn)行身份驗(yàn)證。
通過讓集群將簽名證書和密鑰對(duì)生成到項(xiàng)目名稱空間中的secret中,可以實(shí)現(xiàn)對(duì)服務(wù)的通信的保護(hù)。證書和密鑰對(duì)使用PEM格式存儲(chǔ)以類似tls.crt和tls.key的格式存儲(chǔ)在secret的pod中。
七 ConfigMap對(duì)象7.1 ConfigMap概述ConfigMaps對(duì)象類似于secret,但其設(shè)計(jì)目的是支持處理不包含敏感信息的字符串。ConfigMap對(duì)象持有配置數(shù)據(jù)的鍵值對(duì),這些配置數(shù)據(jù)可以在pods中使用,或者用于存儲(chǔ)系統(tǒng)組件(如控制器)的配置數(shù)據(jù)。
ConfigMap對(duì)象提供了將配置數(shù)據(jù)注入容器的機(jī)制。ConfigMap存儲(chǔ)精細(xì)的粒度信息,比如單個(gè)屬性,或者詳細(xì)信息,比如整個(gè)配置文件或JSON blob。
7.2 CLI創(chuàng)建ConfigMap可以使用--from-literal選項(xiàng)從CLI創(chuàng)建ConfigMap對(duì)象。
示例:創(chuàng)建一個(gè)ConfigMap對(duì)象,該對(duì)象將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定義中填充環(huán)境變量APISERVER。 13 env: 14 - name: APISERVER 15 valueFrom: 16 configMapKeyRef: 17 name: special-config 18 key: serverAddress 7.3 web管理ConfigMap從web控制臺(tái)管理ConfigMap對(duì)象:
1. 以授權(quán)用戶身份登錄到web控制臺(tái)。
2. 創(chuàng)建或選擇一個(gè)項(xiàng)目來承載ConfigMap。
3. 導(dǎo)航到資源→配置映射。
八 加密練習(xí)8.1 前置準(zhǔn)備準(zhǔn)備完整的OpenShift集群,參考《003.OpenShift網(wǎng)絡(luò)》2.1。
8.2 本練習(xí)準(zhǔn)備[student@workstation ~]$ lab secure-secrets setup
8.3 創(chuàng)建項(xiàng)目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 #導(dǎo)入本環(huán)境MySQL模板 模板解讀:
該mysql-ephemeral.yml模板文件,包含openshift項(xiàng)目中的mysql臨時(shí)模板,pod所需的其他環(huán)境變量由模板參數(shù)初始化,并具有默認(rèn)值。
但沒有secret定義,后續(xù)操作將手動(dòng)創(chuàng)建模板所需的secret。
根據(jù)模板的要求,創(chuàng)建一個(gè)包含MySQL容器image使用的憑證的secret,將這個(gè)secret命名為mysql。
8.4 創(chuàng)建新secret1 [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 #確認(rèn)secret 8.5 創(chuàng)建應(yīng)用1 [student@workstation secure-secrets]$ oc new-app --file=mysql-ephemeral.yml 2 [student@workstation secure-secrets]$ oc get pods #確認(rèn)應(yīng)用 3 NAME READY STATUS RESTARTS AGE 4 mysql-1-j4fnz 1/1 Running 0 1m 8.6 端口轉(zhuǎn)發(fā)1 [student@workstation secure-secrets]$ cd 2 [student@workstation ~]$ oc port-forward mysql-1-j4fnz 3306:3306 提示:驗(yàn)證完成之前forward不要關(guān)閉。
8.7 確認(rèn)驗(yàn)證1 [student@workstation ~]$ mysql -uroot -pdo280-admin -h127.0.0.1 #新開終端測(cè)試MySQL 九 管理security policy9.1 OCP authorization授權(quán)OCP定義了用戶可以執(zhí)行的兩組主要操作:
與項(xiàng)目相關(guān)的操作(也稱為本地策略):project-related
與管理相關(guān)的操作(也稱為集群策略):administration-related
由于這兩種策略都有大量可用的操作,所以將一些操作分組并定義為角色。
為管理本地政策,OCP提供以下角色:
除了能夠創(chuàng)建新應(yīng)用程序之外,admin角色還允許用戶訪問項(xiàng)目資源,比如配額和限制范圍。
edit角色允許用戶在項(xiàng)目中充當(dāng)開發(fā)人員,但要在項(xiàng)目管理員配置的約束下工作。
9.2 相關(guān)命令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 將指定的用戶綁定到項(xiàng)目中的角色 10 $ oc adm policy add-role-to-user role-name username -n project 11 示例:在WordPress項(xiàng)目中dev用戶綁定basic-user角色。 12 $ oc adm policy add-role-to-user basic-user dev -n wordpress 9.3 權(quán)限及規(guī)則OpenShift將一組規(guī)則集合成一個(gè)角色,規(guī)則由謂詞和資源定義。如create user是OpenShift中的一條規(guī)則,它是一個(gè)名為cluster-admin的角色的所擁有的權(quán)限的一部分。
1 $ oc adm policy who-can delete user 9.4 user類型與OCP的交互基于用戶,OCP的user對(duì)象表示可以通過向該用戶或用戶組添加角色來從而實(shí)現(xiàn)相應(yīng)權(quán)限的授予。
Regular users:通常以這種用戶類型與OCP交互,常規(guī)用戶用User對(duì)象表。例如,user1,user2。
System users:通常在安裝OCP中定義基礎(chǔ)設(shè)施時(shí)自動(dòng)創(chuàng)建的,主要目的是使基礎(chǔ)設(shè)施能夠安全地與API交互。包括集群管理員(可以訪問所有內(nèi)容)、每個(gè)節(jié)點(diǎn)的用戶、路由器和內(nèi)部倉庫使用的用戶,以及各種其他用戶。還存在一個(gè)匿名系統(tǒng)用戶,默認(rèn)情況下,該用戶用于未經(jīng)身份驗(yàn)證的請(qǐng)求。system user主要包括:system:admin、system:openshift-registry和system:node:node1.。
Service accounts:這些是與項(xiàng)目關(guān)聯(lián)的特殊系統(tǒng)用戶。有些是在第一次創(chuàng)建項(xiàng)目時(shí)自動(dòng)創(chuàng)建的,項(xiàng)目管理員可以創(chuàng)建多個(gè),以便定義對(duì)每個(gè)項(xiàng)目?jī)?nèi)容的訪問。Service accounts由ServiceAccount對(duì)象表示。Service accounts主要包括:system:serviceaccount:default:deployer和system:serviceaccount:foo:builder。
每個(gè)用戶在訪問OpenShift容器平臺(tái)之前必須進(jìn)行身份驗(yàn)證。沒有身份驗(yàn)證或身份驗(yàn)證無效的API請(qǐng)求將使用匿名系統(tǒng)用戶身份驗(yàn)證來請(qǐng)求服務(wù)。身份驗(yàn)證成功后,策略確定用戶被授權(quán)做什么。
9.5 安全上下文約束(SCCS)OpenShift提供了一種名為安全上下文約束的安全機(jī)制,它限制對(duì)資源的訪問,但不限制OpenShift中的操作。
SCC限制從OpenShift中運(yùn)行的pod到主機(jī)環(huán)境的訪問:
社區(qū)開發(fā)的一些容器可能需要放松安全上下文約束,因?yàn)樗鼈兛赡苄枰L問默認(rèn)禁止的資源,例如文件系統(tǒng)、套接字或訪問SELinux上下文。
OpenShift定義的安全上下文約束(SCCs)可以使用以下命令作為集群管理員列出。
$ oc get scc
SCC通常有以下7中SCCS:
$ oc describe scc anyuid #查看某一種SCC詳情
OpenShift創(chuàng)建的所有容器都使用restricted類型的SCC,它提供了對(duì)OpenShift外部資源的有限訪問。
對(duì)于anyuid安全上下文,run as user策略被定義為RunAsAny,表示pod可以作為容器中可用的任何用戶ID運(yùn)行。這允許需要特定用戶使用特定用戶ID運(yùn)行命令的容器。
要將容器更改為使用不同的SCC運(yùn)行,需要?jiǎng)?chuàng)建綁定到pod的服務(wù)帳戶。
$ oc create serviceaccount service-account-name #首先創(chuàng)建服務(wù)賬戶
$ oc adm policy add-scc-to-user SCC -z service-account #將服務(wù)帳戶與SCC關(guān)聯(lián)
要確定哪個(gè)帳戶可以創(chuàng)建需要更高安全性要求的pod,可以使用scc-subject-review子命令。
$ oc export pod pod-name > output.yaml
$ oc adm policy scc-subject-review -f output.yaml
9.6 OpenShift與SELinuxOpenShift要求在每個(gè)主機(jī)上啟用SELinux,以便使用強(qiáng)制訪問控制提供對(duì)資源的安全訪問。同樣,由OpenShift管理的Docker容器需要管理SELinux上下文,以避免兼容性問題。
為了最小化在不支持SELinux的情況下運(yùn)行容器的風(fēng)險(xiǎn),可以創(chuàng)建SELinux上下文策略。
為了更新SELinux上下文,可以使用現(xiàn)有的SCC作為起點(diǎn)生成一個(gè)新的SCC。
$ oc export scc restricted > custom_selinux.yml #導(dǎo)出默認(rèn)的SCC
編輯導(dǎo)出的YAML文件以更改SCC名稱和SELinux上下文。
$ oc create -f yaml_file #使用修改后的ymal重新創(chuàng)建一個(gè)SCC
9.7 特權(quán)容器有些容器可能需要訪問主機(jī)的運(yùn)行時(shí)環(huán)境。S2I構(gòu)建器容器需要訪問宿主docker守護(hù)進(jìn)程來構(gòu)建和運(yùn)行容器。
例如,S2I構(gòu)建器容器是一類特權(quán)容器,它要求訪問超出其自身容器的限制。這些容器可能會(huì)帶來安全風(fēng)險(xiǎn),因?yàn)樗鼈兛梢允褂肙penShift節(jié)點(diǎn)上的任何資源。通過創(chuàng)建具有特權(quán)訪問權(quán)的服務(wù)帳戶,可以使用SCCs啟用特權(quán)容器的訪問。
十 資源訪問控制綜合實(shí)驗(yàn)10.1 前置準(zhǔn)備準(zhǔn)備完整的OpenShift集群,參考《003.OpenShift網(wǎng)絡(luò)》2.1。
10.2 本練習(xí)準(zhǔn)備 1 [student@workstation ~]$ lab secure-review setup 10.3 創(chuàng)建用戶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 禁用所有常規(guī)用戶的項(xiàng)目創(chuàng)建功能 10.5 確認(rèn)驗(yàn)證1 [student@workstation ~]$ oc login -u user-review -p redhat 2 [student@workstation ~]$ oc new-project test #普通用戶無法創(chuàng)建項(xiàng)目 3 Error from server (Forbidden): You may not request a new project via this API. 10.6 創(chuàng)建項(xiàng)目1 [student@workstation ~]$ oc login -u admin -p redhat 2 [student@workstation ~]$ oc new-project secure-review #使用管理員創(chuàng)建項(xiàng)目 10.7 授權(quán)用戶1 [student@workstation ~]$ oc project secure-review 2 Already on project "secure-review" on server "https://master.lab.:443". 3 [student@workstation ~]$ oc policy add-role-to-user edit user-review #將edit的role和user-review進(jìn)行關(guān)聯(lián) 10.8 測(cè)試訪問1 [student@workstation ~]$ oc login -u user-review -p redhat 2 [student@workstation ~]$ oc project secure-review #測(cè)試訪問 3 Already on project "secure-review" on server "https://master.lab.:443". 10.9 檢查模板1 [student@workstation ~]$ cd /home/student/DO280/labs/secure-review/ 2 [student@workstation secure-review]$ less mysql-ephemeral.yml 模板解讀:
該mysql-ephemeral.yml模板文件,包含openshift項(xiàng)目中的mysql臨時(shí)模板,pod所需的其他環(huán)境變量由模板參數(shù)初始化,并具有默認(rèn)值。
但沒有secret定義,后續(xù)操作將手動(dòng)創(chuàng)建模板所需的secret。
根據(jù)模板的要求,創(chuàng)建一個(gè)包含MySQL容器image使用的憑證的secret,將這個(gè)secret命名為mysql。
使用user-review developer用戶創(chuàng)建一個(gè)名為mysql的secret。這個(gè)secret應(yīng)該存儲(chǔ)用戶名mysql、密碼redhat和數(shù)據(jù)庫管理員密碼do280-admin。
數(shù)據(jù)庫用戶名由database-user定義。此用戶的密碼由mysql secret密鑰定義。
數(shù)據(jù)庫管理員密碼由database-root-password定義。
10.10 創(chuàng)建secret1 [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 #確認(rèn)驗(yàn)證secret 10.11 部署應(yīng)用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 轉(zhuǎn)發(fā)端口 1 [student@workstation ~]$ oc port-forward mysql-1-2lr7t 3306:3306 10.13 測(cè)試訪問 1 [student@workstation ~]$ mysql -umysql -predhat -h127.0.0.1 10.14 部署phpmyadmin應(yīng)用使用內(nèi)部倉庫registry.lab.的image部署phpmyadmin:4.7容器。phpmyadmin:4.7容器需要名為PMA_HOST的環(huán)境變量來提供MySQL服務(wù)器的IP地址。
使用模板創(chuàng)建一個(gè)基于FQND的MySQL pod的service。
為使用模板創(chuàng)建的MySQL服務(wù)器pod使用服務(wù)FQDN,該模板是mysql.secure-review.svc.cluster.local。
1 [student@workstation ~]$ oc new-app --name=phpmyadmin 2 --docker-image=registry.lab./phpmyadmin/phpmyadmin:4.7 3 -e PMA_HOST=mysql.secure-review.svc.cluster.local 結(jié)論:該命令會(huì)發(fā)出警告,提示需要root特權(quán)。默認(rèn)情況下,OpenShift不支持使用操作系統(tǒng)的root用戶運(yùn)行容器。
10.15 查看pod1 [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 因?yàn)闆]有root權(quán)限,因此部署失敗,需要提權(quán)。 10.16 授予權(quán)限1 [student@workstation ~]$ oc login -u admin -p redhat #使用管理員登錄 2 [student@workstation ~]$ oc create serviceaccount phpmyadmin-account #首先創(chuàng)建服務(wù)賬戶 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"] #將服務(wù)帳戶與anyuid安全上下文關(guān)聯(lián) 10.17 更新應(yīng)用1 [student@workstation ~]$ oc patch dc phpmyadmin --patch='{"spec":{"template":{"spec":{"serviceAccountName": "phpmyadmin-account"}}}}' #更新負(fù)責(zé)管理phpmyadmin的dc資源,任何開發(fā)人員用戶都可以執(zhí)行此操作。
本環(huán)境中,相關(guān)操作命令可以從/home/student/DO280/labs/secure-review文件夾中的patch-dc.sh腳本運(yùn)行或復(fù)制。
10.18 確認(rèn)驗(yàn)證1 [student@workstation ~]$ oc login -u user-review -p redhat 2 [student@workstation ~]$ oc get pods #確認(rèn)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 暴露服務(wù) 1 [student@workstation ~]$ oc expose svc phpmyadmin --hostname=phpmyadmin.apps.lab. 10.20 訪問測(cè)試 1 [student@workstation ~]$ curl -s http://phpmyadmin.apps.lab. 10.21 確認(rèn)及刪除1 [student@workstation ~]$ lab secure-review grade #環(huán)境腳本判斷 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 #刪除項(xiàng)目 |
|