前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >docker 安全

docker 安全

作者头像
charlieroro
发布2020-03-24 15:05:06
9990
发布2020-03-24 15:05:06
举报
文章被收录于专栏:charlierorocharlieroro

由于容器运行在主机上,且与主机共用一套内核,因此在容器的安全使用上会涉及到容器本身以及主机的安全加固,如针对系统调用,系统资源,远程访问等都需要进行安全方面的考量。

docker官网给出了简单的一些建议,如使用命名空间进行用户隔离,使用cgroup限制容器使用的资源上限,使用apparmor限制容器对资源的访问以及使用seccomp限制容器的系统调用等。但官方文档描述的场景比较简单,更多场景可以参考Dosec整理的Docker容器安全最佳实践白皮书V1.0,也可以微信关注公众号"Dosec"查看更多容器安全相关的文章。

下面简单了解下内核安全组件seccomp和apparmor

seccomp:

seccomp主要用于限制容器程序可以使用的系统调用,可以使用如下方式查看当前系统是否支持seccomp

代码语言:javascript
复制
#  grep CONFIG_SECCOMP= /boot/config-$(uname -r)
CONFIG_SECCOMP=y

seccomp使用profile 白名单机制来配置容器程序的权限,在运行容器时会使用默认配置,当然也可以使用--security-opt选项来覆盖默认的配置。seccomp默认情况下会block大约44个系统调用。使用docker info可以看到如下信息,默认会启动seccomp且使用默认profile

代码语言:javascript
复制
Security Options:
 seccomp
  Profile: default

下面为使用自定义profile文件testprofile.json替换默认profile的操作

代码语言:javascript
复制
# docker run -itd --security-opt seccomp=testprofile.json  busybox:latest /bin/sh

在docker的go源码中定义了seccomp支持的平台以及action和operation,源码总对seccomp的结构体定义如下,包含默认动作,使用的平台集以及系统调用集

代码语言:javascript
复制
// LinuxSeccomp represents syscall restrictions
type LinuxSeccomp struct {
    DefaultAction LinuxSeccompAction `json:"defaultAction"`
    Architectures []Arch             `json:"architectures,omitempty"`
    Syscalls      []LinuxSyscall     `json:"syscalls,omitempty"`
}

系统调用中包含系统调用的名称,动作和参数等

代码语言:javascript
复制
// LinuxSyscall is used to match a syscall in Seccomp
type LinuxSyscall struct {
    Names  []string           `json:"names"`
    Action LinuxSeccompAction `json:"action"`
    Args   []LinuxSeccompArg  `json:"args,omitempty"`
}

支持如下平台架构

代码语言:javascript
复制
const (
    ArchX86         Arch = "SCMP_ARCH_X86"
    ArchX86_64      Arch = "SCMP_ARCH_X86_64"
    ArchX32         Arch = "SCMP_ARCH_X32"
    ArchARM         Arch = "SCMP_ARCH_ARM"
    ArchAARCH64     Arch = "SCMP_ARCH_AARCH64"
    ArchMIPS        Arch = "SCMP_ARCH_MIPS"
    ArchMIPS64      Arch = "SCMP_ARCH_MIPS64"
    ArchMIPS64N32   Arch = "SCMP_ARCH_MIPS64N32"
    ArchMIPSEL      Arch = "SCMP_ARCH_MIPSEL"
    ArchMIPSEL64    Arch = "SCMP_ARCH_MIPSEL64"
    ArchMIPSEL64N32 Arch = "SCMP_ARCH_MIPSEL64N32"
    ArchPPC         Arch = "SCMP_ARCH_PPC"
    ArchPPC64       Arch = "SCMP_ARCH_PPC64"
    ArchPPC64LE     Arch = "SCMP_ARCH_PPC64LE"
    ArchS390        Arch = "SCMP_ARCH_S390"
    ArchS390X       Arch = "SCMP_ARCH_S390X"
    ArchPARISC      Arch = "SCMP_ARCH_PARISC"
    ArchPARISC64    Arch = "SCMP_ARCH_PARISC64"
)

下面的常量定义可以参见linux系统调用seccomp_rule_add

代码语言:javascript
复制
// Define actions for Seccomp rules
const (
    ActKill  LinuxSeccompAction = "SCMP_ACT_KILL"
    ActTrap  LinuxSeccompAction = "SCMP_ACT_TRAP"
    ActErrno LinuxSeccompAction = "SCMP_ACT_ERRNO"
    ActTrace LinuxSeccompAction = "SCMP_ACT_TRACE"
    ActAllow LinuxSeccompAction = "SCMP_ACT_ALLOW"
)
...

// Define operators for syscall arguments in Seccomp
const (
    OpNotEqual     LinuxSeccompOperator = "SCMP_CMP_NE"
    OpLessThan     LinuxSeccompOperator = "SCMP_CMP_LT"
    OpLessEqual    LinuxSeccompOperator = "SCMP_CMP_LE"
    OpEqualTo      LinuxSeccompOperator = "SCMP_CMP_EQ"
    OpGreaterEqual LinuxSeccompOperator = "SCMP_CMP_GE"
    OpGreaterThan  LinuxSeccompOperator = "SCMP_CMP_GT"
    OpMaskedEqual  LinuxSeccompOperator = "SCMP_CMP_MASKED_EQ"
)

apparmor:

apparmor使用上与seccomp类似,也是需要一个profile。apparmor也有一个默认的profile,相比seccomp,apparmor可以限制更多的资源,如文件权限,网络,capabilities等。

ubuntu下多个版本的apparmor手册可以参见AppArmor

SELinux:

TIPS:

  • 在run一个容器的时候,通过--security-opt seccomp:unconfined参数来允许容器执行全部的系统的调用
  • centos使用的安全模块为SELinux,暂不支持apparmor;Debian和Ubuntu支持apparmor
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-02-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档