當安裝完 Red Hat OpenShift 之後...

如果有朋友剛弄好 OpenShift 4 可能對於很多預設機制感到有點狐疑,這篇文章就是要來解釋,安裝完 OpenShift 4 後,最重要的小事 - 帳號權限認證 (Authentication)

Red Hat OpenShift 的權限認證一如繼往都是採用角色型存取控制 (Role Based Access Control, RBAC),這邊就要來準備開始務實一點的操作,本文先從簡單的把預設帳號置換開始做起

圖片出處: 【最終幻想7:重製版】4K電影剪輯版(後篇) - 零收集、電影式運鏡、完整劇情 - PS4 Pro增強模式 - Final Fantasy VII: REMAKE - 太空戰士7- Semenix出品

話說大家也可以多多支持一下 Semenix Gaming - 大大的影片,我的圖片都是截他的頻道,錄的影片相當有水準,最近都在看它的影片當作自己有在打太七 Q_Q

走馬看花之旅: 第五天

預設剛裝完 OpenShift 4,應該都會拿到 3 個資訊

但因為預設帳號導致的資安議題,這個預設的 kubeadminXXXX-XXXX-XXXX-XXXX 不建議持續使用,建議是換成別的帳號替換它既有的角色 cluster-admin,詳請可參考 Removing the kubeadmin user - OpenShift 4.3

準備 HTPasswd Identity Provider

預計將 kubeadmin 置換成 ocproot,權限也要一併移轉,將透過 HTPasswd Identity Porvider 的方式將帳號設定好

設定 OAuth 資源

這邊先開啟一個檔案 oauth.yaml,新增 identityProvider 名字為 local_htpasswd_provider,形式為 HTPasswd,帳號密碼對照表放在 local-htpasswd-secret 裡面。

當中的 local-htpasswd-secret 將之後再新增,所以不用這時候先準備

oauth.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
name: cluster
spec:
identityProviders:
- name: local_htpasswd_provider
challenge: true
login: true
mappingMethod: claim
type: HTPasswd
htpasswd:
fileData:
name: local-htpasswd-secret
1
2
3
4
5
6
7
8
9
# Update OAuth CRD
$ oc apply -f oauth.yaml
oauth.config.openshift.io/cluster configured

# Check
$ oc describe oauth cluster

# Update in the future if needed
$ oc get oauth cluster -o yaml > oauth.yaml

設定新的最高權限帳號 - ocproot

這邊對照過往 Linux 操作系統的習慣,我自行取名 ocproot,如果你想要取別的也可以,請自行修改沒問題

  1. 確保你有 htpasswd 可以使用
1
2
# Make sure you have htpasswd
$ sudo yum install httpd-tools -y
  1. 新增 local-htpasswd-secret 檔案,新增 ocproot/ocproot 進去
1
2
3
4
5
6
7
8
9
10
11
12
# Create
$ htpasswd -c -B -b localuser-htpasswd ocproot ocproot
Adding password for user ocproot

$ cat localuser-htpasswd
ocproot:$2y$05$pMTSySH/qa.gTcom9q/Pd.WHoI8VMIpCHWgc9d7cnQuIbRuuPeMia

# Update if needed
# $ htpasswd -b localuser-htpasswd ocproot ocproot

# Remove if needed
# $ htpasswd -D localuser-htpasswd ocproot ocproot
  1. 新增 HTpasswd 進去到 OpenShift 裡面
1
2
$ oc create secret generic local-htpasswd-secret --from-file htpasswd=/root/user/localuser-htpasswd -n openshift-config
secret/local-htpasswd-secret created
  1. 新增叢集最高權限 cluster-adminocproot
1
2
$ oc adm policy add-cluster-role-to-user cluster-admin ocproot
clusterrole.rbac.authorization.k8s.io/cluster-admin added: "ocproot"
  1. 測試 ocproot
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ oc login -u ocproot
    oc login -u ocproot
    Authentication required for https://api.ocp4.internal:6443 (openshift)
    Username: ocproot
    Password:
    Login successful.

    $ oc whoami
    ocproot

    $ oc get users
    NAME UID FULL NAME IDENTITIES
    ocproot 3635b015-3664-4836-a5a0-2aff1100d99c local_htpasswd_provider:ocproot

移除 kubeadmin 帳號

根據 Removing the kubeadmin user - OpenShift 4.3 來移除預設帳號 kubeadmin,務必要記得,你的集群裡面一定要有

  • 一個以上的 Identity Provider,一般都是用 HTpasswd
  • 一個以上的帳號具備 cluster-admin 的權限

不然你會登不進去集群 = =,這是不可逆的指令

1
2
# Remove it
$ oc delete secrets kubeadmin -n kube-system

修改自動登出時間

根據 Configuring the internal OAuth server - OpenShift 4.3,跟 OpenShift 3 一樣,都是要修改 accessTokenMaxAgeSeconds 值,預設時間應該是 86400,也就是 24 小時後登出,因為太長了,所以改為 3600,也就是登入 1 小時後自動登出

oauth.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
name: cluster
spec:
identityProviders:
- name: local_htpasswd_provider
challenge: true
login: true
mappingMethod: claim
type: HTPasswd
htpasswd:
fileData:
name: local-htpasswd-secret
tokenConfig:
accessTokenMaxAgeSeconds: 3600

如同修改 OAuth ㄧ樣,執行下列操作即可

1
2
3
4
5
6
# Update OAuth CRD
$ oc apply -f oauth.yaml
oauth.config.openshift.io/cluster configured

# Check
$ oc describe oauth cluster

結語

做完上面的步驟,只是剛剛好準備開始以正確且安全的姿勢操作 OpenShift 4,下一篇會提到更複雜的 Users/Groups/Projects 的 RBAC 控制操作

對 我知道你的血條就跟下圖ㄧ樣

Appendix

Q: 登入時,遇到 error: x509: certificate signed by unknown authority

1
2
$ oc login -u ocproot --insecure-skip-tls-verify=true
error: x509: certificate signed by unknown authority

這問題是因為預設是自簽憑證 (Self-Signed),系統沒有安裝這張自簽的 CA ,所以要特別拉出來安裝在系統或者是在你的筆電上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ oc project openshift-authentication

# Same content
$ oc get pods
NAME READY STATUS RESTARTS AGE
oauth-openshift-74fbdf999f-6kpnn 1/1 Running 0 10m
oauth-openshift-74fbdf999f-787cm 1/1 Running 0 10m

# Pick one and copy the cert to outside
$ oc rsh oauth-openshift-74fbdf999f-6kpnn cat /run/secrets/kubernetes.io/serviceaccount/ca.crt > ocp4-ingress-ca.crt

# It work on RHEL 7.7
$ cp ocp4-ingress-ca.crt /etc/pki/ca-trust/source/anchors/
$ update-ca-trust extract

# Verify Cert is working
$ openssl verify ocp4-ingress-ca.crt
ocp4-ingress-ca.crt: OK

切換回 system:admin

1
2
3
4
5
6
$ oc whoami
ocproot
$ oc config use-context admin
Switched to context "admin".
$ oc whoami
system:admin

References

Comments