You need to enable JavaScript to run this app.
导航
IAM 授权最佳实践
最近更新时间:2024.10.18 16:07:35首次发布时间:2024.10.18 16:07:35

本文介绍函数服务 veFaaS 针对 IAM 用户的授权最佳实践。

前提条件

已创建 IAM 用户。详细操作,请参见 用户管理

场景一:使用全局范围的预设策略并授权

场景介绍

veFaaS 提供如下几种系统预设策略,可直接为 IAM 用户授权。

策略说明
VeFaaSFullAccess函数服务全部管理权限。
VeFaaSReadOnlyAccess函数服务只读访问权限。

操作步骤

  1. 使用火山引擎账号或具有相关权限的 IAM 用户登录 IAM 控制台

  2. 在左侧导航栏选择 身份管理 > 用户

  3. 在用户列表中,找到需要设置权限的用户名,单击对应 操作 列下的 管理

  4. 用户详情 页面,选择 权限 > 全局权限 页签,单击 添加权限

  5. 添加权限 面板的搜索框中输入 函数服务,搜索函数服务相关的系统预设策略。

  6. 根据实际需求选择目标策略,单击 确定,为 IAM 用户添加 veFaaS 相关的权限策略。

场景二:创建项目范围使用的自定义权限并授权

场景介绍

veFaaS 中部分操作(Action)和资源(Resource)是按照项目(Project)划分的,可满足项目粒度的权限控制需求。若需要将该类操作和资源授权给 IAM 用户,需要以项目权限的形式授予。

说明

支持按项目授权的 Action 包括:

  • CreateFunction
  • UpdateFunction

操作步骤

  1. 使用火山引擎账号或具有相关权限的 IAM 用户登录 IAM 控制台

  2. 新建自定义策略。

    1. 在左侧导航栏选择 策略管理,在策略管理页面,单击 新建自定义策略

    2. 在新建自定义策略页面,输入策略名称和策略内容,并单击 提交
      假设策略名称为vefaas-create-project,JSON 内容示例如下。您可按需自行增删具体的 Action 或 Resource 。

      {
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "vefaas:CreateFunction",
                      "vefaas:UpdateFunction"
                  ],
                  "Resource": [
                      "*"
                  ]
              }
          ]
      }
      
  3. 为已创建的 vefaas-create-project 策略添加项目授权。

    1. 单击 vefaas-create-project 策略名称,进入当前策略详情页面。

    2. 授权 > 项目授权 页签,单击 添加授权。

    3. 选择要授权的用户和作用的项目。

    4. 单击 确定,完成项目授权。

  4. 为无法按照项目划分的 Action 和 Resource 新建自定义策略,并以全局权限的形式授权给目标 IAM 用户。

    说明

    veFaaS 中有一部分 Action 和 Resource 是无法按照项目划分,因此为 IAM 用户授予项目权限的同时,还需要将无法按照项目划分的 Action 和 Resource,以全局权限的形式授予给该 IAM 用户。否则该 IAM 用户可能无法正常操作和使用 veFaaS 资源。

    1. 新建自定义策略。
      假设名称为vefaas-read-global。策略的 JSON 内容示例如下所示,请按需自行增删具体的 Action 或 Resource。
    {
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "vefaas:Release",
                    "vefaas:TestInvoke",
                    "vefaas:DeleteFunction",
                    "vefaas:AbortRelease",
                    "vefaas:UpdateRelease",
                    "vefaas:GetAvailabilityZones",
                    "vefaas:GetFunction",
                    "vefaas:GetFunctionInstanceLogs",
                    "vefaas:GetReleaseStatus",
                    "vefaas:GetRevision",
                    "vefaas:GetStorageVolumeStatus",
                    "vefaas:ListFunctionInstances",
                    "vefaas:ListReleaseRecords",
                    "vefaas:ListRuntimes",
                    "vefaas:ListFunctions",
                    "vefaas:ListRevisions",
                    "vefaas:ListTemplates",
                    "vefaas:DoesFunctionNameExist"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "apig:GetGateway",
                    "apig:ListGateways",
                    "apig:ListGatewayServices",
                    "apig:GetGatewayService",
                    "apig:DeleteGatewayService",
                    "apig:CreateUpstream",
                    "apig:CheckUpstreamSpecExist",
                    "apig:GetUpstream",
                    "apig:DeleteUpstream",
                    "apig:CreateRoute",
                    "apig:UpdateRoute",
                    "apig:ListRoutes",
                    "apig:DeleteRoute"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "vpc:DescribeVpcs",
                    "vpc:DescribeVpcAttributes",
                    "vpc:DescribeSubnets",
                    "vpc:DescribeSubnetAttributes",
                    "vpc:DescribeSecurityGroups",
                    "vpc:DescribeSecurityGroupAttributes"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "tls:DescribeProject",
                    "tls:DescribeProjects",
                    "tls:DescribeTopic",
                    "tls:DescribeTopics",
                    "tls:DescribeIndex",
                    "tls:DescribeIndexConfig",
                    "tls:DescribeHistogram",
                    "tls:SearchLogs",
                    "tls:Statistics"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "cr:ListRegistries",
                    "cr:ListRepositories",
                    "cr:ListNamespaces",
                    "cr:ListTags"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "kafka:DescribeKafkaInstances",
                    "kafka:DescribeInstanceDetail",
                    "kafka:DescribeTopics",
                    "kafka:DescribeUsers"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "rocketmq:ListInstances",
                    "rocketmq:ListTopics",
                    "rocketmq:ListGroups",
                    "rocketmq:GetInstance"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "tos:PutBucketNotification",
                    "tos:ListBuckets",
                    "tos:ListBucket",
                    "tos:HeadBucket",
                    "tos:GetObject"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "apmplus_server:GetMetricsData",
                    "apmplus_server:Draw"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "bill_volcano_engine:ListResourcePackage"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "FileNAS:DescribeFileSystems"
                ],
                "Resource": [
                    "*"
                ]
            }
        ]
    }
    
    1. 为已创建的vefaas-read-global 策略添加全局授权。
      vefaas-read-global 策略策略详情页面,选择 授权 > 全局授权 页签,单击 添加授权。 选择要授权的用户,并单击 确定,完成全局授权。

结果验证

IAM 用户在非 default 项目下试图创建函数,会提示没有权限。

场景三:创建基于标签的自定义权限并授

场景介绍

veFaaS 中部分操作(Action)和资源(Resource)接入了标签(Tag),可满足标签粒度的权限控制需求。

说明

支持管理标签的 Action 包括:

  • CreateFunction
  • UpdateFunction

操作步骤

  1. 使用火山引擎账号或具有相关权限的 IAM 用户登录 IAM 控制台

  2. 新建自定义策略。

    1. 在左侧导航栏选择 策略管理,在策略管理页面,单击 新建自定义策略

    2. 在新建自定义策略页面,输入策略名称和策略内容,并单击 提交
      假设名称为 vefaas-function-operation-by-tag,表明 CreateFunction 和 UpdateFunction 只允许操作 team:ai-prompt 标签,其余标签会被拒绝。

      ```bash
       {
           "Statement": [
               {
                   "Effect": "Allow",
                   "Action": [
                       "vefaas:CreateFunction",
                       "vefaas:UpdateFunction"
                   ],
                   "Resource": [
                       "*"
                   ],
                   "Condition": {
                       "StringEquals": {
                           "volc:RequestTag/team": [
                               "ai-prompt"
                           ]
                       }
                   }
               }
           ]
       }
       ```
      
  3. 为已创建的 vefaas-function-operation-by-tag 策略添加全局授权。

    1. 单击 vefaas-function-operation-by-tag 策略名称,进入当前策略详情页面。

    2. 授权 > 全局授权 页签,单击 添加授权。

    3. 选择要授权的用户。

    4. 单击 确定,完成项目授权。

  4. 为无法按照标签授权的 Action 和 Resource 新建自定义策略,并以全局权限的形式授权给目标 IAM 用户。

    说明

    veFaaS 中有一部分 Action 和 Resource 是无法按照标签划分,因此为 IAM 用户授予标签权限的同时,还需要将无法按照标签划分的 Action 和 Resource,以全局权限的形式授予给该 IAM 用户。否则该 IAM 用户可能无法正常操作和使用 veFaaS 资源。

    1. 新建自定义策略。
      假设名称为vefaas-other-generate-operation。策略的 JSON 内容示例如下所示,请按需自行增删具体的 Action 或 Resource 。
    {
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "vefaas:Release",
                    "vefaas:TestInvoke",
                    "vefaas:DeleteFunction",
                    "vefaas:AbortRelease",
                    "vefaas:UpdateRelease",
                    "vefaas:GetAvailabilityZones",
                    "vefaas:GetFunctionInstanceLogs",
                    "vefaas:GetReleaseStatus",
                    "vefaas:GetRevision",
                    "vefaas:GetStorageVolumeStatus",
                    "vefaas:ListFunctionInstances",
                    "vefaas:ListReleaseRecords",
                    "vefaas:ListRuntimes",
                    "vefaas:ListRevisions",
                    "vefaas:ListTemplates",
                    "vefaas:DoesFunctionNameExist",
                    "vefaas:GetTemplateDetail",
                    "vefaas:ListFunctions"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "apig:GetGateway",
                    "apig:ListGateways",
                    "apig:ListGatewayServices",
                    "apig:GetGatewayService",
                    "apig:DeleteGatewayService",
                    "apig:CreateUpstream",
                    "apig:CheckUpstreamSpecExist",
                    "apig:GetUpstream",
                    "apig:DeleteUpstream",
                    "apig:CreateRoute",
                    "apig:UpdateRoute",
                    "apig:ListRoutes",
                    "apig:DeleteRoute"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "vpc:DescribeVpcs",
                    "vpc:DescribeVpcAttributes",
                    "vpc:DescribeSubnets",
                    "vpc:DescribeSubnetAttributes",
                    "vpc:DescribeSecurityGroups",
                    "vpc:DescribeSecurityGroupAttributes"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "tls:DescribeProject",
                    "tls:DescribeProjects",
                    "tls:DescribeTopic",
                    "tls:DescribeTopics",
                    "tls:DescribeIndex",
                    "tls:DescribeIndexConfig",
                    "tls:DescribeHistogram",
                    "tls:SearchLogs",
                    "tls:Statistics"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "cr:ListRegistries",
                    "cr:ListRepositories",
                    "cr:ListNamespaces",
                    "cr:ListTags"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "kafka:DescribeKafkaInstances",
                    "kafka:DescribeInstanceDetail",
                    "kafka:DescribeTopics",
                    "kafka:DescribeUsers"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "rocketmq:ListInstances",
                    "rocketmq:ListTopics",
                    "rocketmq:ListGroups",
                    "rocketmq:GetInstance"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "tos:PutBucketNotification",
                    "tos:ListBuckets",
                    "tos:ListBucket",
                    "tos:HeadBucket",
                    "tos:GetObject"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "apmplus_server:GetMetricsData",
                    "apmplus_server:Draw"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "bill_volcano_engine:ListResourcePackage"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "FileNAS:DescribeFileSystems"
                ],
                "Resource": [
                    "*"
                ]
            }
        ]
    }
    
    1. 为已创建的vefaas-other-generate-operation策略添加全局授权。

      vefaas-other-generate-operation 策略策略详情页面,选择 授权 > 全局授权 页签,单击 添加授权。 选择要授权的用户,并单击 确定,完成全局授权。

结果验证

  • IAM 用户创建标签为team:ai-prompt或包含该标签的函数,成功创建。

  • IAM 用户创建函数不包含标签或者不包括team:ai-prompt的标签,提示没有权限。