函数计算权限管理通过阿里云的访问控制RAM实现。使用访问控制RAM可以让您避免与其他用户共享云账号密钥,即AccessKey(包含AccessKey ID和AccessKey Secret),按需为RAM用户分配最小权限。本文介绍函数计算的权限策略,包括系统策略、自定义策略及自定义策略示例。
策略类型
系统策略
当您首次使用RAM用户登录函数计算控制台时,不仅需要通过阿里云账号给您的RAM用户添加访问函数计算的系统权限策略,也需要给RAM用户添加访问其他云服务的系统权限策略。成功授权后,您的RAM用户才可以正常访问函数计算服务及其他云产品服务。
系统策略包含以下类型:
函数计算服务提供的系统策略。
权限策略名称
描述
AliyunFCReadOnlyAccess
表示允许对函数计算所有的资源进行读操作。
AliyunFCInvocationAccess
表示允许对所有函数的资源进行执行操作。
AliyunFCFullAccess
表示允许对所有函数计算资源进行所有执行操作。
说明管理函数计算服务权限AliyunFCFullAccess内包含调用函数计算服务函数的权限AliyunFCInvocationAccess及只读访问函数计算服务权限AliyunFCReadOnlyAccess。当成功授权管理函数计算服务的权限后,您无需再授权调用函数或只读函数计算的权限。
其他云产品服务提供的系统策略。
云产品名称
系统策略
日志服务SLS
AliyunLogReadOnlyAccess:只读访问日志服务Log的权限。
AliyunLogFullAccess:管理日志服务Log的权限。
说明基于最小权限的原则,您只需授予RAM用户只读访问日志服务Log的权限AliyunLogReadOnlyAccess即可访问日志服务Log。
对象存储OSS
AliyunOSSReadOnlyAccess:只读对象存储服务OSS的权限。
AliyunOSSFullAccess:管理对象存储服务OSS权限。
云监控
AliyunCloudMonitorReadOnlyAccess:只读访问云监控CloudMonitor的权限。
云盾证书服务
AliyunYundunCertReadOnlyAccess:只读访问云盾证书服务的权限。
专有网络VPC
AliyunVPCReadOnlyAccess:只读访问专有网络VPC的权限。
云服务器ECS
AliyunECSReadOnlyAccess:只读访问云服务器服务ECS的权限。
访问控制RAM
AliyunRAMReadOnlyAccess:只读访问控制RAM的权限,即查看用户、组以及授权信息的权限。
AliyunRAMFullAccess:管理访问控制RAM的权限,即管理用户以及授权的权限。
说明AliyunRAMReadOnlyAccess仅适用于在控制台获取角色的列表,当RAM用户还需要进行其他操作,您需给RAM用户添加管理访问控制RAM的权限,即AliyunRAMFullAccess。
应用实时监控服务ARMS
AliyunARMSReadOnlyAccess:只读访问应用实时监控服务ARMS的权限。
AliyunARMSFullAccess:管理应用实时监控服务ARMS的权限。
说明基于最小权限的原则,您只需授予RAM用户只读访问应用实时监控服务ARMS的权限AliyunARMSReadOnlyAccess即可访问应用实时监控服务ARMS。
轻量消息队列(原 MNS)
AliyunMNSReadOnlyAccess:只读访问轻量消息队列(原 MNS)的权限。
AliyunMNSFullAccess:管理轻量消息队列(原 MNS)的权限。
说明基于最小权限的原则,您只需授予RAM用户只读访问轻量消息队列(原 MNS)的权限即AliyunMNSReadOnlyAccess即可满足访问轻量消息队列(原 MNS)。
事件总线EventBridge
AliyunEventBridgeReadOnlyAccess:只读访问事件总线EventBridge的权限。
AliyunEventBridgeFullAccess:管理事件总线EventBridge的权限。
说明基于最小权限的原则,您只需授予RAM用户只读访问事件总线EventBridge的权限即AliyunEventBridgeReadOnlyAccess即可满足访问事件总线EventBridge。
消息队列RocketMQ版
AliyunMQReadOnlyAccess:只读访问消息队列MQ的权限。
AliyunMQFullAccess:管理消息队列MQ的权限。
说明基于最小权限的原则,您只需授予RAM用户只读访问消息队列MQ的权限即AliyunMQReadOnlyAccess即可满足访问消息队列RocketMQ版。
容器镜像服务ACR
AliyunContainerRegistryReadOnlyAccess:只读访问容器镜像服务ContainerRegistry的权限。
AliyunContainerRegistryFullAccess:管理容器镜像服务ContainerRegistry的权限。
说明基于最小权限的原则,您只需授予RAM用户只读访问容器镜像服务ContainerRegistry的权限即AliyunContainerRegistryReadOnlyAccess即可访问容器镜像服务。
文件存储NAS
AliyunNASReadOnlyAccess:查看文件存储服务NAS的权限。
AliyunNASFullAccess:管理文件存储服务NAS的权限。
说明基于最小权限的原则,您只需授予RAM用户查看文件存储服务(NAS)的权限即AliyunNASReadOnlyAccess即可满足访问文件存储服务。
云数据库RDS
AliyunRDSReadOnlyAccess:只读访问云数据库服务RDS的权限。
AliyunRDSFullAccess:管理云数据库服务RDS的权限。
说明基于最小权限的原则,您只需授予RAM用户只读访问云数据库服务RDS的权限即AliyunRDSReadOnlyAccess即可满足访问云数据库服务。
云效
AliyunRDCReadOnlyAccess:只读访问云效RDC的权限。
AliyunRDCFullAccess:管理云效RDC的权限。
说明基于最小权限的原则,您只需授予RAM用户只读访问云效RDC的权限,即AliyunRDCReadOnlyAccesss,即可满足访问云效RDC。
当阿里云账号给RAM用户授予关于触发器相关的权限,例如,对象存储OSS的AliyunOSSFullAccess权限后,出现无法更新触发器的情况时,阿里云账号还需给RAM用户添加如下自定义策略。成功授权后RAM用户可以正常更新对象存储触发器。
{
"Statement": [
{
"Action": [
"ram:PassRole"
],
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "1"
}
自定义策略
除了函数计算默认提供的系统策略外,您也可以通过自定义策略进行更细粒度的权限管理。关于权限策略的基本信息,请参见权限策略基本元素。
Action | Resource | 描述 |
fc:ListFunctionAsyncInvokeConfigs | acs:fc:{region}:{uid}:async-invoke-configs/* acs:fc:{region}:{uid}:functions/{functionName} | 异步调用配置。 |
fc:ListConcurrencyConfigs | acs:fc:{region}:{uid}:concurrency-configs/* acs:fc:{region}:{uid}:functions/{functionName} | 并发配置。 |
fc:ListCustomDomains | acs:fc:{region}:{uid}:custom-domains/* | 所有自定义域名。 |
fc:GetCustomDomain | acs:fc:{region}:{uid}:custom-domains/{domainName} | 指定自定义域名。 |
fc:DeleteCustomDomain | ||
fc:UpdateCustomDomain | ||
fc:CreateCustomDomain | ||
fc:ListFunctions | acs:fc:{region}:{uid}:functions/* | 所有函数资源。 |
fc:DeleteConcurrencyConfig | acs:fc:{region}:{uid}:functions/{functionName} | |
fc:PutConcurrencyConfig | acs:fc:{region}:{uid}:functions/{functionName} | |
fc:DeleteFunction | acs:fc:{region}:{uid}:functions/{functionName} | |
fc:UpdateFunction | acs:fc:{region}:{uid}:functions/{functionName} | |
fc:CreateFunction | acs:fc:{region}:{uid}:functions/{functionName} | |
fc:GetConcurrencyConfig | acs:fc:{region}:{uid}:functions/{functionName} | |
fc:GetFunction | acs:fc:{region}:{uid}:functions/{functionName} | |
fc:ListAliases | acs:fc:{region}:{uid}:functions/{functionName}/aliases/* | 所有别名。 |
fc:CreateAlias | acs:fc:{region}:{uid}:functions/{functionName}/aliases/{aliasName} | 指定别名。 |
fc:UpdateAlias | acs:fc:{region}:{uid}:functions/{functionName}/aliases/{aliasName} | |
fc:GetAlias | acs:fc:{region}:{uid}:functions/{functionName}/aliases/{aliasName} | |
fc:DeleteAlias | acs:fc:{region}:{uid}:functions/{functionName}/aliases/{aliasName} | |
fc:ListInstances | acs:fc:{region}:{uid}:functions/{functionName}/instances/* | 实例信息。 |
fc:ListTriggers | acs:fc:{region}:{uid}:functions/{functionName}/triggers/* | 指定函数下的所有触发器资源。 |
fc:CreateTrigger | acs:fc:{region}:{uid}:functions/{functionName}/triggers/{triggerName} | 指定函数下的特定触发器资源。 |
fc:UpdateTrigger | acs:fc:{region}:{uid}:functions/{functionName}/triggers/{triggerName} | |
fc:GetTrigger | acs:fc:{region}:{uid}:functions/{functionName}/triggers/{triggerName} | |
fc:DeleteTrigger | acs:fc:{region}:{uid}:functions/{functionName}/triggers/{triggerName} | |
fc:PublishFunctionVersion | acs:fc:{region}:{uid}:functions/{functionName}/versions | 所有版本。 |
fc:ListFunctionVersions | acs:fc:{region}:{uid}:functions/{functionName}/versions/* | |
fc:DeleteFunctionVersion | acs:fc:{region}:{uid}:functions/{functionName}/versions/{versionId} | 指定版本。 |
fc:ListVpcBindings | acs:fc:{region}:{uid}:functions/{functionName}/vpc-bindings/* | VPC绑定。 |
fc:CreateVpcBinding | acs:fc:{region}:{uid}:functions/{functionName}/vpc-bindings/* | |
fc:DeleteVpcBinding | acs:fc:{region}:{uid}:functions/{functionName}/vpc-bindings/{vpcId} | |
fc:GetFunctionCode | acs:fc:{region}:{uid}:functions/{functionName} acs:fc:{region}:{uid}:functions/{functionName}/{qualifier} | 所有函数代码。 |
fc:GetFunctionAsyncInvokeConfig | acs:fc:{region}:{uid}:functions/{functionName} acs:fc:{region}:{uid}:functions/{functionName}/{qualifier} | 所有函数资源。 |
fc:DeleteProvisionConfig | acs:fc:{region}:{uid}:functions/{functionName} acs:fc:{region}:{uid}:functions/{functionName}/{qualifier} | |
fc:PutProvisionConfig | acs:fc:{region}:{uid}:functions/{functionName} acs:fc:{region}:{uid}:functions/{functionName}/{qualifier} | |
fc:InvokeFunction | acs:fc:{region}:{uid}:functions/{functionName} acs:fc:{region}:{uid}:functions/{functionName}/{qualifier} | |
fc:PutFunctionAsyncInvokeConfig | acs:fc:{region}:{uid}:functions/{functionName} acs:fc:{region}:{uid}:functions/{functionName}/{qualifier} | |
fc:GetProvisionConfig | acs:fc:{region}:{uid}:functions/{functionName} acs:fc:{region}:{uid}:functions/{functionName}/{qualifier} | |
fc:DeleteFunctionAsyncInvokeConfig | acs:fc:{region}:{uid}:functions/{functionName} acs:fc:{region}:{uid}:functions/{functionName}/{qualifier} | |
fc:GetLayerVersionByArn | acs:fc:{region}:{uid}:layerarn/{arn} | 所有层。 |
fc:ListLayers | acs:fc:{region}:{uid}:layers/* | |
fc:PutLayerACL | acs:fc:{region}:{uid}:layers/{layerName} | |
fc:ListLayerVersions | acs:fc:{region}:{uid}:layers/{layerName}/versions/* | |
fc:CreateLayerVersion | acs:fc:{region}:{uid}:layers/{layerName}/versions/* | |
fc:DeleteLayerVersion | acs:fc:{region}:{uid}:layers/{layerName}/versions/{version} | |
fc:GetLayerVersion | acs:fc:{region}:{uid}:layers/{layerName}/versions/{version} | |
fc:ListProvisionConfigs | acs:fc:{region}:{uid}:provision-configs/* acs:fc:{region}:{uid}:functions/{functionName} | 预留实例配置。 |
您可以通过以上自定义的权限策略设置具有调用华东1(杭州)地域下demo函数的权限,具体策略如下所示:
{
"Version": "1",
"Statement": [
{
"Action": [
"fc:InvokeFunction"
],
"Resource": "acs:fc:cn-hangzhou:*:functions/demo",
"Effect": "Allow"
}
]
}
权限策略示例
自定义创建和获取服务以及创建和执行函数权限策略
{
"Version": "1",
"Statement": [{
"Action": [
"fc:CreateFunction",
"fc:GetFunction",
"fc:InvokeFunction"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": [
"ram:PassRole"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
自定义访问日志权限策略
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"log:ListProject",
"log:ListLogStore"
],
"Resource": "acs:log:*:*:project/*"
}
]
}
自定义访问OSS触发器权限策略
{
"Statement": [
{
"Action": [
"oss:ListBucket",
"oss:GetBucketEventNotification",
"oss:PutBucketEventNotification",
"oss:DeleteBucketEventNotification"
],
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "1"
}
自定义禁止创建支持访问公网的服务权限策略
{
"Version": "1",
"Statement": [
{
"Action": "fc:UpdateFunction",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"StringEquals": {
"fc:EnableServiceInternetAccess": "true"
}
}
},
{
"Action": "fc:CreateFunction",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"fc:EnableServiceInternetAccess": "false"
}
}
}
]
}
自定义禁止创建无法打开日志访问的服务权限策略
{
"Version": "1",
"Statement": [
{
"Action": "fc:UpdateFunction",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"StringEquals": {
"fc:EnableServiceSLSLogging": "false"
}
}
},
{
"Action": "fc:CreateFunction",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"fc:EnableServiceSLSLogging": "true"
}
}
}
]
}
自定义禁止创建支持公网访问的触发器权限策略
{
"Version": "1",
"Statement": [
{
"Action": "fc:UpdateTrigger",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"StringEquals": {
"fc:EnableHTTPTriggerAnonymous": "true"
}
}
},
{
"Action": "fc:CreateTrigger",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"StringEquals": {
"fc:EnableHTTPTriggerAnonymous": "true"
}
}
}
]
}
自定义禁止创建匿名访问的触发器权限策略
{
"Version": "1",
"Statement": [
{
"Action": "fc:UpdateTrigger",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"StringEquals": {
"fc:EnableHTTPTriggerAnonymous": "true"
}
}
},
{
"Action": "fc:CreateTrigger",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"StringEquals": {
"fc:EnableHTTPTriggerAnonymous": "true"
}
}
}
]
}
该权限策略会禁止用户在API CreateTrigger - 创建触发器和UpdateTrigger - 更新触发器中将authType
参数设置为anonymous
(不需要认证),只允许设置为function
(需要认证)。该限制仅适用于HTTP触发器,更多信息,请参见HTTPTriggerConfig。
如果尝试创建开启authType=anonymous
的HTTP触发器,会出现403 AccessDenied
报错。示例如下:
{
"statusCode":403,
"Code":"AccessDenied",
"Message":"the caller is not authorized to perform 'fc:CreateTrigger' on resource 'acs:fc:xx:xx:functions/xx/triggers/xx' with condition '[fc:EnableHTTPTriggerAnonymous=true]'"
}
自定义禁止创建支持HTTP协议访问的自定义域名的权限策略
{
"Version": "1",
"Statement": [
{
"Action": "fc:CreateCustomDomain",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"StringEquals": {
"fc:EnableCustomDomainHTTP": "true"
}
}
},
{
"Action": "fc:UpdateCustomDomain",
"Effect": "Deny",
"Resource": "*",
"Condition": {
"StringEquals": {
"fc:EnableCustomDomainHTTP": "true"
}
}
}
]
}
该权限策略会禁止用户在API CreateCustomDomain - 创建自定义域名和UpdateCustomDomain - 更新自定义域名中将protocol
参数设置为 HTTP
或 HTTP,HTTPS
,只能设置为 HTTPS
。
如果尝试创建开启HTTP
协议的自定义域名,会出现 403 AccessDenied
报错,示例如下:
{
"statusCode":403,
"Code":"AccessDenied",
"Message":"the caller is not authorized to perform 'fc:CreateCustomDomain' on resource 'acs:fc:xxx:xxx:custom-domains/xxx' with condition '[fc:EnableCustomDomainHTTP=true]'"
}