K8S原理剖析:安全原理剖析和实践

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
访问控制,不限时长
简介: K8S原理剖析:安全原理剖析和实践

大纲

  • 认证与鉴权
  • 准入控制
  • Service Account
  • Secret


认证与鉴权

API Server架构


Kubernetes的安全框架

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

  • 普通用户若要安全访问集群API Server,往往需要证书、 token、用户名-密码; Pod访问,需要ServiceAccount
  • K8S安全控制框架主要由下面3个阶段进行控制,每一个阶段都支持插件方式,通过API Server配置来启用插件
  • ① Authentication
  • ② Authorization
  • ③ Admission Control


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

认证方式 安全
级别
API Server配置 Client配置 访问示例
证书+私钥 --client-ca-file: CA根证书
--tls-cert-file: API Server证书文件
--tls-private-key-file: API Server私钥文件
--certificate-authority: CA根证书
--client-certificate:客户端证书文件
--client-key:客户端私钥文件
kubectl --server=https:/192.168.61.100:6443 --
certificate-authority=ca.pem --client
certificate=client.crt --client-key=client.key get
nodes
Token --token-auth-file:静态Token文件, csv格
式:
token,user,uid,“group1,group2,group3”
Kubectl --token
或者:
Authorization: Bearer ${token}
kubectl –server=https:/192.168.61.100:6443 --
token=792c62a1b5f2b07b --insecure-skip-tls
verify=true cluster-info
或者:
curl -k --header “Authorization: Bearer
792c62a1b5f2b07b” https:/192.168.61.100:6443/api
用户名+密
--basic_auth_file: basic认证文件,不建议
在生产环境使用
格式:
password,user,uid,"group1,group2,group3“
Kubectl –username –password
或者:
Authorization:Basic
BASE64ENCODED(USER:PASSWORD)
kubectl --server=https:/192.168.61.100:6443 --
username=admin --password=1234 --insecure-skip
tls-verify=true cluster-info
或者:
curl -k --header "Authorization:Basic
YWRtaW46MTIzNA=="
https:/192.168.61.100:6443/api


授权

  • 用户通过认证后,对指定的资源是否有权限访问,还需要经过授权环节。授权主要是用于对集群资源的访问控制,通过检查请求包含的相关属性值,与相对应的访问策略相比较, API请求必须满足某些策略才能被处理
  • Kubernetes授权仅处理以下的请求属性:
  • ① user, group, extra
  • ② API、请求方法(如get、 post、 update、 patch和delete)和请求路径(如/api)
  • ③ 请求资源和子资源
  • ④ Namespace
  • ⑤ API Group
  • API Server支持多种授权策略,通过启动参数“--authorization_mode”设置,可以同时启用多种策略
授权策略 功能描述
AlwaysAllow 接受所有请求,如果集群不需要授权流程,采用该策略
AlwaysDeny 拒绝所有请求,一般用于测试
ABAC 基于属性的访问控制,使用用户配置的授权规则去匹配用户的请求
RBAC 基于角色的访问控制, RBAC 的授权策略可以利用 kubectl 或者 Kubernetes API 直接进行配置。 RBAC 可以授权给用
户,让用户有权进行授权管理,这样就可以无需接触节点,直接进行授权管理
Webhook WebHook 是一种 HTTP 回调, API Server把鉴权请求发给WebHook服务器,由服务器对请求进行鉴权
Node 对Node授权,配合NodeRestriction准入控制来限制kubelet仅可访问node、 endpoint、 pod、 service以及secret、
configmap、 PV和PVC等相关的资源


授权策略-ABAC

  • ABAC( Attribute-based access control),基于属性的访问控制, 通过使用将属性组合在一起的策略向用户授予访问权限
  • 给API Server指定策略文件, --authorization-policy-file=FILENAME,文件内容是一行一个Policy对象的JSON串


ABAC-示例

例子 功能描述
Alice可以对所有资源做
任何操作
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user":
"alice", "namespace": "*", "resource": "*", "apiGroup": "*"}}
Kubelet可以读取任何
Pod
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user":
"kubelet", "namespace": "*", "resource": "pods", "readonly": true}}
Kubelet可以读写事件 {"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user":
"kubelet", "namespace": "*", "resource": "events"}}
Bob可以在命名空间
projectCaribou中读取
Pod
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"user":
"bob", "namespace": "projectCaribou", "resource": "pods", "readonly": true}}
任何人都可以对所有非
资源路径进行只读请求
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group":
"system:authenticated", "readonly": true, "nonResourcePath": "*"}}
{"apiVersion": "abac.authorization.kubernetes.io/v1beta1", "kind": "Policy", "spec": {"group":
"system:unauthenticated", "readonly": true, "nonResourcePath": "*"}}


授权策略-RBAC

RBAC( Role-Based Access Control),允许通过Kubernetes API 动态配置策略。

RBAC被映射成四种K8S顶级资源对象:

  • - 角色(Role): Role、 ClusterRole
  • * 角色表示一组权限的规则,累积规则
  • * Role适用带namespace的资源, ClusterRole适用集群资源或非资源API
  • - 建立用户与角色的映射/绑定关系: RoleBinding、 ClusterRoleBinding
  • * RoleBinding和ClusterRoleBinding的区别在于是否是namespace的资源
  • * 角色绑定包含了一组相关主体(即subject, 包括用户、用户组、或者Service Account)以及对被授予角色的引用


角色


角色绑定


Admission Control准入控制

  • Admission Control实际上是一个准入控制器(Admission Controller)插件列表(又叫“准入控制链” ),发送到API Server的请求都需要经过这个列表中的每个准入控制器插件的检查,检查不通过,则APIServer拒绝请求
  • 会自动修改Pod的配置
  • 官方支持20+个准入控制插件,而且支持自定义扩展
  • 1.4以上版本官方推荐使用的插件
  • --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota


Secret

Secret 对象类型用来保存敏感信息,例如密码、 OAuth 令牌和 ssh key。将这些信息放在 secret 中比放在Pod 的定义或者 docker 镜像中可以更好地控制它的用途,并降低意外暴露的风险。

Pod 一般有3种方式使用 secret:

  • - 作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里
  • - 环境变量
  • - 当 Kubelet 为 pod 拉取镜像时使用(imagePullSecret)
类型 功能描述
Opaque 用来存储密码、密钥等,使用base64编码格式
kubernetes.io/dockerconfigjson 也称imagePullSecrets,用来存储私有docker registry的认证信息
kubernetes.io/service-account-token 用于被serviceaccount引用。 serviceaccout创建时Kubernetes会默认创建对应的
secret。 Pod如果使用了serviceaccount,对应的secret会自动挂载到Pod的
/run/secrets/kubernetes.io/serviceaccount目录中


Secret  - Opaque类型定义

Opaque类型的数据是一个map类型,要求value是base64编码格式

以数据库用户名(admin => YWRtaW4=)、密码(1f2d1e2e67df => MWYyZDFlMmU2N2Rm)为例:

# base64 解码

$ echo "MWYyZDFlMmU2N2Rm" | base64 --decode

1f2d1e2e67df


Secret - dockerconfigjson类型

kubernetes.io/dockerconfigjson类型secret是将包含Docker Registry凭证传递给 Kubelet 的一种方式,可以用来为Pod拉取私有镜像

$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --dockerusername=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

secret/myregistrykey created.

OR: 从docker配置文件导入

$ kubectl create secret docker-registry myregistrykey –from-file=“~/.dockercfg”

$ kubectl get secret myregistrykey -o yaml

kind: Secret
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson:
eyJhdXRocyI6eyJET0NLRVJfUkVHSVNUUllfU0VSVkVSIjp7InVzZXJuYW1lIjoiRE9DS0VSX1VTRVIiLCJwYXNzd29yZCI6IkRPQ0tFU
l9QQVNTV09SRCIsImVtYWlsIjoiRE9DS0VSX0VNQUlMIiwiYXV0aCI6IlJFOURTMFZTWDFWVFJWSTZSRTlEUzBWU1gxQkJVMU5
YVDFKRSJ9fX0=
metadata:
name: myregistrykey


Service Account

Service Account用于Pod中的进程访问API Server

  • - 相对于客户端使用的user account(全局权限),为Pod内的进程提供身份标识

为什么需要Service Account?

  • - 客户端授权方式是“全授权”,可以任意操作集群!需要更轻量和精准的方式。

default Service Account

  • - 当namespace创建时,会自动创建一个名为default的Service Account
  • - 当default的Service Account创建时,会自动在同namespace下创建一个default-token-XXX,并关联到default的Service
  • Account上
  • - 创建Pod时,如果没有指定Service Account, K8S的Service Account Admission Controller会自动为该Pod指定default Service Account

Pod关联Service Account

  • - K8S会给Pod创建一个特殊的Volume,该Volume中包含指定Service Account Secret的token, namespace,证书文件,并将Volume挂载到Pod中所有容器的指定目录下(/var/run/secrets/kubernetes.io/serviceaccount)

认证环节

  • - 用户名 system:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)
  • - 凭证 service account token


ServiceAccount使用

让Pod访问API Server

  • - 容器应用读取/var/run/secrets/kubernetes.io/serviceaccount/token文件,使用token认证方式访问API Server
  • - client-go做了封装

Kubectl使用ServiceAccount token访问API Server

  • ① 查看指定namespace(如default)下的ServiceAccount,获取Secret
  • ② 查看Secret,获取token
  • ③ 设置kubeconfig中设置token
  • ④ 使用kubectl访问


再看service-account-token类型Secret

创建Service Accout, K8S默认会创建对应的Secret

Secret使用:

kubernetes.io/service-account-token类型的Secret对应Pod中的ca.crt(API Server的CA公钥证书), namespace,

token(用API Server私钥签发的bearer token)三个文件:

  • ① /run/sercrets/kubernetes.io/serviceaccount/token
  • ② /run/sercrets/kubernetes.io/serviceaccount/ca.crt
  • ③ /run/sercrets/kubernetes.io/serviceaccount/namespace



相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
26 2
|
2月前
|
Kubernetes 持续交付 开发者
探索并实践Kubernetes集群管理与自动化部署
探索并实践Kubernetes集群管理与自动化部署
102 4
|
5天前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
24 1
|
16天前
|
Kubernetes 负载均衡 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第27天】Kubernetes(简称K8s)是云原生应用的核心容器编排平台,提供自动化、扩展和管理容器化应用的能力。本文介绍Kubernetes的基本概念、安装配置、核心组件(如Pod和Deployment)、服务发现与负载均衡、网络配置及安全性挑战,帮助读者理解和实践Kubernetes在容器编排中的应用。
47 4
|
17天前
|
Kubernetes 监控 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第26天】随着云计算技术的发展,容器化成为现代应用部署的核心趋势。Kubernetes(K8s)作为容器编排领域的佼佼者,以其强大的可扩展性和自动化能力,为开发者提供了高效管理和部署容器化应用的平台。本文将详细介绍Kubernetes的基本概念、核心组件、实践过程及面临的挑战,帮助读者更好地理解和应用这一技术。
49 3
|
23天前
|
Kubernetes 监控 开发者
专家级实践:利用Cloud Toolkit进行微服务治理与容器化部署
【10月更文挑战第19天】在当今的软件开发领域,微服务架构因其高可伸缩性、易于维护和快速迭代的特点而备受青睐。然而,随着微服务数量的增加,管理和服务治理变得越来越复杂。作为阿里巴巴云推出的一款免费且开源的开发者工具,Cloud Toolkit 提供了一系列实用的功能,帮助开发者在微服务治理和容器化部署方面更加高效。本文将从个人的角度出发,探讨如何利用 Cloud Toolkit 来应对这些挑战。
34 2
|
25天前
|
Kubernetes 持续交付 Docker
探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
【10月更文挑战第18天】探索DevOps实践:利用Docker与Kubernetes实现微服务架构的自动化部署
74 2
|
8天前
|
Kubernetes 负载均衡 调度
Kubernetes集群管理与编排实践
Kubernetes集群管理与编排实践
|
8天前
|
Kubernetes Cloud Native 前端开发
Kubernetes入门指南:从基础到实践
Kubernetes入门指南:从基础到实践
18 0
|
2月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践