如何从Dockerfile为容器创建SSH密钥?

inn6fuwd  于 2023-05-22  发布在  Docker
关注(0)|答案(1)|浏览(220)

对于我的特定用例,我试图在带有M1芯片的MBP上学习Ansible。由于使用VirtualBox不再可能,我想通过容器测试Ansible剧本。
我的想法是设置两个容器;一个将运行Ansible playbook(控制器),另一个将在其上运行Ansible playbook(目标)。我需要的一个关键特性是从控制器节点到目标节点的SSH功能。
到目前为止,我已经能够通过下面的设置SSH进入目标节点。但是,我想知道如何通过Dockerfile设置SSH密钥创建和传输?或者,有没有一种方法可以在本地创建SSH密钥,并在构建Dockerfile时将它们附加到Dockerfile?

创建桥接网络:

docker network create localnet

在交互模式下运行两个不同的容器(在不同的终端窗口中)

docker container run --name controller --network localnet -it --rm alpine ash
docker container run --name target --network localnet -it --rm alpine ash

从容器内

  • 目标灰 *
/ # apk update
/ # apk add openssh
/ # ssh-keygen -A
/ # /usr/sbin/sshd
  • 控制器灰 *
/ # apk update
/ # apk add openssh
/ # ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:

然后,我手动复制在控制器上创建的公钥,并将其存储在目标节点~/.ssh/authorized_keys中。这个过程允许我通过在控制器节点中运行ssh root@target来SSH进入目标节点。
如何使用Dockerfile复制此设置过程?

nbysray5

nbysray51#

要回答您评论中的问题:不,SSH密钥不是特定于主机的。
用于用户公钥认证的密钥作为简单的纯文本编码文件存储在~/.ssh/中(默认情况下),并且可以简单地从一个主机复制到另一个主机。
用于验证服务器的主机密钥是(默认情况下是òpenssh ) stored in/etc/ssh/。它们 * 应该 * 对于特定主机是唯一的,因此不能被重用-但从技术上讲,仍然可以通过简单地将文件复制到另一个主机来重用。 我同意Tadman的观点:密钥不应包含在映像中,而应在运行时绑定安装到容器或[provided as a secret](https://docs.docker.com/engine/swarm/secrets/)中。但这取决于您的用例,这里的最佳选择是什么。 因此,映像只需要安装openssh,您只需将预配置的authorized_keys文件绑定挂载到~/.ssh/`:

FROM alpine

RUN apk update
RUN apk add openssh
docker build -t ansible-base .

# create ssh keys on the host
mkdir ./target_ssh_config/ ./controller_ssh_config/
ssh-keygen -f controller_ssh_config/id_rsa
cat controller_ssh_config/id_rsa.pub >> target_ssh_config/authorized_keys

# start target container with ssh config/keys from ./target_ssh_config/
docker container run -d --name target -v "$PWD/target_ssh_config/":/root/.ssh/ ansible-base ash -c 'ssh-keygen -A && /usr/bin/sshd -D'

# start interactive controller with ssh keys from ./controller_ssh_config/
docker container run --name controller -v "$PWD/controller_ssh_config/":/root/.ssh/ -it --rm ansible-base ash

相关问题