zoukankan      html  css  js  c++  java
  • docker 安全

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

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

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

    seccomp:

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

    #  grep CONFIG_SECCOMP= /boot/config-$(uname -r)
    CONFIG_SECCOMP=y

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

    Security Options:
     seccomp
      Profile: default

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

    # docker run -itd --security-opt seccomp=testprofile.json  busybox:latest /bin/sh

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

    // LinuxSeccomp represents syscall restrictions
    type LinuxSeccomp struct {
        DefaultAction LinuxSeccompAction `json:"defaultAction"`
        Architectures []Arch             `json:"architectures,omitempty"`
        Syscalls      []LinuxSyscall     `json:"syscalls,omitempty"`
    }

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

    // 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"`
    }

    支持如下平台架构

    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

    // 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
  • 相关阅读:
    Seq_file文件系统实例剖析
    linux 网卡接收多播MAC(01:08开头)
    linux-3.14.13 看到mpls gso支持
    /usr/include/sys/types.h:62: error: conflicting types for ‘dev_t’
    gcc编译参数-fPIC的一些问题
    glibc-2.15编译error: linker with -z relro support required
    no CONFIG_BQL
    if_nametoindex可以检查网卡名称是否有效
    剑指offer(10)
    剑指Offer(9)
  • 原文地址:https://www.cnblogs.com/charlieroro/p/10184163.html
Copyright © 2011-2022 走看看