文档

权限策略及示例

更新时间:

函数计算权限管理通过阿里云的访问控制RAM实现。使用访问控制RAM可以让您避免与其他用户共享云账号密钥,即AccessKey(包含AccessKey ID和AccessKey Secret),按需为RAM用户分配最小权限。本文介绍函数计算的权限策略,包括系统策略、自定义策略及自定义策略示例。

策略类型

在访问控制中,权限策略是用语法和结构描述的一组权限的集合,可以精确地描述被授权的Resource(资源集)、Action(操作集)以及授权条件。函数计算包含以下权限策略:

  • 系统策略:统一由阿里云创建,您只能使用不能修改,策略的版本更新由阿里云维护。

  • 自定义策略:您可以自主创建、更新和删除,策略的版本更新由您自己维护。

系统策略

当您首次使用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参数设置为 HTTPHTTP,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]'"
}