注:本文翻譯自Docker Security – part 2中關于Seccomp的部分.請查看原文來獲取更詳細的信息.
如果你用的是Ubuntu 14.04,并且是采用編譯的方式來使用Docker,那么在你docker run一個容器時,你肯定會遇到這樣一個錯誤:
**docker: Error response from daemon: Cannot start container daaa7a0c0b2c916019a68bbbdcc77e44a5b0a56478dc5c310665a00226923035: [9] System error: seccomp: config provided but seccomp not supported.
**
這個錯誤中提到了不支持seccomp.
那到底什么是seccomp呢?
Seccomp是Secure computing mode的縮寫,它是Linux內核提供的一個操作,用于限制一個進程可以執行的系統調用.當然,我們需要有一個配置文件來指明進程到底可以執行哪些系統調用,不可以執行哪些系統調用.
在Docker中,它使用Seccomp來限制一個容器可以執行的系統調用.在Ubuntu14.04系統中,default Docker binary還不支持Seccomp.因此,我們要想使用Seccomp,就得使用static Docker binary來安裝Docker.在Ubuntu 14.x以后的版本中,default Docker binary中就默認支持Seccomp了.
默認情況下,Seccomp會禁止容器執行64位Linux系統的313個系統調用的44個.我找不到這個Seccomp的默認配置文件在哪.可能是寫在了源碼中.
我們下面來描述如何使用Seccomp.
首先,創建一個配置文件:/home/smakam14/seccomp/profile.json,其內容為:
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"name": "chmod",
"action": "SCMP_ACT_ERRNO"
}
]
}
在上面的這個配置文件中,默認情況下,我們允許容器執行全部的系統調用.但是,禁止它執行chmod這個系統調用.
然后,我們用這個Seccomp配置文件來啟動一個Docker容器:
docker run --rm -it --security-opt seccomp:/home/smakam14/seccomp/profile.json busybox chmod 400 /etc/hosts
結果如下:
chmod: /etc/hosts: Operation not permitted
我們使用docker inspect來查看容器的詳細信息.會看到如下輸出:
"SecurityOpt": [
"seccomp:
{"defaultAction":"SCMP_ACT_ALLOW",
"syscalls":[{"name":"chmod","action":"SCMP_ACT_ERRNO"}]}"
],
我們也可以在run一個容器的時候,通過--security-opt seccomp:unconfined參數來允許容器執行全部的系統的調用:
docker run --rm -it --security-opt seccomp:unconfined busybox chmod 400 /etc/hosts