

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 加密静态的 Neptune 资源
<a name="encrypt"></a>

Data-at-rest AWS 建议使用加密。有关更多信息，请参阅[Data-at-Rest和 Data-in-Transit 加密](https://docs.aws.amazon.com/whitepapers/latest/logical-separation/encrypting-data-at-rest-and--in-transit.html)。创建新的 Neptune 数据库集群或新的 Neptune 全球数据库时，将在 AWS 控制台中强制执行加密。这提供了额外的数据保护层。它可以保护您的数据免遭未经授权的访问底层存储，并有助于满足静态数据加密的合规性要求。

[要管理用于加密和解密 Neptune 资源的密钥，可以使用 ()。AWS Key Management ServiceAWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/) AWS KMS 将安全、高度可用的硬件和软件相结合，提供可扩展到云端的密钥管理系统。使用 AWS KMS，您可以创建加密密钥并定义控制如何使用这些密钥的策略。 AWS KMS 支持 AWS CloudTrail，因此您可以审核密钥使用情况，以验证密钥的使用是否正确。

在静态状态下，任何加密的 Neptune 数据库集群的所有相关日志、备份和快照都经过加密。Neptune 加密不适用于导出到亚马逊的日志。 CloudWatch

## 对 Neptune 资源进行加密
<a name="encrypt-enable"></a>

在创建 Neptune 数据库集群或 Neptune 全球数据库时，您可以为加密密钥提供 AWS KMS 密钥标识符。如果您未指定 AWS KMS 密钥标识符，Neptune 将在该地区使用您的默认 Amazon RDS 加密密钥 (`aws/rds`)。 AWS KMS 为您 AWS 账户中的每个区域创建默认加密密钥。对于 Neptune Global 集群，其中的 AWS KMS 密钥数量将与区域一样多。

创建 Neptune 资源后，您无法更改该资源的加密密钥。因此，在创建 Neptune 资源之前，请务必确定您的加密密钥要求。如果需要不同的 AWS KMS 密钥，则可以使用现有 Neptune 数据库集群的快照创建具有不同 AWS KMS 密钥的新密钥（参见[从数据库集群快照还原](backup-restore-restore-snapshot.md)）。

您可以使用来自其他账户的密钥的亚马逊资源名称 (ARN) 来加密 Neptune 资源。如果您使用拥有 AWS KMS 加密密钥的相同 AWS 账户创建 Neptune 资源，则您传递的 AWS KMS 密钥 ID 可以是 AWS KMS 密钥别名，而不是密钥的 ARN。

**重要**  
如果 Neptune 无法访问 Neptune 数据库集群的加密密钥（例如，当 Neptune 对密钥的访问权限被撤销时），则加密的集群将进入终端状态，只能从备份中恢复。我们强烈建议您始终为加密的 Neptune 数据库集群启用备份，以防数据库中的加密数据丢失。

## 启用加密时所需的密钥权限
<a name="encrypt-key-permissions"></a>

创建 Neptune 数据库集群的 IAM 用户或角色必须至少拥有 KMS 密钥的以下权限：
+ `"kms:Encrypt"`
+ `"kms:Decrypt"`
+ `"kms:GenerateDataKey"`
+ `"kms:ReEncryptTo"`
+ `"kms:GenerateDataKeyWithoutPlaintext"`
+ `"kms:CreateGrant"`
+ `"kms:ReEncryptFrom"`
+ `"kms:DescribeKey"`

以下是包含必要权限的密钥策略示例（针对`us-east-1`区域）：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "key-consolepolicy-3",
  "Statement": [
    {
      "Sid": "Enable Permissions for root principal",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::{{123456789012}}:root"
      },
      "Action": "kms:*",
      "Resource": "*"
    },
    {
      "Sid": "Allow use of the key for Neptune",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::{{123456789012}}:role/NeptuneFullAccess"
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:ReEncryptTo",
        "kms:GenerateDataKeyWithoutPlaintext",
        "kms:CreateGrant",
        "kms:ReEncryptFrom",
        "kms:DescribeKey"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "kms:ViaService": "rds.us-east-1.amazonaws.com"
        }
      }
    },
    {
      "Sid": "Deny use of the key for non Neptune",
      "Effect": "Deny",
      "Principal": {
        "AWS": "arn:aws:iam::{{123456789012}}:role/NeptuneFullAccess"
      },
      "Action": [
        "kms:*"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "kms:ViaService": "rds.us-east-1.amazonaws.com"
        }
      }
    }
  ]
}
```

------
+ 本策略中的第一条语句是可选的。它允许访问用户的根主体。
+ 第二条语句提供对该角色所有必需 AWS KMS 的 API 的访问权限，其范围仅限于 RDS 服务主体。
+ 第三个语句强制该角色不能将此密钥用于任何其他 AWS 服务，从而进一步加强了安全性。

也可以通过添加以下内容来进一步缩小 `createGrant` 权限范围：

```
"Condition": {
  "Bool": {
    "kms:GrantIsForAWSResource": true
  }
}
```

## Neptune 加密的限制
<a name="encrypt-limitations"></a>

Neptune 加密存在以下限制：
+ 您无法将未加密的 Neptune 数据库集群转换为加密的 Neptune 数据库集群。您只能在创建 Neptune 数据库集群时为其启用加密。但是，您可以将未加密的 Neptune 数据库集群快照还原到加密的 Neptune 数据库集群。为此，请在从未加密的 Neptune 数据库集群快照还原时指定 KMS 加密密钥。
+ 出于兼容性考虑，仍然可以通过 CLI AWS 和 SDK 创建未加密的 Neptune 数据库集群。控制台仅允许创建加密的 Neptune 数据库集群。
+ 您不能在同一 Neptune 全球数据库中混合使用加密和未加密的 Neptune 数据库集群。要么所有集群都已加密，要么所有集群都未加密。这是在 Neptune 全局数据库配置中强制执行的。