[docker] docker 安全知识 - docker api, 权限提升 资源管理

news2024/11/15 15:51:15

[docker] docker 安全知识 - docker api, 权限提升 & 资源管理

这是 docker 安全的最后一篇

暴露 docker api

在 [docker] docker 安全知识 - docker 系统性简介 中曾经提到,docker cli 使用 restful api 与客户端和 docker daemon 之间交流。默认情况下,docker cli 和 docker api 通过 unix socket /var/run/docker.sock 进行交流,而 docker 引擎在宿主机器上默认是有 root 权限的

crul docker socket

这是之前 curl 的 socket 的结果

docker engine

docker daemon 是核心的 server,server+rest API + client 加起来是 docker engine

在有些情况下,也会遇到需要将 docker api 使用的 socket 暴露到网络上的情况,如:

  • 当容器在不同的宿主机器上运作

    这个情况下则需要 query 其他宿主机器的 docker 情况以便实施下一步操作,特别是容器之间有依赖关系的情况

  • 集中化容器管理

  • CI/CD

  • 监控&日志

在这种情况,其他人就可以通过暴露出来的 docker api 对容器和镜像进行管理,从而获取对 docker daemon 的操作权限——搭配上 docker 引擎是以 root 权限在宿主机器上运作的这一情况,这就意味着可以调用 docker api 的用户有可能通过暴露 docker api,获取 root 权限。这种漏洞叫 特权提升,后面也会有一个部分会专门讲 特权提升 的常见出发点情况

docker 官方文档是对暴露 socket 有警告的:

在这里插入图片描述

毕竟用户通过访问 socket,就有可能获取当前宿主上的文件夹和文件,这也是之前跑有漏洞的镜像时的截图:

在这里插入图片描述

在这个情况下,用户可以访问到 /var/lib/docker 这个路径——虽然在 mac 和 windows 上,这可能是虚拟机所在的位置。不过如果是 linux 服务器的话,那就是服务器所在的位置——再重复一遍,在 linux 环境下,docker 并不会重新创建一个虚拟机,而是会使用宿主机器上的 kernal,从而提升性能

换言之,用户也可以直接访问到 /var 下的文件与文件夹,并借助 docker api,以 root 权限在 /var 下进行操作

不安全的配置

下面会列举几种将 socket 暴露出来的方式

  • docker cli

    sudo dockerd
        -H unix:///var/run/docker.sock
        -H tcp://192.168.59.106:2375
    

    这是一个临时地暴露端口的方法,无法持久化

    执行完该命令后,任何可以访问 192.168.59.106:2375 就可以访问通过 unix:///var/run/docker.sock 暴露的 dockerd

  • 使用 systemd service

    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://192.168.59.106:2375
    

    这个配置和上面的指令一样,不过将其暴露成了一个 service,因此可以持久化

  • 通过 daemon.json

    {
      "hosts": ["unix:///var/run/docker.sock", "tcp://192.168.59.106:2375"],
      "experimental": true,
      "features": {
        "buildkit": true
      }
    }
    

    这是通过 docker daemon 实现的暴露

执行了上面任何一个指令后,就可以监听到被暴露的端口了,运行结果大致如下:

sudo netstat -lntp | grep dockerd
tcp        0      0 192.168.59.106:2375     0.0.0.0:*               LISTEN      8745/dockerd

curl 的结果大体如下:

curl http://192.168.59.106:2375/containers/json | jq
[
  {
    "Id": "8dfafdbc3a40",
    "Names": [
      "/registry-server"
    ],
    "Image": "registry:2",
    "ImageID": "sha256:2d4f4b5309b1e65c4a8b6265ffaecc58b239c89973864a7308bda2c95515c5b2",
    "Command": "/entrypoint.sh /etc/docker/registry/config.yml",
    "Created": 1621859727,
    "Ports": [
      {
        "IP": "0.0.0.0",
        "PrivatePort": 5000,
        "PublicPort": 5000,
        "Type": "tcp"
      }
    ],
    "Labels": {
      "maintainer": "Docker <support@docker.com>"
    },
    "State": "running",
    "Status": "Up 3 hours",
    "HostConfig": {
      "NetworkMode": "default"
    },
    "NetworkSettings": {
      "Networks": {
        "bridge": {
          "IPAMConfig": null,
          "Links": null,
          "Aliases": null,
          "NetworkID": "7ea29fc14125a32c4f66af3c258854d9f72f4961d6903d673b56fbd51581cb1b",
          "EndpointID": "d865b3c89d2f06036a8d53133974be4c809cdc1b667a3b3a0a891f62396e92bd",
          "Gateway": "172.17.0.1",
          "IPAddress": "172.17.0.2",
          "IPPrefixLen": 16,
          "IPv6Gateway": "",
          "GlobalIPv6Address": "",
          "GlobalIPv6PrefixLen": 0,
          "MacAddress": "02:42:ac:11:00:02",
          "DriverOpts": null
        }
      }
    },
    "Mounts": [
      {
        "Type": "bind",
        "Source": "/mnt/registry",
        "Destination": "/var/lib/registry",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
      }
    ]
  }
]

一旦可以被 curl 到,也就代表着可以通过扫描软件扫到端口,之前曾经提到的一个 Nmap 就是这样的工具,其运行结果大体如下:

在这里插入图片描述

如果别人运行了类似的软件去扫对应的网址,那么被暴露的 dockerd 也会显示在这里

这里最好的解决方法当然是不暴露 dockerd,不过如果需求是一定要暴露的话,那么解决方案就是添加安全连接的方式,如使用 SSH/TLS

特权提升

特权提升有两种:

  • 水平提升

    这种情况下,同等级的信息会被获取

    如之前提到的使用 Nmap 去探查被暴露在当前域名上的端口

    另外一个看到过是在钓鱼邮件里看到的案例,比如说钓鱼邮件被 cc 给了群组,群组又有人点击/回复了邮件,那么就通过群组(比如说 hr@example.com 这种常见群组)获取了个人信息

  • 垂直提升 (docker 最常见的问题)

bind mounts

之前在 [docker] 多容器项目 - PHP+MySQL+Nginx+utility containers 案例里比较详细地说明了怎么使用 bind mounts,不在本地安装 php、mysql 实现开发一个 laravel 网站,而这里利用的就是容器修改的文件映射到本地,而本地的修改同样也会映射到容器中

这里就会出现一个问题,一个容器中出现了 bind mounts,那就可能会出现安全隐患。如下面这个案例,容器在运行时没有使用合适的 flag 去传输 secrets,而是暴力的使用 bind mounts 绑定了 secrets:

# 假设可以访问到容器
# 可以看到这里所有的权限都是 root 权限
/app # ls -la /
total 64
drwxr-xr-x    1 root     root          4096 Apr 30 03:52 .
drwxr-xr-x    1 root     root          4096 Apr 30 03:52 ..
-rwxr-xr-x    1 root     root             0 Apr 30 03:52 .dockerenv
drwxr-xr-x    4 root     root           128 Apr 30 03:38 app

# 这个指令可以查看所有的 mounts
/app # cat /proc/mounts
# 省略若干行,注意到这里的 bind mounts
/run/host_mark/Users /app fakeowner rw,nosuid,nodev,relatime,fakeowner 0 0

/app # ls
image.dockerfile  secrets
/app # ls secrets/
id_rsa
/app # cat secrets/id_rsa
some random text

如果这里真的是使用当前的 secrets 去进行登录的话,那么:

  1. 就能够获取 host machine 的登录信息

  2. 可以利用 bind mounts 的特性,新建一个文件,其中包含自己的登录信息

    因为 bind mounts 同样也会反映到宿主机器上去,因此同样的密钥也会被添加到宿主机器

    换言之,现在黑客就能够使用自己的密钥,顺利的登录宿主机器

这种问题,平时在检测的时候也比较容易发现:

  1. 运行时是否使用了 bind mounts,这里通过 -v <绝对路径>:路径 的方式可以检测出来

    # may need to check the file sharing permissiondocker run
    -p 3000:80
    -d
    --rm
    --name feedback-app
    # bind mounts
    # 区别在于这是绝对路径
    -v "$(pwd):/app"
    feedback-node:volumes
    
  2. docker compose 是否绑定了绝对路径

    server:
    image: "nginx:stable-alpine3.17"
    ports:
      - "8000:80"
    volumes:
      # 这两个都是 bind mounts
      - ./src:/var/www/html:delegated
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
    

解决方式就比较简单粗暴了——尽量使用 volume 代替 bind mounts

将 docker api 挂载到容器上

这个实现的安全隐患,和第一点暴露 docker api 比较相似,会这么做的主要原因也是为了方便管理,比如说有一个叫做 Portainer 的容器,可以可视化管理 docker 容器,下面是来自官网教程的动图:

在这里插入图片描述

可以看到,如果是一些做未来会交付出去,给非开发进行管理/维护的项目,就可能会使用这种方法——这也是无法避免一定会要使用这种容器的理由。这种情况下,使用 SSH/TLS/VPN 建立安全的登录是最好的防护方式

另一种解决方式是使用 non-root 用户,这里在官方文档也有介绍,这里不多赘述:https://docs.docker.com/engine/security/rootless/

特权容器

类似的我之前跑过:

docker run -it --privileged --pid=host image-vulnerability nsenter -t 1 -m -u -n -i sh

默认情况下,容器是无法访问宿主机的设备(USB, GPU 等),但是使用 --privileged 这个 flag 可以获取这些权限,除此之外还可以挂载文件系统、越过 FS 的权限管理等,除此之外,设备也可以被 map 到容器上去。

对于这个漏洞的检测方式主要有以下几种:

  1. 特权模式,也就是 --privileged flag

  2. 添加 capabilities,也就是 --cap-add=CAPABILITY_NAME flag

    这里包含的 capability 有以下几个选择:

    • SYS_ADMIN,即系统管理
    • NET_ADMIN,即网络管理
    • SYS_TIME,即系统时间
    • SYS_PTRACE, 即 ptrace,可以追踪一些 process
  3. 添加设备,即 --device flag

kernel 漏洞

这个是与 linux 镜像有关的一些漏洞了,具体可以在这个网站上进行查询:https://www.exploit-db.com/

一些漏洞包括:

在这里插入图片描述

在这里插入图片描述

这个就没什么好说的了吧,就是涉及到了底层用的 linux 的漏洞,linux 服务器的话,就和当前的系统有关

资源管理

默认情况下,容器的运行是没有资源限制的,换言之,一个容器很有可能会耗尽当前服务器上所有的资源。以之前提到的一个 package 为例:everything。如果前端容器 不小心 安装了类似的包,那么就会下载 npm registry 上的所有包

这会使用大量的资源,包括带宽和内存。在没有任何限制的情况下,光是前端容器就能够耗尽服务器的资源。当系统内存不够了,就会宕机,这同样也会影响到运行在同样服务器上的其他容器,从而导致整个项目挂掉

限制的方法有:

  • cpu

    • 使用, --cpu-shares=512

    • quota, --cpu-quota=50000

    • 周期, --cpu-period=100000

  • 内存

    • 大小限制, -m 512m
    • swap, --memory-swap=1g
  • IO

    • block, --blkio-weight=500
    • 读写速度, --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb
  • 带宽, --net=my_bandwidth_limited_network

reference

  • Protect the Docker daemon socket

  • Run the Docker daemon as a non-root user (Rootless mode)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1711838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优化效率,简化流程:探索工资结算系统的重要性与实施方法

在现代企业中&#xff0c;工资结算是一项重要而复杂的任务。为了更好地管理和处理员工的工资事务&#xff0c;许多企业采用工资结算系统。本文将探讨工资结算系统的重要性&#xff0c;并介绍一些实施该系统的方法。 ### 1. 概述 工资结算系统是一种自动化的软件系统&#xff0…

Pycharm无法关闭-一直显示正在关闭项

界面上一直显示&#xff0c;正在关闭项目&#xff0c;而且我大部分项目&#xff0c;都能正常关闭&#xff0c;主要是一个由Selenium的项目关不掉&#xff0c;分享一下如何解决。 操作系统版本&#xff1a;Windows 10 专业版 22H2 软件版本&#xff1a;PyCharm Professional 2…

激光雷达测试板智能系统应用

在自动驾驶技术和机器人感知系统的迅猛发展中&#xff0c;激光雷达&#xff08;Lidar&#xff09;作为一种先进的测距技术&#xff0c;正逐渐成为这些系统不可或缺的组成部分。而在这一技术的实际应用前&#xff0c;对激光雷达进行精确的测试和校准是至关重要的一步。激光雷达测…

微乐校园管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;基础数据管理&#xff0c;叫车管理&#xff0c;代跑管理&#xff0c;二手商品管理 司机账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;叫车管理&#xff0c…

pg_lakehouse 与 datafusion

原理分析 pg_lakehouse 是 ParadeDB 推出的一个开源插件&#xff0c;支持对多种数据湖里的数据做分析计算。它的出现&#xff0c;使得 Postgres 能够像访问本地数据一样轻松访问 S3 等对象存储&#xff0c;轻松访问 Delta Lake 上的表格&#xff0c;具备数据湖分析能力。 pg_…

就业班 第三阶段(ELK) 2401--5.22 day3 filebeat+elk云部署

kafka集群 Windterm同步输入&#xff0c;多台机子可以同时输入同步输入 启动kafka需要启动两个 第一个 [rootkafka1 ~]# cd /usr/local/kafka_2.11-2.0.0/ [rootkafka1 ~]# nohup bin/zookeeper-server-start.sh config/zookeeper.properties &第二个 [rootkafka1 ~]#…

一种基于单片机的智能饮水机设计

随着人们生活水平的提高&#xff0c;对美好生活质量的追求也越来越高。饮 水机是人们日常生活不可或缺的&#xff0c;实现饮水机的智能化控制不但方便&#xff0c; 而且更加安全。本文提出一种基于单片机的智能饮水控制系统&#xff0c;通过传 感器实现对水温的监测&#xff0c…

命令注入攻击及其防范措施

命令注入攻击及其防范措施 命令注入攻击是一种通过有漏洞的应用程序在主机操作系统上执行任意命令的攻击。 当应用程序将不安全的用户输入数据&#xff08;如表单、cookie、HTTP 标头等&#xff09;传递给系统命令执行时&#xff0c;可能会发生命令注入攻击。 命令注入攻击的…

《PNAS》和《Nature Communications》仿章鱼和蜗牛的粘液真空吸附,赋予了机器人吸盘新的“超能力”

想象一下&#xff0c;如果机器人能够像章鱼一样牢牢吸附在粗糙崎岖的岩石上&#xff0c;或者像蜗牛那样在墙面上悠然负重爬行&#xff0c;那会是多么神奇的一幕&#xff01;近日&#xff0c;布里斯托大学机器人实验室的Jonathan Rossiter教授课题组就为我们带来了这样的“超能力…

什么是抗压能力?如何判断自己的抗压能力?

什么是抗压能力&#xff1f; 抗压能力&#xff0c;也叫心理承受能力&#xff0c;指的是面对外界的压力&#xff0c;逆境&#xff0c;困境和挑战&#xff0c;能够有效的调整自己的心态&#xff0c;有效的应对和解决问题的能力。 抗压能力涉及多个方面&#xff0c;比如&#xf…

C语言.顺序表.通讯录

基于顺序表示实现通讯录 1.通讯录项目的功能要求2.代码实现3.头文件处理4.通讯录的具体实现4.1通讯录的初始化与销毁4.1.1通讯录的初始化4.1.2通讯录的初始化销毁 4.2通讯录的添加与删除数据4.2.1通讯录的添加数据4.2.1通讯录的删除数据 4.3通讯录的修改4.4通讯录的查找4.5通讯…

C语言-02_变量与进制

文章目录 1.关键字2.标识符3.变量3.1 变量的声明与赋值3.2 变量的作用域3.3 变量按类型的分类 4.基本数据类型4.1 整数类型4.1.1 类型说明4.1.2 举例4.1.3 后缀4.1.4 整型的极限值 4.2 浮点类型4.2.1 类型说明4.2.2 举例 4.3 字符类型4.4 布尔类型 5.变量间的运算规则5.1 隐式类…

Linux 防火墙 firewalld 常用命令

1 防火墙 - firewalld 1.1 开启防火墙 # 临时性开启&#xff0c;服务器重启后会恢复为原来的状态 systemctl start firewalld # 永久性开启&#xff08;即开机启动&#xff09;&#xff0c;重启服务器后生效 systemctl enable firewalld1.2 关闭防火墙 # 临时性关闭&#xf…

学习Uni-app开发小程序Day20

今天学习了&#xff1a;页面的渐变背景、使用deep修改子组件样式、全屏页面absolute定位布局和fit-content内容宽度、遮罩层状态转换及日期格式化、uni-popup弹窗层制作弹出信息 页面的渐变背景 需要设置页面背景&#xff0c;使用的是多个页面&#xff0c;这样就可以把背景做…

深度学习之CNN卷积神经网络

一.卷积神经网络 1. 导入资源包 import numpy as np import pandas as pd import matplotlib.pyplot as plt import sklearn import tensorflow as tf from tensorflow import keras注&#xff1a;from tensorflow import keras&#xff1a;从TensorFlow库中导入Keras模块&am…

关于Linux软链你必须知道的实用知识点(非常详细)零基础入门到精通,收藏这一篇就够了

背景 Linux中的软链&#xff0c;是非常强大的工具&#xff0c;如果只是一知半解&#xff0c;在解决问题时一定会让你栽跟头或者浪费大量的时间。非常有必要提前掌握Linux软链的几个实用的知识点。 分析 软链是什么&#xff1f; 在Linux中&#xff0c;软链接&#xff08;sym…

Echarts 实现线条绘制

文章目录 需求分析 需求 用 Echarts 实现如下效果 分析

PS Adobe Photoshop 2024 for Mac[破]图像处理软件[解]PS 2024安装教程[版]

Adobe Photoshop 2024 for Mac[破]图像处理软件[解]PS 2024安装教程[版] 原文地址&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/139248839

mysql去除重复数据

需求描述 doc表有很多重复的title,想去除掉重复的记录 表结构 CREATE TABLE doc (id INT PRIMARY KEY,title VARCHAR(255),content TEXT );去重SQL -- 创建临时表 CREATE TEMPORARY TABLE temp_doc AS SELECT * FROM doc WHERE 10;-- 插入唯一的记录&#xff08;每个title最…

【ARM+Codesys案例】基于全志T3+Codesys软PLC的3C点胶边缘控制解决方案:整合了运动控制、视觉、激光测高等技术

视觉精密点胶控制方案 针对直交型机构的平面点涂胶应用&#xff0c;基于CODESYS软件平台开发的一站式PC型控制器解决方案&#xff0c;包含运动控制器硬件和点胶应用软件。方案整合了运动控制、视觉、激光测高等技术&#xff0c;高效精密的控制胶水点涂于产品表面或内部&#x…