当前位置: 首页 > web >正文

在本地使用 Docker 创建一个易受攻击的云环境

本指南将指导您使用 Docker 在本地设置一个故意设计为易受攻击的云存储环境。通过模拟一个具有不安全配置的云存储服务(例如过于宽松的存储桶策略),您可以学习云安全、渗透测试或道德黑客技术。

警告:此设置仅用于教育目的,切勿在生产环境中部署。

前提条件

  • 一个 Linux 系统(例如 Ubuntu),具有 root 或 sudo 权限。
  • 对 Docker、Linux 命令和云存储概念有基本了解。
  • 一个与生产系统隔离的测试环境,以避免意外的安全风险。

第一步:安装 Docker

Docker 是一个用于运行容器化应用的平台。我们将使用它来创建一个隔离的 Ubuntu 环境。

  1. 安装 Docker

    sudo apt update
    sudo apt install -y docker-ce
    

    此命令更新软件包列表并安装 Docker 社区版。确保您的系统满足 Docker 的先决条件(例如兼容的内核)。

  2. 验证 Docker 安装

    docker --version
    

    确认 Docker 已正确安装,您应看到安装的版本号。

  3. 拉取最新的 Ubuntu 镜像

    docker pull ubuntu:latest
    

    这将从 Docker Hub 下载最新的 Ubuntu 镜像,作为我们易受攻击环境的基础。

  4. 列出可用 Docker 镜像

    docker images
    

    这将显示系统上的所有镜像。记下 ubuntu:latest 镜像的 IMAGE ID(例如 03a...)。

  5. 运行一个带有交互式 Shell 的容器

    docker run -it <IMAGE_ID>
    

    <IMAGE_ID> 替换为 Ubuntu 镜像 ID 的前几位(例如 03a)。-it 参数提供了一个交互式终端。

  6. 更新容器
    在容器内部,更新软件包列表:

    apt update
    

    这确保容器可以访问最新的软件包版本。

第二步:安装本地云环境的依赖项

我们将安装 MinIO(一个与 S3 兼容的对象存储服务器)和其他依赖项,以模拟云存储服务。

  1. 安装所需软件包

    apt install -y apache2 php php-cli php-curl php-mbstring php-xml php-zip unzip curl python3-pip git default-jre composer
    pip3 install awscli awscli-local --break-system-packages
    
    • apache2:用于托管的 Web 服务器(稍后介绍,可选)。
    • php 及其相关包:用于可能的 Web 交互。
    • python3-pipawscliawscli-local:与 S3 兼容存储交互的工具。
    • composer:PHP 的依赖管理器(稍后用于 Web 集成)。
    • --break-system-packages 允许 pip 安装可能与系统软件包冲突的包。
  2. 下载并配置 MinIO

    curl -O https://dl.min.io/server/minio/release/linux-amd64/minio
    chmod +x minio
    mv minio /usr/local/bin/
    mkdir -p /data/s3
    
    • 下载 MinIO 服务器二进制文件。
    • 授予执行权限并将其移动到系统目录。
    • 创建一个目录(/data/s3)用于存储 MinIO 数据。

第三步:启动本地云服务器

MinIO 将作为我们的本地 S3 兼容云存储服务器。

  1. 启动 MinIO 服务器

    MINIO_ROOT_USER=<USER> MINIO_ROOT_PASSWORD=<PASSWORD> minio server /data/s3 --console-address ":9001" &
    
    • <USER><PASSWORD> 替换为您想要的凭据(例如 adminpassword123)。
    • & 使服务器在后台运行。
    • --console-address ":9001" 将 Web 控制台设置为 9001 端口。S3 API 默认运行在 9000 端口。
  2. 验证服务器
    在浏览器中访问 http://localhost:9001,使用您的凭据登录以确认服务器正在运行。

第四步:配置 AWS CLI 以进行本地交互

AWS CLI 允许我们像操作 AWS S3 一样与 MinIO 服务器交互。

  1. 配置 AWS CLI
    aws configure
    
    在提示时输入以下内容:
    AWS Access Key ID: <USER>
    AWS Secret Access Key: <PASSWORD>
    Default region name: us-east-1
    Default output format: json
    
    使用与 MinIO 服务器设置相同的 <USER><PASSWORD>

第五步:创建易受攻击的 S3 存储桶

我们将创建一个 S3 存储桶,并应用一个故意不安全的策略,以模拟常见的云配置错误。

  1. 创建存储桶

    aws --endpoint-url http://localhost:9000 s3api create-bucket --bucket <BUCKET_NAME>
    

    示例:

    aws --endpoint-url http://localhost:9000 s3api create-bucket --bucket huguelogistics-data
    

    这将创建一个名为 huguelogistics-data 的存储桶。

  2. 创建易受攻击的存储桶策略
    /tmp 目录中创建一个名为 public-policy.json 的文件:

    cd /tmp
    nano public-policy.json
    

    添加以下 JSON,替换 <BUCKET_NAME> 为您的存储桶名称(例如 huguelogistics-data):

    {"Version": "2012-10-17","Statement": [{"Sid": "AllowPublicReadPolicy","Effect": "Allow","Principal": "*","Action": ["s3:GetObject","s3:ListBucket","s3:GetBucketPolicy"],"Resource": ["arn:aws:s3:::<BUCKET_NAME>","arn:aws:s3:::<BUCKET_NAME>/*"]}]
    }
    

    此策略允许匿名访问列出存储桶内容、获取对象和查看存储桶策略,模拟现实世界的安全漏洞。

  3. 应用策略

    aws --endpoint-url http://localhost:9000 s3api put-bucket-policy --bucket <BUCKET_NAME> --policy file:///tmp/public-policy.json
    

    示例:

    aws --endpoint-url http://localhost:9000 s3api put-bucket-policy --bucket huguelogistics-data --policy file:///tmp/public-policy.json
    

第六步:上传测试文件

为了展示漏洞,我们将上传一个敏感文件(例如包含模拟凭据的 Excel 表格)。

  1. 创建并上传文件
    cd /tmp
    touch credentials.xlsx
    aws --endpoint-url http://localhost:9000 s3 cp credentials.xlsx s3://<BUCKET_NAME>/
    
    示例:
    aws --endpoint-url http://localhost:9000 s3 cp credentials.xlsx s3://huguelogistics-data/
    
    这将 credentials.xlsx 上传到存储桶。

第七步:模拟攻击者的视角

攻击者可以利用配置错误的存储桶在无需身份验证的情况下访问敏感数据。

  1. 匿名枚举存储桶

    aws --no-sign-request --endpoint-url http://<VICTIM_IP>:9000 s3api get-bucket-policy --bucket <BUCKET_NAME>
    

    <VICTIM_IP> 替换为目标机器的 IP(例如 localhost 或容器的 IP),<BUCKET_NAME> 替换为您的存储桶名称。

  2. 过滤策略输出以提高清晰度

    aws --no-sign-request --endpoint-url http://<VICTIM_IP>:9000 s3api get-bucket-policy --bucket <BUCKET_NAME> | jq -r '.Policy | fromjson | .Statement[] | {Effect, Principal, Action, Resource, Sid}'
    

    示例输出:

    {"Effect": "Allow","Principal": {"AWS": "*"},"Action": ["s3:ListBucket","s3:GetBucketPolicy","s3:GetObject"],"Resource": ["arn:aws:s3:::huguelogistics-data","arn:aws:s3:::huguelogistics-data/*"],"Sid": "AllowPublicReadPolicy"
    }
    

    这确认存储桶是公开可访问的。

  3. 匿名下载文件

    aws --no-sign-request --endpoint-url http://<VICTIM_IP>:9000 s3 cp s3://<BUCKET_NAME>/credentials.xlsx .
    

    示例:

    aws --no-sign-request --endpoint-url http://localhost:9000 s3 cp s3://huguelogistics-data/credentials.xlsx .
    

    这将下载文件,展示漏洞。

第八步:[可选] 通过 Apache2 托管存储桶

为了模拟基于 Web 的存储桶界面,可以将其与 Apache2 和 PHP 集成。

  1. 安装并启动 Apache2

    apt install -y apache2 php-gd
    service apache2 start
    
  2. 安装 PHP AWS SDK 和依赖项

    cd /var/www/html
    composer require aws/aws-sdk-php phpoffice/phpspreadsheet
    
  3. 配置权限

    chmod -R 755 /var/www/html
    chown -R www-data:www-data /var/www/html
    a2enmod rewrite
    service apache2 restart
    
  4. 创建 PHP 脚本(可选):
    /var/www/html 中创建一个文件(例如 index.php),与存储桶交互,例如列出文件或实现身份验证。示例:

    <?php
    require 'vendor/autoload.php';
    use Aws\S3\S3Client;$s3 = new S3Client(['version' => 'latest','region' => 'us-east-1','endpoint' => 'http://localhost:9000','credentials' => ['key' => '<USER>','secret' => '<PASSWORD>',],
    ]);$objects = $s3->listObjects(['Bucket' => '<BUCKET_NAME>']);
    foreach ($objects['Contents'] as $object) {echo $object['Key'] . "<br>";
    }
    ?>
    

    此脚本列出存储桶中的所有对象。通过 http://localhost 访问。

安全建议

  • 修复漏洞:将存储桶策略限制为特定用户或角色,而不是 "Principal": "*"。示例:
    "Principal": {"AWS": "arn:aws:iam::account-id:user/specific-user"}
    
  • 使用强凭据并定期轮换。
  • 在 MinIO 服务器上启用日志记录和监控。
  • 在沙盒环境中测试以避免暴露敏感数据。

结论

此设置创建了一个易受攻击的本地云环境,用于研究 S3 存储桶配置错误。通过遵循这些步骤,您可以模拟现实世界的云安全问题并练习道德黑客技术。始终确保此类设置与生产系统隔离。

http://www.xdnf.cn/news/19708.html

相关文章:

  • leetcode46.全排列
  • 【LLIE专题】一种语义感知知识引导的低照度图像增强方案
  • Day23 机器学习流水线(管道/pipeline)
  • 小程序开发:懒加载只加载当前和滑动到的图片
  • 【Doris入门】Doris数据表模型:主键模型(Unique Key Model)详解
  • 【重学MySQL】九十六、MySQL SQL Mode高效配置全攻略
  • Linux 孤儿进程 (Orphan Process)
  • 【学Python自动化】 6.1 Python 模块系统学习笔记 (与 Rust 对照)
  • Linux中命令收集
  • UE5 C++ 第三方动态库的使用
  • 「任天堂物语」08 任天堂的山寨时代
  • 递归进阶之全排列、组合
  • JS箭头函数
  • 数字铁流:2025.9.3国庆大阅兵系统架构解析
  • 贪心算法解决固定长度区间覆盖问题:最少区间数计算
  • OpenCV 实战:图像模板匹配与旋转处理实现教程
  • G156HAN04.0 宽温域高亮工业屏技术白皮书
  • Spring Ioc —— 集合类型的依赖注入
  • Next.js渲染模式:SSR、SSG与ISR揭秘
  • 第六章:健壮Go应用:工程实践与生产就绪之测试
  • 旧实例数据库损坏sqlserver启动失败解决办法
  • Java PDF转多种图片格式:技术实践与性能优化
  • CS25FTFR010 1225 0.01R/10mR有哪些优势-华年商城
  • 联邦学习论文分享:Federated Learning via Synthetic Data
  • 搭建APP应用程序如何选择服务器
  • 选择图片转base64格式组件简单封装-Base64ImageInpu
  • 【Node.js教程】Express框架入门:从搭建到动态渲染商品列表
  • 埃文科技亮相2025中部数字经济产业发展大会暨数智创新博览会
  • 数据库事务隔离级别与 MVCC 机制详解
  • MiniCPM-V 4.5实战,实现图片、视频、多图的推理