# 官方提供@yunTaoScripts 系统设置 Seccomp 🔥🔥

loading

seccomp(全称secure computing mode 安全计算模式) 是linux kernel从2.6.23版本开始所支持的一种安全机制。 在Linux系统里,大量的系统调用(systemcall)直接暴露给用户态程序。但是,并不是所有的系统调用都被需要,而且不安全的 代码滥用系统调用会对系统造成安全威胁。通过seccomp,我们限制程序使用某些系统调用,这样可以减少系统的暴露面,使程序进入一种“安全”的状态。

  • 检查内核是否支持
root@vms150:/etc/apparmor.d# cat /boot/config-4.15.0-112-generic | grep -i seccomp=
CONFIG_SECCOMP=y
  • 查看系统调用
root@vms34:~# strace -fqc ping www.baidu.com

# 规则说明

  • SCMP_ACT_ERRNO:
    • 当进程进行对应的系统调用时,系统调用失败,进程会接收到errno返回值
  • SCMP_ACT_TRACE:
    • 当进程进行对应的系统调用时,进程会被跟踪
  • SCMP_ACT_ALLOW:
    • 允许进程进行对应的系统调用行为
  • SCMP_ACT_LOG:
    • 记录所有信息

# docker seccomp 规则

docker 对创建出来的容器做了一些限制,并不是所有syscall都能用。

# 创建profile 规则

  • 默认策略
root@vms150:~# docker run -dit --name=web1 nginx
be342cb4db1a17148e0c7072fed41418908ebf95e260d663492a2a64d13cedef

直接运行相当于加载了默认seccomp规则

root@vms150:~# docker run -dit --name=web4 --security-opt seccomp=./default.json nginx
6009ca348b3ed5ebef8dae6fa242f0a7fb4381115e5346963389df0947eacf79

docker 中默认 seccomp 规则写法 (opens new window)

root@vms150:~# cat default.json | grep -i scmp_act -A3 
	"defaultAction": "SCMP_ACT_ERRNO",
	"defaultErrnoRet": 1,
	"archMap": [
		{
--
			"action": "SCMP_ACT_ALLOW"
		},
		{
			"names": [
--
			"action": "SCMP_ACT_ALLOW",�
  • 全部拒绝
root@vms150:~# cat deny.json 
{
	"defaultAction": "SCMP_ACT_ERRNO"
}
root@vms150:~# docker run -dit --name=web2 --security-opt seccomp=./deny.json nginx
c92a4fac4313e9eded46b3c8a1c80044190644413c26bbfdcab74a5211e313c5
docker: Error response from daemon: cannot start a stopped process: unknown.
  • 全部允许
root@vms150:~# docker run -dit --name=web3 --security-opt seccomp=./allow.json nginx
f2c4a27502afe006ef41f2e79b0a6f5e7b07b689c9e26b900b431b3219b8523d
root@vms150:~# cat allow.json 
{
	"defaultAction": "SCMP_ACT_ALLOW"
}

# Sysdig 查看容器系统调用

想创建profile 规则,但是不知道容器使用了哪些系统调用,命令行可以用 strace查看系统调用, 容器就用sysdig 查看。

# 安装sysdig

curl -s https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public | sudo apt-key add - 
curl -s -o /etc/apt/sources.list.d/draios.list https://s3.amazonaws.com/download.draios.com/stable/deb/draios.list
apt-get update
apt-get -y install linux-headers-$(uname -r) 
apt-get -y install sysdig

# 非集群下使用sysdig

root@vms150:~# sysdig -p "*%evt.time,%proc.name,%evt.type" container.id=fa4a857aeb0e > p1.log
root@vms150:~# docker restart p1
p1
root@vms150:~# docker restart p1
p1
root@vms150:~# tail -f p1.log 
09:09:01.764064293,nginx,epoll_ctl
09:09:01.764065094,nginx,epoll_ctl

可以基于统计到的 系统调用信息来编写profile 文件。比较麻烦,需要反复测试。

sysdig -p "*%evt.time,%proc.name,%evt.type" container.id=5c9431eb8723
sysdig -l ## 查看命令

sysdig 常用参数

evt.num: 递增的事件号
evt.time: 事件发生的时间
evt.cpu: 事件被捕获时所在的 CPU,也就是系统调用是在哪个 CPU 执行的。比较上面的例子中,值 0 代表机器的第一个 CPU proc.name: 生成事件的进程名字,也就是哪个进程在运行
thread.tid: 线程的 id,如果是单线程的程序,这也是进程的 pid
evt.dir: 事件的方向(direction)> 代表进入事件,< 代表退出事件
evt.type: 事件的名称,比如 open、stat等,一般是系统调用
evt.args: 事件的参数。如果是系统调用,这些对应着系统调用的参数

# 集群下使用sysdig

(opens new window)

  • 创建默认 profile 文件
mkdir -p /var/lib/kubelet/seccomp
cd /var/lib/kubelet/seccomp
cat audit.json
{
    "defaultAction": "SCMP_ACT_LOG"
}
cat violation.json
{
    "defaultAction": "SCMP_ACT_ERRNO"
}
  • 创建pod 并引用seccomp 规则
root@vms33:~# cat audit-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: audit-pod
  labels:
    app: audit-pod
spec:
  securityContext:
    seccompProfile:
      type: Localhost
      localhostProfile: audit.json     ## 默认路径/var/lib/kubelet/seccomp
  containers:
  - name: test-container
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=just made some syscalls!"
    securityContext:
      allowPrivilegeEscalation: false
  • sysdig 查看pod系统调用
root@vms33:~# nerdctl ps | grep audit
17fc9494804f    docker.io/hashicorp/http-echo:0.2.3 "/http-echo -text=ju…"    6 minutes ago  Up k8s://admission/audit-pod/test-container  
root@vms33:~# sysdig -p "*%evt.time,%proc.name,%evt.type" container.id=17fc9494804f
最后修改时间: 12/31/2022, 12:00:03 PM