園嶺網(wǎng)站建設(shè)附近有沒有學(xué)電腦培訓(xùn)的
寫在前面
- 因?yàn)閰⒓涌荚?#xff0c;會(huì)陸續(xù)分享一些
OpenShift
的筆記 - 博文內(nèi)容為 openshift 用戶認(rèn)證和權(quán)限管理以及
scc
管理相關(guān)筆記 - 學(xué)習(xí)環(huán)境為 openshift v3 的版本,有些舊
- 這里如果專門學(xué)習(xí) openshift ,建議學(xué)習(xí) v4 版本
- 理解不足小伙伴幫忙指正
對(duì)每個(gè)人而言,真正的職責(zé)只有一個(gè):找到自我。然后在心中堅(jiān)守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是對(duì)大眾理想的懦弱回歸,是隨波逐流,是對(duì)內(nèi)心的恐懼 ——赫爾曼·黑塞《德米安》
用戶認(rèn)證
OpenShift 中有用戶和權(quán)限的概念 。 用戶需要通過登錄賬號(hào)及密碼登錄 OpenShift 才能訪問相應(yīng)的資源以及執(zhí)行相關(guān)的操作 。 通過用戶提供的登錄信息確認(rèn)用戶身份的過程即認(rèn)證的過程。
認(rèn)證配置
認(rèn)證相關(guān)的配置可以通過下面的文件方式
[root@master master]# cat /etc/origin/master/master-config.yaml | grep -A 25 oauthConfig
oauthConfig:assetPublicURL: https://master.lab.example.com/console/grantConfig:method: autoidentityProviders:- challenge: truelogin: truemappingMethod: claimname: htpasswd_authprovider:apiVersion: v1file: /etc/origin/master/htpasswdkind: HTPasswdPasswordIdentityProvidermasterCA: ca-bundle.crtmasterPublicURL: https://master.lab.example.commasterURL: https://master.lab.example.comsessionConfig:sessionMaxAgeSeconds: 3600sessionName: ssnsessionSecretsFile: /etc/origin/master/session-secrets.yamltokenConfig:accessTokenMaxAgeSeconds: 86400authorizeTokenMaxAgeSeconds: 500
pauseControllers: false
policyConfig:bootstrapPolicyFile: /etc/origin/master/policy.json
[root@master master]#
通過上面的配置文件,可以看到當(dāng)前使用的認(rèn)證方式為 HTPasswdPasswordIdentityProvider
,使用 HTPasswd 身份驗(yàn)證插件來實(shí)現(xiàn)基于密碼的認(rèn)證。
當(dāng)前版本為 openshift 3.9 的版本,有些老舊,可以通 api
資源對(duì)象的方式來創(chuàng)建
創(chuàng)建一個(gè)包含 HTPasswd 文件的 Secret 對(duì)象,然后創(chuàng)建一個(gè)包含 HTPasswd 配置的 ConfigMap 對(duì)象。最后,我們將 HTPasswd 身份驗(yàn)證提供者添加到 OAuth 對(duì)象中,以便用戶可以使用用戶名和密碼進(jìn)行身份驗(yàn)證。類似下面這樣
以下是一個(gè)使用 HTPasswd 身份驗(yàn)證插件的示例:
apiVersion: v1
kind: Secret
metadata:name: htpasswd-secret
data:htpasswd: <base64-encoded-htpasswd-file>
type: Opaque---apiVersion: v1
kind: ConfigMap
metadata:name: htpasswd-configmap
data:htpasswd: |kind: HTPasswdPasswordIdentityProviderfile: /etc/openshift/htpasswd
type: Opaque---apiVersion: v1
kind: OAuth
metadata:name: oauth
spec:identityProviders:- name: htpasswdmappingMethod: claimtype: HTPasswdhtpasswd:fileData:name: htpasswd-secretidentityProviderConfig:name: htpasswd-configmap
我們使用 HTPasswd 身份驗(yàn)證插件來實(shí)現(xiàn)基于密碼的認(rèn)證。我們首先創(chuàng)建一個(gè)包含 HTPasswd 文件的 Secret 對(duì)象,然后創(chuàng)建一個(gè)包含 HTPasswd 配置的 ConfigMap 對(duì)象。最后,我們將 HTPasswd 身份驗(yàn)證提供者添加到 OAuth 對(duì)象中,以便用戶可以使用用戶名和密碼進(jìn)行身份驗(yàn)證。
了解過 k8s
的小伙伴,會(huì)發(fā)現(xiàn),k8s 中并沒有 OAuth
這個(gè)資源對(duì)象,也沒有 identityProviders
相關(guān)的,這是 OKD 所特有的,在OpenShift中,身份提供者(IDP,identityProviders)是一個(gè)組件,用于驗(yàn)證用戶并向 OpenShift 集群提供身份信息。OpenShift支持各種IDP,包括Htpasswd、LDAP和Keystone。
比如上面的配置,如果您想使用Htpasswd作為您的IDP,您可以按照以下步驟操作:
-
使用用戶名和密碼創(chuàng)建Htpasswd文件。您可以使用htpasswd命令行工具來創(chuàng)建和管理此文件。
-
在OpenShift中創(chuàng)建包含Htpasswd文件的secret。您可以使用以下命令創(chuàng)建secret:
oc create secret generic htpass-secret --from-file=htpasswd=path/to/htpasswd
此命令創(chuàng)建名為htpass-secret的secret,并將htpasswd文件設(shè)置為secret中htpasswd鍵的值。
- 創(chuàng)建引用Htpasswd secret的OAuth自定義資源。這也就是我們?cè)谧钌厦娴目吹降哪莻€(gè)。
認(rèn)證方式
上面為基于密碼的認(rèn)證,常見的 Openshift 的認(rèn)證方式有以下幾種:
- 基于密碼的認(rèn)證:用戶使用用戶名和密碼進(jìn)行身份驗(yàn)證。
- 基于令牌的認(rèn)證:用戶使用令牌進(jìn)行身份驗(yàn)證。令牌可以是 OAuth 令牌、API 密鑰或其他類型的令牌。
- 基于證書的認(rèn)證:用戶使用證書進(jìn)行身份驗(yàn)證。證書可以是客戶端證書或服務(wù)端證書。
在 Openshift 中,可以使用不同的身份驗(yàn)證插件來實(shí)現(xiàn)這些認(rèn)證方式。例如,可以使用 HTPasswd 身份驗(yàn)證插件來實(shí)現(xiàn)基于密碼的認(rèn)證,使用 OAuth 身份驗(yàn)證插件來實(shí)現(xiàn)基于令牌的認(rèn)證,使用 x509 身份驗(yàn)證插件來實(shí)現(xiàn)基于證書的認(rèn)證(管理員即使用的這一種)。
在 Openshift 中,還可以使用 LDAP、Kerberos、GitHub 等外部身份驗(yàn)證提供者來實(shí)現(xiàn)身份驗(yàn)證。這些提供者可以與身份驗(yàn)證插件結(jié)合使用,以實(shí)現(xiàn)不同的身份驗(yàn)證方式。
OpenShift
通過 OAuth 進(jìn)行用戶的認(rèn)證。 OAuth 是一個(gè)開源的認(rèn)證和授權(quán)的框架。 在 OpenShift 的 Master 節(jié)點(diǎn)上運(yùn)行著一個(gè)內(nèi)置的 OAuth 服務(wù)對(duì)用戶的請(qǐng)求進(jìn)行認(rèn)證檢查。一旦 OAuth 服務(wù)器通過登錄信息確認(rèn)了用戶的身份, OAuth 服務(wù)器就返回用戶的訪問 token (令牌) 。 通過這個(gè) token 用戶可以在有效的時(shí)間內(nèi)對(duì)系統(tǒng)進(jìn)行訪問
admin 是集群默認(rèn)的管理員。前面提到過,該用戶是一個(gè)特殊的用戶,它不能通過用戶名密碼登錄,只提供基于證書的認(rèn)證,之所以的master 節(jié)點(diǎn) 上執(zhí)行 oc、kubectl 命令,是因?yàn)樵谀J(rèn)目錄下存在 集群的 kubeconfig 文件
[root@master master]# oc whoami
system:admin
[root@master master]# oc whoami -t
error: no token is currently in use for this session
[root@master master]#
所以它沒有 token 的認(rèn)證方式,直接通過 kubeconfig
文件的方式進(jìn)行認(rèn)證
[root@master master]# cat /root/.kube/config
apiVersion: v1
clusters:
- cluster:certificate.....
用戶與組管理
用戶類型
OKD 中存在以下幾種用戶類型:
Regular users
:普通用戶。System users
:OKD 平臺(tái)自動(dòng)創(chuàng)建,用于 API 安全訪問。系統(tǒng)用戶包括集群管理員(具有所有訪問權(quán)限),routers 和 registries 使用的用戶,系統(tǒng)匿名用戶(用于非授權(quán)的請(qǐng)求)。 示例:system:admin system:openshift-registry system:node:node1.example.com
[root@master student]# oc get user
NAME UID FULL NAME IDENTITIES
admin 3300d7da-da70-11ed-a5c3-52540000fa0a htpasswd_auth:admin
liruilong b0cb659b-da74-11ed-a5c3-52540000fa0a htpasswd_auth:liruilong
Service accounts
:與項(xiàng)目關(guān)聯(lián)的特殊系統(tǒng)用戶,有些是隨項(xiàng)目創(chuàng)建時(shí)自勱創(chuàng)建。 項(xiàng)目管理員可以根據(jù)需要?jiǎng)?chuàng)建服務(wù)賬戶,用于管理項(xiàng)目資源。 換句話講,給集群中的pod 訪問容器的權(quán)限。每個(gè)項(xiàng)目會(huì)創(chuàng)建一個(gè)默認(rèn)的 sa 賬戶。
[root@master student]# oc get sa
NAME SECRETS AGE
builder 2 19h
default 3 19h
deployer 2 19h
registry 3 19h
router 2 19h
[root@master student]#
在 OKD 中,每個(gè)項(xiàng)目都需要 sa 賬戶執(zhí)行 build、deployment
和創(chuàng)建其他 pod, master-config.yml
參數(shù) managedNames 定義了每個(gè)項(xiàng)目默認(rèn) sa 賬戶。
[root@master student]# cat /etc/origin/master/master-config.yaml | grep -A 10 serviceAccountConfig
serviceAccountConfig:limitSecretReferences: falsemanagedNames:- default- builder- deployermasterCA: ca-bundle.crtprivateKeyFile: serviceaccounts.private.keypublicKeyFiles:- serviceaccounts.public.key
servingInfo:
[root@master student]#
- builder: 構(gòu)建pod需要每個(gè)項(xiàng)目中的構(gòu)建器服務(wù)賬戶,并賦予其
system:image-builder
角色,允許使用內(nèi)部容器注冊(cè)將鏡像推送到項(xiàng)目中的任何 image Stream。 - deployer: 每個(gè)項(xiàng)目中的部署者服務(wù)Account是部署pods所必需的,并在系統(tǒng)中提供
system:deployer
角色,該角色允許查看和修改項(xiàng)目中的復(fù)制控制器和pod default
: 默認(rèn)服務(wù)賬戶由所有其他pod使用,除非它們指定了不同的服務(wù)帳戶
用戶創(chuàng)建
在 OKD 中,可以通過面板界面的方式創(chuàng)建用戶
也可以通過命令行的方式來創(chuàng)建
這里我們看一個(gè) Demo,對(duì)于 HTPasswdIdentityProvider 模塊,使用 htpasswd 命令創(chuàng)建。 htpasswd 是一個(gè)阿帕奇開源的一個(gè)創(chuàng)建帳密的小工具h(yuǎn)ttp-tools的命令,使用時(shí)需要指定創(chuàng)建的密碼文件的位置
這里的密碼文件位置通過,配置的 認(rèn)證模塊來獲取
通過 api 資源文件獲取
data:htpasswd: |kind: HTPasswdPasswordIdentityProviderfile: /etc/openshift/htpasswd
通過靜態(tài)配置文件獲取
provider:apiVersion: v1file: /etc/origin/master/htpasswdkind: HTPasswdPasswordIdentityProvider
非交互式創(chuàng)建
[root@master master]# htpasswd -b /etc/origin/master/htpasswd liruilong redhat
Adding password for user liruilong
[root@master master]# cat /etc/origin/master/htpasswd
admin:$apr1$4ZbKL26l$3eKL/6AQM8O94lRwTAu611
developer:$apr1$4ZbKL26l$3eKL/6AQM8O94lRwTAu611
liruilong:$apr1$TEsPZeVC$mTKI3oehZBZrZUU74UhLn1
交互式創(chuàng)建
[root@master master]# htpasswd /etc/origin/master/htpasswd liruilong
New password:
Re-type new password:
Updating password for user liruilong
[root@master master]# cat /etc/origin/master/htpasswd
admin:$apr1$4ZbKL26l$3eKL/6AQM8O94lRwTAu611
developer:$apr1$4ZbKL26l$3eKL/6AQM8O94lRwTAu611
liruilong:$apr1$RhuXyaXn$xMo1M9CBBA2IftxBdtyHr1
[root@master master]#
也可以通過配置文件的方式來創(chuàng)建用戶
SA 服務(wù)賬號(hào)創(chuàng)建
sa 創(chuàng)建之后會(huì)生成一個(gè)默認(rèn)的 token ,某些面板工具可以通過 token
來實(shí)現(xiàn)認(rèn)證登錄。但是需要對(duì) sa 做授權(quán)
[root@master student]# oc create sa liruilong
serviceaccount "liruilong" created
[root@master student]# oc get sa liruilong
NAME SECRETS AGE
liruilong 2 9s
查看 sa 的詳細(xì)信息
[root@master student]# oc describe sa liruilong
Name: liruilong
Namespace: default
Labels: <none>
Annotations: <none>
Image pull secrets: liruilong-dockercfg-2bpbm
Mountable secrets: liruilong-token-rl57kliruilong-dockercfg-2bpbm
Tokens: liruilong-token-j5v87liruilong-token-rl57k
Events: <none>
[root@master student]# oc get secret liruilong-token-rl57k
NAME TYPE DATA AGE
liruilong-token-rl57k kubernetes.io/service-account-token 4 59s
[root@master student]#
用戶登錄
交互式登錄
[root@master master]# oc login -u liruilong
Authentication required for https://master.lab.example.com:443 (openshift)
Username: liruilong
Password:
Login successful.You don't have any projects. You can try to create a new project, by runningoc new-project <projectname>[root@master master]#
非交互式登錄
[root@master master]# oc login -u liruilong -p redhat https://master.lab.example.com:443
Login successful.You don't have any projects. You can try to create a new project, by runningoc new-project <projectname>[root@master master]#
登錄管理賬號(hào)查看用戶信息
[root@master student]# oc login -u admin
Authentication required for https://master.lab.example.com:443 (openshift)
Username: admin
Password:
[root@master student]# oc login -u admin -p redhat
Login successful.You have access to the following projects and can switch between them with 'oc project <projectname>':* defaultkube-publickube-service-catalogkube-systemloggingmanagement-infraopenshiftopenshift-ansible-service-brokeropenshift-infraopenshift-nodeopenshift-template-service-brokeropenshift-web-consoleUsing project "default".
查看當(dāng)前登錄用戶
[root@master student]# oc whoami
admin
[root@master student]# oc log
login logout logs
[root@master student]# oc log
login logout logs
[root@master student]# oc logout
Logged "admin" out on "https://master.lab.example.com:443"
[root@master student]# oc login -u liruilong -p redhat https://master.lab.example.com:443
Login successful.You don't have any projects. You can try to create a new project, by runningoc new-project <projectname>[root@master student]# oc whoami
liruilong
[root@master student]#
查看當(dāng)前登錄用戶的 tocke
[root@master student]# oc whoami -t
iTYaOvc7DZVBW-vmn_6m71-TrGPiltJ210OkfjMEEi4
[root@master student]#
查看用戶列表
查看用戶列表
[root@master student]# oc get user
NAME UID FULL NAME IDENTITIES
admin 3300d7da-da70-11ed-a5c3-52540000fa0a htpasswd_auth:admin
liruilong b0cb659b-da74-11ed-a5c3-52540000fa0a htpasswd_auth:liruilong
OpenShift 用戶信息來源于后端的省份提供者(Indentity Provider)。 假設(shè)用戶為 OpenShift 配置了某個(gè) Indentity Provider
,當(dāng)用戶第一次登錄時(shí), OpenShift 往會(huì)為這個(gè)用戶創(chuàng)建一個(gè) user 對(duì)象及一個(gè) identity 對(duì)象。這個(gè) identity 對(duì)象記錄了用戶來源于哪一個(gè)后端的 Indentity Provider
,以及相關(guān)的用戶信息 。
通過下面的例子可以看到當(dāng)前系統(tǒng)中的用戶,其來源 Provider 為 htpasswd auth 。
查看 identity 列表
[root@master student]# oc get identity
NAME IDP NAME IDP USER NAME USER NAME USER UID
htpasswd_auth:admin htpasswd_auth admin admin 3300d7da-da70-11ed-a5c3-52540000fa0a
htpasswd_auth:liruilong htpasswd_auth liruilong liruilong b0cb659b-da74-11ed-a5c3-52540000fa0a
[root@master student]#
刪除用戶
刪除 OKD 平臺(tái)中 user
[root@master ~]#oc delete user liruilong
刪除 liruilong 用戶對(duì)應(yīng)的 identity。
oc delete identity liruilong
刪除 identity provider
中用戶。
[root@master ~]# htpasswd -D /etc/origin/openshift-passwd liruilong
如果未刪除 identity provider 中用戶,此時(shí)還可以使用該用戶登錄到 ocp 平臺(tái)。
如果為新創(chuàng)建的一個(gè)用戶,不添加項(xiàng)目,那么這個(gè)用戶沒有任何權(quán)限,需要通過下面的方式添加用戶權(quán)限。
- 將用戶添加到項(xiàng)目中:
oc adm policy add-role-to-user <role> <username> -n <project>
- 從項(xiàng)目中刪除用戶:
oc adm policy remove-role-from-user <role> <username> -n <project>
- 刪除用戶:
oc adm policy remove-role-from-user <role> <username> -n <project>
請(qǐng)注意,命令 1 和 2 中的 是您要分配給用戶的角色,例如 admin 或 view。
組管理
組 (group)的信息的來源有兩個(gè),一是后端的 Indentity Provider
,二是通過用戶在 Open Shift 中定義 。 通過 oadm groups
命令,可以在 OpenShift 中對(duì)組及組的成員進(jìn)行管理。
添加組
[root@master student]# oc adm groups new devops
NAME USERS
devops
在組中添加用戶
[root@master student]# oc adm groups add-users devops liruilong
group "devops" added: "liruilong"
查看組
[root@master student]# kubectl get group
NAME USERS
devops liruilong
[root@master student]# oc get group
NAME USERS
devops liruilong
[root@master student]#
刪除組
[root@master student]# oc adm policy remove-group devops
Groups [devops] were not bound to roles in project default.
[root@master student]# kubectl get groups
NAME USERS
devops
[root@master student]# oc get group
NAME USERS
devops
[root@master student]# kubectl delete group devops
group "devops" deleted
[root@master student]# oc get group
No resources found.
[root@master student]#
權(quán)限管理
OKD 的權(quán)限處理方式有很多中,這里和 K8s 不同的是多了 Policy
,K8s 印象中沒有這一層關(guān)系, 同樣使用 RBAC 的權(quán)限管理方式進(jìn)行管理,不同的是弱化了綁定關(guān)系對(duì)象,進(jìn)行了封裝。
role
:Role (角色)是一組權(quán)限的集rule
:通過過權(quán)限 Rule,系統(tǒng)或用戶可以定義什么樣的角色可以對(duì)什么資源執(zhí)行什么動(dòng)作policy
: 若干個(gè) Role 組成一個(gè) 策略policy
,策略分為 集群級(jí)別Clusterpolicy
和命名空間Policy
級(jí)別.Role Binding
: 角色綁定關(guān)系,定義了角色于具體的用戶以及組的關(guān)聯(lián)關(guān)系,Policy Binding
: 若干 Role Binding組成的集合將構(gòu)成一個(gè) Policy Binding (策略綁定關(guān)系)。該對(duì)象類型同樣分為集群與項(xiàng)目?jī)蓚€(gè)級(jí)別 。
關(guān)于 RBAC
以及對(duì)應(yīng)的資源對(duì)象,這個(gè)不多做說明,簡(jiǎn)單來看一下當(dāng)前 集群內(nèi)置的一些角色
權(quán)限對(duì)象關(guān)系Demo
角色管理
k8s 中的 集群相關(guān)的資源有兩個(gè) role
和 clusterrole
,OKD 中,也是一樣的,角色一般用于處理命令空間,也就是okd 中的項(xiàng)目的資源,而 集群角色用于整個(gè)集群的角色控制。集群級(jí)別的 Clusterrole 和項(xiàng)目級(jí)別的 Role 。
查看當(dāng)前集群的角色和集群角色
[root@master student]# oc get clusterrole | head -n 5
NAME
admin
asb-access
asb-auth
basic-user
[root@master student]# oc get role
No resources found.
[root@master student]#
給用戶和組添加角色
給用戶或組添加角色和集群角色,這里在命令使用上和 k8s
有些出入,應(yīng)為 OKD 多個(gè)一層 policy ,默認(rèn)情況下,需要指定策略,即 policy
為當(dāng)前策略添加角色規(guī)則,看一下有什么命令
[root@master student]# oc adm policy add-cluster-role-to-
add-cluster-role-to-group add-cluster-role-to-user
通過下面的命令看到,可以把角色和集群角色添加到用戶和組上面,給 liruilong 用戶添加一個(gè) admin
[root@master student]# oc adm policy add-cluster-role-to-user admin liruilong
cluster role "admin" added: "liruilong"
[root@master student]# oc adm policy add-
add-cluster-role-to-group add-cluster-role-to-user add-role-to-group add-role-to-user add-scc-to-group add-scc-to-user
給 devops
組添加一個(gè) admin
的集群角色
[root@master student]# oc adm policy add-cluster-role-to-group admin devops
cluster role "admin" added: "devops"
[root@master student]#
綁定關(guān)系管理
用戶和角色的綁定關(guān)系查看
[root@master student]# oc get clusterrolebinding admin
NAME ROLE USERS GROUPS SERVICE ACCOUNTS SUBJECTS
admin /admin openshift-infra/template-instance-controller
[root@master student]#
admin-2 /admin liruilong
admin-3 /admin devops
查看哪個(gè) user 和 group 可以執(zhí)行特定 rule
[root@master student]# oc adm policy who-can delete user
Namespace: default
Verb: delete
Resource: users.user.openshift.ioUsers: adminsystem:adminsystem:serviceaccount:kube-system:clusterrole-aggregation-controllersystem:serviceaccount:kube-system:generic-garbage-collectorsystem:serviceaccount:kube-system:namespace-controllerGroups: system:cluster-adminssystem:masters[root@master student]# oc adm policy who-can delete pod
Namespace: default
Verb: delete
Resource: podsUsers: adminliruilongsystem:adminsystem:kube-schedulersystem:serviceaccount:kube-service-catalog:defaultsystem:serviceaccount:kube-system:clusterrole-aggregation-controllersystem:serviceaccount:kube-system:cronjob-controllersystem:serviceaccount:kube-system:daemon-set-controllersystem:serviceaccount:kube-system:generic-garbage-collectorsystem:serviceaccount:kube-system:job-controllersystem:serviceaccount:kube-system:namespace-controllersystem:serviceaccount:kube-system:node-controllersystem:serviceaccount:kube-system:persistent-volume-bindersystem:serviceaccount:kube-system:pod-garbage-collectorsystem:serviceaccount:kube-system:replicaset-controllersystem:serviceaccount:kube-system:replication-controllersystem:serviceaccount:kube-system:statefulset-controllersystem:serviceaccount:openshift-ansible-service-broker:asbsystem:serviceaccount:openshift-infra:build-controllersystem:serviceaccount:openshift-infra:deployer-controllersystem:serviceaccount:openshift-infra:pv-recycler-controllersystem:serviceaccount:openshift-infra:template-instance-controllerGroups: devopssystem:cluster-adminssystem:masters[root@master student]#
用戶默認(rèn)權(quán)限管理
用戶首次登錄獲取什么權(quán)限?默認(rèn)分配什么組和角色?每個(gè)項(xiàng)目綁定的角色和 用戶?整個(gè)集群綁定的角色和用戶?
默認(rèn)情況下,系統(tǒng)會(huì)為用戶授予這些默認(rèn)組
- 系統(tǒng):已認(rèn)證(
system:authenticated
):這被分配給API可認(rèn)證的所有用戶。非system:anonymous (用戶) 的所有人都在這個(gè)組中 - 系統(tǒng):已認(rèn)證:授權(quán)(
system:authenticated:oauth
):這將分配給使用嵌入式 oauth 服務(wù)器領(lǐng)發(fā)的 oauth 令牌進(jìn)行標(biāo)識(shí)的所有用戶。這不適用于服務(wù)帳戶(它們使用服務(wù)帳戶令牌) 或證書用戶 - 系統(tǒng):未經(jīng)身份驗(yàn)證(
system:unauthenticated
):這將分配給尚未提交憑據(jù)的用戶。無效憑據(jù)被拒絕,并顯示401錯(cuò)誤,因此這是針對(duì)根本沒有嘗試進(jìn)行身份驗(yàn)證的用戶.
所以正常的,如果登錄成功那么系統(tǒng)會(huì)默認(rèn)賦予 authenticated、authenticated:oauth
這兩個(gè)組的權(quán)限
管理員是無法手勱改變這些組成員,想改變這些組中成員權(quán)限,可以通過更改組的角色實(shí)現(xiàn)。 system:authenticated
和 sytem:authenticated:oauth
組具有的默認(rèn)角色
[root@master student]# oc get clusterrolebinding |grep -e system:authenticated -e USER
NAME ROLE USERS GROUPS SERVICE ACCOUNTS SUBJECTS
basic-users /basic-user system:authenticated
cluster-status-binding /cluster-status system:authenticated, system:unauthenticated
self-access-reviewers /self-access-reviewer system:authenticated, system:unauthenticated
self-provisioners /self-provisioner system:authenticated:oauth
servicecatalog-serviceclass-viewer-binding /servicecatalog-serviceclass-viewer system:authenticated
system:basic-user /system:basic-user system:authenticated, system:unauthenticated
system:build-strategy-docker-binding /system:build-strategy-docker system:authenticated
system:build-strategy-jenkinspipeline-binding /system:build-strategy-jenkinspipeline system:authenticated
system:build-strategy-source-binding /system:build-strategy-source system:authenticated
system:discovery /system:discovery system:authenticated, system:unauthenticated
system:discovery-binding /system:discovery system:authenticated, system:unauthenticated
system:oauth-token-deleters /system:oauth-token-deleter system:authenticated, system:unauthenticated
system:scope-impersonation /system:scope-impersonation system:authenticated, system:unauthenticated
system:webhooks /system:webhook system:authenticated, system:unauthenticated
修改用戶默認(rèn)權(quán)限
假設(shè)現(xiàn)在我們有這樣一個(gè)問題,我們不希望默認(rèn)的登錄用戶有 可以創(chuàng)建命名空間的權(quán)限, 即項(xiàng)目的權(quán)限,那么我們可以把對(duì)應(yīng)的綁定關(guān)系刪除。
可以看到創(chuàng)建項(xiàng)目的權(quán)限目前在 self-provisioner
這個(gè)角色
[root@master student]# oc describe clusterrole self-provisioner --all-namespaces
Name: self-provisioner
Created: 24 hours ago
Labels: <none>
Annotations: authorization.openshift.io/system-only=trueopenshift.io/description=A user that can request projects.openshift.io/reconcile-protect=false
Verbs Non-Resource URLs Resource Names API Groups Resources
[create] [] [] [ project.openshift.io] [projectrequests]
[root@master student]#
即將已授權(quán) self-provisioner
集群角色和用戶組(system:authenticated:oauth)的綁定關(guān)系取消。
直接通過 kubectl
命令刪除綁定關(guān)系
[root@master student]# kubectl delete clusterrolebinding self-provisioners
clusterrolebinding "self-provisioners" deleted
[root@master student]# htpasswd -b /etc/origin/master/htpasswd demo redhat
Adding password for user demo
[root@master student]# oc login -u demo -p redhat
Login successful.You don't have any projects. Contact your system administrator to request a project.
[root@master student]#
當(dāng)然也可以使用 OKD 的方式 ,移除策略中對(duì)應(yīng)的綁定關(guān)系規(guī)則,下面我們通過這種方式來添加了對(duì)應(yīng)的綁定關(guān)系,可以看到登錄的時(shí)候擁有了創(chuàng)建項(xiàng)目的權(quán)限
[root@master student]# oc adm policy add-cluster-role-to-group self-provisioner system:authenticated:oauth
cluster role "self-provisioner" added: "system:authenticated:oauth"
[root@master student]# oc get clusterrolebinding |grep -e system:authenticated -e USER | grep provisioner
self-provisioner-0 /self-provisioner system:authenticated:oauth[root@master student]# oc logout
Logged "admin" out on "https://master.lab.example.com:443"
[root@master student]# oc login -u demo -p redhat
Login successful.You don't have any projects. You can try to create a new project, by runningoc new-project <projectname>[root@master student]#
安全上下文(SCC)管理
Kubernetes 中的容器安全有三個(gè)主要的組件:Pod Security Policies (PSP),Pod Security Admission (PSA) 和 Security Context (SC)
。 K8s 中 PSP 在1.25 的版本中被測(cè)底廢除,只能使用 PSA 。
OpenShift 中的容器安全組件是 Security Context Constraints (SCC)
。
上面這四個(gè)組件的作用是確保容器在 Kubernetes 或 OpenShift 集群中運(yùn)行時(shí)的安全性。它們的相同點(diǎn)和不同點(diǎn)如下:
相同點(diǎn):
- 都是用于保證容器安全的組件。
- 都可以用于限制容器的權(quán)限和訪問控制。
- 都可以用于限制容器的資源使用。
不同點(diǎn):
- PSP 是一種集群級(jí)別的安全策略,可以限制 Pod 的安全上下文和訪問控制。而 PSA 是一種動(dòng)態(tài)的安全策略,可以在 Pod 創(chuàng)建時(shí)對(duì)其進(jìn)行檢查和限制。而 SCC 是 OpenShift 中的一種安全策略,可以限制容器的權(quán)限和訪問控制。
- PSP 和 PSA 都可以限制容器的權(quán)限和訪問控制,但 PSP 更加靈活,可以根據(jù) Pod 的標(biāo)簽和命名空間來進(jìn)行限制。而 PSA 只能根據(jù) Pod 的規(guī)范來進(jìn)行限制。而 SCC 可以根據(jù)用戶、命名空間和標(biāo)簽來進(jìn)行限制。
- Security Context 是一種在容器級(jí)別上設(shè)置的安全策略,可以限制容器的權(quán)限和訪問控制。與 PSP、PSA 和 SCC 不同的是,Security Context 是在容器級(jí)別上設(shè)置的,而 PSP、PSA 和 SCC 是在 Pod 或集群級(jí)別上設(shè)置的。
回到 SSC,安全上下文( Security Context Constraint, SCC)要管控的是具體容器可以或不可以執(zhí)行哪些操作或調(diào)用 。 SCC 是 OpenShift 規(guī)范用戶運(yùn)行容器行為的一個(gè)有效途徑,比如相同的鏡像,可能在 docker 中可以運(yùn)行,在openshift 中不能運(yùn)行。
換句話講,通過 SCC 來限定 Pod 對(duì)宿主節(jié)點(diǎn)的資源訪問,雖然通過 Linux 命名空間有對(duì)應(yīng)的資源限制。
利用 SCC ,管理員能對(duì)Pod做如下的一些約束:
- 運(yùn)行特權(quán)容器 (privileged container)
- 為容器增加能力 (capahiliticg)
- 用主機(jī)上的目錄作為卷
- 容器的 SELinux 下文
- 用戶 TD
- 主機(jī)命名空間和網(wǎng)絡(luò)
- 為Pod 的卷分配 FSGroup
- 配置允許的補(bǔ)充組
- 要求使用只讀文件系統(tǒng)
- 控制允許使用的卷類型
- 控制允許使用的安全計(jì)算模式配置文件(seccop prorile)
默認(rèn)情況下,任何容器的執(zhí)行都只授予 restricted(受限制)
的 SCC,這個(gè) SCC 是最嚴(yán)格的,適用于以 root 權(quán)限運(yùn)行的 pod。它限制了 pod 對(duì)主機(jī)文件系統(tǒng)和網(wǎng)絡(luò)的訪問。
查看當(dāng)前命名空間下的所以的 SSC ,OpenShift 有七個(gè) SCC
[root@master student]# oc get scc
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP PRIORITY READONLYROOTFS VOLUMES
anyuid false [] MustRunAs RunAsAny RunAsAny RunAsAny 10 false [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
hostaccess false [] MustRunAs MustRunAsRange MustRunAs RunAsAny <none> false [configMap downwardAPI emptyDir hostPath persistentVolumeClaim projected secret]
hostmount-anyuid false [] MustRunAs RunAsAny RunAsAny RunAsAny <none> false [configMap downwardAPI emptyDir hostPath nfs persistentVolumeClaim projected secret]
hostnetwork false [] MustRunAs MustRunAsRange MustRunAs MustRunAs <none> false [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
nonroot false [] MustRunAs MustRunAsNonRoot RunAsAny RunAsAny <none> false [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
privileged true [*] RunAsAny RunAsAny RunAsAny RunAsAny <none> false [*]
restricted false [] MustRunAs MustRunAsRange MustRunAs RunAsAny <none> false [configMap downwardAPI emptyDir persistentVolumeClaim projected secret]
[root@master student]#
對(duì)應(yīng) 的7中 SCC 限制說明:
- restricted:這個(gè) SCC 是最嚴(yán)格的,適用于以 root 權(quán)限運(yùn)行的 pod。它限制了 pod 對(duì)主機(jī)文件系統(tǒng)和網(wǎng)絡(luò)的訪問。
- privileged:這個(gè) SCC 允許 pod 以完整的 root 權(quán)限運(yùn)行,并訪問所有主機(jī)資源。它適用于需要訪問敏感主機(jī)資源的 pod。
- anyuid:這個(gè) SCC 允許 pod 以任何用戶 ID 和組 ID 運(yùn)行。它適用于需要訪問默認(rèn)用戶 ID 不可訪問的主機(jī)資源的 pod。
- hostaccess:這個(gè) SCC 允許 pod 掛載主機(jī)文件系統(tǒng)并訪問主機(jī)設(shè)備。它適用于需要訪問默認(rèn)用戶 ID 不可訪問的主機(jī)資源的 pod。
- hostmount-anyuid:這個(gè) SCC 允許 pod 掛載主機(jī)文件系統(tǒng)并以任何用戶 ID 和組 ID 運(yùn)行。它適用于需要訪問默認(rèn)用戶 ID 不可訪問的主機(jī)資源的 pod。
- nonroot:這個(gè) SCC 適用于不需要 root 權(quán)限的 pod。它限制了 pod 對(duì)主機(jī)文件系統(tǒng)和網(wǎng)絡(luò)的訪問。
- hostnetwork: 這個(gè) SCC 允許 pod 使用主機(jī)網(wǎng)絡(luò)命名空間。這意味著 pod 可以訪問主機(jī)上的網(wǎng)絡(luò)接口和端口,而不是被限制在容器網(wǎng)絡(luò)命名空間中。這個(gè) SCC 可能會(huì)增加 pod 對(duì)主機(jī)網(wǎng)絡(luò)的訪問權(quán)限,因此需要謹(jǐn)慎使用。
查看當(dāng)前 privileged SCC的詳細(xì)信息
[root@master student]# oc describe scc privileged
Name: privileged
Priority: <none>
Access:Users: system:admin,system:serviceaccount:openshift-infra:build-controller,system:serviceaccount:management-infra:management-admin,system:serviceaccount:management-infra:inspector-adminGroups: system:cluster-admins,system:nodes,system:masters
Settings:Allow Privileged: trueDefault Add Capabilities: <none>Required Drop Capabilities: <none>Allowed Capabilities: *Allowed Seccomp Profiles: *Allowed Volume Types: *Allowed Flexvolumes: <all>Allow Host Network: trueAllow Host Ports: trueAllow Host PID: trueAllow Host IPC: trueRead Only Root Filesystem: falseRun As User Strategy: RunAsAnyUID: <none>UID Range Min: <none>UID Range Max: <none>SELinux Context Strategy: RunAsAnyUser: <none>Role: <none>Type: <none>Level: <none>FSGroup Strategy: RunAsAnyRanges: <none>Supplemental Groups Strategy: RunAsAnyRanges: <none>
[root@master student]#
詳情中的 Run As User Strategy: RunAsAny
表示可以使用容器中的任意用戶 ID 執(zhí)行,但運(yùn)行容器需要指定特定的 Service 用戶
查看系統(tǒng)默認(rèn)的restricted SCC 詳細(xì)信息
[root@master student]# oc describe scc restricted
Name: restricted
Priority: <none>
Access:Users: <none>Groups: system:authenticated
Settings:Allow Privileged: falseDefault Add Capabilities: <none>Required Drop Capabilities: KILL,MKNOD,SETUID,SETGIDAllowed Capabilities: <none>Allowed Seccomp Profiles: <none>Allowed Volume Types: configMap,downwardAPI,emptyDir,persistentVolumeClaim,projected,secretAllowed Flexvolumes: <all>Allow Host Network: falseAllow Host Ports: falseAllow Host PID: falseAllow Host IPC: falseRead Only Root Filesystem: falseRun As User Strategy: MustRunAsRangeUID: <none>UID Range Min: <none>UID Range Max: <none>SELinux Context Strategy: MustRunAsUser: <none>Role: <none>Type: <none>Level: <none>FSGroup Strategy: MustRunAsRanges: <none>Supplemental Groups Strategy: RunAsAnyRanges: <none>
[root@master student]#
Run As User Strategy: MustRunAsRange
:則表示容器必須以指定的用戶 ID 運(yùn)行。具體來說,MustRunAsRange 策略要求容器的用戶 ID 必須在指定的范圍內(nèi)。這個(gè)范圍由 RunAsUser 和 RunAsGroup 字段指定。如果容器的用戶 ID 不在指定的范圍內(nèi),容器將無法啟動(dòng)。
pod 以哪個(gè)用戶身份執(zhí)行,如果沒有明確挃定,則由 pod 使用的 scc 確定。明確指定方法,下面為 K8s官網(wǎng)的一個(gè)Demo。
apiVersion: v1
kind: Pod
metadata:name: security-context-demo
spec:securityContext:runAsUser: 1000runAsGroup: 3000fsGroup: 2000volumes:- name: sec-ctx-volemptyDir: {}containers:- name: sec-ctx-demoimage: busybox:1.28command: [ "sh", "-c", "sleep 1h" ]volumeMounts:- name: sec-ctx-volmountPath: /data/demosecurityContext:allowPrivilegeEscalation: false
SCC 使用案例
如果你有一個(gè)需要特定 capability 能力的應(yīng)用,但是這個(gè) capability 不能通過系統(tǒng)默認(rèn)的 restricted SCC 授予,此時(shí)可以創(chuàng)建一個(gè)特殊的 service account,并將該賬戶加到 SCC 中。創(chuàng)建應(yīng)用使用此 sa 賬戶。
Openshift 中容器默認(rèn)是以隨機(jī)用戶執(zhí)行 command 的,如果該容器中 command 命令要求 root 用戶執(zhí)行,那么容器就無法創(chuàng)建
[root@master student]# oc new-app --name=nginx --docker-image=registry.lab.example.com/nginx
--> Found Docker image c825216 (4 years old) from registry.lab.example.com for "registry.lab.example.com/nginx"* An image stream will be created as "nginx:latest" that will track this image* This image will be deployed in deployment config "nginx"* Port 80/tcp will be load balanced by service "nginx"* Other containers can access this service through the hostname "nginx"* WARNING: Image "registry.lab.example.com/nginx" runs as the 'root' user which may not be permitted by your cluster administrator--> Creating resources ...imagestream "nginx" createddeploymentconfig "nginx" createdservice "nginx" created
--> SuccessApplication is not exposed. You can expose services to the outside world by executing one or more of the commands below:'oc expose svc/nginx'Run 'oc status' to view your app.
[root@master student]# oc expose svc/nginx
route "nginx" exposed
[root@master student]# kubectl get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
docker-registry docker-registry-default.apps.lab.example.com docker-registry <all> passthrough None
nginx nginx-default.apps.lab.example.com nginx 80-tcp None
registry-console registry-console-default.apps.lab.example.com registry-console <all> passthrough None
[root@master student]# kubectl get pods
NAME READY STATUS RESTARTS AGE
docker-registry-1-drmbk 1/1 Running 2 1d
nginx-1-deploy 1/1 Running 0 45s
nginx-1-h5zx8 0/1 CrashLoopBackOff 2 42s
registry-console-1-dg4h9 1/1 Running 2 1d
router-1-27wtd 1/1 Running 2 1d
router-1-lvmvk 1/1 Running 2 1d
可以看到 pod 一直創(chuàng)建失敗。
[root@master student]# kubectl get pods --selector=app=nginx
NAME READY STATUS RESTARTS AGE
nginx-1-h5zx8 0/1 CrashLoopBackOff 6 6m
[root@master student]#
在最前面的 Pod 創(chuàng)建的時(shí)候,我們看到一個(gè)告警,提示提示,以root 的方式運(yùn)行不被集群管理員所允許。所以 Pod 狀態(tài)一直是 CrashLoopBackOff
.
* WARNING: Image "registry.lab.example.com/nginx" runs as the 'root' user which may not be permitted by your cluster administrator
[root@master student]# oc describe pods nginx-1-h5zx8 | grep -i -A 20 event
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 13m default-scheduler Successfully assigned nginx-1-h5zx8 to node2.lab.example.comNormal SuccessfulMountVolume 13m kubelet, node2.lab.example.com MountVolume.SetUp succeeded for volume "default-token-bmctn"Normal Pulled 12m (x4 over 13m) kubelet, node2.lab.example.com Successfully pulled image "registry.lab.example.com/nginx@sha256:4ffd9758ea9ea360fd87d0cee7a2d1cf9dba630bb57ca36b3108dcd3708dc189"Normal Created 12m (x4 over 13m) kubelet, node2.lab.example.com Created containerNormal Started 12m (x4 over 13m) kubelet, node2.lab.example.com Started containerNormal Pulling 11m (x5 over 13m) kubelet, node2.lab.example.com pulling image "registry.lab.example.com/nginx@sha256:4ffd9758ea9ea360fd87d0cee7a2d1cf9dba630bb57ca36b3108dcd3708dc189"Warning BackOff 3m (x46 over 13m) kubelet, node2.lab.example.com Back-off restarting failed container
[root@master student]#
這個(gè)時(shí)候,我們可以修改默認(rèn)的 SCC 相關(guān)的權(quán)限,或者通過創(chuàng)建新的 SA 的方式,創(chuàng)建服務(wù)帳戶;將特定 SCC(如 anyuid)添加給用戶;修改 dc 使用創(chuàng)建的 sa 用戶身份運(yùn)行。
這里創(chuàng)建的 SA ,綁定到
oc create sa useroot
oc adm policy add-scc-to-user anyuid -z useroot
修改應(yīng)用 dc,使用 sa-useroot 用戶運(yùn)行容器
oc patch dc/nginx --patch '{"spec":{"template":{"spec":{"serviceAccountName": " useroot"}}}}'
dc 會(huì)根據(jù) template 的定義創(chuàng)建 pod。
serviceAccountName: useroot
也可以直接修改 默認(rèn) sa 的綁定的 SCC 。
oc adm policy add-scc-to-user anyuid -z default -n test2
關(guān)于 secret 這里簡(jiǎn)單介紹,Secret 對(duì)象類型提供了一種保存敏感信息的機(jī)制,例如密碼,OCP 客戶端配置文件,Docker 配置文件,私有 sorce registry 憑據(jù)。
博文部分內(nèi)容參考
? 文中涉及參考鏈接內(nèi)容版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)告知,這是一個(gè)開源項(xiàng)目,如果你認(rèn)可它,不要吝嗇星星哦 😃
《OKD 3.9 DO280 Red Hat OpenShift Administration I》
《開源容器云OpenShift:構(gòu)建基于Kubernetes的企業(yè)應(yīng)用云平臺(tái)》
https://docs.okd.io/latest/welcome/index.html
? 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)