TIM'S BLOG

TIM'S BLOG

阿里云 OSS 被盗刷流量

181
2023-05-27

前言

重新搭建好博客到现在已经过去半年了,由于工作太忙,一直没时间输出博客😅

但是没想到搭建的环境还没有用起来,反倒是先被攻击了🤦‍♂️

遭受攻击

早上收到阿里云的邮件提示余额不足,登上控制台一看,好家伙,PicGo 图床搭建一文中利用阿里云 OSS 搭建的图床,2 天内被恶意刷了 400 GB 的流量,直接导致欠费停机了😅

image-20230527164435426.png

image-20230527161639317.png

为了备份文件并关闭服务,竟然要先启动服务(充钱)😅

好吧,充值!服务恢复后,快速将文件取回本地并关闭服务,这段时间里又消费了 35 😅

img

当初使用这个方案的时候,的确考虑过这个问题,所以在上传图片时,使用年/月/日作为存储路径,时-分-秒-哈希值作为图片名称,而且获取文件列表也需要鉴权,所以理论上除非在博客中主动分享,图片的链接应该是私密的。

在此之前,博客总共 3 篇文章,11 张图片,硬是靠着这几张图片,2 天请求了 250 万次😅

让我来问问 ChatGPT 需要怎么办?

为了防止阿里云OSS(对象存储服务)遭受分布式拒绝服务(DDoS)攻击,您可以采取以下几项安全措施:

  1. 防火墙和访问控制策略:在阿里云控制台或使用API配置网络访问控制,限制只允许受信任的IP地址或IP地址段访问您的OSS存储桶。这样可以降低未经授权的访问和恶意请求的风险。

  2. DDoS防护服务:阿里云提供DDoS防护服务,可帮助抵御DDoS攻击。您可以在阿里云控制台开启DDoS防护功能,并根据实际需求选择合适的防护方案,如高级防护、流量清洗等。

  3. 访问频率限制:根据正常使用情况,限制对OSS的访问频率。您可以设置合理的访问频率限制,以防止异常高的访问流量。

  4. 内容分发网络(CDN):使用阿里云CDN服务将OSS与CDN结合,通过分发节点分担流量负载,提高响应速度,并通过CDN的防护机制来抵御一定程度的DDoS攻击。

  5. 监控和日志分析:定期监控和分析OSS的访问日志,及时发现异常访问和攻击行为。阿里云提供了日志服务和安全运营中心等工具,可用于监测和分析日志数据。

  6. 更新安全策略:及时关注阿里云的安全通知和更新,确保您的OSS服务和相关组件都是最新版本,以获取最新的安全补丁和增强功能。

  7. 强化访问控制:合理使用阿里云的访问控制策略,为OSS资源设置合适的权限和访问策略。使用RAM(资源访问管理)服务,按照最小权限原则,为不同的用户和角色分配最低必要的权限,避免意外的数据泄露或篡改。

  8. 安全备份和容灾:定期备份OSS中的重要数据,并将数据复制到不同的地理位置和存储设备上,以便在发生攻击或故障时能够快速恢复数据并保持业务连续性。

这些措施可以帮助您增强阿里云OSS的安全性,减少DDoS攻击的影响。建议您根据实际需求和安全风险评估,选择合适的安全措施来保护您的OSS服务。

说的很对,但是我选择放弃(不想额外支出了)。

然而没有了图床,又回到了老问题上,纯静态博客放图片太不方便了。那就找一个带后端的博客系统,把图片直接放服务器上吧。曾经体验过 Halo 1.x 版本,感觉挺不错的,今年年初的时候出了 Halo 2.x,支持安装插件,就决定是你了。

切换博客

整体来说,全部都有现成的 Docker,部署非常简单,启动后剩下的内容在页面配置即可。

Halo 本体

参考官方文档使用 Docker Compose 部署:

version: "3"
​
services:
  halo:
    image: halohub/halo:2.5
    container_name: halo
    restart: on-failure:3
    depends_on:
      halodb:
        condition: service_healthy
    networks:
      halo_network:
    volumes:
      - ./:/root/.halo2
    ports:
      - "8090:8090"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s          
    command:
      - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
      - --spring.r2dbc.username=halo
      # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
      - --spring.r2dbc.password=openpostgresql
      - --spring.sql.init.platform=postgresql
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/
      # 初始化的超级管理员用户名
      - --halo.security.initializer.superadminusername=admin
      # 初始化的超级管理员密码
      - --halo.security.initializer.superadminpassword=P@88w0rd
  halodb:
    image: postgres:latest
    container_name: halodb
    restart: on-failure:3
    networks:
      halo_network:
    volumes:
      - ./db:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    healthcheck:
      test: [ "CMD", "pg_isready" ]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=openpostgresql
      - POSTGRES_USER=halo
      - POSTGRES_DB=halo
      - PGUSER=halo
​
networks:
  halo_network:

Web 服务器

反向代理依旧使用 Caddy 2:

www.yourdomain.com
​
encode gzip
​
reverse_proxy 127.0.0.1:8090

后记

后续有时间了再考虑其他的防御手段吧🤦‍♂️

  • 2