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

在本地使用 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.dtcms.com/a/362060.html

相关文章:

  • Day23 机器学习流水线(管道/pipeline)
  • Windows系统安装Git详细教程
  • c# winform 拼图游戏
  • 随机获取集合里面的某一条数据
  • 利用Mybatis自定义排序规则实现复杂排序
  • UBUNTU之Onvif开源服务器onvif_srvd:1、编译
  • Java synchronized 关键字详解
  • JAVA后端开发——forEach 与方法引用(::)详解
  • 剧想智读项目展示
  • 针对redis中的热数据该怎么处理
  • Qt 项目文件(.pro)中添加 UI 文件相关命令
  • 【系规伴学】云资源规划核心知识点解析
  • vcruntime140.dll丢失解决办法
  • pandas自学笔记16 pandas可视化
  • 继承体系中的隐藏机制解析(继承中的作用域)
  • Unity图集 SpriteAltas 打包探究
  • [界面通过zmq请求调用指定动态库函数(三)]将zmq请求集成二次开发接口
  • Android 文件下载 FileDownloader
  • TypeScript交叉类型、重复属性、类型断言和as const详解
  • 光颉科技)Viking)的CS25FTFR009 1225 0.009R/9mR 3W电阻介绍-华年商城
  • 【笔记】float类型的精度有限,无法精确表示123456.6789
  • 【Audio】静音或振动模式下重复来电响铃
  • Java Web项目后台管理系统之内容管理仿写(三):图片上传
  • 使用 BayesFlow 通过神经网络简化贝叶斯推断(一)
  • C扩展4:X宏(X-MACRO)
  • JS循环机制
  • IS-IS的原理
  • Java超卖问题
  • MySQL安装与使用指南
  • 【读论文】量子关联增强双梳光谱技术