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

简介: 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



相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
11月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
476 2
|
弹性计算 Kubernetes 数据处理
KubeRay on ACK:更高效、更安全
阿里云 ACK 以托管组件化的方式给客户提供快速搭建Ray集群的能力,并通过结合使用阿里云的调度,存储,日志与监控,给用户提供更佳使用体验。
|
6月前
|
存储 负载均衡 测试技术
ACK Gateway with Inference Extension:优化多机分布式大模型推理服务实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with Inference Extension组件,在Kubernetes环境中为多机分布式部署的LLM推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
7月前
|
存储 人工智能 Kubernetes
ACK Gateway with AI Extension:面向Kubernetes大模型推理的智能路由实践
本文介绍了如何利用阿里云容器服务ACK推出的ACK Gateway with AI Extension组件,在Kubernetes环境中为大语言模型(LLM)推理服务提供智能路由和负载均衡能力。文章以部署和优化QwQ-32B模型为例,详细展示了从环境准备到性能测试的完整实践过程。
|
7月前
|
存储 人工智能 物联网
ACK Gateway with AI Extension:大模型推理的模型灰度实践
本文介绍了如何使用 ACK Gateway with AI Extension 组件在云原生环境中实现大语言模型(LLM)推理服务的灰度发布和流量分发。该组件专为 LLM 推理场景设计,支持四层/七层流量路由,并提供基于模型服务器负载感知的智能负载均衡能力。通过自定义资源(CRD),如 InferencePool 和 InferenceModel,可以灵活配置推理服务的流量策略,包括模型灰度发布和流量镜像。
|
11月前
|
Kubernetes 持续交付 开发者
探索并实践Kubernetes集群管理与自动化部署
探索并实践Kubernetes集群管理与自动化部署
407 93
|
8月前
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
8月前
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
10月前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
8月前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。

热门文章

最新文章

推荐镜像

更多