OpenShift 4 - 提升客户端访问 API Server 安全

OpenShift / RHEL / DevSecOps 汇总目录

kubeconfig 文件的作用

OpenShift 或 Kubernetes 的客户端每次向 OpenShift或 Kubernetes 发出命令,Kubernetes 都需要对其身份进行识别。如果 Kubernetes 识别出客户端没有认证登录,那么将无法执行指令。
在这里插入图片描述

为了简化客户端操作,我们并不需要在每次发出的命令中都提供身份认证信息,而是使用 kubeconfig 文件保存客户端的会话。通常当客户端首次通过命令行登录 OpenShift 后会自动在 $HOME/.kube/ 目录下创建 config 文件,它除了保存当前用户身份认证信息外还会保存曾经访问过的集群 API Server 地址、当前默认操作的 namespace 等信息。这样客户端就可以决定使用哪个身份、访问哪个集群、在哪个项目中执行命令来操作。

OpenShift 客户端除了默认使用 $HOME/.kube/config 文件,也可以用 KUBECONIFG 变量指定默认的文件位置,或者每次在命令中使用 --kubeconfig 参数指定该文件位置。

kubeconfig 文件构成

在 kubeconfig 文件中包括三部分:

  • clusters:记录访问过的集群
  • contexts:记录访问过的每个集群当前使用的 namespace
  • users:记录访问过的每个集群的用户认证信息。

其中 users 部分可以使用以下几种方式来记录用户的认证信息:证书/秘钥、用户名/密码、Token。

users:
- name: admin1
  user:
    client-certificate: your-cert-file
    client-key: your-key-file
- name: admin2
  user:
    client-certificate-data: cert-string-base64
    client-key-data: key-string-base64
- name: admin3
  user:
    username: admin
    password: mypassword
- name: admin4
  user:
    token: sha256~tqccPtgknX99ZwK-Sc5umeXz8-b_Hqgxrb4vQ3VWPgs

用户认证 Token

通常,OpenShift 客户端会将认证过用户的会话 Token 保存在 kubeconfig 文件中。默认情况 OpenShift 的 Token 仅在 24 小时内有效,现有的会话会在此时间过后到期。由于 Token 具备有效时限,因此要比长时间有效的“用户名/密码”或证书更安全。

  1. 退出登录,删除已有的 kubeconfig 文件。
$ oc logou
$ rm $HOME/.kube/config
  1. 在未登录的时候执行 oc 命令,客户端会提示找不到 kubeconfig 文件。
$ oc whoami
error: Missing or incomplete configuration info.  Please point to an existing, complete config file:
 
  1. Via the command-line flag --kubeconfig
  2. Via the KUBECONFIG environment variable
  3. In your home directory as ~/.kube/config

To view or setup config directly use the 'config' command.
  1. 登录 OpenShift 的 OCP-API-SERVER。
$ oc login OCP-API-SERVER -u USERNAME -p PASSWORD
  1. 确认生成了 $HOME/.kube/config 文件。
$ cat $HOME/.kube/config
apiVersion: v1
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://api.crc.testing:6443
  name: api-crc-testing:6443
contexts:
- context:
    cluster: api-crc-testing:6443
    namespace: default
    user: admin/api-crc-testing:6443
  name: default/api-crc-testing:6443/admin
current-context: default/api-crc-testing:6443/admin
kind: Config
preferences: {}
users:
- name: admin/api-crc-testing:6443
  user:
    token: sha256~tqccPtgknX99ZwK-Sc5umeXz8-b_Hqgxrb4vQ3VWPgs
  1. 查看该文件的属性,确认只有本用户才能“读写”这个文件,其他用户都无法访问这个文件。
$ ls -l ~/.kube/config
-rw------- 1 root root 727 Apr 21 12:47 /root/.kube/config

了解 OpenShift 认证和 Token 关系

  1. 执行命令查看已经登录的用户 oauthaccesstokens。以下有3个客户端登录了 OpenShift,其中2个是通过 console 认证的身份,1个是通过 oc 命令认证的身份。
$ oc get oauthaccesstokens 
NAME                                                 USER NAME   CLIENT NAME                    CREATED                EXPIRES                         REDIRECT URI                                                                                      SCOPES
sha256~6Bnlp-r9GRe-oTH2_HOf0PHb8dSDukxK94psf0ZO7Vo   admin       console                        2022-04-19T13:48:21Z   2022-04-20 13:48:21 +0000 UTC   https://console-openshift-console.crc-dzk9v-master-0.crc.t2nlpquzh82q.instruqt.io/auth/callback   user:full
sha256~lMj713Q6LUVBrFtjMUwpLFUn7Qi_pSijm9LFS7rzmV4   admin       openshift-challenging-client   2022-04-19T13:48:38Z   2022-04-20 13:48:38 +0000 UTC   https://oauth-openshift.crc-dzk9v-master-0.crc.t2nlpquzh82q.instruqt.io/oauth/token/implicit      user:full
sha256~q_0BM9by-I7YRmTeFItdD5laF8MbYdNV5icZlFYZkd4   admin       console                        2022-04-19T13:47:47Z   2022-04-20 13:47:47 +0000 UTC   https://console-openshift-console.crc-dzk9v-master-0.crc.t2nlpquzh82q.instruqt.io/auth/callback   user:full
  1. 查看其中一个 oauthaccesstoken,可以看到登录用户是 admin,用户是在 “2 minutes ago” 登录成功,Token 有效时间是 “24 hours”。
$ oc describe oauthaccesstokens sha256~6Bnlp-r9GRe-oTH2_HOf0PHb8dSDukxK94psf0ZO7Vo
Name:           sha256~6Bnlp-r9GRe-oTH2_HOf0PHb8dSDukxK94psf0ZO7Vo
Created:        2 minutes ago
Labels:         <none>
Annotations:    <none>
Scopes:         [user:full]
Expires In:     24 hours
User Name:      admin
User UID:       f2736e81-192b-45d5-92a9-910464451fba
Client Name:    console
  1. 如果删除一个 oauthaccesstoken,对应已被认证的用户需要重新登录才能再次访问 OpenShift。
$ oc delete oauthaccesstokens sha256~lMj713Q6LUVBrFtjMUwpLFUn7Qi_pSijm9LFS7rzmV4
$ oc whoami
error: You must be logged in to the server (Unauthorized)

更改 Token 有效时间,增强客户端访问安全

Token 是 OpenShift 服务器端生成用来为客户端认证用的。Token 默认 24 小时有效,可以修改 OAuth 的 accessTokenMaxAgeSeconds 参数来修改默认 Token 的有效时间。

执行命令,将 Token 的有效时间改为 172800 秒(2 天)。

$ oc edit OAuth cluster
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  annotations:
...
...
spec:
  tokenConfig:
    accessTokenMaxAgeSeconds: 172800

另外,当 OpenShift 客户端在一段时间没有访问 API Server 后客户端会进入 InactivityTimeout,其保存在本地 kubeconfig 中的 Token 也会失效。这时客户端也需要重新登录才可以继续访问 OpenShift。

执行以下命令,修改名为 openshift-challenging-client 的 oauthclient 中的 accessTokenInactivityTimeoutSeconds 参数为 300 秒。

$ oc edit oauthclient openshift-challenging-client
apiVersion: oauth.openshift.io/v1
grantMethod: auto
kind: OAuthClient
metadata:
...
accessTokenInactivityTimeoutSeconds: 300

完成上一步修改后,然后至少 5 分钟后再使用客户端访问 OpenShift。确认此时认证已经失效,需要再次登录才可以访问 OpenShift。

$ oc whoami
error: You must be logged in to the server (Unauthorized)

退出登录,强制清除 kubeconfig 文件中的 Token

在登录 OpenShift 后首先查看 $HOME/.kube/config 文件中的 users 部分的 token,确认有内容。

。。。
users:
- name: admin/api-crc-testing:6443
  user:
    token: sha256~hDzwJlOBA4nF3yUssoekyDtsGUsgv2PfXgm_qYLMLrY

然后执行命令,让客户端退出登录。

$ oc logout

最后再次查看 $HOME/.kube/config 文件中的 users 部分的 token,确认 token 已经被清除。

。。。
users:
- name: admin/api-crc-testing:6443
  user: {}

演示视频

视频

参考

https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.10/html-single/authentication_and_authorization/index
http://www.xuyasong.com/?p=2054

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值