一.系统环境

本文主要基于Kubernetes1.22.2和Linux操作系统Ubuntu 18.04。

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构
Ubuntu 18.04.5 LTS Docker version 20.10.14 v1.22.2 x86_64

Kubernetes集群架构:k8scludes1作为master节点,k8scludes2,k8scludes3作为worker节点。

服务器 操作系统版本 CPU架构 进程 功能描述
k8scludes1/192.168.110.128 Ubuntu 18.04.5 LTS x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scludes2/192.168.110.129 Ubuntu 18.04.5 LTS x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scludes3/192.168.110.130 Ubuntu 18.04.5 LTS x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

二.前言

在我们使用Kubernetes进行容器化部署时,经常需要为Pod设置特定的权限。这种权限管理通常通过Kubernetes的服务账号(Service Accounts)实现。然而,默认情况下,Service Account的token会自动挂载到对应的Pod中,这可能引发一些安全问题。因此,本文将介绍如何设置Service Account的token不自动挂载到Pod中。

设置Kubernetes(k8s)服务账号Service Accounts(sa)的token不挂载到pod的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Ubuntu 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/17632858.html。

三.Service Accounts(sa)简介

Service Accounts(服务账户)通常用于计算机程序或操作系统中。它们不是普通用户账户,而是被某些应用程序或服务用于特定的、通常自动化的任务。

在Kubernetes(一个开源的容器编排平台)中,Service Accounts主要为Pod中运行的进程提供身份。与面向人类的普通用户不同,Service Accounts由Kubernetes集群内的Pods/服务使用。

关于Service Accounts的关键点:

  • 它们是有命名空间的:可以为每个命名空间创建Service Accounts,并且不能跨命名空间访问(除非被赋予明确的权限)。

  • 默认情况下,当创建一个Pod时,Kubernetes会自动为其分配一个"default" Service Account,但你也可以创建并指定特定的Service Account。

  • Service Account 被绑定到一组角色(Roles),这些角色定义了 Service Account 的权限,例如对某些资源的读写权限等。

总的来说,Service Accounts 是一种安全和权限管理的机制,让我们能更好地控制在复杂环境中的应用程序和服务的访问权限。

默认情况下,Service Account的token会自动挂载到Pod内的应用程序使用。但在某些情况下,我们可能不希望token自动挂载,以避免潜在的安全风险。Service Accounts(sa)的token自动挂载到pod的方式具有安全隐患,假如我们拉取的镜像存有恶意代码,如果给了sa一个不正当的权限,pod使用这个sa权限的时候就可能干坏事,避免的方法有:

  1. 授予的权限最小化,够用就行 ;
  2. 如果没有必要 的话,不需要把sa的token挂载到pod里,不然恶意程序使用token干坏事。

关于Service Accounts(sa)的更多内容,请查看博客《Kubernetes(k8s)服务账号Service Accounts》。

四.在pod里设置sa的token不挂载到pod

不把Service Accounts(sa)的token挂载到pod有两种方法:

  1. 在pod里设置 ;
  2. 在sa里设置。

我们先使用第一种方法,现在没有pod。

root@k8scludes1:~/authorization# kubectl get pod
No resources found in authorization namespace.

pod.spec下有automountServiceAccountToken字段。

root@k8scludes1:~/authorization# kubectl explain pod.spec | grep automountService
automountServiceAccountToken <boolean>

查看automountServiceAccountToken参数的含义,automountServiceAccountToken字段的功能是:是否应自动挂载服务账户token。

root@k8scludes1:~/authorization# kubectl explain pod.spec.automountServiceAccountToken
KIND: Pod
VERSION: v1 FIELD: automountServiceAccountToken <boolean> DESCRIPTION:
AutomountServiceAccountToken indicates whether a service account token
should be automatically mounted.

如下是pod的yaml文件,功能为:使用hub.c.163.com/library/nginx:latest镜像创建一个名为podtest的pod,不自动挂载sa的token到pod上。

root@k8scludes1:~/authorization# vim pod.yaml 

root@k8scludes1:~/authorization# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: podtest
name: podtest
spec:
#automountServiceAccountToken: false:表示不会自动挂载服务账户token到Pod中。通常情况下,这个令牌用于授权Pod访问Kubernetes API。
automountServiceAccountToken: false
#terminationGracePeriodSeconds: 0:表示当需要关闭容器时,立即杀死容器而不等待默认的30秒优雅停机时长。
terminationGracePeriodSeconds: 0
containers:
- image: hub.c.163.com/library/nginx:latest
#imagePullPolicy: IfNotPresent:这表示如果本地不存在该镜像,则从远程仓库拉取。
imagePullPolicy: IfNotPresent
name: podtest
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

创建pod。

root@k8scludes1:~/authorization# kubectl apply -f pod.yaml
pod/podtest created

pod创建成功。

root@k8scludes1:~/authorization# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
podtest 1/1 Running 0 9s 10.244.218.143 k8scludes2 <none> <none>

进入pod,此时sa的token就没有挂载到pod上,应用程序就不可以使用token干坏事了。

root@k8scludes1:~/authorization# kubectl exec -it podtest -- bash

root@podtest:/# df -Th
Filesystem Type Size Used Avail Use% Mounted on
overlay overlay 97G 5.3G 87G 6% /
tmpfs tmpfs 64M 0 64M 0% /dev
tmpfs tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup
/dev/mapper/tom--vg-root ext4 97G 5.3G 87G 6% /etc/hosts
shm tmpfs 64M 0 64M 0% /dev/shm
tmpfs tmpfs 1.4G 0 1.4G 0% /proc/acpi
tmpfs tmpfs 1.4G 0 1.4G 0% /proc/scsi
tmpfs tmpfs 1.4G 0 1.4G 0% /sys/firmware #退出pod
root@podtest:/# exit
exit

删除pod。

root@k8scludes1:~/authorization# kubectl delete pod podtest
pod "podtest" deleted

五.在sa里设置sa对应的token不挂载到pod上

默认存在一个名为default的sa。

root@k8scludes1:~/authorization# kubectl get sa
NAME SECRETS AGE
default 1 3d4h

生成创建sa的yaml文件。

root@k8scludes1:~/authorization# kubectl create sa satest --dry-run=client -o yaml >satest.yaml

sa的yaml文件如下:sa的名字为satest。

root@k8scludes1:~/authorization# cat satest.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: null
name: satest

sa有一个automountServiceAccountToken字段。

root@k8scludes1:~/authorization# kubectl explain sa | grep -A4 automountService
automountServiceAccountToken <boolean>
AutomountServiceAccountToken indicates whether pods running as this service
account should have an API token automatically mounted. Can be overridden
at the pod level.

查看sa的automountServiceAccountToken参数的含义,表示作为此服务账户运行的Pod是否应自动挂载API token,这可以在Pod级别被覆盖。

root@k8scludes1:~/authorization# kubectl explain sa.automountServiceAccountToken
KIND: ServiceAccount
VERSION: v1 FIELD: automountServiceAccountToken <boolean> DESCRIPTION:
AutomountServiceAccountToken indicates whether pods running as this service
account should have an API token automatically mounted. Can be overridden
at the pod level.

修改sa的yaml文件,设置automountServiceAccountToken: false,这样设置之后,pod以satest的身份运行之后,默认是不挂载satest的token到pod上的。

root@k8scludes1:~/authorization# vim satest.yaml 

root@k8scludes1:~/authorization# cat satest.yaml
apiVersion: v1
kind: ServiceAccount
automountServiceAccountToken: false
metadata:
creationTimestamp: null
name: satest

创建sa。

root@k8scludes1:~/authorization# kubectl apply -f satest.yaml
serviceaccount/satest created

sa创建成功。

root@k8scludes1:~/authorization# kubectl get sa
NAME SECRETS AGE
default 1 3d4h
satest 1 4s

如下是pod的yaml文件,功能为:使用hub.c.163.com/library/nginx:latest镜像创建一个名为podtest的pod,并且pod以satest的身份运行。

root@k8scludes1:~/authorization# vim pod.yaml 

root@k8scludes1:~/authorization# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: podtest
name: podtest
spec:
#terminationGracePeriodSeconds: 0 表示当需要关闭容器时,立即杀死容器而不等待默认的30秒优雅停机时长。
terminationGracePeriodSeconds: 0
containers:
- image: hub.c.163.com/library/nginx:latest
#imagePullPolicy: IfNotPresent:表示如果本地已经存在该镜像,则不重新下载;否则从远程 Docker Hub 下载该镜像
imagePullPolicy: IfNotPresent
name: podtest
resources: {}
#serviceAccount: satest表示pod以satest的身份运行
serviceAccount: satest
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

创建pod。

root@k8scludes1:~/authorization# kubectl apply -f pod.yaml
pod/podtest created

pod创建成功。

root@k8scludes1:~/authorization# kubectl get pod
NAME READY STATUS RESTARTS AGE
podtest 1/1 Running 0 5s

进入pod,sa的token没有挂载到pod。

root@k8scludes1:~/authorization# kubectl exec -it podtest -- bash

#sa的token没有挂载到pod
root@podtest:/# df -hT
Filesystem Type Size Used Avail Use% Mounted on
overlay overlay 97G 5.3G 87G 6% /
tmpfs tmpfs 64M 0 64M 0% /dev
tmpfs tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup
/dev/mapper/tom--vg-root ext4 97G 5.3G 87G 6% /etc/hosts
shm tmpfs 64M 0 64M 0% /dev/shm
tmpfs tmpfs 1.4G 0 1.4G 0% /proc/acpi
tmpfs tmpfs 1.4G 0 1.4G 0% /proc/scsi
tmpfs tmpfs 1.4G 0 1.4G 0% /sys/firmware root@podtest:/# exit
exit

六.总结

本文介绍了如何在Kubernetes中设置Service Account的token不自动挂载到Pod中,以增强系统的安全性。希望本文能够帮助你更好地理解和使用Kubernetes的Service Account。

设置服务账号Service Accounts(sa)的token不挂载到pod的更多相关文章

  1. 在SharePoint 2010中,如何找回丢失的服务账号(Service Account)密码

    背景信息: 通常在SharePoint环境中我们会使用很多的服务账号来运行各种不同的服务,尤其在企业环境中,由于权限管理条例严格,这些服务账号更是只能多不能少.面对如此多的服务账号,各个企业都会有自己 ...

  2. Centos7 环境下开机 自启动服务(service) 设置的改变 (命令systemctl 和 chkconfig用法区别比较)

    参考文章:  <Linux 设置程序开机自启动 (命令systemctl 和 chkconfig用法区别比较)> http://blog.csdn.net/kenhins/article/ ...

  3. NeuChar 平台使用及开发教程(二):设置平台账号

    在上一篇<NeuChar 平台使用及开发教程(一):开始使用 NeuChar>中我们了解了 NeuChar 的角色和大体功能框架,并进行了注册,本文将介绍如何设置多账号,以便让 NeuCh ...

  4. 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇

    什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...

  5. VS 2010一步步开发windows服务(windows service)

    基于0起步来创建一个服务,做到简单的记录时间日志功能,其具体招行方法可自行添加. 1.创建服务 2.删除默认服务文件 3.添加自己的服务文件 4.更改启动项目 5. 引用 using System.T ...

  6. Windows Azure文件共享服务--File Service

    部署在Windows Azure上的虚拟机之间如何共享文件?例如:Web Server A和Web Server B组成负载均衡集群,两个服务器需要一个共享目录来存储用户上传的文件.通常,大家可能首先 ...

  7. Android 服务类Service 的详细学习

    http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建   目录(?)[+] 什么是服务 服务有 ...

  8. Android(java)学习笔记234: 服务(service)之音乐播放器

    1.我们播放音乐,希望在后台长期运行,不希望因为内存不足等等原因,从而导致被gc回收,音乐播放终止,所以我们这里使用服务Service创建一个音乐播放器. 2.创建一个音乐播放器项目(使用服务) (1 ...

  9. Amazon MWS 上传数据 (一) 设置服务

    Amazon 上传数据的流程为: 通过 SubmitFeed 操作.加密标头和所有必需的元数据(包括 FeedType 的值在内),来提交 XML 或文本型数据文件.正如亚马逊 MWS的所有提交内容一 ...

  10. Android 服务类Service 的具体学习

    上一篇说到了通知栏Notification,提起通知栏,不得让人想到Service以及BroadcastReceive,作为android的4大组建的2个重要成员,我们没少和它们打交道.它们能够在无形 ...

随机推荐

  1. 都说 C++ 没有 GC,RAII: 那么我算个啥?(赠书福利)

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/7A9-tGZxf4w_7eZl3OUQ4A 学过 Java.C# ...

  2. 记一次排查:接口返回值写入excel后,从单元格copy出来的数据会带有多重引号的问题

    在项目里刚好有3个服务,同一个网关内层的3个服务,两个php的,一个golang的,为了提高负载以及进行分流,部分客户的接口调用会被网关自动分配到go服务. 恰好为了测试,我写了一个全量用户的生产.测 ...

  3. Mybatis查询

    查询 查询的数据为单条实体类 使用实体类进行接受即可,或者使用list,map接口均可.后面两者比较浪费 使用实体类接受 mapper接口: User selectUserById(int useri ...

  4. drf——反序列化校验源码(了解)、断言、drf之请求和响应、视图之两个视图基类

    1.模块与包 # 模块与包 模块:一个py文件 被别的py文件导入使用,这个py文件称之为模块,运行的这个py文件称之为脚本文件 包:一个文件夹下有__init__.py # 模块与包的导入问题 '' ...

  5. vue iview 单击table行变色 获取行数据

    用到两个事件: 代码如下: 1 <Table :columns="columns" :data="tableData" @on-row-click=&qu ...

  6. aspnetcore最最简单的接口权限认证

    五月一眨眼就过去,就当凑个数吧. 场景: 一个小小的项目,需要一个后台,就展示几个列表,连用户表.角色表等都不需要设计. 之前有写过identityserver4和jwt4的demo (exercis ...

  7. List的拆分的几种方式

    开发中我们可能会遇到一个大的集合,然后我们需要对集合进行拆分,然后再对拆分的集合进行相关的操作.当然我们可以自己写一个拆分的方法,我自己写过用了不少代码,但是感觉还不是很好,最近看了不少工具才发现很多 ...

  8. R 包 pathview 代谢通路可视化

    pathview R 包是一个集成 pathway 通路数据与可视化的工具集.它用于把用户的数据映射并渲染到相关的 pathway 通路图上,用户只需要提供基因或者化合物数据(gene or comp ...

  9. R 数据可视化 : 热图

    本文作者蒋刘一琦,自嘲是一个有艺术追求的生信狗,毕业于浙江大学生物信息学专业,目前在复旦大学就读研究生,研究方向为宏基因组. 在生物信息领域我们常常使用 R 语言对数据可视化.在对数据可视化的时候,我 ...

  10. ElasticSearch的使用和介绍

    1.概述 功能 Elasticsearch 是一个分布式的 RESTful 搜索和分析引擎,可用来集中存储您的数据,以便您对形形色色.规模不一的数据进行搜索.索引和分析. 例如: 在电商网站搜索商品 ...