首页 > 其他分享 >Kubernetes security context capability

Kubernetes security context capability

时间:2023-04-14 15:25:43浏览次数:96  
标签:sys 应用 admin cap capability context security 普通用户 net

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


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 内,则启动二进制文件会失败。

参考

标签:sys,应用,admin,cap,capability,context,security,普通用户,net
From: https://www.cnblogs.com/xingzheanan/p/17318399.html

相关文章

  • 【Java技术专题】「盲点追踪」突破知识盲点分析Java安全管理器(SecurityManager)
    前提介绍Java安全应该包括两方面的内容,一是Java平台(即是Java运行环境)的安全性;二是Java语言开发的应用程序的安全性。由于我们不是Java本身语言的制定开发者,所以第一个安全性不需要我们考虑。其中第二个安全性是我们重点考虑的问题,一般我们可以通过安全管理器机制来完善安全性,安全管......
  • HttpServeletRequest与RequestContextHolder.getRequestAttributes.getRequest的区别
    HttpServletRequest是JavaServletAPI中的一个接口,它提供了访问HTTP请求的方法,例如获取请求参数、请求头、请求体等。它是在Servlet容器中处理HTTP请求时创建的,并在Servlet的doGet()、doPost()等方法中作为参数传递。RequestContextHolder.getRequestAttributes().getRequest......
  • SpringSecurity
    permitAll() :无条件允许任何形式访问,不管你登录还是没有登录。anonymous() :允许匿名访问,也就是没有登录才可以访问。denyAll() :无条件决绝任何形式的访问。authenticated():只允许已认证的用户访问。fullyAuthenticated() :只允许已经登录或者通过remember-me登录的用户......
  • SpringBoot向web容器注入Servlet,Filter及SpringSecurity注册DelegatingFilterProxy
    从SpringSecurity架构图可知SpringSecurity的过滤器与Web容器的过滤器是通过DelegatingFilterProxy接入的。由DelegatingFilterProxy代理了FilterChainProxy,FilterChainProxy包含了SpringSecurity的过滤器链。 那么DelegatingFilterProxy是怎么创建及如何加入到Web容器中? 看......
  • spring security FormLoginConfigure的作用和源码解读
    这一节来研究下springsecurity中FormLoginConfigurer这个配置器的作用一、综述FormLoginConfigurer本质上还是一个SecurityConfigurer,用来对HttpSecurity这个构建器进行配置,它用来对表单登录的功能进行配置,通过HttpSecurity#formLogin()方法来给HttpSecurity对象中添加此配......
  • Spring-Security
    SecurityConfig@Configuration@EnableWebSecuritypublicclassSecurityConfigimplementsWebMvcConfigurer{@BeanpublicSecurityFilterChainfilterChain(HttpSecurityhttpSecurity)throwsException{//httpSecurity.authorizeHttpRe......
  • Context响应,重定向,自定义函数,Abort
    前言:Context对象提供了很多内置的响应形式,JSON、HTML、Protobuf、MsgPack、Yaml、String等。它会为每一种形式都单独定制一个渲染器。Context是Gin最重要的部分。它允许我们在中间件之间传递变量,管理流程,验证请求的JSON并呈现JSON响应。正文: content响应字符串,json,及......
  • SpringSecurity源码-构建ProviderManager
    简介在构建WenSecurity执行生命周期AbstractConfiguredSecurityBuilder#doBuild()方法中的init(),会执行到WebSecurityConfigurerAdapter#init(WebSecurityweb)方法,会去创建HttpSecurity。在创建HttpSecurity时调用authenticationManager()构建ProviderManager。 WebSecurityCo......
  • Spring Security系列教程-初识Spring Security
    前言在开始学习SpringSecurity系列教程之前,小千先带大家来了解一下SpringSecurity,看看它到底是什么,有哪些功能,有什么特点,以及它与别的同类框架相比,有什么不同,我们以后学习任何一个新技术,其实都可以遵循"3W1H"法则,这样学习起来才能更有条理。一.SpringSecurity概念首先请各位跟......
  • C# System.lnvalidOperationException:"A second operation started on this context
    项目中使用了依赖注入,这个错误在我项目中的原因:在async修饰的异步方法中,调用执行数据库操作的方法时,没有使用await关键字调用,因为没有等待该调用,所以在调用完成之前将继续执行该方法。因此,已处理了注入的依赖项。......