在AWS EC2上的轻量级SSH密钥管理
项目描述
Keymaker是连接亚马逊AWS中SSH和IAM账户的“缺失环节”。它是一个无状态的同步引擎,能够安全地管理SSH公钥共享和验证、用户和组同步以及家目录共享(通过可选的EFS集成)。作为AWS账户管理员,您在IAM中定义或导入用户和组标识,而您的账户中的实例将动态检索和使用这些标识来验证您的用户。Keymaker是现代、简约的替代LDAP或Active Directory认证的方案。
安装
运行 pip install keymaker。
在接受SSH登录的实例上
运行 keymaker install。
确保由sshd启动的进程具有以下IAM权限:iam:GetSSHPublicKey、iam:ListSSHPublicKeys、iam:GetUser、iam:ListGroups、iam:GetGroup、iam:ListGroupsForUser、iam:GetRole和sts:GetCallerIdentity。最简单的方法是运行作为特权IAM用户的keymaker configure --instance-iam-role INSTANCE_ROLE,这将创建并将Keymaker IAM策略附加到角色< span class="docutils literal">INSTANCE_ROLE(然后您应通过IAM实例配置文件将其分配给您启动的任何实例)。您也可以手动配置这些权限,或附加IAMReadOnlyAccess管理策略。
Keymaker需要OpenSSH v6.2+,由Ubuntu 14.04+和RHEL7+提供。
用法
不输入参数运行 keymaker 可以获取使用信息。在客户端模式(在您将要连接的计算机上运行)下,您可以运行 keymaker <subcommand>,其中子命令是
upload_key Upload public SSH key for a user. Run this command for each user who will be accessing EC2 hosts. list_keys Get public SSH keys for a given or current IAM/SSH user. disable_key Disable a given public SSH key for a given or current IAM/SSH user. enable_key Enable a given public SSH key for a given or current IAM/SSH user. delete_key Delete a given public SSH key for a given or current IAM/SSH user. configure Perform administrative configuration tasks on the current AWS account.
使用 keymaker <subcommand> --help 获取每个命令的完整描述和选项列表。
操作原理
亚马逊网络服务(AWS)IAM 用户账户可以将其元数据(最多可添加5个密钥;可以禁用单个密钥)添加SSH公钥。Keymaker使用此元数据来验证SSH登录。Keymaker提供了一种集成方式,使用户可以通过 keymaker upload_key 将其公钥SSH上传到IAM账户。
在您想要用户连接的实例上运行 keymaker install。这会安装三个组件
一个 AuthorizedKeysCommand sshd配置指令,它作为一个登录事件钩子,并动态地从IAM为正在登录的用户检索公钥SSH密钥,使用默认的 boto3凭据(默认为实例的IAM角色凭据)。
一个 pam_exec PAM配置指令,它会在登录过程早期调用 keymaker-create-account-for-iam-user。此脚本检测是否存在认证主体对应的Linux用户账户,但存在具有相同名称的授权IAM账户,并在需要时创建账户。账户的UID是从用户SSH密钥的散列计算出来的,使其在运行Keymaker的实例之间保持稳定。
一个 cron作业,每小时在您的实例上运行一次,并同步IAM组成员信息。只有名称以可配置的前缀(默认为 keymaker_*)开头的IAM组才会同步为Linux组。
因此,通过SSH连接到您的实例的用户将基于集中存储在您的AWS账户中的信息获得访问权限。用户必须拥有一个活跃的IAM账户,并且具有活跃的匹配SSH公钥,才能成功进行身份验证。用户的UID和组成员关系也会在您的实例之间同步,因此任何基于UID的检查或基于组的权限都保持最新。
跨账户身份验证
某些AWS安全模型将IAM用户放在一个AWS账户中,而资源(EC2实例、S3存储桶等)放在其他联合AWS账户的系列中(例如,开发账户和产品账户)。然后用户通过 sts:AssumeRole 在这些联合账户中承担角色,并受其权限约束。当用户通过SSH连接到在联合账户中运行的实例时,可以指示Keymaker在该其他AWS账户(称为“ID解析器账户”)中查找用户身份和SSH公钥。
Keymaker期望通过检查实例自身的IAM角色描述来找到此配置信息。描述中应包含空格分隔的配置标记列表,例如,keymaker_id_resolver_account=123456789012 keymaker_id_resolver_iam_role=id_resolver。对于 sts:AssumeRole 要工作,账户123456789012中的角色 id_resolver 应有一个信任策略,允许实例的IAM角色在 id_resolver 上执行sts:AssumeRole。
在ID解析器账户(包含IAM用户)中运行以下命令来自动应用此配置: keymaker configure --instance-iam-role arn:aws:iam::987654321098:role/INSTANCE_ROLE --cross-account-profile AWS_CLI_PROFILE_NAME。在这里,987654321098是将在其中运行EC2实例的联合账户的账户ID,AWS_CLI_PROFILE_NAME是您已设置的用于访问联合账户的 AWS CLI角色配置文件 的名称。
要求IAM组成员资格
如果实例的IAM角色描述中包含配置令牌 keymaker_require_iam_group=prod_ssh_users,则声明组成员资格。然后要求登录的用户必须是 prod_ssh_users IAM组的成员。通过运行 keymaker configure --require-iam-group IAM_GROUP_NAME 自动应用此配置。
安全考虑
将IAM用户身份与Unix用户身份集成对您的安全威胁模型有影响。使用Keymaker,能够设置IAM用户账户上的SSH公钥的主可以模拟该用户登录EC2实例。例如,这可以扩大受损害的AWS秘密密钥的攻击范围。您可以通过限制对 UploadSSHPublicKey 方法的访问来缓解这种威胁。
常见问题解答
运行Keymaker需要root权限吗?
答案取决于您对“运行Keymaker”的定义。
要将keymaker安装到sshd配置和crontab中(keymaker install),您需要访问这些守护进程的配置文件,这通常意味着您需要root权限。
keymaker授权钩子(在sshd登录时运行)不需要root权限。
上述“用法”中列出的所有客户端命令都不需要root权限。
EFS集成
有关EFS集成的详细信息,请联系 kislyuk@gmail.com。
链接
错误
请在 GitHub 上报告错误、问题、功能请求等。
许可证
根据Apache License,Version 2.0的条款授权。
项目详情
下载文件
下载适合您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。