在 Transfer Family 中管理 SSH 和 PGP 密钥 - Amazon Transfer Family
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在 Transfer Family 中管理 SSH 和 PGP 密钥

在本节中,您可以找到有关 SSH 密钥的信息,包括如何生成密钥以及如何轮换的信息。有关使用 Transfer Family Amazon Lambda 来管理密钥的详细信息,请参阅博客文章使用 A Amazon Transfer Family 和启用用户自助服务密钥管理 Amazon Lambda

注意

Amazon Transfer Family 接受 RSA、ECDSA 和 ED25519 密钥。

本节还介绍如何生成与管理 Pretty Good Privacy (PGP) 密钥。

所支持的用户和服务器密钥算法

支持以下 Amazon Transfer Family中的用户和服务器秘钥对算法。

注意

有关在工作流程中与 PGP 解密配合使用的算法,请参阅PGP 秘钥对支持的算法

  • 对于 ED25519:ssh-ed25519

  • 对于 RSA:

    • rsa-sha2-256

    • rsa-sha2-512

  • 对于 ECDSA:

    • ecdsa-sha2-nistp256

    • ecdsa-sha2-nistp384

    • ecdsa-sha2-nistp521

注意

我们根据旧版安全策略中的 SHA1 支持ssh-rsa。有关更多信息,请参阅 加密算法

为服务托管用户生成 SSH 密钥

您可以设置 SFTP 服务器以使用服务管理的身份验证方法对用户进行身份验证,其中用户名和 SSH 密钥存储在服务中。用户的公有 SSH 密钥作为用户属性上传到 SFTP 服务器。服务器将此密钥用作密钥标准身份验证过程的一部分。每个用户均可使用单个服务器存档多个公有 SSH 密钥。有关每个用户可以存储的密钥数量限制,请参阅中的Amazon Web Services 一般参考中的Amazon Transfer Family 端点和配额

作为服务托管身份验证方法的替代方法,您可以使用自定义身份提供商对用户进行身份验证,或者 Amazon Directory Service for Microsoft Active Directory。有关更多信息,请参阅使用自定义身份提供程序使用 Di Amazon rectory Service 身份提供商

服务器只能使用一种方法(服务托管、目录服务或自定义身份提供程序)对用户进行身份验证,并且该方法在创建服务器后无法更改。

在 macOS、Linux 或 Unix 系统创建 SSH 密钥

在 macOS、Linux 或 Unix 操作系统中,您可以使用ssh-keygen命令创建 SSH 公钥和 SSH 私钥(也称为密钥对)。

若要在 macOS、Linux 或 Unix 操作系统上创建 SSH 密钥
  1. 在 macOS、Linux 或 Unix 操作系统,打开命令终端。

  2. Amazon Transfer Family 接受 RSA、ECDSA 和 ED25519 格式的密钥。根据您生成的密钥对类型选择相应的命令。

    注意

    在以下示例中,我们未指定密码:在这种情况下,该工具会要求您输入密码,然后重复密码进行验证。创建密码可以更好地保护您的私钥,还可以提高系统整体安全性。您无法恢复密码:如果您忘记了密码,则必须创建新的密钥。

    但是,如果要生成服务器主机密钥,则必须通过在命令中指定 -N "" 选项(或者在出现提示时按Enter两次)指定空密码,原因是 Transfer Family 服务器无法在启动时请求密码。

    • 生成 4096 位 RSA 密钥对。

      ssh-keygen -t rsa -b 4096 -f key_name
    • 若要生成 ECDSA 521 位密钥对(ECDSA 大小为 256、384 和 521),请执行以下操作:

      ssh-keygen -t ecdsa -b 521 -f key_name
    • 生成 ED25519 密钥对。

      ssh-keygen -t ed25519 -f key_name
    注意

    key_name 是 SSH 密钥对文件名。

    下面是此类输出的示例。

    ssh-keygen -t rsa -b 4096 -f key_name Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in key_name. Your public key has been saved in key_name.pub. The key fingerprint is: SHA256:8tDDwPmanTFcEzjTwPGETVWOGW1nVz+gtCCE8hL7PrQ bob.amazon.com The key's randomart image is: +---[RSA 4096]----+ | . ....E | | . = ... | |. . . = ..o | | . o + oo = | | + = .S.= * | | . o o ..B + o | | .o.+.* . | | =o*+*. | | ..*o*+. | +----[SHA256]-----+
    注意

    当您运行 ssh-keygen 命令时(如前所示),它将公有密钥和私有密钥创建为当前目录中的文件。

    您的 SSH 密钥对现已准备就绪,可以使用。按照步骤 3 和 4 为服务托管用户存储 SSH 公钥。这些用户在 Transfer Family 服务器端点上传输文件时使用这些密钥。

  3. 导航到 key_name.pub,然后打开 README.md 文件。

  4. 复制文本并将其粘贴至服务托管用户的SSH 公钥中。

    1. 通过 https://console.aws.amazon.com/transfer/ 打开 Amazon Transfer Family 控制台,然后从导航窗格中选择 “服务器”。

    2. 服务器页面,选择包含要更新用户服务器的 服务器 ID

    3. 选择要为其添加公钥的目标用户。

    4. SSH 公钥窗格,选择添加 SSH 公钥

      Amazon Transfer Family 控制台,显示选定用户的用户详细信息。
    5. 将您生成的公钥文本粘贴至 SSH 公钥文本框中,然后选择添加密钥

      Amazon Transfer Family 控制台,显示用于添加公钥的 “添加密钥” 页面。

      新密钥列于 SSH 公钥窗格。

      Amazon Transfer Family 控制台,在 SSH 公钥部分显示新添加的公钥。

在 Windows 上创建 SSH 密钥

Windows 使用略微不同的 SSH 密钥对格式。公有密钥必须采用 PUB 格式,私有密钥必须采用 PPK 格式。在 Windows 上,您可以使用 PuTTYgen 以适当的格式创建 SSH 密钥对。您还可以使用 PuTTYgen 将使用 ssh-keygen 生成的私有密钥转换为 .ppk 文件。

注意

如果您向 WinSCP 提供的私有密钥文件不是 .ppk 格式,该 SFTP 客户端会为您将密钥转换为 .ppk 格式。

要查看有关在 Windows 上使用 PuTTYgen 创建 SSH 密钥的教程,请参阅 SSH.com 网站

将 SSH2 公钥转换至 PEM 格式

Amazon Transfer Family 仅接受 PEM 格式的公钥。如果您有 SSH2 公钥,需要对其进行转换。SSH2 公有密钥包含以下格式:

---- BEGIN SSH2 PUBLIC KEY ---- Comment: "rsa-key-20160402" AAAAB3NzaC1yc2EAAAABJQAAAgEAiL0jjDdFqK/kYThqKt7THrjABTPWvXmB3URI : : ---- END SSH2 PUBLIC KEY ----

PEM 公有密钥包含以下格式:

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAA...

运行以下命令,将 SSH2 格式的公钥转换为 PEM 格式的公钥。将ssh2-key替换为 SSH2 秘钥名称,将PEM-key替换为您的 PEM 秘钥名称。

ssh-keygen -i -f ssh2-key.pub > PEM-key.pub

轮换 SSH 密钥

我们推荐轮换 SSH 密钥的最佳安全实践。通常,此轮换被指定为安全策略的一部分,并以某种自动化的方式实现。根据安全级别,对于高度敏感的通信,SSH 密钥对可能只使用一次。这样做可以消除因存储密钥而导致的任何风险。但是,更常见的做法是将 SSH 凭证存储一段时间,并设置一个不会给 SFTP 用户带来过多负担的间隔。通常,时间间隔为 3 个月。

有两种方法用于执行 SSH 密钥轮换:

  • 在控制台上,您可以上传新的 SSH 公钥和删除现有 SSH 公钥。

  • 使用 API,您可以使用 AP DeleteSshPublicKeyI 删除用户的安全外壳 (SSH) 公钥,使用 ImportSshPublicKeyAPI 向用户账户添加新的安全外壳 (SSH) 公钥,从而更新现有用户。

Console
若要控制台中执行密钥轮换
  1. 打开 Amazon Transfer Family 控制台,网址为 https://console.aws.amazon.com/transfer/

  2. 导航至 服务器 页面。

  3. 选择 Server ID (服务器 ID) 列中的标识符以查看 Server Configuration (服务器配置) 页面,如下所示。

  4. 用户 下,选中要轮换其 SSH 公钥用户的复选框,然后选择操作,然后选择添加密钥以查看添加密钥页面。

    或者

    选择用户名以查看用户详细信息页面,然后选择添加 SSH 公钥 以查看添加密钥页面。

  5. 输入新的 SSH 公钥并选择 添加密钥

    重要

    SSH 公有密钥格式取决于您生成的密钥的类型。

    • RSA 密钥的格式为 ssh-rsa string

    • ED25519 密钥的格式为 ssh-ed25519 string

    • 对于 ECDSA 密钥,ecdsa-sha2-nistp256 字符串为ecdsa-sha2-nistp384、或,具体取决于您生成的密钥的大小。然后,先是string,后跟开头字符串,这与其他秘钥类型类似。

    您将返回 用户配置 屏幕,并且您刚刚上传的新 SSH 公有密钥将显示在 SSH 公有密钥部分中。

  6. 选中要删除的身份旁边的复选框,然后选择删除

  7. 输入单词delete以确认删除操作,然后选择 删除

API
若要使用 API 执行密钥轮换
  1. 在 macOS、Linux 或 Unix 操作系统,打开命令终端。

  2. 输入以下命令,以检索要删除的 SSH 密钥。若要使用此命令,请将serverID替换为您的 Transfer Family 服务器的服务器 ID,然后将username替换为您的用户名。

    aws transfer describe-user --server-id='serverID' --user-name='username'

    该命令返回有关此用户的详细信息。复制 "SshPublicKeyId": 字段的内容。您将需要稍后在此程序中输入此值。

    "SshPublicKeys": [ { "SshPublicKeyBody": "public-key", "SshPublicKeyId": "keyID", "DateImported": 1621969331.072 } ],
  3. 接下来,为您的用户导入新 SSH 密钥。在 提示符中,输入以下命令。若要使用此命令,请将serverID替换为您的 Transfer Family 服务器的服务器 ID,然后将替换为您的用户名。

    aws transfer import-ssh-public-key --server-id='serverID' --user-name='username' --ssh-public-key-body='public-key'

    如果命令成功,则不返回任何输出。

  4. 最后通过运行以下命令删除旧密钥。若要使用此命令,将serverID替换为 Transfer Family 服务器的服务器 ID,将username替换为您的用户名,将keyID-from-step-2替换为您在此程序第 2 步中复制的秘钥 ID 值。

    aws transfer delete-ssh-public-key --server-id='serverID' --user-name='username' --ssh-public-key-id='keyID-from-step-2'
  5. (可选)要确认旧密钥是否存在,请重复第 2 步。

生成和管理 PGP 密钥

您可以对 Transfer Family 通过工作流程处理的文件使用 Pretty Good Privacy (PGP) 解密。要在工作流程步骤中使用解密,请提供 PGP 密钥。

Amazon 存储博客上有一篇文章描述了如何使用 Transfer Family Managed 工作流程、使用 PGP 加密和解密文件以及,无需编写任何代码即可简单地解密文件。 Amazon Transfer Family

生成 PGP 密钥

用于生成 PGP 密钥的运算符取决于您的操作系统和所使用的密钥生成软件的版本。

如果您使用的是 Linux 或 Unix,请使用软件包安装程序安装gpg。根据您的 Linux 发行版,在以下选择适用于您的命令。

sudo yum install gnupg
sudo apt-get install gnupg

对于 Windows 或 macOS,你可以从https://gnupg.org/download/下载你需要的内容。

安装 PGP 密钥生成器软件后,运行 gpg --full-gen-keygpg --gen-key 命令生成密钥对。

注意

如果您使用的版本是GnuPG 2.3.0 或以上,则必须运行 gpg --full-gen-key。当提示输入要创建的密钥类型时,请选择 RSA 或 ECC。但是,如果您选择 ECC,请确保为椭圆曲线选择NIST或BrainPool 请勿选择 。

PGP 密钥对支持的算法

我们支持 PGP 密钥对的以下算法:

  • RSA

  • Elgamal

  • ECC:

    • NIST

    • BrainPool

注意

我们不支持 ccurve25519 密钥。

有用的 gpg 子命令

以下是一些有用的gpg子命令:

  • gpg --help — 此命令列出了可用选项,可能还包括一些示例。

  • gpg --list-keys— 此命令列出了您创建的所有密钥对的详细信息。

  • gpg --fingerprint— 此命令列出了所有密钥对的详细信息,包括每个密钥的指纹。

  • gpg --export -a user-name — 此命令导出生成密钥时 user-name 使用密钥的公钥部分。

管理密钥对

要管理您的 PGP 密钥,请使用 Amazon Secrets Manager。

注意

您的秘钥名称包括 Transfer Family 服务器 ID。这意味着您应在 Amazon Secrets Manager中存储 PGP 秘钥信息之前识别或创建服务器。

如果您想为所有用户使用同一个密钥和密码,则可以将 PGP 密钥区块信息存储在机密名称aws/transfer/server-id/@pgp-default下,其中server-id是 Transfer Family 服务器的 ID。如果没有与正在执行工作流程的用户user-name匹配的密钥,Transfer Family 将使用此默认密钥。

您可以为特定用户创建密钥。在本例中,密钥名称的格式为aws/transfer/server-id/user-name,其中user-name匹配正在为 Transfer Family 服务器运行工作流程的用户。

注意

在每台 Transfer Family 服务器上,每位用户最多可存储 3 个 PGP 私钥。

配置用户解密的 PGP 密钥
  1. 根据您使用的 GPG 版本,运行以下命令之一来生成不使用 Curve 25519 加密算法的 PGP 密钥对。

    • 如果您使用的是GnuPG版本为 2.3.0 或以上,请运行以下命令:

      gpg --full-gen-key

      您可选择RSA,或如果您选择ECC,您可为此椭圆曲线选择NISTBrainPool。如果改为gpg --gen-key运行,则会创建一个使用 ECC Curve 25519 加密算法的密钥对,而我们目前不支持 PGP 密钥。

    • 对于 2.3.0 之前版本的GnuPG,您可以使用以下命令,原因是 RSA 是默认的加密类型。

      gpg --gen-key
    重要

    密钥生成过程中,您必须提供密码和电子邮箱地址。请务必记下这些值。本过程后续在 Amazon Secrets Manager 中输入密钥详细信息时,必须提供密码。您必须提供相同的电子邮件地址才能在下一步中导出私钥。

  2. 运行以下命令以导出私钥。要使用此命令,请将private.pgp替换为用于保存私钥块的文件名,以及将marymajor@example.com替换为生成密钥对时使用的电子邮件地址。

    gpg --output private.pgp --armor --export-secret-key marymajor@example.com
  3. 用于存储 Amazon Secrets Manager 您的 PGP 密钥。

    1. 登录 Amazon Web Services Management Console 并打开 Amazon Secrets Manager 控制台,网址为 https://console.aws.amazon.com/secretsmanager/

    2. 在左侧导航窗格中,选择密钥

    3. 在 Secrets(密钥)列表页上,选择副本密钥。

    4. Store a new secret (存储新密钥) 页面上,对于 Select secret type (选择密钥类型),选择 Other type of secrets (其他类型的密钥)

    5. 秘钥/值对 部分,选择 秘钥/值选项卡。

      • 密钥 - 输入 PGPPrivateKey

        注意

        必须准确输入 PGPPrivateKey 字符串:切勿在字符前面或字符之间添加任何空格。

      • value — 将您的私钥文本粘贴至值字段。您可以在文件中找到私钥文本(例如private.pgp),该文件是在您之前导出密钥时指定的文件。密钥开头为-----BEGIN PGP PRIVATE KEY BLOCK-----,结尾为-----END PGP PRIVATE KEY BLOCK-----

        注意

        确保文本块仅包含私钥,且不包含公钥。

    6. 选择 添加行,然后在 秘钥/值对 部分选择秘钥/值选项卡。

      • 密钥 - 输入 PGPPassphrase

        注意

        必须准确输入 PGPPassphrase 字符串:切勿在字符前面或字符之间添加任何空格。

      • – 输入您在生成 PGP 密钥对时使用的密码。

      Amazon Secrets Manager 控制台,显示您为管理 PGP 密钥而输入的密钥和值。
      注意

      您最多可添加 3 组密钥和密码。若要添加第二组,请添加两行新行,为秘钥输入PGPPrivateKey2PGPPassphrase2,并粘贴至其他私钥和密码。若要添加第三组,秘钥值必须为 PGPPrivateKey3PGPPassphrase3

    7. 选择下一步

    8. 配置密钥页面,输入密钥的名称和描述。

      • 如果您要创建默认密钥,即可供任何 Transfer Family 用户使用的密钥,请输入 aws/transfer/server-id/@pgp-default。将server-id替换为包含解密工作流程服务器的 ID。

      • 如果您正在创建供特定 Transfer Family 用户使用的密钥,请输入 aws/transfer/server-id/user-name。将server-id替换为包含解密工作流程服务器的 ID,将user-name更换为运行工作流程的用户名称。user-name存储在 Transfer Family 服务器正在使用的身份提供程序。

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

    10. 审核 页面,选择 存储 以创建和存储密钥。

以下屏幕截图显示了指定 Transfer Family 服务器用户 marymajor的详细信息。此示例显示三个密钥及其对应的密码。

Amazon Secrets Manager 控制台,显示机密详情页面,其中包含 Transfer Family 服务器和用户的三个密钥和密码。

支持的 PGP 客户端

以下客户端已通过 Transfer Family 进行测试,可用于生成 PGP 密钥,以及加密您打算通过工作流程解密的文件。

  • Gpg4win + Kleopatra.

    注意

    当您选择 签名/加密文件 时,请务必取消选择 签名身份:我们目前不支持对加密文件进行签名。

    用于签名和加密文件的 Kleopatra 选项。签名身份选项已清除,为我加密 选项已选中。

    如果您对加密文件进行签名并尝试使用解密工作流程将其上传到 Transfer Family 服务器,则会收到以下错误:

    Encrypted file with signed message unsupported
  • GnuPG 主要版本:2.4、2.3、2.2、2.0 和 1.4。

请注意,其他 PGP 客户端也可运行,但只有此处提到的客户端通过 Transfer Family 进行了测试。