使用cloud-init为用户安装私钥

41次阅读
没有评论

问题描述

需要在使用git clone时,通过私钥对公司源代码库进行身份验证。为了为用户设置这个私钥,用户需要指定一个用户的私钥(而不是主机的私钥在/etc目录下)。是否有一种方法可以实现这个需求?
用户使用cloud-init中的system_info配置了用户,但没有安装用户私钥的机制。
请注意:假设您正在配置一台新机器并在其中添加一个名为bob的用户。如何为bob安装私钥,以便他可以使用ssh进行身份验证?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

cloud-init中,没有专门的模块来简化安装用户的私钥,也没有在system_info(用于添加和配置用户)下的参数来方便配置用户的SSH密钥。我采用的方法是在我的main.tf中添加以下内容,以填充变量ssh_keys_user

ssh_keys_user = {
  write_files = [
    {
      path        = "/home/ecarroll/.ssh/id_rsa"
      content     = file("./ssh/user/cp-terraform-user-id_rsa")
      owner       = "ecarroll:ecarroll"
      permissions = "0600"
      defer       = true
    },
    {
      path        = "/home/ecarroll/.ssh/id_rsa.pub"
      content     = file("./ssh/user/cp-terraform-user-id_rsa.pub")
      owner       = "ecarroll:ecarroll"
      permissions = "0644"
      defer       = true
    },
    {
      path        = "/home/ecarroll/.ssh/id_ecdsa"
      content     = file("./ssh/user/cp-terraform-user-id_ecdsa")
      owner       = "ecarroll:ecarroll"
      permissions = "0600"
      defer       = true
    },
    {
      path        = "/home/ecarroll/.ssh/id_ecdsa.pub"
      content     = file("./ssh/user/cp-terraform-user-id_ecdsa.pub")
      owner       = "ecarroll:ecarroll"
      permissions = "0644"
      defer       = true
    },
    {
      path        = "/home/ecarroll/.ssh/id_ed25519"
      content     = file("./ssh/user/cp-terraform-user-id_ed25519")
      owner       = "ecarroll:ecarroll"
      permissions = "0600"
      defer       = true
    },
    {
      path        = "/home/ecarroll/.ssh/id_ed25519.pub"
      content     = file("./ssh/user/cp-terraform-user-id_ed25519.pub")
      owner       = "ecarroll:ecarroll"
      permissions = "0644"
      defer       = true
    }
  ]
}

然后,我将其与我的cloud-init文件关联,如下所示:

write_files:${ yamlencode( ssh_keys_user.write_files ) }

我使用一个Makefile来生成这些文件,示例如下:

user/cp-terraform-user-id_ecdsa:
  -mkdir user 2> /dev/null;
  ssh-keygen -C "User key for SSH authentication to repos" -N "" -b 521 -t ecdsa -f "$@";
  touch "$@";
user/cp-terraform-user-id_ed25519:
  -mkdir user 2> /dev/null;
  ssh-keygen -C "User key for SSH authentication to repos" -N "" -t ed25519 -f "$@";
  touch "$@";
user/cp-terraform-user-id_rsa:
  -mkdir user 2> /dev/null;
  ssh-keygen -C "User key for SSH authentication to repos" -N "" -b 4096 -t rsa -f "$@";
  touch "$@";

这个方法可以正常工作。然后,我将.pub文件添加到BitBucket和GitLab中。

方案2

如果允许在启动时生成密钥,您可以使用phone-home模块将新生成的公钥发送到需要的位置:
以下是这个模块的示例:

url: http://example.com/$INSTANCE_ID/
post:
  - pub_key_dsa
  - pub_key_rsa
  - pub_key_ecdsa
  - pub_key_ed25519
  - instance_id
  - hostname
  - fqdn
tries: 5

我以前没有尝试过这个方法,但如果“在启动时生成密钥”符合您的要求,类似这样的方法应该可以工作。

正文完