对象存储S3权限控制

本文介绍了如何通过S3权限控制实现不同用户间的资源共享。重点讨论了通过更改用户、使用policy授权及ACL设置来达到特定权限控制的目的,并对比了几种方法的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


layout: post
title: 对象存储S3权限控制
catalog: true
tag: [Ceph, S3]

1. 背景

1.1. 需求

A用户创建了一个桶bucket1
B用户需要能对桶bucket1进行操作
A用户上传的东西B用户可以操作,B用户上传的东西A用户可以操作

1.2. 存在的问题

  • ceph rgw 多租户不能实现这个功能,且多租户功能还没补齐
  • bucket link 只能替换存储桶的owner
  • Policy
    • ceph文档太少
    • aws文档是否适用于ceph
  • ACL 权限控制稍弱

2. 几种已有方式的使用

2.1. 更改用户

更改owner,将一个桶的owner变成 user2,这样原来的owner就不具备对桶所有权限了,他的权限全部转移到user2

# 修改
radosgw-admin bucket link --bucket bucketusage --uid user2 --bucket_id e5162bfb-bb2f-46e0-bc9a-1d067d672f73.202155490.1
# unlink 没啥用,用link即可
radosgw-admin bucket unlink --bucket bucketusage --uid user2 --bucket_id e5162bfb-bb2f-46e0-bc9a-1d067d672f73.202155490.1

2.2. policy授权

授权桶和对象给别的用户,这种方式权限控制最细,一般是deny all,然后根据需求access,下面的例子只实现背景中的需求

2.2.1. example

允许
test用户
s3的所有操作
对桶bucketusage、对象bucketusage/*

bucketusage 的owner是user1

cat examplepol
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"AWS": ["arn:aws:iam:::user/user2"]},
    "Action": "s3:*",
    "Resource": [
      "arn:aws:s3:::bucketusage",
      "arn:aws:s3:::bucketusage/*"
    ]
  },
  {
    "Effect": "Allow",
    "Principal": {"AWS": ["arn:aws:iam:::user/user1"]},
    "Action": "s3:*",
    "Resource": [
      "arn:aws:s3:::bucketusage",
      "arn:aws:s3:::bucketusage/*"
    ]
  }]
}

2.2.2. 设置

# 设置
s3cmd -c .s3cfg-user1 setpolicy examplepol s3://bucketusage
# 删除
s3cmd -c .s3cfg-user1 delpolicy examplepol s3://bucketusage

2.2.3. 设置效果

# 使用user2上传一个对象到user1的桶
s3cmd -c .s3cfg-user2 put xxx s3://bucketusage
# user1可以访问这个对象,user2也可以访问这个对象
[root@ceph01 ~]# s3cmd -c .s3cfg-xxxxxx info  s3://bucketusage/xxx
s3://bucketusage/xxx (object):
   File size: 354
   Last mod:  Thu, 20 Jan 2022 06:00:33 GMT
   MIME type: text/plain
   Storage:   STANDARD
   MD5 sum:   456a2de120feb6d9371e95a54ddb7a35
   SSE:       none
   Policy:    {
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {"AWS": ["arn:aws:iam:::user/user1"]},
    "Action": "s3:*",
    "Resource": [
      "arn:aws:s3:::bucketusage",
      "arn:aws:s3:::bucketusage/*"
    ]
  },
  {
    "Effect": "Allow",
    "Principal": {"AWS": ["arn:aws:iam:::user/user2"]},
    "Action": "s3:*",
    "Resource": [
      "arn:aws:s3:::bucketusage",
      "arn:aws:s3:::bucketusage/*"
    ]
  }]
}

   CORS:      none
   ACL:       display user2: FULL_CONTROL
   x-amz-meta-s3cmd-attrs: atime:1642658418/ctime:1642647563/gid:0/gname:root/md5:456a2de120feb6d9371e95a54ddb7a35/mode:33188/mtime:1642618683/uid:0/uname:root

2.2.4. 参考示例

ceph源码

  • 文档
    • doc/radosgw/bucketpolicy.rst
    • doc/radosgw/role.rst
    • qa/tasks/rgw_multi/tests.py
  • 数据结构
    • src/rgw/rgw_iam_policy.h

amazon s3 policy

2.3. acl

acl针对对象用的比较多,桶层级作用相对小,例如给某个对象生成一个http url

# 设置ACL,设为public
s3cmd -c .s3cfg-user2 setacl  s3://bucketusage/xxx -P
# 设置好之后info里面会多一条 URL
s3cmd -c .s3cfg-xxxxxxxx info  s3://bucketusage/xxx
# URL:       http://172.16.10.10:8080/bucketusage/xxx

3. 关于s3文档

ceph的s3相关文档相对较少,使用时有两个路径可以找到比较多的说明材料

  • aws s3文档: 文档齐全,但是有些功能ceph没有
  • ceph 源码: 包括文档和测试用例、还有数据结构

使用时文档可参考aws s3,但要看下ceph里面有没有相关的例子

<think>好的,我现在要解决用户关于如何使用S3协议实现对象存储以及其工作原理的问题。首先,我需要回顾一下用户提供的引用内容,确保回答准确并涵盖关键点。 用户提到了AWS S3的基本概念,比如对象、存储桶,以及类比为硬盘中的文件和文件夹。同时,用户提供的引用中还提到了s3fs挂载工具和MinIO的实现。这些信息需要整合到回答中。 首先,工作原理部分,我需要解释S3的核心机制,包括存储桶和对象的结构、REST API的作用、访问控制、数据一致性模型,以及分布式存储的特点。可能需要提到引用中的全球SAN类比,说明其分布式特性。 接下来是具体实现步骤。用户可能需要知道如何选择服务(如AWS S3或MinIO),创建存储桶,使用API进行操作,以及通过工具挂载。引用中的s3fs和MinIO的Java依赖可以作为示例,展示如何实际操作。 然后,技术选型部分需要比较不同方案,比如公有云、自建方案如MinIO,以及兼容工具如s3fs,帮助用户根据需求选择。引用里提到的MinIO的高性能和兼容性可以作为重点。 最后,注意事项部分应该包括数据一致性、权限管理、网络传输和成本优化。引用中的s3fs局限性和数据持久性需要提及,确保用户了解潜在问题。 在组织回答时,要遵循用户给的格式要求,比如行内公式用$...$,独立公式用$$...$$,但这个问题可能不需要数学公式。不过要注意正确使用LaTeX,如果有技术术语需要强调的话。另外,生成相关问题时要围绕S3协议的应用场景、与文件存储的区别、数据安全等,确保问题有针对性。 检查是否有遗漏的信息,比如S3的URI结构、分段上传、加密等特性,确保覆盖用户提到的所有引用点。同时,保持回答结构清晰,分点说明,帮助用户逐步理解。最后,确认所有引用标记正确,比如[^1]、[^2]、[^3]的位置是否合适,避免错误引用。</think># S3协议对象存储的实现与工作原理 ## 一、S3协议核心原理 S3协议基于分布式对象存储架构,采用$key-value$存储模型,其核心机制包含以下特性: 1. **存储桶与对象结构** 存储桶(Bucket)作为逻辑容器,通过全局唯一命名空间进行管理。对象(Object)由$三元组$定义: $$ \text{Object} = (\text{数据体}, \text{元数据}, \text{唯一标识符}) $$ 引用示例中AWS S3的URI结构为:`s3://bucket-name/object-key`[^1] 2. **RESTful API体系** 所有操作通过HTTP/HTTPS协议实现,核心API包括: - PUT Object(对象上传) - GET Object(对象下载) - DELETE Object(对象删除) - LIST Objects(对象列举) 3. **强一致性模型** 新对象写入和覆盖操作具备强一致性,目录列表操作保持最终一致性[^1] 4. **分布式存储架构** 采用纠删码(Erasure Coding)技术,数据自动分片存储于多个可用区,典型设计支持$n$节点中任意$k$节点故障不影响数据可用性(如12节点容4节点故障)[^3] ## 二、具体实现步骤 ### 方案1:公有云服务(AWS S3) ```python # 使用boto3操作示例 import boto3 s3 = boto3.client(&#39;s3&#39;, aws_access_key_id=&#39;YOUR_KEY&#39;, aws_secret_access_key=&#39;YOUR_SECRET&#39;) # 创建存储桶 s3.create_bucket(Bucket=&#39;my-bucket&#39;) # 上传对象 s3.upload_file(&#39;local_file.txt&#39;, &#39;my-bucket&#39;, &#39;remote_key&#39;) ``` 通过AWS管理控制台可配置存储桶策略、版本控制、生命周期管理等高级特性[^1] ### 方案2:私有化部署(MinIO) ```java // Java客户端示例 MinioClient client = MinioClient.builder() .endpoint("https://play.min.io") .credentials("minioadmin", "minioadmin") .build(); // 创建存储桶 client.makeBucket(MakeBucketArgs.builder().bucket("my-bucket").build()); // 上传对象 client.uploadObject(UploadObjectArgs.builder() .bucket("my-bucket") .object("key") .filename("local-file") .build()); ``` MinIO支持单机部署和分布式集群模式,兼容S3协议且提供管理界面[^3] ### 方案3:挂载访问(s3fs) ```bash # 挂载对象存储到本地文件系统 s3fs my-bucket /mnt/s3 -o passwd_file=${HOME}/.passwd-s3fs -o url=https://s3.us-west-2.amazonaws.com ``` 通过FUSE实现POSIX兼容访问,支持$chmod$、$ls$等常规文件操作,但需注意大文件分块上传特性[^2] ## 三、技术选型对比 | 特性 | AWS S3 | MinIO | s3fs | |---------------|--------------|-------------|-------------| | 部署模式 | 公有云 | 私有化部署 | 访问层 | | 协议兼容性 | 原生协议 | 完全兼容 | 部分兼容 | | 最大对象尺寸 | 5TB | 5TB | 依赖后端 | | 数据加密 | SSE-S3/KMS | 客户端加密 | 传输层加密 | | 典型延迟 | 100-500ms | 10-50ms | 100-200ms | ## 四、关键注意事项 1. **数据持久性模型** S3协议设计为$11$个$9$的数据持久性(99.999999999%),但需注意不同服务商的实际SLA差异[^1] 2. **权限控制体系** 采用IAM策略、存储桶策略、ACL三级权限模型,建议遵循最小权限原则: $$ \text{权限} = \text{主体} + \text{操作} + \text{资源} $$ 3. **大文件传输优化** 使用分段上传(Multipart Upload)提升吞吐量: $$ T_{\text{总}} = \max(T_{\text{分块1}}, T_{\text{分块2}}, ..., T_{\text{分块n}}) + T_{\text{合并}} $$ 4. **成本优化策略** 通过生命周期策略自动转换存储层级(标准/低频访问/归档),建议热数据采用$标准$存储,冷数据采用$Glacier$归档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值