You need to enable JavaScript to run this app.
导航
IAM 授权最佳实践
最近更新时间:2025.01.09 11:24:53首次发布时间: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",
                      "vefaas:GetDependencyInstallTaskStatus"
                  ],
                  "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": [
                      "*"
                  ]
              }
          ]
      }
      
    2. 为已创建的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 标签,其余标签会被拒绝。

      {
          "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",
                      "vefaas:GetDependencyInstallTaskStatus"
                  ],
                  "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": [
                      "*"
                  ]
              }
          ]
      }
      
    2. 为已创建的vefaas-other-generate-operation策略添加全局授权。

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

结果验证

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

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