密钥管理 - AWS Transfer Family

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

密钥管理

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

注意

AWS Transfer Family 接受RSAECDSA、和ED25519密钥。

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

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

支持以下 AWS 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密钥

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

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

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

在 macOS、Linux 或 Unix 上创建SSH密钥

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

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

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

    注意

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

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

    • 要生成 RSA 4096 位密钥对,请执行以下操作:

      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 key pair 文件名。

    下面是 ssh-keygen 输出的示例。

    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密钥对(key pair)现已准备就绪,可以使用。按照步骤 3 和 4 为服务托管用户存储SSH公钥。这些用户在 Transfer Family 服务器端点上传输文件时使用这些密钥。

  3. 导航到 key_name.pub 文件并打开它。

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

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

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

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

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

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

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

      新密钥将在SSH公钥窗格中列出。

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

在微软 Windows 上创建SSH密钥

Windows 使用的密SSH钥对格式略有不同。公有密钥必须采用 PUB 格式,私有密钥必须采用 PPK 格式。在 Windows 上,你可以使用 P uTTYgen 来创建相应格式的SSH密钥对。您也可以使用 P uTTYgen 将使用生成的私钥ssh-keygen转换为.ppk文件。

注意

如果您向 Win SCP 提供非.ppk格式的私钥文件,则该客户端会主动为您将该密钥转换为.ppk格式。

有关在 Windows uTTYgen 上使用 P 创建SSH密钥的教程,请访问 SSH .com 网站

将SSH2公钥转换为PEM格式

AWS 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公钥。Replace(替换) ssh2-key 用你的SSH2密钥的名字,以及 PEM-key 用你的PEM密钥的名字。

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

旋转SSH密钥

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

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

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

  • 使用可以更新现有用户API,方法是使用删除用户的 Secure Shell (SSH) 公钥,使用ImportSshPublicKeyAPI向用户账户添加新的安全外壳 (SSH) 公钥。DeleteSshPublicKeyAPI

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

  2. 导航至服务器页面。

  3. 选择服务器 ID 列中的标识符以查看服务器详细信息页面。

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

    或者

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

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

    重要

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

    • 对于RSA密钥,格式为ssh-rsa string

    • 对于ED25519密钥,格式为ssh-ed25519 string

    • 对于ECDSA密钥,密钥以ecdsa-sha2-nistp256ecdsa-sha2-nistp384、或开头ecdsa-sha2-nistp521,具体取决于您生成的密钥的大小。然后,先是 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,将 public-key 替换为您的用户名,并将 username 替换为新公钥的指纹。

    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

AWS 存储博客上有一篇文章描述了如何加密和解密文件,使用和加密和解密文件。PGP AWS 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 用于椭圆曲线。不要选择 Curve 25519.

PGP密钥对支持的算法

PGP密钥对支持以下算法:

  • RSA

  • Elgamal

  • ECC:

    • NIST

    • BrainPool

注意

不支持 Curve25519 秘钥。

有用的 gpg 子命令

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

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

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

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

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

管理PGP密钥

要管理您的PGP密钥,必须使用 AWS Secrets Manager。

注意

您的秘钥名称包括 Transfer Family 服务器 ID。这意味着在存储PGP密钥信息之前,您应该已经识别或创建了服务器 AWS Secrets Manager。

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

或者,您也可为特定用户创建密钥。在本例中,密钥名称的格式为 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改为运行,则会创建一个使用 C ECC urve 25519 加密算法的密钥对,而我们目前不支持PGP密钥。

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

      gpg --gen-key
    重要

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

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

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

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

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

    3. 密钥页面,选择存储新密钥

    4. 选择密钥类型页面上,为密钥类型选择其他密钥类型

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

      • 密钥 - 输入 PGPPrivateKey

        注意

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

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

        注意

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

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

      • — 输入 PGPPassphrase

        注意

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

      • valu e — 输入生成密钥对PGP时使用的密码。

      AWS 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 的详细信息。此示例显示三个密钥及其对应的密码。

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

支持的PGP客户端

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

  • Gpg4win + Kleopatra

    注意

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

    用于签名和加密文件的 Kleopatra 选项。签名身份选项已清除,为我加密选项已选中。
  • GnuPG 主要版本:2.4、2.3、2.2、2.0 和 1.4。

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