Docker小记-安全隔离

Docker资源分配

内存限制

  • docker run或docker create命令上使用-m或–memory选项来设置内存限制
  • 这个选项会接受一个值和一个基础单元作为参数。格式如下:
    where unit = b,k,m or g
    在这个命令中,b表示字节,k表示千字节,m表示兆字节,g表示千兆字节。
docker run -d --name mydb \
--m 256m \
--cpu-shares 1024 \
--user nobody \
--cap-drop all \
dockerfile/mariadb
  • 内存限制并不是内存保留,并不是它保证具体大小的内存是可用的,而是会防止容器使用超出具体大小的内存资源

CPU限制

–cpu-shares
  • –cpu-shares指定容器使用cup资源的相对权重,选项值为一个整数
  • Linux使用这个权重来决定该容器应该占用的CPU时间百分比。这个百分比是相对于所有对容器可用的处理器的CPU周期的总和来计算的。
  • CPU时间少的后果不是失败,而是性能降低
    -只有在CPU时间上存在竞争时,它才会被强制执行。如果其他的进程和容器处于空闲中,那么被限制的容器可能会超出CPU资源限制
  • 当其他进程需要CPU时,被限制的进程会让出CPU
  • 默认配置不会限制容器,因此容器能够使用100%的CPU。
–cpuset-cpus
  • 使用 docker run或docker create命令的–cpuset-cpus选项来限制容器只能在某一指定的CPU核集合中执行。值的格式可以是列表或者范围:
    • 0,1,2 —— 一个列表包含了CPU的前三个核
    • 0-2 —— 一个范围包含了CPU的前三个核
  • 上下文切换就是从执行一个进程切换到执行另一个进程的任务。这个操作十分昂贵,因此可能对你系统的性能产生显著的影响。确保某些重要的进程不会在同一个CPU核集合中执行能够减少上下文的切换

设备的访问权

  • 使用–device选项来指定一个设备的集合,这些设备会被挂载进新容器中。
// 将在/dev/video0位置的网络摄像头映射到新容器的同一个位置上
docker -it --rm \
--device /dev/viede0:/dev/video0 \
ubuntu:latest ls -al /dev

–device选项的值必须是主机操作系统上的设备文件到新容器中位置的映射

  • 设备的访问并不是一种限制,更像是一种资源认证控制

跨容器的进程间通信

  • IPC(跨进程通信)
  • Docker 为每一个容器创建了一个独立且唯一的 IPC 命名空间
  • IPC命名空间的作用就是防止一个容器中的进程访问主机或者其他容器的内存
  • –ipc选项,创建的新容器的IPC命名空间和另外一个目标容器是一样的
    • 想要在不同容器中使用共享内存进行通信,需要使用–ipc选项来连接它们的IPC命名空间。
  • 开放内存容器:通过指定–ipc选项的值为host可以和主机运行在同一个命名空间中,实现和运行在主机上的进程进行通信

Linux用户命名空间

  • Linux用户(USR)命名空间,允许一
    一个命名空间中的用户被映射到另一个命名空间的用户上
  • Docker还没有集成USR命名空间。这意味着,如果一个容器的用户ID(数字,不是名字)和主机上的一个用户一样,那么该容器中的用户和主机上的用户拥有相同的主机文件权限
  • 容器中的文件系统的改动只会保留在容器的文件系统中,不会影响到主机。但是,这能够影响到卷(volume)。
  • 当Docker采用了USR命名空间,能够将主机上的用户ID映射到容器命名空间的用户ID上。
  • 如果一个用户能够控制你的Docker后台进程,那么这个用户也能够控制你系统上的root用户。

设置用户

  • -u或–user选项来设置这个run-as用户,支持用户和用户组的名字或ID.下面这个命令将run-as用户设置为nobody:
docker run--rm --user nobody:defult busybox:latest id
  • 如果你设置了run-as用户,那么你就能够完全避免默认用户带来的问题。注意,指定的用户名必须在你使用的镜像中存在
    • 使用以下命令来获得镜像中的可用用户的列表:
docker run -rm busybox:latest awk -F:‘$0=$1'/etc/passwd
- Linux的用户数据库就存储在/etc/passwd文件中。这个命令会读取这个文件,并且获取其中的用户名列表。一旦你找到了你想要使用的用户,你就能够使用这个用户作为run-as用户来启动容器了
  • 设置的用户和用户组都不存在于容器中时,ID不会被解析成用户或者用户组名字,但是所有的文件权限会以该用户和用户组存在的情况来进行工作

查看当前用户

  • docker inspect子命令能够显示出一个容器的元数据
  • 以下命令,如果显示结果空白,那么容器会默认使用root用户来启动。如果结果不为空,要么镜像作者指定了一个默认的run-as用户,
    要么就是当你创建这个容器时,你指定了run-as用户
docker inspect --format "{{.Config.User}}" docker_name
  • docker inspect 返回的元数据仅仅是容器启动时的配置。因此,如果用户被脚本改变了,改动的结果并不会反馈到docker inspect命令的输出上
  • 以下两个命令能够获得镜像默认用户的信息,这两个脚本都很谨慎地重置了容器的entrypoint,这确保了命令中跟随在镜像名字后的命令能够被容器执行
// 输出结果:root
docker run --rm --entrypoint "" busybox:latest whoami
// 输出结果:uid=0,git=0,groups=10
docker run --rm --entrypoint "" busybox:latest id

用户和卷

  • 卷(volume)中的文件的文件权限在容器中也是有效的。但这也意味着用户ID空间被共享了。主机上的root用户和容器中
    的root用户的ID都是0。因此,尽管容器中ID为65534的nobody用户不能够访问主机上root用户创建的文件,但是容器中的root用户可以。
  • 除非想要主机的文件能够被容器访问,否则不要将文件以卷的形式挂载到容器上。
  • 如果一个进程运行在1001用户下,并且它将日志文件写入到卷中,而另外一个容器中的进程想要以1002用户去访问这个文件,那么文件权限会阻止这个操作。

创建更健壮的容器

能力——操作系统功能的授权

  • 当创建了一个新容器,在默认情况下,Docker删减了一部分的能力。这么做是为了更进一步地将正在运行的进程和操作系统的管理功能隔离开来。
  • 可以通过使用docker create或docker run上的–cap-drop选项来为容器去除能力。
  • –cap-add 选项能够增添能力

运行特权容器

  • 当你需要在容器中运行系统管理任务时,你可以授予这些容器访问你计算机的特权
  • 特权容器维持它们自己的文件系统和网络隔离,但却拥有对设备和共享内存的全部访问权,还具备全部的系统能力
  • 使用docker run或docker create命令的–privileged选项来开启这种模式

指定额外的安全选项

  • 可以使用强制访问控制(MAC——定义访问规则的系统)来取代标准的Linux自主访问控制(文件所有者定义访问规则)。
  • 通过docker run或docker create命令上的–security-opt选项来设置这些内容

微调LXC

  • LXC是一个比libcontainer更加成熟的库,且提供了很多与Docker目标背道而驰的额外特性。如果你可以并且想要使用LXC,你可以改变容器供应商,并且利用这些额外的特性
  • 为了使用LXC,你需要安装它,并且确保Docker后台进程程序启动时,LXC驱动被允许。当启动Docker后台进程时,使用-
    -exec-driver=lxc来使用LXC
  • 一旦Docker被配置为LXC,你可以使用docker run或docker create命令的–lxc-conf选项来设置LXC的配置

相关链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值