# 仅可信网络/预期网络

通过定义预期网络可以解决以下安全问题：

* 防止意外泄漏的AKSK从非公司网络访问；
* 防止意外泄漏的凭证窃取数据；

您可以使用以下 IAM 全局条件键来执行控制目标：

* `aws:SourceIp`:  可以使用这个条件设置仅允许从指定的 IP CIDR 段访问。比如使用你们公司的 IP CIDR段限制仅能从办公网络访问。
* `aws:SourceVpc`: 可以使用这个条件定义指定的VPCs才能访问。比如，只能从指定的VPC ID访问S3存储桶。
* `aws:SourceVpce`: 可以使用这个条件定义指定的 VPC 端点才能访问。增加这个条件可以帮助你限制API请求来自指定的VPC端点。
* `aws:ViaAWSService`: 你可以使用这个条件允许AWS service 使用你的安全凭据代表你执行操作。 比如，当你上传文件到 Amazon S3 使用客户端加密，因此，S3 要请求 AWS KMS 生成一个密钥加密对象。
* `aws:PrincipalIsAWSService`: 这个条件帮助你实现允许 AWS 服务主体访问你的资源。比如你创建了  [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) trail 并且指定了一个 S3 存储桶作为存放目标，CloudTrail 使用服务主体cloudtrail.amazonaws.com, 推送日志到你的 S3 存储桶。从 CloudTrail 发起的API请求 从服务网络来。

结合标签使用可以设置一些绕过SCP控制的资源，比如请求者添加了标签IpRestrictedExempt:true，则不会受到SCP控制。

简单禁用所有操作可以使用SCP如下， IP段为信任的网络，意思是除了给出的IP段访问过来的请求都会被拒绝：

```
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "192.0.2.0/24",
                    "203.0.113.0/24"
                ]
            }
        }
    }
}
```

细化部分操作从可信网络访问过来才允许时设置如下：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "NotAction": [
        "es:ESHttp*",
        "dax:PutItem",
        "dax:Query",
        "dax:Scan",
        "dax:GetItem",
        "dax:DeleteItem",
        "dax:BatchGetItem",
        "dax:BatchWriteItem",
        "dax:ConditionCheckItem",
        "iam:PassRole"
      ],
      "Resource": "*",
      "Condition": {
        "NotIpAddressIfExists": {
          "aws:SourceIp": [
            "<my-corporate-cidr>",
            "203.0.113.0/24"
          ]
        },
        "StringNotEqualsIfExists": {
          "aws:SourceVpc": [
            "vpc-012abc01",
            "vpc-023edf34"
          ]
        },
        "Bool": {
          "aws:ViaAWSService": "false"
        },
        "Null": {
          "aws:PrincipalTag/IpRestrictedExempt": true
        },
        "ArnNotLike": {
          "aws:PrincipalArn": "arn:aws:iam::*:role/aws:ec2-infrastructure"
        }
      }
    }
  ]
}

```

替换\<my-data-bucket>, \<my-corporate-cidr>和\<my-vpc>为你自己的信息：

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "EnforceNetworkPerimeter",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::<my-data-bucket>",
        "arn:aws:s3:::<my-data-bucket>/*"
      ],
      "Condition": {
        "NotIpAddressIfExists": {
          "aws:SourceIp": "<my-corporate-cidr>"
        },
        "StringNotEqualsIfExists": {
          "aws:SourceVpc": "<my-vpc>"
        },
        "BoolIfExists": {
          "aws:PrincipalIsAWSService": "false",
          "aws:ViaAWSService": "false"
        }
      }
    }
  ]
}
```

参考资料

[Establishing a data perimeter on AWS: Allow access to company data only from expected networks](https://aws.amazon.com/blogs/security/establishing-a-data-perimeter-on-aws-allow-access-to-company-data-only-from-expected-networks/)

[AWS: Denies access to AWS based on the source IP](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_deny-ip.html)
