IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    深入浅出 MinIO:身份管理与权限配置实战

    ysicing (i@ysicing.me)发表于 2025-05-02 01:21:13
    love 0

    前面刚刚讲了如何搭建 MinIO,本文趁热打铁手把手教你如何配置 MinIO 权限配置。对于略懂 MinIO 的用户,配置权限可能是个挑战:如何安全地让别人读取存储内容,但不能列出所有存储桶或文件列表?或者让某个存储桶的内容可以列出? 本文将深入讲解 MinIO 的身份管理和权限配置,聚焦存储桶权限(private、public、custom)的区别和 匿名访问 的应用,通过清晰的场景示例,教你实现安全分享,同时保护数据。

    MinIO 身份管理基础

    MinIO 的身份管理负责用户认证和授权,默认使用内置身份提供者(IDP)。核心概念包括:

    1. 用户(User)
      用户通过 Access Key(用户名)和 Secret Key(密码)访问 MinIO,可用命令行工具 mc 或 Web 控制台管理。
    2. 服务账号(Service Account)
      服务账号是为应用程序设计的专用凭证,无法登录控制台,但可通过 API 访问资源,适合自动化脚本或服务集成。
    3. 策略(Policy)
      JSON 格式的策略定义用户、服务账号或匿名访问对存储桶(Bucket)和对象(Object)的权限,基于 AWS S3 语法。
    4. 匿名访问(Anonymous Access)
      允许未认证用户(无 Access Key)通过 URL 或 API 访问特定资源,需通过存储桶权限配置。

    用户组:可通过 mc admin group 批量管理用户权限,本文不展开。

    我们的目标是:安全地让匿名用户或服务账号读取特定内容,限制列出存储桶或文件列表,或有选择地允许列出某个存储桶的内容。

    准备工作

    1. 确保 MinIO 运行:假设 MinIO 部署在 http://localhost:9000,管理员账号为 homes4,密码为 aiy0ooCheephai0ohNahmu3Aijee6eiv。
    2. 安装 mc 工具:下载 MinIO 客户端(mc),用于配置权限(支持 Windows、Mac、Linux)。
    3. 配置 mc:
    mc alias set homes4 http://localhost:9000 homes4 aiy0ooCheephai0ohNahmu3Aijee6eiv
    Added `homes4` successfully.
    

    准备好后,我们开始配置权限!

    PS:命令行方式和可视化操作效果是一样的,下文会穿插着来,但是主要还是以可视化 web 操作为主

    存储桶权限:Private、Public 和 Custom

    MinIO 的存储桶权限控制匿名访问行为,分为 private、public 和 custom 三种模式,可通过 mc anonymous 命令设置。以下是它们的区别

    Private(私有)

    • 定义:禁止所有匿名访问,仅允许认证用户或服务账号(有 Access Key 和策略授权)访问。
    • 适用场景:保护敏感数据,如内部文档、用户数据。
    • 效果:匿名用户访问存储桶或对象时,返回 403 Forbidden
    • 配置:mc anonymous set none homes4/web

    Public(公开)

    注意:风险较高,容易暴露所有文件,慎用。(我个人基本不用)

    • 定义:允许匿名用户访问,权限包括:

      • download:只读(s3:GetObject)
      • upload:只写(s3:PutObject)。
      • public:读写均可。
    • 适用场景:分享公开资源,如网站静态文件、开源软件。

    • 配置(只读):mc anonymous set download homes4/web

    • 效果:匿名用户可通过 URL(如 http://localhost:9000/web/file.jpg)读取对象,可能列出文件列表(若未限制)。

    Custom(自定义)

    推荐用

    • 定义:通过 JSON 策略精确控制匿名访问权限,如限制特定路径或操作。
    • 适用场景:部分公开,如只分享某个文件夹,或禁止列出文件列表。
    • 配置:见下文场景示例。
    • 效果:灵活性最高,匿名用户只能执行策略允许的操作。

    存储桶权限区别总结

    模式 匿名访问权限 适用场景 配置命令
    Private 禁止匿名访问 敏感数据 mc anonymous set none
    Public 读、写或读写(看设置) 公开资源 mc anonymous set download upload/public
    Custom 自定义(JSON 策略) 部分公开、精确控制 mc anonymous set-json

    实战:安全分享存储内容

    通过一个最常见的场景,教你如何:

    • 让匿名用户只读特定文件,禁止列出存储桶或文件列表。

    此外,还会写如何用服务账号为应用程序提供类似权限。

    新建存储桶

    先创建一个存储桶,默认创建的存储桶都是私有权限

    root@docker:~$ mc mb homes4/cli
    Bucket created successfully `homes4/cli`.
    root@docker:~$ mc ls homes4
    [2025-05-01 11:26:11 EDT]     0B cli/
    [2025-05-01 11:23:57 EDT]     0B ddd/
    [2025-05-01 10:38:53 EDT]     0B homes4/
    [2025-05-01 11:29:06 EDT]     0B web/
    

    场景:只读特定文件,禁止列出存储桶或文件列表

    需求:存储桶 web 包含 public/photo.jpg 和 private/secret.pdf。想让匿名用户只读 photo.jpg,但不能列出 web 桶中 的文件列表,也不能访问其他文件或存储桶

    步骤:

    设为 Private(默认安全)

    mc anonymous set none homes4/web
    

    创建自定义策略:只允许匿名读取 public/photo.jpg

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Action": ["s3:GetObject"],
          "Effect": "Allow",
          "Resource": ["arn:aws:s3:::web/public/photo.jpg"],
          "Principal": "*"
        }
      ]
    }
    
    • s3:GetObject:允许读取对象
    • Resource:精确到 photo.jpg, 例如你想某个目录读写 arn:aws:s3:::web/public/*
    • Principal: "*":表示匿名用户
    • 无 s3:ListBucket:禁止列出文件列表

    应用策略

    mc anonymous set-json custom.json homes4/web
    

    控制台可以直接编辑存储桶的 Access Policy,改成 Custom,内容和上面一致

    查看策略

    root@docker:~$ mc anonymous get-json homes4/web
    {
     "Statement": [
      {
       "Action": [
        "s3:GetObject"
       ],
       "Effect": "Allow",
       "Principal": {
        "AWS": [
         "*"
        ]
       },
       "Resource": [
        "arn:aws:s3:::web/public/photo.jpg"
       ]
      }
     ],
     "Version": "2012-10-17"
    }
    

    效果

    • 匿名用户可通过 http://localhost:9000/web/public/photo.jpg 下载 photo.jpg。
    • 其他访问都是 403

    服务账号:为应用程序配置相同权限

    需求:为应用程序(如网站后端)提供只读 public/photo.jpg 的权限,类似上述场景,但通过服务账号实现

    步骤:

    创建用户(服务账号需绑定到用户):

    密码长度需要 8-40

    mc admin user add homes4 app1user app1pass
    

    web 可视化操作,policy 那里随便选个小权限的,后面需要调整

    创建服务账号:为 app1user 生成服务账号,绑定 custom.json 策略

    mc admin user svcacct add homes4 app1user --access-key svc1 --secret-key svc1pass --policy custom.json
    

    可视化操作创建服务状态,凭证信息会随机生成,且只显示一次

    策略信息只能在生成 access key 后才能编辑操作

    实用技巧:兼顾安全与便利

    • 优先 Custom 模式:比 public 安全,精确控制分享内容。
    • 避免 Public 模式:除非真想完全公开,否则可能暴露所有文件。
    • 检查权限:定期用 mc anonymous get-json homes4/web 确认存储桶权限
    • 随机存储桶名:用随机名,降低被猜到风险
    • 用预签名 URL 临时分享:生成带有效期的链接,过期失效:
    # 分享下载链接,下载速度限制10MB/s有效期7天
    mc share download --limit-download 10MB homes4/web/private/secret.pdf
    

    总结

    MinIO 的权限配置简单而灵活,用服务账号拥有某个存储桶的只读权限就行了。




沪ICP备19023445号-2号
友情链接