API网关权限管理
如果您需要对华为云上购买的API网关资源,给企业中的员工设置不同的访问权限,以达到不同员工之间的权限隔离,您可以使用统一身份认证服务(Identity and Access Management,简称IAM)进行精细的权限管理。该服务提供用户身份认证、权限分配、访问控制等功能,可以帮助您安全的控制华为云资源的访问。
通过IAM,您可以在华为云帐号中给员工创建IAM用户,并使用策略来控制员工对API网关资源的访问范围。
如果华为云帐号已经能满足您的需求,不需要创建独立的IAM用户进行权限管理,您可以跳过以下内容,不影响您使用API网关服务的其它功能。
IAM是华为云提供权限管理的基础服务,无需付费即可使用,您只需要为您帐号中的资源进行付费。关于IAM的详细介绍,请参见《IAM产品介绍》。
API网关系统角色
默认情况下,管理员创建的IAM用户没有任何权限,需要将其加入用户组,并给用户组授予策略或角色,才能使得用户组中的用户获得对应的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对云服务进行操作。
API网关服务部署时通过物理区域划分,为项目级服务。授权时,“作用范围”需要选择“区域级项目”,然后在指定区域(如华北-北京1)对应的项目(cn-north-1)中设置相关权限,并且该权限仅对此项目生效;如果在“所有项目”中设置权限,则该权限在所有区域项目中都生效。访问API网关服务时,需要先切换至授权区域。
权限根据授权精细程度分为角色和策略,策略是角色的升级版。
角色:IAM最初提供的一种根据用户的工作职能定义权限的粗粒度授权机制。该机制以服务为粒度,提供有限的服务相关角色用于授权。由于华为云各服务之间存在业务依赖关系,因此给用户授予角色时,可能需要一并授予依赖的其他角色,才能正确完成业务。角色并不能满足用户对精细化授权的要求,无法完全达到企业对权限最小化的安全管控要求。
策略:IAM最新提供的一种细粒度授权的能力,可以精确到具体服务的操作、资源以及请求条件等。基于策略的授权是一种更加灵活的授权方式,能够满足企业对权限最小化的安全管控要求。例如:针对API网关服务,管理员能够控制IAM用户进行指定的管理操作。权限策略以API接口为粒度进行权限拆分,API网关服务支持的API授权项请参见权限策略和授权项。
如表所示,包括了API网关的所有系统角色和策略。
系统角色/策略名称
|
描述
|
类别
|
依赖关系
|
---|---|---|---|
APIG Administrator |
API网关服务的管理员权限。拥有该权限的用户可以使用共享版和专享版API网关服务的所有功能。 |
系统角色 |
无。 |
APIG FullAccess |
API网关服务所有权限。拥有该权限的用户可以使用专享版API网关服务的所有功能。 |
系统策略 |
无。 |
APIG ReadOnlyAccess |
API网关服务的只读访问权限。拥有该权限的用户只能查看专享版API网关的各类信息。 |
系统策略 |
无。 |
API网关自定义策略
如果系统预置的API网关权限,不满足您的授权要求,可以创建自定义策略。自定义策略中可以添加的授权项(Action)请参考权限策略和授权项。
目前华为云支持以下两种方式创建自定义策略:
可视化视图创建自定义策略:无需了解策略语法,按可视化视图导航栏选择云服务、操作、资源、条件等策略内容,可自动生成策略。
JSON视图创建自定义策略:可以在选择策略模板后,根据具体需求编辑策略内容;也可以直接在编辑框内编写JSON格式的策略内容。
具体创建步骤请参见创建自定义策略。以下为常用的API网关自定义策略样例。
示例1:授权用户创建API、调试API的权限
{
"Version": "1.1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"
apig:apis:create
apig:apis:debug
"
]
}
]
}
示例2:拒绝用户创建API分组
拒绝策略需要同时配合其他策略使用,否则没有实际作用。用户被授予的策略中,一个授权项的作用如果同时存在Allow和Deny,则遵循Deny优先。
如果您给用户授予APIG FullAccess的系统策略,但不希望用户拥有APIG FullAccess中定义的创建API分组权限,您可以创建一条拒绝创建API分组的自定义策略,然后同时将APIG FullAccess和拒绝策略授予用户,根据Deny优先原则,则用户可以执行除创建API分组外的所有操作。拒绝策略示例如下:
{
"Version": "1.1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"
apig:apis:create
apig:apis:debug
"
]
}
]
}
API网关权限策略和授权项
如果您需要对您所拥有的API网关服务进行精细的权限管理,您可以使用统一身份认证服务。
默认情况下,新建的IAM用户没有任何权限,您需要将其加入用户组,并给用户组授予策略(以JSON格式描述权限集的语言),才能使用户组中的用户获得策略定义的权限,这一过程称为授权。授权后,用户就可以基于策略对云服务进行操作。关于策略的语法结构及示例,请参见上文。
华为云帐号具备所有接口的调用权限,如果使用帐号下的IAM用户发起API请求时,该IAM用户必须具备调用该接口所需的权限,否则,API请求将调用失败。每个接口所需要的权限,与各个接口所对应的授权项相对应,只有发起请求的IAM用户被授予授权项所对应的策略,该用户才能成功调用该接口。例如,IAM用户要调用接口来创建API,那么这个IAM用户被授予的策略中必须包含允许“apig:apis:create”的授权项,该接口才能调用成功。
支持的授权项
细粒度策略支持的操作与API相对应,授权项列表说明如下:
- 权限:自定义策略中授权项定义的内容即为权限。
- 授权项:自定义策略中支持的Action,在自定义策略中的Action中写入授权项,可以实现授权项对应的权限功能。
- 对应API接口:自定义策略实际调用的API接口。
- 授权范围:自定义策略的授权范围,包括IAM项目与企业项目。授权范围如果同时支持IAM项目和企业项目,表示此授权项对应的自定义策略,可以在IAM和企业管理两个服务中给用户组授权并生效。如果仅支持IAM项目,不支持企业项目,表示仅能在IAM中给用户组授权并生效,如果在企业管理中授权,则该自定义策略不生效。
以下仅给出部分授权项,更多API网关权限明细请参考权限明细。
权限描述
|
授权项
|
对应的API
|
IAM项目(Project)
|
企业项目(Enterprise Project)
|
---|---|---|---|---|
创建API网关专享版实例 |
apig:instances:create |
POST /v2/{project_id}/apigw/instances |
√ |
√ |
更新API网关专享版实例 |
apig:instances:update |
PUT /v2/{project_id}/apigw/instances/{instance_id} |
√ |
√ |
查看API网关专享版实例 |
apig:instances:get |
GET /v2/{project_id}/apigw/instances/{instance_id} |
√ |
√ |
创建API分组 |
apig:groups:create |
POST /v2/{project_id}/apigw/instances/{instance_id}/api-groups |
√ |
√ |
查看API分组 |
apig:groups:get |
GET /v2/{project_id}/apigw/instances/{instance_id}/api-groups/{group_id} |
√ |
√ |
分组域名绑定证书 |
apig:domains:bindCertificat |
POST /v2/{project_id}/apigw/instances/{instance_id}/api-groups/{group_id}/domains/{domain_id}/certificate |
√ |
√ |
查看环境变量 |
apig:variables:get |
GET /v2/{project_id}/apigw/instances/{instance_id}/env-variables/{env_variable_id} |
√ |
√ |
创建API |
apig:apis:create |
POST /v2/{project_id}/apigw/instances/{instance_id}/apis |
√ |
√ |
发布API |
apig:apis:publish |
POST /v2/{project_id}/apigw/instances/{instance_id}/apis/action |
√ |
√ |
下线API |
apig:apis:offline |
POST /v2/{project_id}/apigw/instances/{instance_id}/apis/action |
√ |
√ |
调试API |
apig:apis:debug |
POST /v2/{project_id}/apigw/instances/{instance_id}/apis/debug/{api_id} |
√ |
√ |
导入API |
apig:apis:import |
POST /v2/{project_id}/apigw/instances/{instance_id}/openapi/import |
√ |
√ |