

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

# 通过命令行使用 IAM 身份验证连接到 Amazon Neptune 数据库
<a name="iam-auth-connect-command-line"></a>

如本文档中的许多示例所示，拥有用于向 Neptune 数据库集群提交查询的命令行工具非常方便。如果未启用 IAM 身份验证，则 [curl](https://curl.haxx.se/) 工具是与 Neptune 端点通信的上佳选择。

**但是，为了确保您的数据安全，最好启用 IAM 身份验证。**

启用 IAM 身份验证后，必须使用[签名版本 4 (Sig4)](https://docs.aws.amazon.com/general/latest/gr/signing-aws-api-requests.html) 对每个请求进行签名。第三方 [awscurl](https://github.com/okigan/awscurl) 命令行工具使用与 `curl` 相同的语法，并且可以使用 Sig4 签名对查询进行签名。[使用 `awscurl`](#iam-auth-connect-awscurl)部分解释了如何将 `awscurl` 安全地与临时凭证结合使用。

## 设置命令行工具以使用 HTTPS
<a name="iam-auth-connect-command-line-https"></a>

Neptune 要求所有连接都使用 HTTPS。任何像 `curl` 或 `awscurl` 这样的命令行工具都需要访问相应的证书才能使用 HTTPS。只要 `curl` 或 `awscurl` 可以找到相应的证书，它们即可像处理 HTTP 连接一样处理 HTTPS 连接，而无需额外的参数。本文档中的示例基于该场景。

要了解如何获取此类证书以及如何将其正确格式化为 `curl` 可以使用的证书颁发机构 (CA) 证书存储，请参阅 `curl` 文档中的 [SSL 证书验证](https://curl.haxx.se/docs/sslcerts.html)。

然后，您使用 `CURL_CA_BUNDLE` 环境变量指定此 CA 证书存储的位置。在 Windows 上，`curl` 自动在名为 `curl-ca-bundle.crt` 的文件中查找它。首先在与 `curl.exe` 相同的目录中查找，然后在路径的其他位置查找。有关更多信息，请参阅 [SSL 证书验证](https://curl.haxx.se/docs/sslcerts.html)。

## 将 `awscurl` 与临时凭证结合使用以安全地连接到启用了 IAM 身份验证的数据库集群
<a name="iam-auth-connect-awscurl"></a>

[awscurl](https://github.com/okigan/awscurl) 工具使用与 `curl` 相同的语法，但还需要其它信息：
+ **`--access_key`** – 有效的访问密钥。如果未使用此参数提供，则必须在 `AWS_ACCESS_KEY_ID` 环境变量或配置文件中提供它。
+ **`--secret_key`** – 对应于访问密钥的有效秘密密钥。如果未使用此参数提供，则必须在 `AWS_SECRET_ACCESS_KEY` 环境变量或配置文件中提供它。
+ **`--security_token`** – 有效的会话令牌。如果未使用此参数提供，则必须在 `AWS_SECURITY_TOKEN` 环境变量或配置文件中提供它。

过去，通常的做法是将永久凭证与 `awscurl` 结合使用，例如 IAM 用户凭证甚至根凭证，但不建议这样做。而是使用其中一个[AWS 安全令牌服务 (STS) APIs](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) 或其[AWS CLI 包装器](https://docs.aws.amazon.com/cli/latest/reference/sts/index.html)生成临时证书。

最好将 STS 调用返回的 `AccessKeyId`、`SecretAccessKey` 和 `SessionToken` 值放入 Shell 会话的相应环境变量中，而不是放在配置文件中。然后，当 Shell 终止时，凭证会被自动丢弃，而配置文件则不是这样。同样，请求的临时凭证期限也不要超过您可能需要的期限。

以下示例显示了您可以在 Linux Shell 中使用 [sts assume-role](https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role) 获取有效期为半小时的临时凭证，然后将它们放在 `awscurl` 可以找到它们的环境变量中的步骤：

```
aws sts assume-role \
    --duration-seconds 1800 \
    --role-arn "arn:aws:iam::(account-id):role/(rolename)" \
    --role-session-name AWSCLI-Session > $output
AccessKeyId=$(echo $output | jq '.Credentials''.AccessKeyId')
SecretAccessKey=$(echo $output | jq '.Credentials''.SecretAccessKey')
SessionToken=$(echo $output | jq '.Credentials''.SessionToken')

export AWS_ACCESS_KEY_ID=$AccessKeyId
export AWS_SECRET_ACCESS_KEY=$SecretAccessKey
export AWS_SESSION_TOKEN=$SessionToken
```

然后，您可以使用 `awscurl` 向数据库集群发出签名请求，如下所示：

```
awscurl (your cluster endpoint):8182/status \
    --region us-east-1 \
    --service neptune-db
```