1.Kubernetes的安全框架

  • 访问K8S集群的资源需要过三关:认证、鉴权、准入控制

  • 普通用户若要安全访问集群API Server,往往需要证书、Token或者用户名+密码;Pod访问,需要ServiceAccount

  • K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都支持插件方式,通过API Server配置来启用插件。

访问API资源要经过以下三关才可以:

  1. Authentication(鉴权)

  2. Authorization(授权)

  3. Admission Control(准入控制)

2.传输安全,认证,授权,准入控制

传输安全:

  • 告别8080,迎接6443(http://172.16.1.70:6443/)
    Client sent an HTTP request to an HTTPS server.

  • 全面基于HTTPS通信

鉴权:三种客户端身份认证:

  • HTTPS 证书认证:基于CA证书签名的数字证书认证

    [root@k8s-admin ~]# ls /etc/kubernetes/pki/
    [root@k8s-admin ~]# ls -l /root/.kube/config
    -rw------- 1 root root 5451 Apr 24 18:40 /root/.kube/config

  • HTTP Token认证:通过一个Token来识别用户

  • HTTP Base认证:用户名+密码的方式认证

授权:

RBAC(Role-Based Access Control,基于角色的访问控制):负责完成授权(Authorization)工作。

根据API请求属性,决定允许还是拒绝。

准入控制:

Adminssion Control实际上是一个准入控制器插件列表,发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则拒绝请求。

3.使用RBAC授权

RBAC(Role-Based Access Control,基于角色的访问控制),允许通过Kubernetes API动态配置策略。

角色

  • Role:授权特定命名空间的访问权限

  • ClusterRole:授权所有命名空间的访问权限

角色绑定

  • RoleBinding:将角色绑定到主体(即subject)

  • ClusterRoleBinding:将集群角色绑定到主体

主体(subject)

  • User:用户

  • Group:用户组

  • ServiceAccount:服务账号

示例:为aliang用户授权default命名空间Pod读取权限

1、用K8S CA签发客户端证书

# tar -xzf cfssl.tar.gz
# cp -a cfssl/* /usr/bin/


# cat cert.sh
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF cat > lc-csr.json <<EOF
{
"CN": "lc",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes lc-csr.json | cfssljson -bare lc


# sh cert.sh
生成如下文件
ca-config.json lc.csr lc-csr.json lc-key.pem lc.pem

2、生成kubeconfig授权文件

# cat config.sh
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://172.16.1.70:6443 \
--kubeconfig=lc.kubeconfig # 设置客户端认证
kubectl config set-credentials lc \
--client-key=lc-key.pem \
--client-certificate=lc.pem \
--embed-certs=true \
--kubeconfig=lc.kubeconfig # 设置默认上下文
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=lc \
--kubeconfig=lc.kubeconfig # 设置当前使用配置
kubectl config use-context kubernetes --kubeconfig=lc.kubeconfig # sh config.sh
会生成 lc.kubeconfig 文件

3、创建RBAC权限策略

# cat rbac.yaml
---
# 创建角色(权限集合)
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"] ---
# 将lc用户绑定到角色
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: lc
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io # kubectl apply -f rbac.yaml
# 具体的角色权限可以参考官网rbac相关文档:https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/

4、测试

# kubectl get Role
NAME         AGE
pod-reader   7m46s

# kubectl get RoleBinding
NAME       AGE
read-pods   7m49s

# kubectl --kubeconfig=lc.kubeconfig get pods
NAME                     READY   STATUS   RESTARTS   AGE
nginx-86c57db685-rrhzp   1/1     Running   1         28d

# kubectl --kubeconfig=lc.kubeconfig get pods -n kube-system
Error from server (Forbidden): pods is forbidden: User "lc" cannot list resource "pods" in API group "" in the namespace "kube-system"
# lc用户只有访问default命名空间Pod读取权限。

第13章:Kubernetes 鉴权框架与用户权限分配的更多相关文章

  1. 2_MVC+EF+Autofac(dbfirst)轻型项目框架_用户权限验证

    前言 接上面两篇 0_MVC+EF+Autofac(dbfirst)轻型项目框架_基本框架 与 1_MVC+EF+Autofac(dbfirst)轻型项目框架_core层(以登陆为例) .在第一篇中介 ...

  2. 基于Springboot集成security、oauth2实现认证鉴权、资源管理

    1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...

  3. Mongodb 认证鉴权那点事

    [TOC] 一.Mongodb 的权限管理 认识权限管理,说明主要概念及关系 与大多数数据库一样,Mongodb同样提供了一套权限管理机制. 为了体验Mongodb 的权限管理,我们找一台已经安装好的 ...

  4. iOS进阶之UDP代理鉴权过程

    上一篇介绍的是TCP代理的鉴权过程,这篇将介绍UDP代理的大致鉴权过程. 在UDP鉴权过程中,有几点是需要注意的.首先,UDP是一种无连接协议,不需要连接,使用广播的方式:其次,为了通过鉴权,所以需要 ...

  5. JWT对SpringCloud进行系统认证和服务鉴权

    JWT对SpringCloud进行系统认证和服务鉴权 一.为什么要使用jwt?在微服务架构下的服务基本都是无状态的,传统的使用session的方式不再适用,如果使用的话需要做同步session机制,所 ...

  6. 「快学springboot」集成Spring Security实现鉴权功能

    Spring Security介绍 Spring Security是Spring全家桶中的处理身份和权限问题的一员.Spring Security可以根据使用者的需要定制相关的角色身份和身份所具有的权 ...

  7. 【Gin-API系列】Gin中间件之鉴权访问(五)

    在完成中间件的介绍和日志中间件的代码后,我们的程序已经基本能正常跑通了,但如果要上生产,还少了一些必要的功能,例如鉴权.异常捕捉等.本章我们介绍如何编写鉴权中间件. 鉴权访问,说白了就是给用户的请求增 ...

  8. 使用SpringSecurity Oauth2.0实现自定义鉴权中心

    Oauth2.0是什么不在赘述,本文主要介绍如何使用SpringSecurity Oauth2.0实现自定义的用户校验 1.鉴权中心服务 首先,列举一下我们需要用到的依赖,本文采用的是数据库保存用户信 ...

  9. 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...

随机推荐

  1. [bug] SpringBoot 集成 jsp,访问时页面报Whitelabel Error Page

    参考 https://bbs.csdn.net/topics/392187702

  2. Ansible_使用Ansible galaxy部署角色

    一.介绍Anisble galaxy 1.介绍Ansibleu galaxy 1️⃣:Ansible Galaxy (官网:https://galaxy.ansible.com)是一个Ansible内 ...

  3. Linux_配置本地YUM源(RHEL8)

    [RHEL8] Linux-RHEL8配置本地YUM 源,按照之前传统的配置本地YUM的方法肯定不行,在RHEL8版本的软件源发生了变化,在RHEL8版本的软件仓库分成了两部分:[AppStream] ...

  4. 四大浏览器JavaScript性能/硬件加速测试

    四大浏览器JavaScript性能/硬件加速测试 出处:快科技 2010-09-19 10:52:59    人气: 27925 次   作者:萧萧 编辑:萧萧[爆料]  评论(42)  收藏文章 新 ...

  5. 051.Python的Django框架简单使用

    一 HTTP相关概念 http协议包含由浏览器发送数据到服务器需要遵循的请求协议与服务器发送数据到浏览器需要遵循的响应协议.用于HTTP协议交互的信息被为HTTP报文.请求端(客户端)的HTTP报文 ...

  6. Linux ll查看文件属性详解-软硬链接详解

    Linux文件属性及类型 [root@localhost ~]# ll anaconda-ks.cfg 文件类型 权限 硬连接数 文件的大小 文件的创建,修改时间 - rw-------. 1 roo ...

  7. shell基础之exit,break,continue

    exit代码: 1 #!/bin/bash 2 echo "Is it morning? Please answer yes or no." 3 read YES_OR_NO 4 ...

  8. declaration may not appear after executable statement in block--转载

    这个问题是在编译STM32的程序时遇到的,这个错误的原因是对于变量的声明不能放在可执行语句后面,必须在主函数开头声明变量.在程序中声明一个变量时,需要在可执行语句之前声明,否则会出现以上错误. 例: ...

  9. C语言函数sscanf()的用法-(转自Walter L)

    在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int ss ...

  10. Linux 性能监控工具