🖌️
Functfan的格物致知
  • 写在前面
  • java技术
    • J2EE 全面简介
  • java安全
    • 反序列化漏洞
      • 序列化/反~
      • Ysoserial
        • Java反序列化之Vaadin1
        • Java反序列化之Groovy1
        • Java反序列化之Jdk7u21
        • Java反序列化之Commons beanUtils
        • Java反序列化之Commons-Collections
          • CommonsCollections1
          • CommonsCollections2
          • CommonsCollections1
          • CommonsCollections2
          • CommonsCollections3
          • CommonsCollections4
          • CommonsCollections5
          • CommonsCollections6
          • CommonsCollections7
      • Marshalsec
    • XXE漏洞
      • XXE爱之初印象
      • XXE漏洞写法及防御
      • XXExploiter工具
  • web安全
    • 一句话木马
  • 渗透测试
    • 网络资产收集
    • 端口服务探测
    • 边界突破
    • 内网穿透
    • 容器与K8S安全测试
  • 漏洞挖掘
    • web类框架研究报告
      • Xstream经验
      • weblogic漏洞研究经验笔记
      • WebLogic安全研究报告
    • 漏洞挖掘入门
      • 小白入门
      • 源代码审计方法
        • Java类编译与反编译基础
        • IDEA使用技巧
        • IDEA Java程序调试
      • Fuzzing技术
        • 方法论
          • fuzzing的四个技能
        • 工具集
          • tmnt-Web应用漏洞fuzzer
          • wfuzz-web app fuzzer
          • AFL-基于变异的fuzz工具
      • 物联网漏洞挖掘技术
        • 物联网设备固件模拟分析环境*(亲测下载好慢,不建议使用该教程)
        • 智能设备漏洞挖掘之固件提取
        • pwndbg调试工具使用教程
    • 漏洞情报监测
    • 漏洞安全检测工具
      • 容器安全检测脚本总结
      • WebLogic漏洞检测小工具
    • 漏洞复现
      • 操作系统
        • windows
        • Linux
          • 脏牛漏洞-Docker逃逸POC(dirtycow-vdso)代码分析
          • Dirty CoW脏牛内核提权漏洞(CVE-2016-5195)
      • 数据库
      • WEB服务组件
        • CVE-2020-2883
        • F5 BIG-IP远程代码执行漏洞(CVE-2020-5902)
        • Apache Solr 远程命令执行漏洞(CVE-2019-0193)
      • 云计算安全
        • CVE-2020-15257-容器逃逸-containerd
      • 物联网安全
        • TP-Link SR20 本地网络远程代码执行漏洞
  • CTF比赛
    • BUUCTF-练习场web
    • xctf-攻防世界新手练习区web
    • Exploit利器——Pwntools
  • 新技术研究
    • 区块链
    • 云原生安全
      • 虚拟化hypervisor简介
      • Docker容器基础
        • 云原生攻防研究:容器基础
          • Linux内核基础
          • Docker容器基础
          • 理解容器进程
          • 组件组成:剖析 Docker 组件作用及其底层工作原理
          • Docker镜像的内部结构(四)
          • docker之namespace,cgroup与unionFS
          • Linux内核安全模块之AppArmor
          • Linux沙箱之seccomp
          • Linux权限管理之Capabilities
        • 云原生攻防研究:Docker安全性与攻击面分析
        • 云原生攻防研究:容器逃逸技术概览
        • 云原生攻防研究:针对容器的渗透测试方法
        • 云原生攻防研究:漏洞缓解技术
      • Kubernetes容器编排基础
        • k8s基本概念
        • 云原生攻防研究:Kubernetes安全分析
        • 云原生攻防研究:Kubernetes攻击矩阵
    • 联邦安全
    • 云边协同
    • 安全多方计算
由 GitBook 提供支持
在本页
  1. 新技术研究
  2. 云原生安全
  3. Docker容器基础
  4. 云原生攻防研究:容器基础

Linux沙箱之seccomp

docker 安全

上一页Linux内核安全模块之AppArmor下一页Linux权限管理之Capabilities

最后更新于3年前

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

docker给出了简单的一些建议,如使用命名空间进行用户隔离,使用cgroup限制容器使用的资源上限,使用apparmor限制容器对资源的访问以及使用seccomp限制容器的系统调用等。但官方文档描述的场景比较简单,更多场景可以参考Dosec整理的,也可以微信关注公众号"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"
)
// 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:

SELinux:

  

TIPS:

  • 在run一个容器的时候,通过--security-opt seccomp:unconfined参数来允许容器执行全部的系统的调用

  • centos使用的安全模块为SELinux,暂不支持apparmor;Debian和Ubuntu支持apparmor

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

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

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

https://www.cnblogs.com/charlieroro/p/10184163.html
官网
Docker容器安全最佳实践白皮书V1.0
默认配置
seccomp_rule_add
profile
AppArmor
复制代码
复制代码
复制代码
复制代码