

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

# 设置用于解密文件的托管工作流程
<a name="workflow-decrypt-tutorial"></a>

本教程说明如何设置包含解密步骤的托管工作流程。本教程还展示了如何将加密文件上传到 Amazon S3 存储桶，然后在同一存储桶中查看解密后的文件。

**注意**  
 AWS 存储博客上有一篇文章描述了如何使用 Transfer Family Managed 工作流程、使用 PGP [加密和解密文件以及，无需编写任何代码即可简单地解密文件](https://aws.amazon.com/blogs/storage/encrypt-and-decrypt-files-with-pgp-and-aws-transfer-family/)。 AWS Transfer Family

**Topics**
+ [步骤 2：配置执行角色](#create-example-execution-role)
+ [步骤 2：创建托管工作流程](#create-example-workflow)
+ [步骤 3：将工作流程添加至服务器并创建用户](#add-workflow-to-server)
+ [步骤 2：创建 PGP 密钥对](#create-example-pgp-key-pair)
+ [步骤 5：将 PGP 私钥存储在 AWS Secrets Manager](#output-private-key-to-secrets)
+ [步骤 6：加密文件](#encrypt-example-file)
+ [步骤 7：运行工作流程并查看结果](#test-decrypt-workflow)

## 步骤 2：配置执行角色
<a name="create-example-execution-role"></a>

创建一个 AWS Identity and Access Management (IAM) 执行角色，Transfer Family 可以使用该角色启动工作流程。[适用于工作流程的 IAM 策略](workflow-execution-role.md) 中描述了创建执行角色的过程。

**注意**  
在创建执行角色时，请务必在执行角色和 Transfer Family 之间建立信任关系，如 [建立信任关系](requirements-roles.md#establish-trust-transfer) 中所述。

以下执行角色策略包含启动您在本教程中创建的工作流程所需的所有权限。要使用此示例策略，请将 `user input placeholders` 替换为您自己的信息。`amzn-s3-demo-bucket`替换为您上传加密文件的 Amazon S3 存储桶的名称。

**注意**  
并非每个工作流程都需要此示例中列出的每个权限。您可以根据特定工作流程中的步骤类型来限制权限。[使用预定义的步骤](nominal-steps-workflow.md) 中描述了每种预定义步骤类型所需的权限。[自定义步骤的 IAM 权限](custom-step-details.md#custom-step-iam) 中描述了每种自定义步骤所需的权限。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "WorkflowsS3Permissions",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectTagging",
                "s3:GetObjectVersion",
                "s3:PutObject",
                "s3:PutObjectTagging",
                "s3:ListBucket",
                "s3:PutObjectTagging",
                "s3:PutObjectVersionTagging",
                "s3:DeleteObjectVersion",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/*",
                "arn:aws:s3:::amzn-s3-demo-bucket"
            ]
        },
        {
            "Sid": "DecryptSecret",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:aws/transfer/*"
        }
    ]
}
```

## 步骤 2：创建托管工作流程
<a name="create-example-workflow"></a>

现在，您需要创建一个包含解密步骤的工作流程。

**创建一个包含解密步骤的工作流程。**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在左侧的导航窗格中，选择**工作流程**，然后选择**创建工作流程**。

1. 输入以下详细信息：
   + 例如，输入描述 **Decrypt workflow example**。
   + 在**标称步骤**部分中，选择**添加步骤**。

1. 对于**选择步骤类型**，选择**解密文件**，然后选择**下一步**。

1. <a name="configure-destination-details"></a>在**配置参数**对话框中，指定以下内容：
   + 例如，输入描述性步骤名称 **decrypt-step**。步骤名称中不允许使用空格。
   + 对于**解密文件的目标**，请选择 Amazon S3。
   + 对于**目标存储桶名称**，请选择您在步骤 1 中创建的 IAM 策略 `amzn-s3-demo-bucket` 中指定的相同的 Amazon S3 存储桶。
   + 在**目标密钥前缀**中，输入要在目标存储桶中存储解密文件的前缀（文件夹）的名称，例如，**decrypted-files/**。
**注意**  
请务必在前缀中添加一个尾部斜杠 (**/**)。
   + 在本教程中，请清除**覆盖现有文件**。清除此设置后，如果您尝试解密与现有文件同名的文件，则工作流处理将停止，并且不会处理新文件。

   选择**下一步**，进入下一个审核屏幕。

1. 审核该步骤的详细信息。如果一切正确，请选择**创建步骤**。

1. 您的工作流程只需要单个解密步骤，因此无需配置其他步骤。选择**创建工作流程**以创建新工作流程。

记下新工作流程的工作流程 ID。下一步骤中，您需要用到此 ID。本教程使用 *`w-1234abcd5678efghi`* 作为示例工作流程 ID。

## 步骤 3：将工作流程添加至服务器并创建用户
<a name="add-workflow-to-server"></a>

现在您已经有了带有解密步骤的工作流程，您必须将其与 Transfer Family 服务器相关联。本教程介绍如何将工作流程附加至现有 Transfer Family 服务器。或者，您可以创建新的服务器以用于您的工作流程。

将工作流程附加到服务器后，必须创建一个可以通过 SFTP 连接到服务器并触发工作流程运行的用户。

**配置 Transfer Family 服务器以运行工作流程**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在左侧导航窗格中，选择**服务器**，然后从列表中选择服务器。确保此服务器支持 SFTP 协议。

1. 在服务器的详细信息页面上，向下滚动到**其他详细信息**部分，然后选择**编辑**。

1. 在**编辑其他详细信息**页面的**托管工作流程**部分，选择您的工作流程，然后选择相应的执行角色。
   + **对于完成文件上传的工作流程**，请选择您在 [步骤 2：创建托管工作流程](#create-example-workflow) 中创建的工作流程，例如 **w-1234abcd5678efghi**。
   + 对于**托管工作流程执行角色**，选择您在 [步骤 2：配置执行角色](#create-example-execution-role) 中创建的 IAM 角色。

1. 滚动到页面底部并选择**保存**以保存您的更改。

记下您正在使用的服务器的 ID。用于存储 PGP AWS Secrets Manager 密钥的密钥的名称部分基于服务器 ID。

**添加可以触发工作流程的用户**

1. 打开 AWS Transfer Family 控制台，网址为[https://console.aws.amazon.com/transfer/](https://console.aws.amazon.com/transfer/)。

1. 在左侧导航窗格中，选择**服务器**，然后选择您要用于解密工作流程的服务器。

1. 在服务器的详细信息页面上，向下滚动到**用户**部分，然后选择**添加用户**。

1. 对于您的新用户，请输入以下详细信息：
   + 对于**用户名**，输入 **decrypt-user**。
   + 对于**角色**，请选择可以访问您的服务器的用户角色。
   + 对于**主目录**，选择您之前使用的 Amazon S3 存储桶，例如 `amzn-s3-demo-bucket`。
   + 对于 **SSH 公有密钥**，请粘贴与您拥有的私有密钥相对应的公有密钥。有关更多信息，请参阅 [为服务托管用户生成 SSH 密钥](sshkeygen.md)。

1. 选择**添加**以保存您的新用户。

记下您在这台服务器上的 Transfer Family 用户的名称。该密钥部分基于用户的名称。为简单起见，本教程使用了服务器的任何用户均可使用的默认密钥。

## 步骤 2：创建 PGP 密钥对
<a name="create-example-pgp-key-pair"></a>

使用[支持的 PGP 客户端](pgp-key-clients.md)之一以生成 PGP 密钥对。有关此过程的详细介绍，请参阅 [生成 PGP 密钥](generate-pgp-keys.md)。

**生成 PGP 密钥对**

1. 在本教程中，您可以使用 `gpg` (`GnuPG`) 版本 2.0.22 客户端生成使用 RSA 作为加密算法的 PGP 密钥对。对于此客户端，运行如下命令，并提供电子邮件地址和密码。您可以使用任何您喜欢的姓名或电子邮件地址。请务必记住所使用的值，因为本教程稍后需要输入这些值。

   ```
   gpg --gen-key
   ```
**注意**  
如果您使用的版本是 `GnuPG` 2.3.0 或以上，则必须运行 `gpg --full-gen-key`。当提示输入要创建的密钥类型时，请选择 RSA 或 ECC。如果选择 **ECC**，则可以选择BrainPool和Curve25519作为椭圆曲线。NIST

1. 通过运行以下命令导出私有密钥。将 `user@example.com` 替换为生成密钥时使用的电子邮件地址。

   ```
   gpg --output workflow-tutorial-key.pgp --armor --export-secret-key user@example.com
   ```

   此命令将私有密钥导出到 **workflow-tutorial-key.pgp** 文件中。您可以随意命名输出文件。您也可以在将私有密钥文件添加到 AWS Secrets Manager后删除该文件。

## 步骤 5：将 PGP 私钥存储在 AWS Secrets Manager
<a name="output-private-key-to-secrets"></a>

您需要以非常具体的方式将私有密钥存储在 Secrets Manager 中，以便工作流程在对上传的文件运行解密步骤时可以找到私有密钥。

**注意**  
当你在 Secret AWS 账户 s Manager 中存储密钥时，会产生费用。有关定价的信息，请参阅[AWS Secrets Manager 定价](https://aws.amazon.com/secrets-manager/pricing)。

**在 Secrets Manager 中存储 PGP 私有密钥**

1. 登录 AWS 管理控制台 并打开 AWS Secrets Manager 控制台，网址为[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 在左侧导航窗格中，选择**密钥**。

1. 在**密钥**页面，选择**存储新密钥**。

1. 在**选择密钥类型**页面上，对于**密钥类型**，选择**其他类型密钥**。

1. 在**键/值对**部分，选择**键/值**选项卡。
   + **键** — 输入 **PGPPrivateKey**。
   + **值** — 将您的私有密钥文本粘贴至值字段。

1. 选择**添加行**，然后在**密钥/值对**部分选择**密钥/值**选项卡。
   + **键** — 输入 **PGPPassphrase**。
   + **值** — 输入您在 [步骤 2：创建 PGP 密钥对](#create-example-pgp-key-pair) 中生成 PGP 密钥对时使用的密码。

1. 选择**下一步**。

1. 在**配置密钥**页面，输入密钥的名称和描述。您可以为特定用户创建密钥，也可以创建可供所有用户使用的密钥。如果您的服务器 ID 是*`s-11112222333344445`*，则按如下方式命名密钥。
   + 要为所有用户创建默认密钥，请为该密钥命名**aws/transfer/*s-11112222333344445*/@pgp-default**。
   + 要仅为之前创建的用户创建密钥，请为该密钥命名 **aws/transfer/*s-11112222333344445*/decrypt-user**。

1. 选择**下一步**，接受**配置轮换**页面的默认设置。然后选择**下一步**。

1. 在**审核**页面，选择**存储**以创建和存储密钥。

有关将 PGP 私钥添加到 Secrets Manager 的更多信息，请参阅[用于 AWS Secrets Manager 存储 PGP 密钥](manage-pgp-keys.md#store-pgp-key-details)。

## 步骤 6：加密文件
<a name="encrypt-example-file"></a>

使用该 `gpg` 程序对文件进行加密，以便在工作流程中使用。要加密文件，请运行以下命令：

```
gpg -e -r marymajor@example.com --openpgp testfile.txt
```

在运行此命令之前，请注意以下事项：
+ 对于 `-r` 参数，请 `marymajor@example.com` 替换为创建 PGP 密钥对时使用的电子邮件地址。
+ `--openpgp` 标记是可选的。此标志使加密文件符合 [OpenPGP RFC4880](https://www.rfc-editor.org/rfc/rfc4880) 标准。
+ 此命令将创建一个名为 **testfile.txt.gpg** 的文件，其位置与 **testfile.txt** 相同。

**重要**  
加密用于 AWS Transfer Family 工作流程的文件时，请务必使用参数指定非匿名收件人。`-r`匿名加密（不指定收件人）可能会导致工作流程中的解密失败，因为系统无法识别要使用哪个密钥进行解密。有关此问题的调试信息，请访问[解决匿名收件人加密问题](workflow-issues.md#workflows-decrypt-anonymous)。

## 步骤 7：运行工作流程并查看结果
<a name="test-decrypt-workflow"></a>

要运行工作流程，您需要使用在步骤 3 中创建的用户连接到 Transfer Family 服务器。然后，您可以查看您在[步骤 2.5 中指定的 Amazon S3 存储桶，配置目标参数](#configure-destination-details)以查看解密后的文件。

**运行解密工作流程**

1. 打开命令终端。

1. 运行以下命令，替换 `your-endpoint` 为实际端点和 `transfer-key` 为用户的 SSH 私有密钥：

   ```
   sftp -i transfer-key decrypt-user@your-endpoint
   ```

   例如，如果私有密钥存储在 `~/.ssh/decrypt-user` 中，而您的端点存储在 `s-11112222333344445.server.transfer.us-east-2.amazonaws.com` 中，则命令如下所示：

   ```
   sftp -i  ~/.ssh/decrypt-user decrypt-user@s-11112222333344445.server.transfer.us-east-2.amazonaws.com
   ```

1. 运行 `pwd` 命令。如果成功，此命令将返回以下内容：

   ```
   Remote working directory: /amzn-s3-demo-bucket/decrypt-user
   ```

   您的目录反映了 Amazon S3 存储桶的名称。

1. 运行如下命令来上传文件并触发要运行的工作流程：

   ```
   put testfile.txt.gpg
   ```

1. 对于解密文件的目标，您在创建工作流程时指定了 `decrypted-files/` 文件夹。现在，您可以导航到该文件夹并列出内容。

   ```
   cd ../decrypted-files/
   ls
   ```

   如果成功，则 `ls` 命令将列出 `testfile.txt` 文件。您可以下载此文件并验证它是否与之前加密的原始文件相同。