在本地使用 Docker 创建一个易受攻击的云环境
本指南将指导您使用 Docker 在本地设置一个故意设计为易受攻击的云存储环境。通过模拟一个具有不安全配置的云存储服务(例如过于宽松的存储桶策略),您可以学习云安全、渗透测试或道德黑客技术。
警告:此设置仅用于教育目的,切勿在生产环境中部署。
前提条件
- 一个 Linux 系统(例如 Ubuntu),具有 root 或 sudo 权限。
- 对 Docker、Linux 命令和云存储概念有基本了解。
- 一个与生产系统隔离的测试环境,以避免意外的安全风险。
第一步:安装 Docker
Docker 是一个用于运行容器化应用的平台。我们将使用它来创建一个隔离的 Ubuntu 环境。
-
安装 Docker:
sudo apt update sudo apt install -y docker-ce
此命令更新软件包列表并安装 Docker 社区版。确保您的系统满足 Docker 的先决条件(例如兼容的内核)。
-
验证 Docker 安装:
docker --version
确认 Docker 已正确安装,您应看到安装的版本号。
-
拉取最新的 Ubuntu 镜像:
docker pull ubuntu:latest
这将从 Docker Hub 下载最新的 Ubuntu 镜像,作为我们易受攻击环境的基础。
-
列出可用 Docker 镜像:
docker images
这将显示系统上的所有镜像。记下
ubuntu:latest
镜像的IMAGE ID
(例如03a...
)。 -
运行一个带有交互式 Shell 的容器:
docker run -it <IMAGE_ID>
将
<IMAGE_ID>
替换为 Ubuntu 镜像 ID 的前几位(例如03a
)。-it
参数提供了一个交互式终端。 -
更新容器:
在容器内部,更新软件包列表:apt update
这确保容器可以访问最新的软件包版本。
第二步:安装本地云环境的依赖项
我们将安装 MinIO(一个与 S3 兼容的对象存储服务器)和其他依赖项,以模拟云存储服务。
-
安装所需软件包:
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-pip
、awscli
、awscli-local
:与 S3 兼容存储交互的工具。composer
:PHP 的依赖管理器(稍后用于 Web 集成)。--break-system-packages
允许 pip 安装可能与系统软件包冲突的包。
-
下载并配置 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 兼容云存储服务器。
-
启动 MinIO 服务器:
MINIO_ROOT_USER=<USER> MINIO_ROOT_PASSWORD=<PASSWORD> minio server /data/s3 --console-address ":9001" &
- 将
<USER>
和<PASSWORD>
替换为您想要的凭据(例如admin
和password123
)。 &
使服务器在后台运行。--console-address ":9001"
将 Web 控制台设置为 9001 端口。S3 API 默认运行在 9000 端口。
- 将
-
验证服务器:
在浏览器中访问http://localhost:9001
,使用您的凭据登录以确认服务器正在运行。
第四步:配置 AWS CLI 以进行本地交互
AWS CLI 允许我们像操作 AWS S3 一样与 MinIO 服务器交互。
- 配置 AWS CLI:
在提示时输入以下内容:aws configure
使用与 MinIO 服务器设置相同的AWS Access Key ID: <USER> AWS Secret Access Key: <PASSWORD> Default region name: us-east-1 Default output format: json
<USER>
和<PASSWORD>
。
第五步:创建易受攻击的 S3 存储桶
我们将创建一个 S3 存储桶,并应用一个故意不安全的策略,以模拟常见的云配置错误。
-
创建存储桶:
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
的存储桶。 -
创建易受攻击的存储桶策略:
在/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>/*"]}] }
此策略允许匿名访问列出存储桶内容、获取对象和查看存储桶策略,模拟现实世界的安全漏洞。
-
应用策略:
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 表格)。
- 创建并上传文件:
示例: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
上传到存储桶。
第七步:模拟攻击者的视角
攻击者可以利用配置错误的存储桶在无需身份验证的情况下访问敏感数据。
-
匿名枚举存储桶:
aws --no-sign-request --endpoint-url http://<VICTIM_IP>:9000 s3api get-bucket-policy --bucket <BUCKET_NAME>
将
<VICTIM_IP>
替换为目标机器的 IP(例如localhost
或容器的 IP),<BUCKET_NAME>
替换为您的存储桶名称。 -
过滤策略输出以提高清晰度:
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" }
这确认存储桶是公开可访问的。
-
匿名下载文件:
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 集成。
-
安装并启动 Apache2:
apt install -y apache2 php-gd service apache2 start
-
安装 PHP AWS SDK 和依赖项:
cd /var/www/html composer require aws/aws-sdk-php phpoffice/phpspreadsheet
-
配置权限:
chmod -R 755 /var/www/html chown -R www-data:www-data /var/www/html a2enmod rewrite service apache2 restart
-
创建 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 存储桶配置错误。通过遵循这些步骤,您可以模拟现实世界的云安全问题并练习道德黑客技术。始终确保此类设置与生产系统隔离。