当前位置:   article > 正文

Kubernetes(二十)Security Context(二)_--security-opt seccomp=unconfined

--security-opt seccomp=unconfined

一    官网参考文档

Docker侧的文档

Kubernetes侧的文档

二    Seccomp

secccomp深入了解

内核文档学习

对于'业务安全等级要求较高'的应用场景,我们需要限制'应用容器的内核能力',可以配合'Seccomp'/AppArmor/SELinux等'策略工具'达到限制'容器运行时刻capabilities'的目的

(1)基本概念

wiki

  1. seccomp 其实是 'secure computing mode' 的缩写,是 Linux 内核中的一个安全计算工具。seccomp 允许进程单向转换为'安全状态',在此状态下的进程,除了 'exit(),sigreturn(),read() 和 write()' '已打开的文件描述符外'等系统调用外,'不允许执行'其他任何系统调用
  2. 如果'该进程'尝试进行'其他的系统调用',则内核会使用 'SIGKILL 或 SIGSYS' 终止该进程,从这个意义上看,它'并没有'虚拟化系统资源,而是'完全'将其进行了'隔离'
  3. 通俗点来说,seccomp 的作用相当于是充当了'系统调用(syscall)的防火墙',它利用 'BPF 规则'来过滤系统调用,并控制'如何处理'它们

通俗的理解

它允许对'系统调用'进行'筛选',这样我们就能够为'应用程序-->进程'定义其'need-->需要的系统调用',并'deny-->拒绝'其它一切'不必要'的调用行为

BPF简介

不错的科普文章

目的: 限制'容器内'可用的'操作-->operation',seccomp()系统调用在'调用进程'seccomp状态下运行,使用此功能限制'容器内-->应用程序'的访问权限

沙盒理解

(2)查看内核是否支持

grep CONFIG_SECCOMP= /boot/config-`uname -r`

详细操作系统版本支持的情况

(3)传递给容器的配置文件

  1. SCMP_ACT_ERRNO: default action, 'Permission Denied'
  2. SCMP_ACT_ALLOW: '允许'

明确指定策略覆盖默认

  1. docker run --rm \
  2. -it \
  3. --security-opt 'seccomp=/path/to/seccomp/profile.json' \
  4. hello-world
  5. 备注: 必须是一个'json格式'的文件

(4)小扩展

(5)默认禁止的功能

  1. 思考: 'seccomp''capailities'的区别?
  2. 个人理解: 好多功能是'一致'
  3. +++++++++++++++++++'分割线'+++++++++++++++++++
  4. s说明: 直接'机器翻译'的并不准确,核心是理解'功能',大致有一个'全局性的'理解

'也门'  -->'be gated by' -->'等价的cap方式替代'

(6)需求:运行时不使用默认的seccomp配置文件

  1. 传递'unconfined'运行'没有默认'seccomp配置文件的容器
  2. docker run --rm -it '--security-opt seccomp=unconfined' debian:jessie unshare --map-root-user --user sh -c whoami

三     Seccomp在k8s上的应用

(1)总的学习目标

(2)帮助文档查看

  1. 说明的是: 'v1.19 或更新-->update'版本(GA)和 'v1.19之前-->old'版本(alpha)版本关于seccomp使用方式是'有差异'
  2. 在1.19版中,'Seccomp 功能 GA',将新的'seccompProfile字段'添加到pod和容器的securityContext对象中

'unconfined传入'docker run的security-opt seccomp选项,'(forbidden)禁用默认(default)'的seccomp profile

  1. 备注1: '/var/lib/kubelet/seccomp/' 目录'默认没有创建',如果要使用需要'手动创建'
  2. 备注2: 和'static pod'不一样,在kubelet起动后,不会'主动扫描',只有在'kubelt启动时候'加载

(3)annoation注解的说明

说明: 1.19之前以'注解'的方式运行

(4)  kubelet加载节点上seccomp 配置文件,在Pod中使用

参考内容

  1. 说明: 以下实验都基于'1.19.3'版本做测试
  2. +++'分割线'+++
  3. mkdir -p /var/lib/kubelet/seccomp/profiles

  1. '修改之后重启' --> '从实验效果上来看实际不需要重启'
  2. systemctl restart kubelet.service
  3. 备注: 'ps -ef | grep kubelet | grep *seccomp*'发现kubelet的'启动参数'并没有这个配置

测试模板文件

  1. 'audit.json'模板文件
  2. {
  3. "defaultAction": "SCMP_ACT_LOG"
  4. }

其他参考

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: audit-pod
  5. labels:
  6. app: audit-pod
  7. spec:
  8. securityContext:
  9. seccompProfile:
  10. type: Localhost
  11. localhostProfile: profiles/audit.json --> '相对kubelet 启动参数--seccomp-profile-root的路径' --> '这里是/var/lib/kubelet/seccomp/'
  12. containers:
  13. - name: test-container
  14. image: hashicorp/http-echo:0.2.3
  15. args:
  16. - "-text=just made some syscalls!"
  17. securityContext:
  18. allowPrivilegeEscalation: false

相关报错

备注:1.19之后和1.19之前的方式按照官网均报错,达不到预期的实验效果,目前不知道原因,后续再补充

(5)使用导致违规的 Seccomp 配置文件创建 Pod

需求: '不允许任何'系统调用的配置文件'应用于 Pod'
  1. 'violation.json' --> '只要进行系统调用就出错'
  2. {
  3. "defaultAction": "SCMP_ACT_ERRNO"
  4. }

模板文件

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: violation-pod
  5. labels:
  6. app: violation-pod
  7. spec:
  8. securityContext:
  9. seccompProfile:
  10. type: Localhost
  11. localhostProfile: profiles/violation.json
  12. containers:
  13. - name: test-container
  14. image: hashicorp/http-echo:0.2.3
  15. args:
  16. - "-text=just made some syscalls!"
  17. securityContext:
  18. allowPrivilegeEscalation: false

分析原因

(6)使用设置仅允许需要的系统调用的配置文件来创建 Pod 

  1. cat /var/lib/kubelet/kubeadm-flags.env --> '添加kubelet的启动参数'
  2. 备注: 由于是'alpha的特性',所以需要自己在'kubelet侧'开启该参数--> '上面我们已经'
  3. --seccomp-profile-root=/var/lib/kubelet/seccomp
  4. 注意: '当pod调度到哪个节点上,就使用该节点上的seccomp配置文件,而不是加载执行apply所对用的文件中'
  5. 备注: 修改启动参数之后最好'restart'下kubelet服务

 

模板文件

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: fine-pod
  5. labels:
  6. app: fine-pod
  7. spec:
  8. securityContext:
  9. seccompProfile:
  10. type: Localhost
  11. localhostProfile: profiles/fine-grained.json
  12. containers:
  13. - name: test-container
  14. image: hashicorp/http-echo:0.2.3
  15. args:
  16. - "-text=just made some syscalls!"
  17. securityContext:
  18. allowPrivilegeEscalation: false
  19. 备注: '1.19.3'

  1. {
  2. "defaultAction": "SCMP_ACT_ERRNO",
  3. "architectures": [
  4. "SCMP_ARCH_X86_64",
  5. "SCMP_ARCH_X86",
  6. "SCMP_ARCH_X32"
  7. ],
  8. "syscalls": [
  9. {
  10. "names": [
  11. "accept4",
  12. "epoll_wait",
  13. "pselect6",
  14. "futex",
  15. "madvise",
  16. "epoll_ctl",
  17. "getsockname",
  18. "setsockopt",
  19. "vfork",
  20. "mmap",
  21. "read",
  22. "write",
  23. "close",
  24. "arch_prctl",
  25. "sched_getaffinity",
  26. "munmap",
  27. "brk",
  28. "rt_sigaction",
  29. "rt_sigprocmask",
  30. "sigaltstack",
  31. "gettid",
  32. "clone",
  33. "bind",
  34. "socket",
  35. "openat",
  36. "readlinkat",
  37. "exit_group",
  38. "epoll_create1",
  39. "listen",
  40. "rt_sigreturn",
  41. "sched_yield",
  42. "clock_gettime",
  43. "connect",
  44. "dup2",
  45. "epoll_pwait",
  46. "execve",
  47. "exit",
  48. "fcntl",
  49. "getpid",
  50. "getuid",
  51. "ioctl",
  52. "mprotect",
  53. "nanosleep",
  54. "open",
  55. "poll",
  56. "recvfrom",
  57. "sendto",
  58. "set_tid_address",
  59. "setitimer",
  60. "writev"
  61. ],
  62. "action": "SCMP_ACT_ALLOW"
  63. }
  64. ]
  65. }

seccomp概要

(7)使用容器运行时默认的 Seccomp 配置文件创建 Pod 

了解: '默认的 seccomp' 配置文件应该为'大多数工作负载'提供足够的权限

模板文件

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: audit-pod
  5. labels:
  6. app: audit-pod
  7. spec:
  8. securityContext:
  9. seccompProfile:
  10. type: RuntimeDefault '注意:与第一个demo的区别就在这个地方的书写上'
  11. containers:
  12. - name: test-container
  13. image: hashicorp/http-echo:0.2.3
  14. args:
  15. - "-text=just made some syscalls!"
  16. securityContext:
  17. allowPrivilegeEscalation: false

四    有效动作值的分析

在seccomp profile规则中,可定义以下'6种'行为对'进程的系统调用'行为'做出响应'

其他参考

五    有demo参考

参考1

参考2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/461363
推荐阅读
相关标签
  

闽ICP备14008679号