Docker(八)---Docker安全相关设定


一、理解docker安全

Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:

  • Linux内核的命名空间机制提供的容器隔离安全
  • Linux控制组机制对容器资源的控制能力安全。
  • Linux内核的能力机制所带来的操作权限安全
  • Docker程序(特别是服务端)本身的抗攻击性。
  • 其他安全增强机制对容器安全性的影响。

可以看到docker提供了6种命名空间:
在这里插入图片描述

命名空间隔离的安全

  • 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。
  • 在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:时间。
  • 容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
  • 与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。
  • 命名空间提供了最基础也最直接的隔离。

控制组资源控制的安全

  • 当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
  • Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源。
  • 确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击(DDoS)方面必不可少。

内核能力机制

  • 能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。
  • 大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。
  • 默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。

Docker服务端防护

  • 使用Docker容器的核心是Docker服务端,确保只有可信的用户才能访问到Docker服务。
  • 将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全问题。
  • 允许Docker 服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。这些子进程只允许在特定范围内进行操作。

其他安全特性

  • 在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安全检查;并且通过地址随机化机制来避免恶意探测等。启用该特性不需要Docker进行任何配置。
  • 使用一些有增强安全特性的容器模板。
  • 用户可以自定义更加严格的访问控制机制来定制安全策略。
  • 在文件系统挂载到容器内部时,可以通过配置只读模式来避免容器内的应用通过文件系统破坏外部环境,特别是一些系统运行状态相关的目录。

二、cgroup:容器资源控制

Linux Cgroups 的全称是 Linux Control Group

  • 是Linux内核的一个功能,限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
  • 对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。

Linux Cgroups 给用户暴露出来的操作接口是文件系统。

  • 它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。
  • 执行此命令查看:mount -t cgroup

所有容器资源限制的相关信息都在 /sys/fs/cgroup/memory/docker 此目录下,如果我们建立容器时不设置,那么docker内容器的目录内的文件都继承于/sys/fs/cgroup/memory/docker 内的其他文件

1.cpu资源限制

[root@server1 cpu]# docker run -it --rm --cpu-period 100000 --cpu-quota 20000 ubuntu
root@433a1612a171:/# dd if=/dev/zero of=/dev/null &
在这里插入图片描述
在这里插入图片描述

容器会直接调用cgroup
在这里插入图片描述

2.cpu优先级

不限制时为%100
在这里插入图片描述
测试时只保留一个cpu核心可用,只有争抢cpu资源时优先级才会生效
[root@server1 cpu1]# pwd
/sys/devices/system/cpu/cpu1
[root@server1 cpu1]# echo 0 > online
在这里插入图片描述

3.内存资源限制

(1)一般内存资源控制

[root@server7 cpu1]# docker run -d --name demo --memory 200M --memory-swap=200M nginx
在这里插入图片描述
[root@server1 memory]# pwd
/sys/fs/cgroup/memory
[root@server1 memory]# mkdir x1
[root@server1 memory]# cd x1/
[root@server1 x1]# echo 209715200 > memory.limit_in_bytes
在这里插入图片描述
[root@server1 x1]# yum install -y libcgroup-tools.x86_64
[root@server1 x1]# cd /dev/shm/
[root@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300
[root@server1 shm]# free -m
total used free shared buff/cache available
Mem: 1980 187 1080 206 712 1389
Swap: 2047 103 1944
多出的100m会写入swap
在这里插入图片描述
用以下设置即可

[root@server7 shm]# cd /sys/fs/cgroup/memory/x1/
[root@server7 x1]# echo 209715200 > memory.memsw.limit_in_bytes
[root@server7 x1]# cd -
/dev/shm
[root@server7 shm]# cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300
Killed

(2)控制用户内存

控制用户内存如下操作

[root@server7 shm]# useradd gong
[root@server7 shm]# vim /etc/cgrules.conf
gong     memory  x1/

[root@server7 shm]# systemctl  start cgred.service
[root@server7 shm]# su - gong
[gong@server7 ~]$ cd /dev/shm/
[gong@server7 shm]$ dd if=/dev/zero of=bigfile bs=1M count=200
Killed

4.磁盘io限制

[root@server7 ~]# docker run -it --rm --device-write-bps /dev/sda:30MB ubuntu
root@3226b0fc6231:/# dd if=/dev/zero of=bigfile bs=1M count=100 oflag=direct
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 3.31722 s, 31.6 MB/s

–device-write-bps限制写设备的bps,即每秒的吞吐量
目前的block IO限制只对direct IO有效。(不使用文件缓存)

此处的设置只能走直连IO,所以我们用有dd命令的镜像(由于我们在虚拟机上运行容器,所以要用/dev/sda)
在这里插入图片描述
可以看到我们设置每秒30M,100M用了3S左右。当我们不加限制时如下图:
在这里插入图片描述

三、docker安全加固(lxcfs隔离)

xcfs 是一个开源的 FUSE(用户态文件系统)实现来支持 LXC 容器,它也可以支持 Docker 容器。让容器内的应用在读取内存和 CPU 信息的时候通过 lxcfs 的映射,转到自己的通过对 cgroup 中容器相关定义信息读取的虚拟数据上。

什么是资源视图隔离?

  • 容器技术提供了不同于传统虚拟机技术的环境隔离方式。通常的 Linux 容器对容器打包和启动进行了加速,但也降低了容器的隔离强度。其中 Linux 容器最为知名的问题就是资源视图隔离问题。
  • 容器可以通过 cgroup 的方式对资源的使用情况进行限制,包括: 内存,CPU 等。但是需要注意的是,如果容器内的一个进程使用一些常用的监控命令,如: free, top 等命令其实看到还是物理机的数据,而非容器的数据。这是由于容器并没有做到对 /proc, /sys 等文件系统的资源视图隔离

为什么要做容器的资源视图隔离?

  • 从容器的视角来看,通常有一些业务开发者已经习惯了在传统的物理机,虚拟机上使用 top, free 等命令来查看系统的资源使用情况,但是容器没有做到资源视图隔离,那么在容器里面看到的数据还是物理机的数据
  • 从应用程序的视角来看,在容器里面运行进程和在物理机虚拟机上运行进程的运行环境是不同的。并且有些应用在容器里面运行进程会存在一些安全隐患:

lxcfs 横空出世就是为了解决这个问题。
lxcfs 是通过文件挂载的方式,把 cgroup 中关于系统的相关信息读取出来,通过 docker 的 volume 挂载给容器内部的 proc 系统。 然后让 docker 内的应用读取 proc 中信息的时候以为就是读取的宿主机的真实的 proc。
lxcfs 的工作原理架构图:
在这里插入图片描述
以上转载作者hantmac:https://juejin.cn/post/6847902216511356936

之前我们没有办法做到完全隔离是因为/proc 中的资源,容器和宿主机之间是共享的,所以没有做隔离。我们通过一个第三方程序,可以做到隔离的效果(从阿里云下载即可):
在这里插入图片描述

[root@server7 ~]# yum install lxcfs-2.0.5-3.el7.centos.x86_64.rpm
[root@server7 ~]# lxcfs /var/lib/lxcfs &

启动一个容器,用lxcfs的/proc文件映射到容器中的 /proc文件,容器内存设置为 256M:
[root@server7 ~]# docker run  -it -m 256m \         
>       -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
>       -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
>       -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
>       -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
>       -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
>       -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
>       ubuntu
root@45edbc92cc1d:/# free -m  #可以看到容器本身的内存被正确获取到了,对于内存的资源视图隔离是成功的
                total         used      free      shared  buff/cache   available
Mem:             256           3         255        9           0         255
Swap:            256           0         256

启动并打入后台:
在这里插入图片描述
通过命令将宿主机的lxcfs的proc下文件挂接到容器中:
在这里插入图片描述

四、容器特权(白名单方式实现)

  • 设置特权级运行的容器:–privileged=true
  • 有的时候我们需要容器具备更多的权限,比如操作内核模块,控制swap交换分区,挂载USB磁盘,修改MAC地址等。

默认容器内的用户是受限的
在这里插入图片描述
开启容器特权
在这里插入图片描述
可以看到没有报错且可以查看磁盘情况。此权限的意思是全开,即容器内用户可以做几乎任何事情,近乎root超户。但是此种方式权力又给的太大了不安全,我们可以给白名单。

设置容器白名单:
–cap-add --privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供给容器必须的权限。此时Docker 提供了权限白名单的机制,使用–cap-add添加必要的权限。
capabilities手册地址: http://man7.org/linux/man-pages/man7/capabilities.7.html
在这里插入图片描述
可以看到给了网络权限就能随意操作网络,但是没有别的权限。

五、安全加固的思路

保证镜像的安全

  • 1.使用安全的基础镜像
  • 2.删除镜像中的setuid和setgid权限
  • 3.启用Docker的内容信任
  • 4.最小安装原则
  • 5.对镜像进行安全漏洞扫描,镜像安全扫描器:Clair
  • 6.容器使用非root用户运行

保证容器的安全

  • 1.对docker宿主机进行安全加固
  • 2.限制容器之间的网络流量
  • 3.配置Docker守护程序的TLS身份验证
  • 4.启用用户命名空间支持(userns-remap)
  • 5.限制容器的内存使用量
  • 6.适当设置容器CPU优先级

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,您想问有关使用Docker运行PHP-FPM的问题,是吗?那我来简单介绍一下。 使用Docker运行PHP-FPM的主要目的是为了方便地进行开发和部署,同时还可以保证应用程序在不同环境中的一致性。下面是一些基本步骤: 1. 首先,您需要安装Docker,可以在官网上下载安装包。 2. 然后,您需要创建一个dockerfile文件,用于构建您的PHP-FPM镜像。示例文件内容如下: ``` FROM php:7.4-fpm-alpine RUN apk --update --no-cache add \ git \ unzip \ libzip-dev \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ && docker-php-ext-install zip pdo_mysql mysqli gd \ && apk del --purge autoconf g++ make \ && rm -rf /var/cache/apk/* WORKDIR /var/www/html CMD ["php-fpm"] ``` 3. 接着,您可以使用以下命令构建您的镜像: ``` docker build -t your-image-name . ``` 4. 然后,您可以使用以下命令运行您的PHP-FPM容器: ``` docker run -d --name your-container-name -p 9000:9000 -v /path/to/your/app:/var/www/html your-image-name ``` 其中: - -d:表示在后台运行容器 - --name:指定容器的名称 - -p:将容器的9000端口映射到主机的9000端口 - -v:将主机上的应用程序目录挂载到容器中的/var/www/html目录中 5. 最后,您可以使用以下命令进入容器并查看PHP-FPM的日志: ``` docker exec -it your-container-name /bin/sh tail -f /usr/local/var/log/php-fpm.log ``` 希望这些信息能帮助到您。如果您还有其他问题,请随时问我。 ### 回答2: Docker是一种开源的容器化平台,可以在不同的操作系统中创建和管理轻量级的容器。php-fpm(PHP FastCGI Process Manager)是PHP中用于处理FastCGI的进程管理器。结合使用Docker和php-fpm可以带来一些好处。 首先,使用Docker和php-fpm可以使PHP应用程序更易于部署和管理。通过在Docker容器中运行php-fpm,可以将应用程序及其所有的依赖项打包到一个容器中,而不需要在不同的环境中进行配置和安装。这使得在不同的服务器上部署应用程序变得更加简单和一致。 其次,使用Docker和php-fpm可以提供更好的资源管理。通过使用php-fpm进程管理器,可以控制和监视PHP进程的数量和资源使用情况。这有助于避免服务器过载和资源浪费,并确保应用程序的性能和稳定性。 此外,使用Docker和php-fpm可以提高开发和测试的效率。在开发环境中,可以使用Docker容器来模拟生产环境,确保应用程序在不同的环境中具有一致的行为。还可以利用Docker容器的快速启动和停止功能,加速开发、测试和部署流程。 最后,使用Docker和php-fpm还可以实现应用程序的可伸缩性。通过通过启动多个具有相同配置的php-fpm容器来处理更多的请求,可以轻松地扩大应用程序的处理能力。这使得应对高流量和负载峰值变得更加容易。 综上所述,通过结合使用Docker和php-fpm,可以简化应用程序的部署和管理、提高资源利用率、加速开发和测试速度,并实现应用程序的可伸缩性。 ### 回答3: Docker是一个开源的应用容器引擎,可以将应用程序与其依赖项打包在一个轻量级的、可移植的容器中。而php-fpm是PHP FastCGI Process Manager的简称,是一种常用的PHP处理器,它能够管理和处理PHP请求。 在使用Docker时,可以通过Docker镜像来运行php-fpm容器,以便于更方便、更快速地搭建和部署PHP应用程序。首先,我们可以根据需要选择适合的php-fpm镜像,并使用Docker命令来创建和启动容器。 在创建容器时,我们可以指定容器运行的端口号、挂载主机目录、设定环境变量等。例如,我们可以将容器的端口号映射到主机的某个端口上,这样就可以通过主机的IP地址和对应端口号来访问容器内运行的PHP应用程序。 另外,我们还可以通过容器之间的网络连接来实现不同容器间的通信。例如,我们可以创建一个Nginx容器来作为反向代理服务器,同时将其与php-fpm容器连接在一起,这样就可以实现客户端与PHP服务器之间的通信。 由于Docker的轻量级特性,可以在一台物理机或虚拟机上运行多个容器,每个容器可以独立运行,互不干扰。这样的模式可以有效地隔离应用程序及其依赖项,减少部署和升级的风险。 总而言之,通过使用Docker来运行php-fpm容器,可以更方便、更快速地部署和管理PHP应用程序,提高开发和运维效率。同时,Docker的轻量级特性和容器间的网络连接,也提供了更灵活和可扩展的部署方案,使整个应用环境更加稳定和可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值