对象存储公有读防恶意刷流量

背景:

目前各大云服务商的对象存储均无流量超出自动关闭服务的功能,以至于网上有很多使用对象存储被刷流量导致一觉醒来负债的案例。网上很多说可以设置防盗链来避免盗刷流量,防盗链这种方式确实可以防止被别人盗链,但却无法防止恶意刷流量,并且不知道为什么防盗链会导致小程序应用中视频无法正常播放。也有一些说cdn的,因为cdn中提供了流量超出自动关闭的功能,确实可以实现这一功能,但有时候我们不想使用cdn,加之使用cdn也有暴露源站地址的风险,源站一旦被发现,那么还是会被进行恶意刷流,因此我们需要直接在COS上进行防护。

具体思路:

虽然不知道为啥各大云服务商均未提供流量超出自动关闭服务的功能,但好在他们提供了根据策略进行告警的功能,并且还提供了告警回调功能,我们可以在接收告警时,设置ACL策略为私有,以此来中断恶意刷流行为的持续。

以下以腾讯云的COS为例,其他对象存储若包含告警接口回调功能,可参考该思路实现。

实现步骤:

1)设置告警策略:登录 - 腾讯云

2)根据具体应用情况设置告警触发策略

3)设置接口回调(这个在通知模版里)

4)完成告警设置后,进行需要被回调的接口实现即可。

代码实现:

回调接口实现:

@Slf4j
@RestController
@RequestMapping("/callback")
@Api(tags = {"用于第三方接口回调"})
public class CallbackController {



    @Autowired
    COSUtil cosUtil;

    @PostMapping("/cos/f6d9c1c8-0f3e-4b5d-8e5b-2a7a2d7f6c6d")
    @ApiOperation("cos防盗刷流量接口,接收告警设置ACL为私有")
    public void cosTrafficAlarm(@RequestBody JSONObject alarm) {
        if (alarm.get("alarmStatus").equals("1")) {
            log.error("告警信息为: {}", alarm);
            cosUtil.setACL(CannedAccessControlList.Private);
        }
    }
}

PS:代码中alarmStatus为告警状态,1为告警,0为恢复,回调接口参数详见:腾讯云可观测平台 告警回调说明-告警管理-文档中心-腾讯云

COSUtil部分代码:

下面代码需要适当改动才可使用。

@Service
public class COSUtil extends FileVerification implements FileUtil {

    @Value("${cos.host}")
    private String host;
    @Value("${cos.secretId}")
    private String secretId;
    @Value("${cos.secretKey}")
    private String secretKey;
    @Value("${cos.regionName}")
    private String regionName;
    @Value("${cos.bucketName}")
    private String bucketName;

    // 创建 COSClient 实例,这个实例用来后续调用请求
    COSClient createCOSClient() {
        // 设置用户身份信息。
        // SECRETID 和 SECRETKEY 请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);

        // ClientConfig 中包含了后续请求 COS 的客户端设置:
        ClientConfig clientConfig = new ClientConfig();

        // 设置 bucket 的地域
        // COS_REGION 请参照 https://cloud.tencent.com/document/product/436/6224
        clientConfig.setRegion(new Region(regionName));

        // 设置请求协议, http 或者 https
        // 5.6.53 及更低的版本,建议设置使用 https 协议
        // 5.6.54 及更高版本,默认使用了 https
        clientConfig.setHttpProtocol(HttpProtocol.https);

        // 以下的设置,是可选的:

        // 设置 socket 读取超时,默认 30s
        clientConfig.setSocketTimeout(30*1000);
        // 设置建立连接超时,默认 30s
        clientConfig.setConnectionTimeout(30*1000);

//        // 如果需要的话,设置 http 代理,ip 以及 port
//        clientConfig.setHttpProxyIp("httpProxyIp");
//        clientConfig.setHttpProxyPort(80);

        // 生成 cos 客户端。
        return new COSClient(cred, clientConfig);
    }

    public void setACL(CannedAccessControlList cannedAccessControlList) {
        COSClient cosClient = createCOSClient();
// 设置预定义 ACL
// 设置私有读写(默认新建的 bucket 都是私有读写)
        try {
            cosClient.setBucketAcl(bucketName, cannedAccessControlList);
        }finally {
            cosClient.shutdown();
        }

    }
}

注意点:

1)上面的功能虽然可以实现防止恶意刷流量,但也会因为设置了ACL为私有导致我们自己的系统无法进行对象存储中静态资源的访问,之后需要系统能够正常使用还需要改ACL为原有策略,所以使用之前请斟酌是否能够接受系统在被恶意刷流时停止服务。

2)上面的接口存在被他人调用导致ACL被修改的风险,因此开发者需要自行实现限制可访问接口的ip,并且建议接口路径添加UUID,避免接口路径轻易被发现。

以下为使用SpringSecurity实现访问接口的ip限制,其中"159.75.0.0/16"为腾讯云进行告警回调接口的服务器ip段,如使用其他对象存储服务,则需进行ip段的对应修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值