kubernetes 身份与权限认证 (ServiceAccount RBAC)

2024-01-28 06:59

本文主要是介绍kubernetes 身份与权限认证 (ServiceAccount RBAC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

Kubernetes中提供了良好的多租户认证管理机制,如RBAC、ServiceAccount还有各种Policy等。

 

ServiceAccount

Service Account为Pod中的进程提供身份信息。

 

当用户访问集群(例如使用kubectl命令)时,apiserver 会将用户认证为一个特定的 User Account目前通常是admin,除非系统管理员自定义了集群配置)。Pod 容器中的进程也可以与 apiserver 联系。 当它们在联系 apiserver 的时候,它们会被认证为一个特定的 Service Account(例如default)。

 

  • 使用默认的 Service Account 访问 API server

  当创建 pod 的时候,如果没有指定一个 service account,系统会自动得在与该pod 相同的 namespace 下为其指派一个default service account。如果获取刚创建的 pod 的原始 json 或 yaml 信息(例如使用kubectl get pods podename -o yaml命令),将看到spec.serviceAccountName字段已经被设置为 default

 

  可以在 pod 中使用自动挂载的 service account 凭证来访问 API,如 Accessing the Cluster 中所描述。

Service account 是否能够取得访问 API 的许可取决于您使用的 授权插件和策略。

 

在 1.6 以上版本中,可以选择取消为 service account 自动挂载 API 凭证,只需在 service account 中设置 automountServiceAccountToken: false

复制代码
apiVersion: v1
kind: ServiceAccount
metadata:name: build-robot
automountServiceAccountToken: false
...
复制代码

 

在 1.6 以上版本中,也可以选择只取消单个 pod 的 API 凭证自动挂载

复制代码
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:serviceAccountName: build-robotautomountServiceAccountToken: false...
复制代码

如果在 pod 和 service account 中同时设置了 automountServiceAccountToken , pod 设置中的优先级更高

 

  • 使用 Service Account 作为用户权限管理配置 kubeconfig

 

创建服务账号(serviceAccount)

kubectl create serviceaccount sample-sc

 

这时候将得到一个在 default namespace 的 serviceaccount 账号;运行kubectl get serviceaccount sample-sc 将得到如下结果:

复制代码
apiVersion: v1
kind: ServiceAccount
metadata:creationTimestamp: 2018-09-03T02:00:37Zlabels:from: mofangname: mofang-viewer-scnamespace: defaultresourceVersion: "18914458"selfLink: /api/v1/namespaces/default/serviceaccounts/sample-scuid: 26e129dc-af1d-11e8-9453-00163e0efab0
secrets:
- name: sample-sc-token-9x7nk
复制代码

 

因为在使用 serviceaccount 账号配置 kubeconfig 的时候需要使用到 sample-sc 的 token, 该 token 保存在该 serviceaccount 保存的 secret 中;

运行kubectl get secret sample-sc-token-9x7nk 或者kubectl describe serviceaccount sample-sc将会得到如下结果:

复制代码
apiVersion: v1
data:ca.crt: Ci0tLS0tQkVHSU4gQ0VSVcvfUNBVEUtLS0tLQpNSUlDL3pDQ0FtaWdBd0lCQWdJREJzdFlNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1HSXhDekFKQmdOVkJBWVRBa05PCk1SRXdEd1lEVlFRSURBaGFhR1ZLYVdGdVp6RVJNQThHQTFVRUJ3d0lTR0Z1WjFwb2IzVXhFREFPQmdOVkJBb00KQjBGc2FXSmhZbUV4RERBS0JnTlZCQXNNQTBGRFV6RU5NQXNHQTFVRUF3d0VjbTl2ZERBZUZ3MHhPREExTWprdwpNelF3TURCYUZ3MHpPREExTWpRd016UTFOVGxhTUdveEtqQW9CZ05WQkFvVElXTTJaVGxqTm1KallUY3pZakUwClkyTTBZV0UzT1RNd1lqTTROREV4TkRaallURVFNQTRHQTFVRUN4TUhaR1ZtWVhWc2RERXFNQ2dHQTFVRUF4TWgKWXpabE9XTTJZbU5oTnpOaU1UUmpZelJoWVRjNU16QmlNemcwTVRFME5tTmhNSUdmTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRHTkFEQ0JpUUtCZ1FETGNFWmJycCtBa0taNHU4TklVM25jaFU4YkExMnhKR0pJMzlxdTd4aFFsR3lHCmZqQTFqdXV4cVMyaE4vTGpwM21XNkdIaW0zd2lJd2N1WUtUN3RGOW9UejgrTzhBQzZHYnpkWExIL1RQTWtCZ2YKOVNYaEdod1hndklMb3YzbnZlS1MzRElxU3UreS9OK1huMzhOOW53SHF6S0p2WE1ROWtJaUJuTXgwVnlzSFFJRApBUUFCbzRHNk1JRzNNQTRHQTFVZER3RUIvd1FFQXdJQ3JEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkCkl3UVlNQmFBRklWYS85MGp6U1Z2V0VGdm5tMUZPWnRZZlhYL01Ed0dDQ3NHQVFVRkJ3RUJCREF3TGpBc0JnZ3IKQmdFRkJRY3dBWVlnYUhSMGNEb3ZMMk5sY25SekxtRmpjeTVoYkdsNWRXNHVZMjl0TDI5amMzQXdOUVlEVlIwZgpCQzR3TERBcW9DaWdKb1lrYUhSMGNEb3ZMMk5sY25SekxtRmpjeTVoYkdsNWRXNHl0TDNKdmIzUXVZM0pzCk1BMEdDU3FHU0liM0RRRUJDd1VBQTRHQkFKWFRpWElvQ1VYODFFSU5idVRTay9PanRJeDM0ckV0eVBuTytBU2oKakszaTR3d1BRMEt5MDhmTlNuU2Z4Q1EyeEY1NTIxNVNvUzMxU3dMellJVEp1WFpBN2xXT29RU1RZL2lBTHVQQgovazNCbDhOUGNmejhGNXlZNy9uY1N6WDRwTXgxOHIwY29PTE1iZlpUUXJtSHBmQ053bWRjQmVCK0JuRFJMUEpGCmgzSUQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKCg==namespace: ZGVmYXAsdA==token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJblI1Y0NJNklrcFhppppppo5LmV5SnBjM01pT2lKcmRXSmxjbTVsZddekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUprWldaaGRXeDBJaXdpYTNWaVpYSnVaWFJsY3k1cGJ5OXpaWEoyYVdObFlXTmpiM1Z1ZEM5elpXTnlaWFF1Ym1GdFpTSTZJbTF2Wm1GdVp5MTJhV1YzWlhJdGMyTXRkRzlyWlc0dE9YZzNibXNpTENKcmRXSmxjbTVsZEdWekxtbHZMM05sY25acFkyVmhZMk52ZFc1MEwzTmxjblpwWTJVdFlXTmpiM1Z1ZEM1dVlXMWxJam9pYlc5bVlXNW5MWFpwWlhkbGNpMXpZeUlzSW10MVltVnlibVYwWlhNdWFXOHZjMlZ5ZG1salpXRmpZMjkxYm5RdmMyVnlkbWxqWlMxaFkyTnZkVzUwTG5WcFpDSTZJakkyWlRFeU9XUmpMV0ZtTVdRdE1URmxPQzA1TkRVekxUQXdNVFl6WlRCbFptRmlNQ0lzSW5OMVlpSTZJbk41YzNSbGJUcHpaWEoyYVdObFlXTmpiM1Z1ZERwa1pXWmhkV3gwT20xdlptRnVaeTEyYVdWM1pYSXRjMk1pZlEuQWpudnZueXRaWHJ1UndSdEJ3S3RFdzZWNzJpWU1vOUI2LVh3VmkzRWhReXNOM21PLXJvdGFJQnZHUFlNMGZNVDlWRzVjTFFKYmJWUmhLR0FyclUyQ1FNVl9JQ3NpbjFzMjFxTXJ5dngzNm9abzFYZkpWZlVVMEtqeWxndEQ0NTNmWU84SlFfWFF3OGNwVWc5NGE2WnZvcDZHcXNGNGhzT0sxTjFMaGRrSFBpWHA4TzRQUzJ6eDFXNklfeGs2ZUNBcjUxRVpwSktEWTZHMmhmZ1A5emxROGdPV21nbS1EVjZPZzNobjJ4UFprZUktVk1nYUF3amdFUGtVZFJDSndYRk9QRG5UcXlqUmtZVzdLVU1GLTVDTHdBNDZMNk5PYjJ6YUR0Uy16Zm5hdVFwLVdIcFNQdDNEdFc0UmRLZDVDZzE3Z3RGaWhRZzI3dnVqYWJNMGpmQmp3
kind: Secret
metadata:annotations:kubernetes.io/service-account.name: sample-sckubernetes.io/service-account.uid: 26e129dc-af1d-11e8-9453-00163e0efab0creationTimestamp: 2018-09-03T02:00:37Zname: mofang-viewer-sc-token-9x7nknamespace: defaultresourceVersion: "18914310"selfLink: /api/v1/namespaces/default/secrets/sample-sc-token-9x7nkuid: 26e58b7c-af1d-11e8-9453-00163e0efab0
type: kubernetes.io/service-account-token
复制代码

其中 {data.token} 就会是我们的用户 token 的 base64 编码,之后我们配置 kubeconfig 的时候将会用到它;

 

创建角色

比如想创建一个只可以查看集群deploymentsservicespods 相关的角色,应该使用如下配置

复制代码
apiVersion: rbac.authorization.k8s.io/v1
## 这里也可以使用 Role
kind: ClusterRole
metadata:name: mofang-viewer-rolelabels:from: mofang
rules:
- apiGroups:- ""resources:- pods- pods/status- pods/log- services- services/status- endpoints- endpoints/status- deploymentsverbs:- get- list- watch
复制代码

 

创建角色绑定

复制代码
apiVersion: rbac.authorization.k8s.io/v1
## 这里也可以使用 RoleBinding
kind: ClusterRoleBinding
metadata:name: sample-role-bindinglabels:from: mofang
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: mofang-viewer-role    #这里即绑定上面创建的clusterrole
subjects:
- kind: ServiceAccount      #将clusterrole绑定到这个服务账户上name: sample-scnamespace: default
复制代码

 

配置 kubeconfig

    经过以上的步骤,最开始创建的 serviceaccount 就可以用来访问我们的集群了, 同时我们可以动态更改 ClusterRole 的授权来及时控制某个账号的权限(这也是使用 serviceaccount 的好处);

配置应该如下:

复制代码
apiVersion: v1
clusters:
- cluster:## 这个是集群的 TLS 证书,与授权无关,使用同一的就可以certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvekNDQW1pZ0F3SUJBZ0lEQnN0WU1BMEdDU3FHU0liM0RRRUJDd1VBTUdJeEN6QUpCZ05WQkFZVEFrTk8KTVJFd0R3WURWUVFJREFoYWFHVkthV0Z1WnpFUk1BOEdBMVVFQnd3SVNHRnVaMXBvYjNVeEVEQU9CZ05WQkFvTQpCMEZzYVdKaFltRXhEREFLQmdOVkJBc01BMEZEVXpFTk1Bc0dBMVVFQXd3RWNtOXZkREFlRncweE9EQTFNamt3Ck16UXdNREJhRncwek9EQTFNalF3TXpRMU5UbGFNR294S2pBb0JnTlZCQW9USVdNMlpUbGpObUpqWVRjellqRTAKWTJNMFlXRTNPVE13WWpNNE5ERXhORFpqWVRFUU1BNEdBMVVFQ3hNSFpHVm1ZWFZzZERFcU1DZ0dBMVVFQXhNaApZelpsT1dNMlltTmhOek5pTVRSall6UmhZVGM1TXpCaU16ZzBNVEUwTm1OaE1JR2ZNQTBHQ1NxR1NJYjNEUUVCCkFRVUFBNEdOQURDQmlRS0JnUURMY0VaYnJwK0FrS1o0dThOSVUzbmNoVThiQTEyeEpHSkkzOXF1N3hoUWxHeUcKZmpBMWp1dXhxUzJoTi9ManAzbVc2R0hpbTN3aUl3Y3VZS1Q3dEY5b1R6OCtPOEFDNkdiemRYTEgvVFBNa0JnZgo5U1hoR2h3WGd2SUxvdjNudmVLUzNESXFTdSt5L04rWG4zOE45bndIcXpLSnZYTVE5a0lpQm5NeDBWeXNIUUlECkFRQUJvNEc2TUlHM01BNEdBMVVkRHdFQi93UUVBd0lDckRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWQKSXdRWU1CYUFGSVZhLzkwanpTVnZXRUZ2bm0xRk9adFlmWFgvTUR3R0NDc0dBUVVGQndFQkJEQXdMakFzQmdncgpCZ0VGQlFjd0FZWWdhSFIwY0RvdkwyTmxjblJ6TG1GamN5NWhiR2w1ZFc0dVkyOXRMMjlqYzNBd05RWURWUjBmCkJDNHdMREFxb0NpZ0pvWWthSFIwY0RvdkwyTmxjblJ6TG1GamN5NWhiR2w1ZFc0dVkyOXRMM0p2YjNRdVkzSnMKTUEwR0NTcUdTSWIzRFFFQkN3VUFBNEdCQUpYVGlYSW9DVVg4MUVJTmJ1VFNrL09qdEl4MzRyRXR5UG5PK0FTagpqSzNpNHd3UFEwS3kwOGZOU25TZnhDUTJ4RjU1MjE1U29TMzFTd0x6WUlUSnVYWkE3bFdPb1FTVFkvaUFMdVBCCi9rM0JsOE5QY2Z6OEY1eVk3L25jU3pYNHBNeDE4cjBjb09MTWJmWlRRcm1IcGZDTndtZGNCZUIrQm5EUkxQSkYKaDNJRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==server: https://10.10.10.165:6443name: beta
contexts:
- context:cluster: betauser: beta-viewername: beta-viewer
current-context: beta-viewer
kind: Config
preferences: {}
users:
- name: beta-vieweruser:## 这个使我们在创建 serviceaccount 生成相关 secret 之后的 data.token 的 base64 解码字符,它本质是一个 jwt tokentoken: eyJhbGciOiJSUzI1NiIsInR5dffg6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Im1vZmFuZy12aWV3ZXItc2MtdG9rZW4tOXg3bmsiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoibW9mYW5nLXZpZXdlci1zYyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjxZTEyOWRjLWFmMWQtMTFlOC05NDUzLTAwMTYzZTBlZmFiMCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0Om1vZmFuZy12aWV3ZXItc2MifQ.AjnvvnytZXruRwRtBwKtEw6V72iYMo9B6-XwVi3EhQysN3mO-rotaIBvGPYM0fMT9VG5cLQJbbVRhKGArrU2CQMV_ICsin1s21qMryvx36oZo1XfJVfUU0KjylgtD453fYO8JQ_XQw8cpUg94a6Zvop6GqsF4hsOK1N1LhdkHPiXp8O4PS2zx1W6I_xk6eCAr51EZpJKDY6G2hfgP9zlQ8gOWmgm-DV6Og3hn2xPZkeI-VMgaAwjgEPkUdRCJwXFOPDnTqyjRkYW7KUMF-5CLwA46L6NOb2zaDtS-zfnauQp-WHpSPt3DtW4RdKd5Cg17gtFihQg27vujabM0jfBjw
复制代码

 

 

  • 使用多个Service Account

 

每个 namespace 中都有一个默认的叫做 default 的 service account 资源。

 

可以使用以下命令列出 namespace 下的所有 serviceAccount 资源。

复制代码
$ kubectl get serviceAccounts
NAME      SECRETS    AGE
default   1          1d[root@bogon ingress-test]# kubectl get serviceaccounts --all-namespaces
NAMESPACE NAME SECRETS AGE
default default 1 26d
ingress-nginx default 1 11d
ingress-nginx nginx-ingress-serviceaccount 1 3d
kube-public default 1 26d
kube-system dashboard 1 22d
kube-system default 1 26d
kube-system heapster 1 21d
kube-system jenkins-admin 1 3d
kube-system kube-dns 1 23d
复制代码

 

可以像这样创建一个 ServiceAccount 对象:

复制代码
$ cat > /tmp/serviceaccount.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:name: build-robot
EOF
$ kubectl create -f /tmp/serviceaccount.yaml serviceaccount "build-robot" created
复制代码

 

如果看到如下的 service account 对象的完整输出信息:

复制代码
$ kubectl get serviceaccounts/build-robot -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:creationTimestamp: 2015-06-16T00:12:59Zname: build-robotnamespace: defaultresourceVersion: "272500"selfLink: /api/v1/namespaces/default/serviceaccounts/build-robotuid: 721ab723-13bc-11e5-aec2-42010af0021e
secrets:
- name: build-robot-token-bvbk5
复制代码

然后将看到有一个 token 已经被自动创建,并被 service account 引用。可以使用授权插件来 设置 service account 的权限 

 

在 pod 创建之初 service account 就必须已经存在,否则创建将被拒绝。设置非默认的 service account,只需要在 pod 的spec.serviceAccountName 字段中将name设置为想要用的 service account 名字即可。

 

不能更新已创建的 pod 的 service account。可以清理 service account,如下所示:

$ kubectl delete serviceaccount/build-robot

 

  • 手动创建 service account 的 API token

假设已经有了一个如上文提到的名为 ”build-robot“ 的 service account,现在手动创建一个新的 secret。

复制代码
$ cat > /tmp/build-robot-secret.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:name: build-robot-secretannotations: kubernetes.io/service-account.name: build-robot
type: kubernetes.io/service-account-token
EOF
$ kubectl create -f /tmp/build-robot-secret.yaml secret "build-robot-secret" created
复制代码

 

现在可以确认下新创建的 secret 取代了 “build-robot” 这个 service account 原来的 API token。

所有已不存在的 service account 的 token 将被 token controller 清理掉。获取token内容命令如下

复制代码
[root@bogon tmp]# kubectl describe secrets/build-robot-secret 
Name:         build-robot-secret
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=build-robotkubernetes.io/service-account.uid=fcf67da4-cd58-11e8-8e6e-00505693e5c6Type:  kubernetes.io/service-account-tokenData
====
ca.crt:     1359 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6ImJ1aWxkLXJvYm90LXNlY3JldCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJidWlsZC1yb2JvdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImZjZjY3ZGE0LWNkNTgtMTFlOC04ZTZlLTAwNTA1NjkzZTVjNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmJ1aWxkLXJvYm90In0.dH-Xxj0drOjhvQlWF37n2Q61fGXG26xRkklIWw6wHH0s8Msdf5FIOfD_E9OFez9nbIPO4efMG5ZK79Rc1vtmdBIfHUSi_tsHhsoGJwqtkoj1wXTJTaum4RtXQVyaVxqLsPjFaP0EL-5_YTy2Q9Ay5hBBqjUGRJ1KiuRKHNoLuSO3L7oYZcPXX0BCrSFyTqlYfvcNqv3P-hT-TKLB25uBw2eE90iguDk1cGCCfCeKtLVuZ6iFNOBEZOYCErOiboPAH55e3wl98Uuze6MOAbsZRIaALISCxyR0W_heyYES90MU8IOvgQW7Z0WkxSNLTsknPL7nMykvkHXJay1J-18ZGw
复制代码

 

  • 为 service account 添加 ImagePullSecret

 

ImagePullSecret用于从私有仓库pull镜像

$ kubectl create secret docker-registry myregistrykey --docker-server=10.10.10.12 --docker-username=admin --docker-password=HarBor12345 --docker-email=xxxx
secret/myregistrykey created.

说明 : --docker 开头的参数分别指定了私有仓库的地址用户和密码

 

首先,创建一个 imagePullSecret,详见这里(或者上面)。然后,确认已创建。如:

$ kubectl get secrets myregistrykey
NAME             TYPE                              DATA    AGE
myregistrykey    kubernetes.io/.dockerconfigjson   1       1d

 

然后,修改 namespace 中的默认 service account 使用该 secret 作为 imagePullSecret。

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "myregistrykey"}]}'

 

或者使用Vi 交互过程中需要手动编辑:

复制代码
$ kubectl get serviceaccounts default -o yaml > ./sa.yaml
$ cat sa.yaml apiVersion: v1 kind: ServiceAccount metadata:creationTimestamp: 2015-08-07T22:02:39Zname: defaultnamespace: defaultresourceVersion: "243024"selfLink: /api/v1/namespaces/default/serviceaccounts/defaultuid: 052fb0f4-3d50-11e5-b066-42010af0d7b6 secrets: - name: default-token-uudge
$ vi sa.yaml [editor session not shown] [delete line with key "resourceVersion"] [add lines with "imagePullSecret:"]
$ cat sa.yaml apiVersion: v1 kind: ServiceAccount metadata:creationTimestamp: 2015-08-07T22:02:39Zname: defaultnamespace: defaultselfLink: /api/v1/namespaces/default/serviceaccounts/defaultuid: 052fb0f4-3d50-11e5-b066-42010af0d7b6 secrets: - name: default-token-uudge imagePullSecrets: - name: myregistrykey
$ kubectl replace serviceaccount default -f ./sa.yaml serviceaccounts/default
复制代码

 

现在,所有当前 namespace 中新创建的 pod 的 spec 中都会增加如下内容:

spec:imagePullSecrets:- name: myregistrykey

 

回到顶部

RBAC——基于角色的访问控制

  基于角色的访问控制(Role-Based Access Control, 即”RBAC”)使用”rbac.authorization.k8s.io” API Group实现授权决策,允许管理员通过Kubernetes API动态配置策略。

 

要启用RBAC,请使用--authorization-mode=RBAC启动API Server。

 

  • Role与ClusterRole

在RBAC API中,一个角色包含了一套表示一组权限的规则。 权限以纯粹的累加形式累积(没有”否定”的规则)。 角色可以由命名空间(namespace)内的Role对象定义而整个Kubernetes集群范围内有效的角色则通过ClusterRole对象实现。

 

一个Role对象只能用于授予对某一单一命名空间中资源的访问权限。 以下示例描述了”default”命名空间中的一个Role对象的定义,用于授予对pod的读访问权限:

复制代码
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:namespace: defaultname: pod-reader
rules:
- apiGroups: [""]       # 空字符串""表明使用core API groupresources: ["pods"]verbs: ["get", "watch", "list"]
复制代码

 

下面示例中的ClusterRole定义可用于授予用户对某一特定命名空间,或者所有命名空间中的secret(取决于其绑定方式)的读访问权限:

复制代码
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:# 鉴于ClusterRole是集群范围对象,所以这里不需要定义"namespace"字段name: secret-reader
rules:
- apiGroups: [""]resources: ["secrets"]verbs: ["get", "watch", "list"]
复制代码

 

  • RoleBinding与ClusterRoleBinding

  角色绑定将一个角色中定义的各种权限授予一个或者一组用户。 角色绑定包含了一组相关主体(即subject包括用户——User、用户组——Group、或者服务账户——Service Account以及对被授予角色的引用。 在命名空间中可以通过RoleBinding对象授予权限,而集群范围的权限授予则通过ClusterRoleBinding对象完成。

  

  RoleBinding可以引用在同一命名空间内定义的Role对象。 下面示例中定义的RoleBinding对象在”default”命名空间中将”pod-reader”角色授予用户”jane”。 这一授权将允许用户”jane”从”default”命名空间中读取pod。

复制代码
# 以下角色绑定定义将允许用户"jane"从"default"命名空间中读取pod。
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata:name: read-podsnamespace: default subjects: - kind: User          #赋予用户jane pod-reader角色权限name: janeapiGroup: rbac.authorization.k8s.io roleRef:kind: Rolename: pod-reader      #引用上面定义的roleapiGroup: rbac.authorization.k8s.io
复制代码

 

RoleBinding对象也可以引用一个ClusterRole对象用于在RoleBinding所在的命名空间内授予用户对所引用的ClusterRole中 定义的命名空间资源的访问权限。这一点允许管理员在整个集群范围内首先定义一组通用的角色,然后再在不同的命名空间中复用这些角色。

 

例如,尽管下面示例中的RoleBinding引用的是一个ClusterRole对象,但是用户”dave”(即角色绑定主体)还是只能读取”development” 命名空间中的secret(即RoleBinding所在的命名空间)。

复制代码
# 以下角色绑定允许用户"dave"读取"development"命名空间中的secret。
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata:name: read-secretsnamespace: development       # 这里表明仅授权读取"development"命名空间中的资源。 subjects: - kind: Username: daveapiGroup: rbac.authorization.k8s.io roleRef:kind: ClusterRolename: secret-reader      #引用上面定义的clusterRole 名称(clusterRole没有指定命名空间,默认可以应用所有,但是在rolebinding时,指定了命名空间,所以只能读取本命名空间的文件)apiGroup: rbac.authorization.k8s.io
复制代码

 

最后,可以使用ClusterRoleBinding在集群级别和所有命名空间中授予权限。下面示例中所定义的ClusterRoleBinding 允许在用户组”manager”中的任何用户都可以读取集群中任何命名空间中的secret。

复制代码
# 以下`ClusterRoleBinding`对象允许在用户组"manager"中的任何用户都可以读取集群中任何命名空间中的secret。
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata:name: read-secrets-global subjects: - kind: Groupname: managerapiGroup: rbac.authorization.k8s.io roleRef:kind: ClusterRolename: secret-readerapiGroup: rbac.authorization.k8s.io
复制代码

 

  • 对资源的引用

  大多数资源由代表其名字的字符串表示,例如”pods”,就像它们出现在相关API endpoint的URL中一样。然而,有一些Kubernetes API还 包含了”子资源”,比如pod的logs。在Kubernetes中,pod logs endpoint的URL格式为:

GET /api/v1/namespaces/{namespace}/pods/{name}/log

 

在这种情况下,”pods”是命名空间资源,而”log”是pods的子资源。为了在RBAC角色中表示出这一点,我们需要使用斜线来划分资源 与子资源。如果需要角色绑定主体读取pods以及pod log,您需要定义以下角色:

复制代码
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:namespace: defaultname: pod-and-pod-logs-reader
rules:
- apiGroups: [""]resources: ["pods", "pods/log"]    #根据上面意思表示授予读取pods下log的权限verbs: ["get", "list"]
复制代码

 

  通过resourceNames列表,角色可以针对不同种类的请求根据资源名引用资源实例。当指定了resourceNames列表时,不同动作 种类的请求的权限,如使用”get”、”delete”、”update”以及”patch”等动词的请求将被限定到资源列表中所包含的资源实例上。 例如,如果需要限定一个角色绑定主体只能”get”或者”update”一个configmap时,您可以定义以下角色:

复制代码
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:namespace: defaultname: configmap-updater
rules:
- apiGroups: [""]resources: ["configmap"]resourceNames: ["my-configmap"]verbs: ["update", "get"]
复制代码

 

值得注意的是,如果设置了resourceNames,则请求所使用的动词不能是list、watch、create或者deletecollection。 由于资源名不会出现在create、list、watch和deletecollection等API请求的URL中,所以这些请求动词不会被设置了resourceNames 的规则所允许,因为规则中的resourceNames部分不会匹配这些请求。

 

    • 角色定义的例子

在以下示例中,仅截取展示了rules部分的定义。

 

允许读取core API Group中定义的资源”pods”:

rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "list", "watch"]

 

允许读写在”extensions”和”apps” API Group中定义的”deployments”:

rules:
- apiGroups: ["extensions", "apps"]resources: ["deployments"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

 

允许读取”pods”以及读写”jobs”:

复制代码
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "list", "watch"]
- apiGroups: ["batch", "extensions"]resources: ["jobs"]verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
复制代码

 

允许读取一个名为”my-config”的ConfigMap实例(需要将其通过RoleBinding绑定从而限制针对某一个命名空间中定义的一个ConfigMap实例的访问):

rules:
- apiGroups: [""]resources: ["configmaps"]resourceNames: ["my-config"]verbs: ["get"]

 

允许读取core API Group中的”nodes”资源(由于Node是集群级别资源,所以此ClusterRole定义需要与一个ClusterRoleBinding绑定才能有效):

rules:
- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]

 

允许对非资源endpoint “/healthz”及其所有子路径的”GET”和”POST”请求(此ClusterRole定义需要与一个ClusterRoleBinding绑定才能有效):

rules:
- nonResourceURLs: ["/healthz", "/healthz/*"]   # 在非资源URL中,'*'代表后缀通配符verbs: ["get", "post"]

 

  • 对角色绑定主体(Subject)的引用

  RoleBinding或者ClusterRoleBinding将角色绑定到角色绑定主体(Subject)。 角色绑定主体(kind指定)可以是用户组(Group)、用户(User)或者服务账户(Service Accounts)。

 

用户由字符串表示。可以是纯粹的用户名,例如”alice”、电子邮件风格的名字,如 “bob@example.com” 或者是用字符串表示的数字id。由Kubernetes管理员配置认证模块 以产生所需格式的用户名。对于用户名,RBAC授权系统不要求任何特定的格式。然而,前缀system:是 为Kubernetes系统使用而保留的,所以管理员应该确保用户名不会意外地包含这个前缀。

 

Kubernetes中的用户组信息由授权模块提供。用户组与用户一样由字符串表示。Kubernetes对用户组 字符串没有格式要求,但前缀system:同样是被系统保留的。

 

服务账户(serviceAccount)拥有包含 system:serviceaccount:前缀的用户名并属于拥有system:serviceaccounts:前缀的用户组。

 

    • 角色绑定例子

以下示例中,仅截取展示了RoleBindingsubjects字段。

 

一个名为”alice@example.com”的用户:

subjects:
- kind: Username: "alice@example.com"apiGroup: rbac.authorization.k8s.io

 

一个名为”frontend-admins”的用户组:

subjects:
- kind: Groupname: "frontend-admins"apiGroup: rbac.authorization.k8s.io

 

kube-system命名空间中的默认服务账户:

subjects:
- kind: ServiceAccountname: defaultnamespace: kube-system

 

名为”qa”命名空间中的所有服务账户:

subjects:
- kind: Groupname: system:serviceaccounts:qaapiGroup: rbac.authorization.k8s.io

 

在集群中的所有服务账户:

subjects:
- kind: Groupname: system:serviceaccountsapiGroup: rbac.authorization.k8s.io

 

所有认证过的用户(version 1.5+):

subjects:
- kind: Groupname: system:authenticatedapiGroup: rbac.authorization.k8s.io

 

所有未认证的用户(version 1.5+):

subjects:
- kind: Groupname: system:unauthenticatedapiGroup: rbac.authorization.k8s.io

 

所有用户(version 1.5+):

复制代码
subjects:
- kind: Groupname: system:authenticatedapiGroup: rbac.authorization.k8s.io
- kind: Groupname: system:unauthenticatedapiGroup: rbac.authorization.k8s.io
复制代码

 

  • 默认角色与默认角色绑定

  API Server会创建一组默认的ClusterRoleClusterRoleBinding对象。 这些默认对象中有许多包含system:前缀,表明这些资源由Kubernetes基础组件”拥有”。 对这些资源的修改可能导致非功能性集群(non-functional cluster)。一个例子是system:node ClusterRole对象。 这个角色定义了kubelets的权限。如果这个角色被修改,可能会导致kubelets无法正常工作。

 

所有默认的ClusterRole和ClusterRoleBinding对象都会被标记为kubernetes.io/bootstrapping=rbac-defaults

 

每次启动时,API Server都会更新默认ClusterRole所缺乏的各种权限,并更新默认ClusterRoleBinding所缺乏的各个角色绑定主体。 这种自动更新机制允许集群修复一些意外的修改。由于权限和角色绑定主体在新的Kubernetes释出版本中可能变化,这也能够保证角色和角色 绑定始终保持是最新的。

如果需要禁用自动更新,请将默认ClusterRole以及ClusterRoleBinding的rbac.authorization.kubernetes.io/autoupdate 设置成为false。 请注意,缺乏默认权限和角色绑定主体可能会导致非功能性集群问题。

自Kubernetes 1.6+起,当集群RBAC授权器(RBAC Authorizer)处于开启状态时,可以启用自动更新功能

 

    • 发现类角色
默认ClusterRole默认ClusterRoleBinding描述
system:basic-usersystem:authenticated and system:unauthenticatedgroups允许用户只读访问有关自己的基本信息。
system:discoverysystem:authenticated and system:unauthenticatedgroups允许只读访问API discovery endpoints, 用于在API级别进行发现和协商。
    • 面向用户的角色

  一些默认角色并不包含system:前缀它们是面向用户的角色。 这些角色包含超级用户角色(cluster-admin),即旨在利用ClusterRoleBinding(cluster-status)在集群范围内授权的角色, 以及那些使用RoleBinding(admineditview)在特定命名空间中授权的角色。

默认ClusterRole默认ClusterRoleBinding描述
cluster-adminsystem:mastersgroup超级用户权限,允许对任何资源执行任何操作。 在ClusterRoleBinding中使用时,可以完全控制集群和所有命名空间中的所有资源。 在RoleBinding中使用时,可以完全控制RoleBinding所在命名空间中的所有资源,包括命名空间自己。
adminNone管理员权限,利用RoleBinding在某一命名空间内部授予。 在RoleBinding中使用时,允许针对命名空间内大部分资源的读写访问, 包括在命名空间内创建角色与角色绑定的能力。 但不允许对资源配额(resource quota)或者命名空间本身的写访问。
editNone允许对某一个命名空间内大部分对象的读写访问,但不允许查看或者修改角色或者角色绑定。
viewNone允许对某一个命名空间内大部分对象的只读访问。 不允许查看角色或者角色绑定。 由于可扩散性等原因,不允许查看secret资源。
  • Core Component Roles

    • 核心组件角色
默认ClusterRole默认ClusterRoleBinding描述
system:kube-schedulersystem:kube-scheduler user允许访问kube-scheduler组件所需要的资源。
system:kube-controller-managersystem:kube-controller-manageruser允许访问kube-controller-manager组件所需要的资源。 单个控制循环所需要的权限请参阅控制器(controller)角色.
system:nodesystem:nodesgroup (deprecated in 1.7)允许对kubelet组件所需要的资源的访问,包括读取所有secret和对所有pod的写访问。 自Kubernetes 1.7开始, 相比较于这个角色,更推荐使用Node authorizer 以及NodeRestriction admission plugin, 并允许根据调度运行在节点上的pod授予kubelets API访问的权限。 自Kubernetes 1.7开始,当启用Node授权模式时,对system:nodes用户组的绑定将不会被自动创建。
system:node-proxiersystem:kube-proxyuser允许对kube-proxy组件所需要资源的访问。
    • 其它组件角色
默认ClusterRole默认ClusterRoleBinding描述
system:auth-delegatorNone允许委托认证和授权检查。 通常由附加API Server用于统一认证和授权。
system:heapsterNoneHeapster组件的角色。
system:kube-aggregatorNonekube-aggregator组件的角色。
system:kube-dnskube-dns service account in the kube-systemnamespacekube-dns组件的角色。
system:node-bootstrapperNone允许对执行Kubelet TLS引导(Kubelet TLS bootstrapping)所需要资源的访问.
system:node-problem-detectorNonenode-problem-detector组件的角色。
system:persistent-volume-provisionerNone允许对大部分动态存储卷创建组件(dynamic volume provisioner)所需要资源的访问。
    • 控制器(Controller)角色

Kubernetes controller manager负责运行核心控制循环。 当使用--use-service-account-credentials选项运行controller manager时,每个控制循环都将使用单独的服务账户启动。 而每个控制循环都存在对应的角色,前缀名为system:controller: 如果不使用--use-service-account-credentials选项时,controller manager将会使用自己的凭证运行所有控制循环,而这些凭证必须被授予相关的角色。 这些角色包括:

  • system:controller:attachdetach-controller
  • system:controller:certificate-controller
  • system:controller:cronjob-controller
  • system:controller:daemon-set-controller
  • system:controller:deployment-controller
  • system:controller:disruption-controller
  • system:controller:endpoint-controller
  • system:controller:generic-garbage-collector
  • system:controller:horizontal-pod-autoscaler
  • system:controller:job-controller
  • system:controller:namespace-controller
  • system:controller:node-controller
  • system:controller:persistent-volume-binder
  • system:controller:pod-garbage-collector
  • system:controller:replicaset-controller
  • system:controller:replication-controller
  • system:controller:resourcequota-controller
  • system:controller:route-controller
  • system:controller:service-account-controller
  • system:controller:service-controller
  • system:controller:statefulset-controller
  • system:controller:ttl-controller
  • 初始化与预防权限升级

RBAC API会阻止用户通过编辑角色或者角色绑定来升级权限。 由于这一点是在API级别实现的,所以在RBAC授权器(RBAC authorizer)未启用的状态下依然可以正常工作。

 

用户只有在拥有了角色所包含的所有权限的条件下才能创建/更新一个角色,这些操作还必须在角色所处的相同范围内进行(对于ClusterRole来说是集群范围,对于Role来说是在与角色相同的命名空间或者集群范围)。 例如,如果用户”user-1”没有权限读取集群范围内的secret列表,那么他也不能创建包含这种权限的ClusterRole。为了能够让用户创建/更新角色,需要:

  1. 授予用户一个角色以允许他们根据需要创建/更新Role或者ClusterRole对象。
  2. 授予用户一个角色包含他们在Role或者ClusterRole中所能够设置的所有权限。如果用户尝试创建或者修改Role或者ClusterRole以设置那些他们未被授权的权限时,这些API请求将被禁止。

 

用户只有在拥有所引用的角色中包含的所有权限时才可以创建/更新角色绑定(这些操作也必须在角色绑定所处的相同范围内进行)或者用户被明确授权可以在所引用的角色上执行绑定操作。 例如,如果用户”user-1”没有权限读取集群范围内的secret列表,那么他将不能创建ClusterRole来引用那些授予了此项权限的角色。为了能够让用户创建/更新角色绑定,需要:

  1. 授予用户一个角色以允许他们根据需要创建/更新RoleBinding或者ClusterRoleBinding对象。
  2. 授予用户绑定某一特定角色所需要的权限:
  • 隐式地,通过授予用户所有所引用的角色中所包含的权限

  • 显式地,通过授予用户在特定Role(或者ClusterRole)对象上执行bind操作的权限

 

例如,下面例子中的ClusterRole和RoleBinding将允许用户”user-1”授予其它用户”user-1-namespace”命名空间内的admineditview等角色和角色绑定。

复制代码
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:name: role-grantor
rules:
- apiGroups: ["rbac.authorization.k8s.io"]resources: ["rolebindings"]verbs: ["create"]
- apiGroups: ["rbac.authorization.k8s.io"]resources: ["clusterroles"]verbs: ["bind"]resourceNames: ["admin","edit","view"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:name: role-grantor-bindingnamespace: user-1-namespace
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: role-grantor
subjects:
- apiGroup: rbac.authorization.k8s.iokind: Username: user-1
复制代码

 

当初始化第一个角色和角色绑定时,初始用户需要能够授予他们尚未拥有的权限。 初始化初始角色和角色绑定时需要:

  • 使用包含system:masters用户组的凭证,该用户组通过默认绑定绑定到cluster-admin超级用户角色。
  • 如果您的API Server在运行时启用了非安全端口(--insecure-port),您也可以通过这个没有施行认证或者授权的端口发送角色或者角色绑定请求。

 

  • 一些命令行工具

有两个kubectl命令可以用于在命名空间内或者整个集群内授予角色。

kubectl create rolebinding

 

在某一特定命名空间内授予Role或者ClusterRole。示例如下:

  • 在名为”acme”的命名空间中将admin ClusterRole授予用户”bob”:

    kubectl create rolebinding bob-admin-binding --clusterrole=admin --user=bob --namespace=acme

     

  • 在名为”acme”的命名空间中将view ClusterRole授予服务账户”myapp”:

    kubectl create rolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp --namespace=acme

 

kubectl create clusterrolebinding

 

在整个集群中授予ClusterRole,包括所有命名空间。示例如下:

  • 在整个集群范围内将cluster-admin ClusterRole授予用户”root”:

    kubectl create clusterrolebinding root-cluster-admin-binding --clusterrole=cluster-admin --user=root
  • 在整个集群范围内将system:node ClusterRole授予用户”kubelet”:

    kubectl create clusterrolebinding kubelet-node-binding --clusterrole=system:node --user=kubelet
  • 在整个集群范围内将view ClusterRole授予命名空间”acme”内的服务账户”myapp”:

    kubectl create clusterrolebinding myapp-view-binding --clusterrole=view --serviceaccount=acme:myapp

     

  • 服务账户(Service Account)权限

默认的RBAC策略将授予控制平面组件(control-plane component)、节点(node)和控制器(controller)一组范围受限的权限, 但对于”kube-system”命名空间以外的服务账户,则不授予任何权限(超出授予所有认证用户的发现权限)

 

 

从最安全到最不安全可以排序以下方法:

    1. 对某一特定应用程序的服务账户授予角色(最佳实践)

      要求应用程序在其pod规范(pod spec)中指定serviceAccountName字段,并且要创建相应服务账户(例如通过API、应用程序清单或者命令kubectl create serviceaccount等)。

      例如,在”my-namespace”命名空间中授予服务账户”my-sa”只读权限:

      kubectl create rolebinding my-sa-view \--clusterrole=view \--serviceaccount=my-namespace:my-sa \--namespace=my-namespace

      换成yaml文件大概如下 

      复制代码
      kind: RoleBinding
      apiVersion: rbac.authorization.k8s.io/v1beta1
      metadata:name: my-sa-viewnamespace: my-namespace
      subjects:
      - kind: ServiceAccountname: my-saapiGroup: rbac.authorization.k8s.io
      roleRef:kind: ClusterRolename: view                       #这里view为clusterrole名称,其中berbs需要给viewapiGroup: rbac.authorization.k8s.io
      复制代码
  1. 在某一命名空间中授予”default”服务账号一个角色

    如果一个应用程序没有在其pod规范中指定serviceAccountName,它将默认使用”default”服务账号。

    注意:授予”default”服务账号的权限将可用于命名空间内任何没有指定serviceAccountName的pod。

    下面的例子将在”my-namespace”命名空间内授予”default”服务账号只读权限:

     
    kubectl create rolebinding default-view \--clusterrole=view \--serviceaccount=my-namespace:default \--namespace=my-namespace

    目前,许多加载项(addon)作为”kube-system”命名空间中的”default”服务帐户运行。 要允许这些加载项使用超级用户访问权限,请将cluster-admin权限授予”kube-system”命名空间中的”default”服务帐户。 注意:启用上述操作意味着”kube-system”命名空间将包含允许超级用户访问API的秘钥。

     
    kubectl create clusterrolebinding add-on-cluster-admin \--clusterrole=cluster-admin \--serviceaccount=kube-system:default
  2. 为命名空间中所有的服务账号授予角色

    如果您希望命名空间内的所有应用程序都拥有同一个角色,无论它们使用什么服务账户,您可以为该命名空间的服务账户用户组授予角色。

    下面的例子将授予”my-namespace”命名空间中的所有服务账户只读权限:

     
    kubectl create rolebinding serviceaccounts-view \--clusterrole=view \--group=system:serviceaccounts:my-namespace \--namespace=my-namespace
  3. 对集群范围内的所有服务账户授予一个受限角色(不鼓励)

    如果您不想管理每个命名空间的权限,则可以将集群范围角色授予所有服务帐户

    下面的例子将所有命名空间中的只读权限授予集群中的所有服务账户:

     
    kubectl create clusterrolebinding serviceaccounts-view \--clusterrole=view \--group=system:serviceaccounts
  4. 授予超级用户访问权限给集群范围内的所有服务帐户(强烈不鼓励)

    如果您根本不关心权限分块,您可以对所有服务账户授予超级用户访问权限。

    警告:这种做法将允许任何具有读取权限的用户访问secret或者通过创建一个容器的方式来访问超级用户的凭据。

     
    kubectl create clusterrolebinding serviceaccounts-cluster-admin \--clusterrole=cluster-admin \--group=system:serviceaccounts

 

  • 并行授权器(authorizer)

同时运行RBAC和ABAC授权器,并包括旧版ABAC策略:

 
--authorization-mode=RBAC,ABAC --authorization-policy-file=mypolicy.jsonl

RBAC授权器将尝试首先授权请求。如果RBAC授权器拒绝API请求,则ABAC授权器将被运行。这意味着RBAC策略或者ABAC策略所允许的任何请求都是可通过的。

当以日志级别为2或更高(--v = 2)运行时,您可以在API Server日志中看到RBAC拒绝请求信息(以RBAC DENY:为前缀)。 您可以使用该信息来确定哪些角色需要授予哪些用户,用户组或服务帐户。 一旦授予服务帐户角色,并且服务器日志中没有RBAC拒绝消息的工作负载正在运行,您可以删除ABAC授权器。

转载于:https://www.cnblogs.com/mjiu/p/10395220.html

这篇关于kubernetes 身份与权限认证 (ServiceAccount RBAC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652844

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

什么是Kubernetes PodSecurityPolicy?

@TOC 💖The Begin💖点点关注,收藏不迷路💖 1、什么是PodSecurityPolicy? PodSecurityPolicy(PSP)是Kubernetes中的一个安全特性,用于在Pod创建前进行安全策略检查,限制Pod的资源使用、运行权限等,提升集群安全性。 2、为什么需要它? 默认情况下,Kubernetes允许用户自由创建Pod,可能带来安全风险。

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

kubernetes集群部署Zabbix监控平台

一、zabbix介绍 1.zabbix简介 Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件。可以监视各种系统与设备的参数,保障服务器及设备的安全运营。 2.zabbix特点 (1)安装与配置简单。 (2)可视化web管理界面。 (3)免费开源。 (4)支持中文。 (5)自动发现。 (6)分布式监控。 (7)实时绘图。 3.zabbix的主要功能

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p