注:以下内容基于经验主义,不一定对。


Linux capability

Linux 中,root 作为特权用户,具有执行所有应用的能力。而普通用户只能执行普通应用。如果普通用户需要执行特权应用,需要进行 SUID 提权,使得普通用户在执行具有 SUID 的应用时短暂获得特权用户的身份。

这一设计容易出现漏洞,漏洞在于 SUID 程序上,普通用户在执行 SUID 程序是以特权用户执行的。利用这一功能,可以使普通用户提权。如 SUID 程序中,新开一个 shell,该 shell 可以 root 身份运行的。详细了解可参考 原理+代码实战:SUID提权渗透

因此,需要给普通用户更细粒度的权限,使得普通用户仅能获得给定的能力而不能越权。Linux 的 capability 定义了一系列细粒度的能力供普通用户使用,从而保证安全性。

工具 setcapgetcap 可以给应用加 cap 和获取应用的 cap。setcap 加的应用,在移动或操作时,其 cap 会丢失。

给应用加上指定运行应用的 cap 时,普通用户即可运行特权用户才能执行的应用。

Linux 中,setcap 加的是静态的应用属性,真正执行还是要看系统是否具有执行应用的 cap。

Kubernetes capability

Linux 的 capability 理清了,就要上到容器中看。

容器中,应用在 dockerfile 内定义好需要的 cap,这是静态属性。在起容器时,静态的 docker image 将映射为动态的文件系统(容器)。

此时,容器中的应用是具有 cap。也即是,容器作为沙箱需要有运行容器应用的 cap。否则,应用执行会失败。

简单记录如下:

# dockerfile
setcap cap_dac_override,cap_sys_admin,cap_net_admin+ep /usr/sbin/tc # 容器中的应用
$ kubectl exec -it <pod_id> -c <container_id> /bin/bash
bash-5.1$ getcap /usr/sbin/tc
/usr/sbin/tc cap_dac_override,cap_net_admin,cap_sys_admin=ep

那么,运行应用的 cap 在哪里定义呢?

理解这一点,要从 SCC(security context constraints) 讲起。

SCC 里定义了一系列 security 属性,绑定其上的 serviceaccount 受 SCC 约束。其中,allowPrivilegeEscalation, allowPrivilegedContainerallowedCapabilities 属性和 capability 相关,需要重点关注下。

容器内运行“特权”应用。有三种方式:

  • 用户可以以 root 身份运行。
  • 普通用户通过权限提升 allowPrivilegeEscalation 为 root 运行。
  • 指定容器中 cap,使普通用户具有执行应用的能力。

容器内所需要的 cap 在 container 域定义,container 域定义的 cap 需要在 SCC 中 allow 的,并且要 disable container 中用户的特权提升。

查看 container 中容器的 cap 如下:

bash-5.1$ capsh --print
Current: cap_dac_override,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_sys_admin,cap_sys_nice=i
Bounding set =cap_dac_override,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_sys_admin,cap_sys_nice
Ambient set =
Current IAB: !cap_chown,cap_dac_override,!cap_dac_read_search,!cap_fowner,!cap_fsetid,!cap_kill,!cap_setgid,!cap_setuid,!cap_setpcap,!cap_linux_immutable,cap_net_bind_service,!cap_net_broadcast,cap_net_admin,cap_net_raw,!cap_ipc_lock,!cap_ipc_owner,!cap_sys_module,!cap_sys_rawio,!cap_sys_chroot,!cap_sys_ptrace,!cap_sys_pacct,cap_sys_admin,!cap_sys_boot,cap_sys_nice,!cap_sys_resource,!cap_sys_time,!cap_sys_tty_config,!cap_mknod,!cap_lease,!cap_audit_write,!cap_audit_control,!cap_setfcap,!cap_mac_override,!cap_mac_admin,!cap_syslog,!cap_wake_alarm,!cap_block_suspend,!cap_audit_read,!cap_perfmon,!cap_bpf,!cap_checkpoint_restore

查看进程所具有的 cap:

bash-5.1$ cat /proc/$$/status | grep Cap
CapInh: 0000000000a03402
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000000000a03402
CapAmb: 0000000000000000
bash-5.1$ capsh --decode=0000000000a03402
0x0000000000a03402=cap_dac_override,cap_net_bind_service,cap_net_admin,cap_net_raw,cap_sys_admin,cap_sys_nice

可以看到进程绑定到环境拥有的 cap,这里要注意的是如果二进制文件定义的 cap 不在容器 cap 内,则启动二进制文件会失败。

参考

Kubernetes security context capability的更多相关文章

  1. Security Context

    概述 Security Context(安全上下文)用来限制容器对宿主节点的可访问范围,以避免容器非法操作宿主节点的系统级别的内容,使得节点的系统或者节点上其他容器组受到影响. Security Co ...

  2. The server principal "sa" is not able to access the database "xxxx" under the current security context

    在SQL Server服务器上一个作业执行时,遇到下面错误信息: Message: Executed as user: dbo. The server principal "sa" ...

  3. SQL Agent Job 报“Access to the remote server is denied because the current security context is not trusted”

    SQL Server 2005(Microsoft SQL Server 2005 - 9.00.5000.00)下的一个作业执行一个存储过程,存储过程中动态SQL语句使用链接服务器(Linked S ...

  4. Summary Checklist for Run-Time Kubernetes Security

    Here is a convenient checklist summary of the security protections to review for securing Kubernetes ...

  5. 101 More Security Best Practices for Kubernetes

    https://rancher.com/blog/2019/2019-01-17-101-more-kubernetes-security-best-practices/ The CNCF recen ...

  6. kubernetes 实战3_命令_Configure Pods and Containers

    Configure a Pod to Use a PersistentVolume for Storage how to configure a Pod to use a PersistentVolu ...

  7. Kubernetes 最佳安全实践指南

    原文链接:https://fuckcloudnative.io/posts/security-best-practices-for-kubernetes-pods/ 对于大部分 Kubernetes ...

  8. Kubernetes 安全

    RBAC 权限控制 对资源对象的操作都是通过 APIServer 进行的,那么集群是怎样知道我们的请求就是合法的请求呢?这个就需要了解 Kubernetes 中另外一个非常重要的知识点了:RBAC(基 ...

  9. 基于Kubernetes构建企业容器云

    前言 团队成员有DBA.运维.Python开发,由于需要跨部门向公司私有云团队申请虚拟机, 此时我在思考能否在现有已申请的虚拟机之上,再进行更加细粒度的资源隔离和划分,让本团队的成员使用, 也就是在私 ...

  10. Dock的生态开源技术(Etcd&Machine&Compose&Swarm&Mesos&Kubernetes)

    Etcd CoreOS公司开源的高可用分布式键值数据库Etcd,该项目已经被广泛应用到分布式系统的一致性实现和服务发现中,基于Go语言实现. Etcd就是专门为集群环境设计,可以很好地实现数据一致性, ...

随机推荐

  1. 使用 Taro 开发鸿蒙原生应用 —— 当 Taro 遇到纯血鸿蒙

    纯血鸿蒙即将到来 在今年 8 月的「2023年华为开发者大会(HDC.Together)」上,华为正式官宣「鸿蒙Next」,这个更新的版本将移除所有的 AOSP 代码,彻底与 Android 切割,使 ...

  2. Python 中 key 参数的含义及用法

    哈喽大家好,我是咸鱼 我们在使用 sorted() 或 map() 函数的时候,都会看到里面有一个 key 参数 其实这个 key 参数也存在于其他内置函数中(例如 min().max() 等),那么 ...

  3. Python——第四章:迭代器(Iterators)

    迭代器iterator: 提到迭代器,最典型的就是for循环 for 变量 in 可迭代: pass 可迭代对象iterable: 是指可以使用 for 循环进行遍历的对象.除了字符串 (str).列 ...

  4. elastic优化

    通过定义keyword 的 "null_value" :"NULL",使得搜索是不用单独使用exists查询.统一用terms查询就能查询到想要的结果 利用co ...

  5. 如何保证XML正确性

    如何保证XML正确性 XML是个盒子,什么都能装,但是装进去的东西正确与否恐怕无法得知.往往我们都人工审核.双人复核保证,但是次数多了难免会出错.那么我们如何保证和避免这种问题出现呢? 那就是XSD, ...

  6. Mybatis源码4 Cache的实现和其原理

    Mybatis CachingExecutor, 二级缓存,缓存的实现 一丶二级缓存概述 上一章节,我们知道mybaits在构造SqlSession的时候,需要让SqlSession持有一个执行器,如 ...

  7. cf1453F 二维DP 思维

    cf1453F 二维DP 思维 原题链接 题意 目前我们有一个序列,在第i个点可以走到[i + 1, i + a[i]]区间内的任意一点(也就是说如果a[i]是0,路就走不通了) 现在要求我们将一些位 ...

  8. 下载安装Android Studio

    1,安装java的jdk 2,下载安装Dart 3,下载安装  Android Studio 建议这个安装在C盘,以防后期出现各种问题 在plugins中 (1)下载dart插件 (2)下载flutt ...

  9. Java 插入Excel页眉、页脚

    前言 在Excel文档中,我们常用页眉页脚来显示文档的附加信息,例如日期.公司名称.Logo或作者信息等.本文将通过Java程序来介绍如何给Excel文档添加页眉页脚.代码示例主要从以下几方面来演示添 ...

  10. 玩转云上数据湖,解析Serverless 技术落地

    导读: 本文主要介绍Serverless计算相关技术与其在华为云数据湖探索服务(后文简称DLI)中的技术落地.Serverless是DLI将计算能力服务化和产品化关键技术,与传统IAAS和PAAS技术 ...