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

这篇具有很好参考价值的文章主要介绍了Docker(八)---Docker安全相关设定。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、理解docker安全

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

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

可以看到docker提供了6种命名空间:
docker白名单,docker,docker,安全,linux

命名空间隔离的安全

  • 当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 &
docker白名单,docker,docker,安全,linux
docker白名单,docker,docker,安全,linux

容器会直接调用cgroup
docker白名单,docker,docker,安全,linux

2.cpu优先级

不限制时为%100
docker白名单,docker,docker,安全,linux
测试时只保留一个cpu核心可用,只有争抢cpu资源时优先级才会生效
[root@server1 cpu1]# pwd
/sys/devices/system/cpu/cpu1
[root@server1 cpu1]# echo 0 > online
docker白名单,docker,docker,安全,linux

3.内存资源限制

(1)一般内存资源控制

[root@server7 cpu1]# docker run -d --name demo --memory 200M --memory-swap=200M nginx
docker白名单,docker,docker,安全,linux
[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
docker白名单,docker,docker,安全,linux
[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
docker白名单,docker,docker,安全,linux
用以下设置即可

[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)
docker白名单,docker,docker,安全,linux
可以看到我们设置每秒30M,100M用了3S左右。当我们不加限制时如下图:
docker白名单,docker,docker,安全,linux

三、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 的工作原理架构图:
docker白名单,docker,docker,安全,linux
以上转载作者hantmac:https://juejin.cn/post/6847902216511356936

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

[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

启动并打入后台:
docker白名单,docker,docker,安全,linux
通过命令将宿主机的lxcfs的proc下文件挂接到容器中:
docker白名单,docker,docker,安全,linux

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

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

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

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

五、安全加固的思路

保证镜像的安全

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

保证容器的安全文章来源地址https://www.toymoban.com/news/detail-768635.html

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

到了这里,关于Docker(八)---Docker安全相关设定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Selenium技术在CentOS6.8系统的腾讯云服务器上的docker镜像的Ubuntu容器里的相关使用(Linux环境下)

    一开始看标题,我知道你们会很懵,我当初完成的时候,我自己也很懵,主要是想在Linux环境下使用Selenium技术来完成一些工作,本来打算用docker创建一个Anaconda的容器来用Selenium技术的,但发现无法通过chrome驱动来驱动谷歌浏览器,所以我又用docker创建了一个Ubuntu容器来使用

    2024年02月03日
    浏览(103)
  • Linux开启Docker远程访问并设置安全访问(证书密钥),附一份小白一键设置脚本哦!

    前言 喜欢折腾慢慢看,不喜欢折腾直接跳到小简下文的一键脚本那里,两分钟搞好。 我的博客:https://blog.ideaopen.cn 我的公众号:小简聊开发 开启远程访问 编辑 docker.service 文件 找到 Service 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375 这样相当于对外开放的是 2375 端口,

    2024年02月02日
    浏览(50)
  • 【Docker】Docker相关基础命令

    目录 一、Docker服务相关命令 1、启动docker服务 2、停止docker服务 3、重启docker服务 4、查看docker服务状态 5、开机自启动docker服务 二、Images镜像相关命令 1、查看镜像 2、拉取镜像 3、搜索镜像 4、删除镜像 三、Container容器相关命令 1、创建容器 2、查看容器 3、启动容器 4、删除

    2024年02月15日
    浏览(39)
  • 『 云原生·Docker』Docker容器相关操作(二)

    本系列主要分为以下六大部分,正在更新中,尽请期待! 『 云原生·生之门』 『 云原生·前置知识』 『 云原生·Docker』 『 云原生·Kubernetes』 『 云原生·KubeSphere』 『 云原生·DevOps』 🚩点击关注本专栏 提示:已经更新的或正在更新的文章前面打勾了哈! 容器是 Docker的另一个

    2024年02月06日
    浏览(47)
  • Docker 相关操作,及其一键安装Docker脚本

    创建一个CentOS 7.5的虚拟机或使用其他方式准备一个CentOS 7.5的环境。 在CentOS 7.5上执行以下命令,以安装Docker的依赖项: 添加Docker的官方仓库: 安装Docker CE(社区版): 启动Docker服务: 设置Docker服务开机自启动: 验证Docker安装是否成功,运行以下命令检查Docker版本: 如果安

    2024年02月10日
    浏览(34)
  • Docker 相关命令

    1.1 卸载(可选) 如果之前安装过旧版本的Docker,可以使用下面命令卸载: 1.2 安装 docker 1.2.1 如果没有 yum,先安装 yum 工具 1.2.2 更新本地镜像源 设置docker镜像源 然后输入命令: ** 1.3 启动 docker ** docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家

    2024年02月02日
    浏览(37)
  • docker相关命令

    systemctl restart docker systemctl status docker systemctl enable docker docker info docker --help docker 具体命令 --help docker images REPOSITORY(镜像的仓库源) TAG(镜像的标签版本号) IMAGE ID(镜像ID) CREATED(镜像创建时间) SIZE(镜像大小) 同一个仓库源可以有多个TAG版本,代表这个仓库员的不同个版本,使用

    2024年02月09日
    浏览(48)
  • docker 部署网页相关服务

    1.拉取镜像 docker pull netresearch/sftp 2.启动后容器: docker run --name Sftp -v E:wwwrootjulongfsnfiles:/home/sftpuser/upload --privileged=true -p 22:22 -d netresearch/sftp sftpuser:123456:::upload 1.拉取镜像 docker pull fauria/vsftpd 2.启动后容器: docker run -d -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -v E:wwwrootjulongfsnfil

    2024年02月16日
    浏览(32)
  • Docker相关知识

    一、docker镜像,容器的区别 镜像和容器就像编程里面的类和实例的关系,镜像是静态的,容器是动态的,也即是运行起来的 二、docker镜像制作 首先为啥要自己制作,网上不是有很多docker镜像吗? 不适合或者感觉不安全 a、制作流程         1)创建工作目录,后面所有的工

    2024年01月19日
    浏览(32)
  • Docker相关的概念

    人不走空                                                                          目录         🌈个人主页:人不走空       💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 1.1 虚拟机和容器 1.2 容器、镜像和Docker 1.3 Docker 和 k8s 作者其他作品:  

    2024年02月20日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包