aws对象存储
㈠ AWS S3 对象存储攻防
对象存储,一种面向对象的存储方式,也被业界称为云存储。Amazon 的 S3(Simple Storage Service)是其公开云存储服务的代表,S3 协议因其广泛认可性,成为了主流对象存储厂商的首选标准协议。对象存储中,数据以桶(Bucket)为单位组织,每个桶内存储对象,对象包含 Key、Data 和 Metadata 三部分。操作 Amazon S3 的方法多样,本文将简要介绍对象存储的基本概念,然后探讨在对象存储环境下的攻防手法。
在 Bucket 的 ACL(访问控制列表)设置中,用户可选择允许特定人群访问。如果设置为“所有人可列出对象”,只需知道链接,即可访问对象。当权限设为“私有”时,需通过签名信息访问,如:teamssix.s3.ap-northeast-2.amazonaws.com。对于敏感文件,建议设置为“私有”权限,并强化对签名信息的安全意识。理论上,即使对象名称复杂,私有权限的安全性也更高。
当 Bucket 名称未知时,可通过爆破方式获取。与目录爆破类似,但通过页面内容而非状态码判断。存在两种情况:Bucket 不存在时返回“InvalidBucketName”或“NoSuchBucket”,存在时则列出 Object 或返回“AccessDenied”。通过返回内容不同,可进行 Bucket 名称的爆破。知道 Bucket 名称后,Key 的爆破变得相对容易。
在 S3 中,如果 Bucket 策略允许“s3:ListBucket”,则可能导致 Bucket Object 遍历。MinIO 等工具配置为公开时,打开目标站点会列出 Bucket 中的所有 Key。将 Key 值拼接到目标站点后,可访问相应对象。因此,对象存储配置不当,如公共读写,可能造成任意文件上传与覆盖,甚至利用 HTML 解析进行 XSS 钓鱼、挂链等操作。
若 AccessKeyId 和 SecretAccessKey 泄露,可能导致对对象存储的所有权限获取。收集泄露信息的方法包括多种途径。通过 Bucket 接管,若页面显示“NoSuchBucket”,说明 Bucket 可接管,并提供 Bucket 名称。在 AWS 控制台创建同名 Bucket 后,通过页面特征判断,即可实现接管,最终设置为公开并上传文件,验证权限。
Bucket ACL 设置为可写时,策略允许任何人访问和写入 ACL,但不能读取和写入对象。修改策略为 FULL_CONTROL 后,可控制 Bucket。类似地,修改 Object ACL 为 FULL_CONTROL,可实现读取权限。特定的 Bucket 策略配置只允许某些特定条件下的访问,了解策略后,可访问相关对象。例如,通过添加 User-Agent,可绕过限制直接访问。在实际操作中,留意对方可能使用的策略,尝试访问原本的“AccessDenied”对象。
利用可读写的 Bucket 策略,可将原本不可访问的数据设置为可访问,获取敏感信息。修改网站引用的 S3 资源,通过策略控制权限,导致网站瘫痪。例如,修改策略为 Deny,阻止业务正常运行。通过这些攻防手法,对象存储的安全性和策略配置至关重要,需加强安全管理,防止潜在威胁。
㈡ 对象存储:AWS S3性能优化实践
在Curve项目中,我们遇到了AWS S3同步接口带宽利用率不足的问题。通过对AWS S3底层接口的分析,我们尝试找到性能优化的办法。首先,我们区分了同步与异步接口的区别。同步接口意味着业务调用函数后阻塞直至接收到服务端响应,而异步接口则在将请求丢入AWS底层请求队列后立即返回用户,当底层接收服务端请求时,调用上层业务提供的回调函数。不过,实际情况并非如此,线程池处理请求时,并未执行真正的异步发送至服务端,而是采用同步方式。
进一步深入AWS S3底层逻辑分析,我们以PutObjectAsync接口为例,揭示了其工作流程。AWS当前提供了两种执行器,DefaultExecutor和PooledThreadExecutor。我们采用的是PooledThreadExecutor,通过继承Executor基类并重写SubmitToThread函数进行自定义实现。DefaultExecutor不设线程限制,创建的线程数量与请求数量相同。而PooledThreadExecutor将任务放入队列,线程池通过队列进行任务调度处理。
通过分析,我们发现线程池调用的是同步的curl函数。这意味着,尽管使用了异步接口,实际操作仍受限于同步机制。在默认配置下,线程池中32个线程处理128KB大小的对象时,理论最大带宽仅为40MB,在许多场景下无法满足需求。因此,我们需要采取措施优化带宽能力。
为了提高带宽能力,我们可以通过调整线程池线程数量和最大连接数,从而增加任务处理能力。例如,将两者都设置为200,理论上可达到约250MB的最大带宽。值得注意的是,从AWS SDK的最新版本(V1.9)开始,已经采用了真正的异步处理机制,详情请参考相关文档。
为了更有效地管理任务,开发者可以选择合适的方法,如QUEUE_TASKS_EVENLY_ACROSS_THREADS,确保任务在所有线程之间均匀分布,提高处理效率。此外,配置策略如线程池大小、任务队列限制等,需根据实际需求进行调整。
总结而言,通过深入分析AWS S3底层接口逻辑并合理配置线程池,我们可以优化带宽能力,提升对象存储服务的性能。同时,遵循最佳实践和文档指导,有助于在实际应用中实现更高效的数据传输。
㈢ s3瀛桦偍鍜宱ss瀛桦偍镄勫尯鍒
链嶅姟鎻愪緵鍟嗐佸竞鍦鸿嗙洊銆
1銆佹湇锷℃彁渚涘晢锛歋3鏄疉mazonWebServices锛圆WS锛夋彁渚涚殑瀵硅薄瀛桦偍链嶅姟锛岃孙SS鍒欐槸阒块噷浜戞彁渚涚殑瀵硅薄瀛桦偍链嶅姟銆
2銆佸竞鍦鸿嗙洊锛歋3涓昏佹湇锷′簬鍖楃编鍜屾ф床甯傚満锛岃孙SS鍒椤湪涓锲藉竞鍦哄箍娉涗娇鐢ㄣ