9.kubernetes认证及ServiceAccount

一、前言

ApiServer:管理平台访问控制的唯一入口。

用户对API资源进行操作:

1、 对客户端的访问进行认证操作,确认是否有访问k8s权限;token(共享密钥)或SSL(双向SSL认证)二选一

2、 授权检查,确认是否对资源具有相关权限

ABAC(基于属性的访问控制)、RBAC(基于角色的访问控制)、NODE(基于节点)、WebHook(自定义HTTP回调方法的访问控制)

3、 准入控制,对操作资源相关联的其他资源是否有权限。

K8S集群交互的身份认证:kubeconfig(证书)、token

Tips:RBAC(基于角色的访问控制),一般都是许可控制,默认都是拒绝的。

1、对API资源进行操作需要经过的三个阶段:

认证操作:访问k8s的账号及认证通过。不需要串行检查。N种认证插件。

授权检查:检查是否有资源对象是否有操作权限。N种授权插件(webHook,ABAC,Node,RBAC),主流是RBAC。

准入控制:对授权检查后的其他安全检查。比如级联资源对象是否有操作权限,补充类的检查。

认证方式:

认证令牌(token):经由http的守护来实现。

SSL 认证:确认服务器的身份。双向证书认证,SSL会话,HTTPS。

2、Client --> ApiServer应该具有的信息:

APISever:

Subject --> action--> resource

Subject:user group serviceaccount

Object:resource ,resource group ,no-resource url

Action:get list watch patch delete deletecollection等等

User:username,uid;

Group

Extra

Api:RequestPath

(https:// 192.168.42.128:6443/apis/apps/v1/namespaces/default/deployments/myapp-deploy/)

HTTP request verb:get post put delete 对应 API requests verb: get list create update patch watch proxy redirect delete deleteCollection等等

Resources

subResource

namespace

API Group

https是双向认证的,curl没有经过认证,是不能直接去访问的。

可以用kubectl在本地启动一个认证代理,因为kubectl是被集群认证了的。(kubectl的认证信息:[[email protected] ~]$ cat .kube/config  --- /etc/kubernetes/admin.conf)

[[email protected] ~]$ kubectl proxy --port=8080
[[email protected] ~]$ curl http://localhost:8080/api/v1/namespaces  # 列出所有的namespace
[[email protected] ~]$ curl http://localhost:8080/apis/apps/v1/namespaces/kube-system/deployments/   # 除核心群组里的资源,请求时都需要用apis

二、认证操作

K8S有两类认证账号:

集群外部的人用的:UserAccount – 不需要自己去创建,只是一种标识

集群内部的Pod与apiServer通信用的:ServiceAccount

1、ServiceAccount:标准的K8S资源对象,专用账号。

[[email protected] yaml]$ kubectl create serviceaccount mysa -o yaml --dry-run > mysa.yaml  # 没有真正创建
[[email protected] yaml]$ kubectl get pod myapp-deploy-67b4984cb5-fs28j -o yaml –export   # 导出配置,已废弃。
[[email protected] yaml]$ kubectl create serviceaccount admin

创建sa时,会自动创建一个默认的secret。

[[email protected] ~]$ kubectl explain pod.spec.serviceAccountName  #指定pod使用的sa

Pod获取私有仓库镜像时的认证方式有两种:

  1. 直接使用字段pod.spec.imagePullSecrets来定义
  2. 使用serviceAccount,serviceAccount里也有Image pull secrets

2、Kubectl的认证实现

[[email protected] ~]$ kubectl config view  # 查看kubeconfig(连入apiServer的认证配置) # 可以实现一个kubectl管理多个集群,使用不同的或者相同的账号,一个配置文件配置多个账号,多个集群。
[[email protected] ~]$ kubectl config –h  # 可以自己添加cluster,user,context,以及切换当前使用的context。Context表示集群与账号的关联关系

集群的所有认证文件目录:

[[email protected] ~]$ ll /etc/kubernetes/pki/

3、自定义证书使用kubectl来认证接入到apiServer:

[[email protected] pki]# cd /etc/kubernetes/pki
[[email protected] pki]# (umask 077; openssl genrsa -out magedu.key 2048)
[[email protected] pki]# openssl req -new -key magedu.key -out magedu.csr -subj "/CN=magedu"
[[email protected] pki]# openssl x509 -req -in magedu.csr -CA ./ca.crt -CAkey ./ca.key -CAcreateserial -out magedu.crt -days 365
[[email protected] pki]# openssl x509  -in magedu.crt -text –noout  # 查看

[[email protected] pki]# kubectl config set-credentials magedu --client-certificate=./magedu.crt --client-key=./magedu.key --embed-certs=true  # 创建用户并且隐藏

[[email protected] pki]# kubectl config set-context [email protected] --cluster=kubernetes --user=magedu  # 创建上下文

[[email protected] pki]# kubectl config use-context [email protected] #切换当前使用的context

获取不到资源,因为此账号没有权限。

添加集群同样,查看帮助文档。

默认保存的配置都是在用户家目录下的.kube/config(例:/root/.kube/config)里面,可以手动指定保存在其他的配置文件里(--kubeconfig=/tmp/kube.conf)。

例:[[email protected] ~]# kubectl config set-cluster kube-cluster --kubeconfig=/tmp/kube.conf --server=https://192.168.42.128:6443 --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true

[[email protected] ~]# kubectl config view --kubeconfig=/tmp/kube.conf

三、授权操作

授权操作也是由授权插件来完成。

常用的授权插件:

Node

ABAC基于属性的访问控制

RBAC基于角色的访问控制

Webhook基于http的回机制的访问控制

1、RBAC(基于角色的访问控制)

三要素:

User(用户):K8S中User不是单独的资源。

Role(角色)

Permission(许可)

K8S中有两种级别的资源:集群级别,名称空间级别。

名称空间级别角色定义与绑定

Role:不能定义拒绝权限,只能定义允许权限,默认就是拒绝。

Operations

Objects

Rolebinding:

UserAccount or ServiceAccount

Role

集群级别的角色定义与绑定

ClusterRole

ClusterRoleBinding

Tips:如果用Rolebinding去绑定ClusterRole,则ClusterRole只具备名称空间的权限。当需要对多个名称空间授权时,可以用不同名称空间的用户通过RoleBinding去绑定同一个ClusterRole,则这些用户依然只有当前名称空间的权限。

2、创建及使用

Role:

[[email protected] ~]$ kubectl explain role
[[email protected] ~]$ kubectl create role pods-reader --verb=get,list,watch --resource=pods --dry-run -o yaml > yaml/role-demo.yaml

RoleBinding:

[[email protected] yaml]$ kubectl explain rolebinding
[[email protected] ~]$ kubectl create rolebinding magedu-read-pods --role=pods-reader --user=magedu --dry-run -o yaml

使用magedu账号可以读取default名称空间的资源,但是不能读kube-system,因为Role(pod-reader)属于default。

[[email protected] ~]$ kubectl delete rolebinding magedu-read-pods  # 删除权限

ClusterRole:

[[email protected] yaml]$ kubectl explain clusterrole
[[email protected] ~]$  kubectl create clusterrole cluster-reader --verb=get,list,watch --resource=pods --dry-run -o yaml

ClusterRoleBinding:

[[email protected] ~]$ kubectl create clusterrolebinding –h
[[email protected] yaml]$ kubectl explain clusterrolebinding
[[email protected] ~]$  kubectl create clusterrolebinding magedu-read-all-pods --clusterrole=cluster-reader --user=magedu --dry-run -o yaml

[[email protected] yaml]$ kubectl delete clusterrolebinding magedu-read-all-pods  #删除后立即生效,权限回收。

用RoleBinding绑定ClusterRole:

[[email protected] yaml]$ kubectl create rolebinding magedu-read-pod --clusterrole=cluster-reader --user=magedu --dry-run -o yaml > rolebinding-clusterrole-demo.yaml

此时只有default名称空间的pod读取权限。

Tips:ClusterRoleBinding只能绑定ClusterRole,不能绑定Role;RoleBinding能绑定ClusterRole,也能绑定Role,但绑定ClusterRole权限也是在名称空间中。

系统内建的重要的ClusterRole:

系统中有很多内建的ClusterRole,ClusterRoleBinding

admin:可以用作命名空间的管理员。

[[email protected] ~]$ kubectl get clusterrole admin -o yaml

cluster-admin:

[[email protected] ~]$ kubectl get clusterrolebinding cluster-admin -o yaml

用户属于哪个组是在证书中定义的。

四、准入控制

准入控制一般不用管理员操作,了解即可。

原文地址:https://www.cnblogs.com/cmxu/p/12240264.html

时间: 2024-10-08 19:30:16

9.kubernetes认证及ServiceAccount的相关文章

15.kubernetes认证及serviceaccount

kubernetes认证及serviceaccount 认证 授权:RBAC(目前的主流授权方式) 准入控制:了解即可 --> 认证 授权 准入控制 客户端 -->api-server: user: username,uid group: extra: API Request path serviceaccount k8s的资源如果支持create 那么可以使用--dry-run来生成清单配置--dry-run 获取单个pod的清单配置[[email protected] ~]# kubect

kubernetes认证和serviceaccount

Service Account 为 Pod 提供必要的身份认证.所有的 kubernetes 集群中账户分为两类,Kubernetes 管理的 serviceaccount(服务账户) 和 useraccount(用户账户). kubectl 如果需要访问 apiserver 需要经过 认证,授权,准入控制 三关. kubectl 客户端请求的时候首先需要进行认证,认证通过后再进行授权检查,因有些增删等某些操作需要级联到其他资源或者环境,这时候就需要准入控制来检查级联环境是否有授权权限了. 获取

013.Kubernetes认证授权

一 Kubernetes认证系统介绍 1.1 访问控制 Kubernetes API的每个请求都会经过多阶段的访问控制之后才会被接受,这包括认证.授权以及准入控制(Admission Control)等 1.2 认证 在集群开启TLS后,客户端发往Kubernetes的所有API请求都需要进行认证,以验证用户的合法性. Kubernetes支持多种认证机制,并支持同时开启多个认证插件(只要有一个认证通过即可).如果认证成功,则用户的username会被传入授权模块做进一步授权验证:而对于认证失败

kubernetes认证、授权、准入控制

1 总述 1 概述 kubernetes 中的资源访问类型有两种,一种是由POD提供的服务资源,其可通过service或 ingress提供接口以供外部访问,这种访问不需要经过API server的认证,而另一种对集群内部资源的操作则需要经过一定的认证授权操作才能完成. 2 认证,授权,准入控制概述 1 概述 任何客户端在操作相关资源对象时必须经过三个步骤:认证: 身份鉴别,正确的账号,能够通过认证,其只能证明其是合法的账户.授权: 权限检查,对资源进行相应的操作.其可操作某些资源,其某些资源需

kubernetes安全认证相关资料

1.Kubernetes安装之创建Kubeconfig文件 https://jimmysong.io/blogs/kubernetes-create-kubeconfig/ 2.轻松了解Kubernetes认证功能 http://qinghua.github.io/kubernetes-security/ 3.kubernetes集群的安全配置 http://tonybai.com/2016/11/25/the-security-settings-for-kubernetes-cluster/

kubernetes的Service Account

Service account作用Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务. Service account使用场景运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它服务.Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证. 与User account区别(1)User account是为人设计的,而se

在kubernetes 集群内访问k8s API服务

所有的 kubernetes 集群中账户分为两类,Kubernetes 管理的 serviceaccount(服务账户) 和 useraccount(用户账户).基于角色的访问控制(“RBAC”)使用“rbac.authorization.k8s.io”API 组来实现授权控制,允许管理员通过Kubernetes API动态配置策略. API Server 内部通过用户认证后,然后进入授权流程.对合法用户进行授权并且随后在用户访问时进行鉴权,是权限管理的重要环节.在 kubernetes 集群中

kubernetes的Service Account和secret

系列目录 Service Account Service Account概念的引入是基于这样的使用场景:运行在pod里的进程需要调用Kubernetes API以及非Kubernetes API的其它服务.Service Account它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证. kubectl get sa --all-namespaces NAMESPACE NAME SECRETS AGE default build-robo

第27 章 : Kubernetes 安全之访问控制

Kubernetes 安全之访问控制 本文将主要分享以下三方面的内容: Kubernetes API 请求访问控制 Kubernetes 认证 Kubernetes RBAC Security Context 的使用 Kubernetes API 请求访问控制 访问控制 大家都知道访问控制是云原生中的一个重要组成部分.也是一个 Kubernetes 集群在多租户环境下必须要采取的一个基本的安全架构手段. 那么在概念上可以抽象的定义为谁在何种条件下可以对什么资源做什么操作.这里的资源就是在 Kub