问题描述
需要在使用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
我以前没有尝试过这个方法,但如果“在启动时生成密钥”符合您的要求,类似这样的方法应该可以工作。
正文完