# 官方提供@yunTaoScripts 系统设置 Seccomp 🔥🔥
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
- 创建默认 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
← 快速链接