
# 跨服务转发访问
跨服务转发访问是指云服务需要与下游云服务交互才能完成用户请求时，由云服务代表调用者身份向下游云服务发起转发请求的一种技术，发起该请求的云服务将传递您的[身份](https://support.huaweicloud.com/usermanual-iam5/iam_01_1282.html)、[权限](https://support.huaweicloud.com/usermanual-iam5/iam_01_1159.html)和[会话属性](https://support.huaweicloud.com/usermanual-iam5/iam_01_1287.html#iam_01_1287__section1577113583599)。在跨服务转发访问场景下，云服务以调用者的身份并结合与下游云服务约定好的协议向下游云服务发起请求。在跨服务转发访问场景下：
- 接受IAM主体访问请求的首个云服务会校验IAM主体的权限。
- 跨服务转发访问的下游云服务也会检查同一IAM主体的权限。
例如，当使用[SSE-KMS](https://support.huaweicloud.com/usermanual-obs/obs_03_0090.html)加密对象时，对象存储服务（OBS）使用跨服务转发访问调用密钥管理服务（KMS）以解密该对象。当下载SSE-KMS加密对象时，用户直接调用OBS服务获取对象，而不会直接调用KMS服务去获取密钥来解密该对象。在OBS服务接收到获取对象的请求后，OBS服务会发起跨服务转发调用请求至KMS服务，用以解密该对象数据。当KMS服务接收到跨服务转发请求后，会校验用户是否具有对所需的KMS密钥的权限。换句话讲，用户必须同时具有OBS对象访问的权限和获取KMS密钥的权限才能完成下载SSE-KMS加密对象的操作。
![](https://support.huaweicloud.com/usermanual-iam5/zh-cn_image_0000002400410973.png "点击放大")
![](https://support.huaweicloud.com/usermanual-iam5/public_sys-resources/note_3.0-zh-cn.png)
收到跨服务访问请求的服务可以发出其他跨服务访问请求，在这种情况下，请求的主体必须拥有对跨服务访问请求链路上调用的所有服务的权限。
#### 跨服务转发访问及其IAM相关条件键
当发起跨服务访问请求时，g:CalledVia、g:CalledViaFirst、g:CalledViaLast条件键将填充发起跨服务转发访问的云服务主体信息。每当发出跨服务转发访问时，g:ViaService条件键都将设置为true。在下图中，直接向OBS发出的请求未设置任何g:CalledVia或g:ViaService条件键。当OBS代表用户身份发起下游的跨服务访问时会填充这些条件键的值。有关这些条件键的详细介绍，请参见[全局条件键](https://support.huaweicloud.com/usermanual-iam5/iam_01_1287.html)。
![](https://support.huaweicloud.com/usermanual-iam5/zh-cn_image_0000002366978446.png "点击放大")
当在限制源IP地址或源VPC访问的场景下，您必须使用跨服务转发访问的相关条件键为跨服务访问请求提供例外。使用g:ViaService条件键可以为所有跨服务访问请求提供此例外，若要指定特定云服务请使用g:CalledVia。
![](https://support.huaweicloud.com/usermanual-iam5/public_sys-resources/note_3.0-zh-cn.png)
在通过VPC EP或经过公网发起请求时，初始请求的g:SourceVpce、g:SourceVpc、g:VpcSourceIp、g:SourceIp的条件键值不会向跨服务转发访问请求传递。在使用g:SourceVpce、g:SourceVpc、g:VpcSourceIp、g:SourceIp编写策略时还必须使用g:ViaService、g:CalledVia等条件键允许跨服务转发访问。
#### 示例：允许跨服务转发访问ECS
在以下IAM policy示例中，仅允许用户在指定IP内编程访问ECS服务且支持不在该Ip段内可跨服务转发访问ECS服务。
```
{
"Version": "5.0",
"Statement": [{
"Effect": "Allow",
"Action": ["ecs:*:*"],
"Resource": ["*"],
"Condition": {
"IpAddress": {
"g:SourceIp": ["103.218.xxx.xxx/32"]
}
}
}, {
"Effect": "Allow",
"Action": ["ecs:*:*"],
"Resource": ["*"],
"Condition": {
"Bool": {
"g:ViaService": "true"
}
}
}]
}
```
