一、ssh介绍
SSH公钥和私钥是用于SSH(Secure Shell)协议中的一对密钥,用于身份验证和安全通信。SSH是一种加密的网络协议,常用于在不安全的网络中安全地进行远程登录和执行命令。
公钥:
公钥是密钥对中公开的部分,可以安全地分享给任何人或存储在远程服务器上,没有泄露风险。
公钥通常用于加密会话密钥、验证数字签名或加密可以用相应的私钥解密的数据。
在SSH登录认证过程中,公钥被放置在远程服务器上用户账号的~/.ssh/authorized_keys文件中。当有客户端尝试连接服务器时,服务器会使用公钥来验证客户端发送的签名是否合法,以此确认远程登录用户持有对应的私钥。
私钥:
私钥是密钥对中非公开的部分,它必须保密,绝不能被泄露或分享给其他人。
私钥通常由SSH客户端软件生成并带有密码保护(可选)。
在SSH登录过程中,私钥被用来对服务端发起的挑战进行签名,进而证明客户端确实拥有对应的私钥。
工作原理:
客户端请求连接到SSH服务器。
服务器检查客户端是否提供了一个公钥。
如果客户端提供了一个公钥,服务器使用这个公钥生成一个随机数并发送给客户端作为挑战。
客户端使用私钥对这个挑战进行签名,然后将签名发送回服务器。
服务器用公钥验证这个签名,如果验证成功,则允许客户端登录。
优势:
提供了更强的安全性,相对于基于密码的身份验证。
允许设置无密码登录,提高了操作的便捷性同时仍然保持了较高的安全性。
用于加密通信,确保数据在传输过程中的机密性。
生成与管理:
使用ssh-keygen命令可以生成SSH公钥和私钥。在生成过程中,可以选择密钥类型、设置密码(可选)等。
公钥可以安全地分享,通常复制并添加到远程代码托管平台账户上进行身份验证。
私钥是与用户身份相关联的关键部分,必须妥善保存在本地,不应与他人共享。
二、ConfigMap和Secret介绍
ConfigMap
ConfigMap是一个Kubernetes资源,允许您将配置数据与应用程序代码分开存储。它提供了一种将配置设置与应用程序本身分离的方法,从而可以更轻松地管理和更新配置,而无需修改应用程序的代码或容器镜像。
ConfigMap通常用于存储键值对或配置文件。它可以通过使用YAML文件的声明性方法或通过 Kubernetes API 创建。创建后,ConfigMap 可以作为卷挂载,也可以作为容器化应用程序中的环境变量公开
Secret
Secret对象是一种用于在集群中安全地存储和管理敏感数据的机制。Secret的主要作用包括安全存储、保密传输和应用集成。
安全存储方面,Secret可以将密码、API密钥、TLS证书、SSH密钥等敏感数据以加密形式存储在集群内部,而不是直接暴露在配置文件或容器镜像中。
保密传输方面,当Secret被挂载到Pod时,虽然数据是以明文形式存在于Pod的文件系统中,但在存储和分发过程中,这些数据会被kubelet自动解密,并确保在集群内部网络中的传输是加密的。
应用集成方面,Secret可以以环境变量或者卷文件的形式注入到Pod中,使得应用程序能够访问必要的私密数据,同时避免了在代码仓库或其他非加密介质中硬编码这些敏感信息
三、Dockerfile制作ssh免密镜像
FROM centos:centos7.9.2009
# 安装openssh-server
RUN yum install -y epel-release
RUN yum install -y openssh-server openssh-clients cronie && \
ssh-keygen -A
#设置 root 用户密码
RUN echo "root:root" | chpasswd
# SSH登录设置允许 root 用户
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config && \
echo "AuthorizedKeysFile /root/.ssh/authorized_keys" >> /etc/ssh/sshd_config && \
mkdir -p /root/.ssh && \
chmod 700 /root/.ssh
# 暴露 SSH 端口
EXPOSE 22
# 容器启动时启动SSH服务
CMD ["/usr/sbin/sshd", "-D"]
四、创建ConfigMap和Secret
公钥和私钥目录(一般是/root/.ssh)
物理机上
kubectl create configmap ssh-public-keys --from-file=/root/.ssh/id_rsa.pub
kubectl create secret generic ssh-key-secret --from-file=/root/.ssh/id_rsa
五、部署免密POD,并挂载公钥和私钥
apiVersion: apps/v1
kind: Deployment
metadata:
name: ssh
labels:
app: ssh
spec:
selector:
matchLabels:
app: ssh
template:
metadata:
labels:
app: ssh
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1
containers:
- name: ssh
image: ssh:v1
command: ["/bin/sh"]
args:
- "-c"
- |
mkdir -p /root/.ssh &&
chmod 700 /root/.ssh &&
echo "$(cat /keys/id_rsa.pub)" > /root/.ssh/authorized_keys &&
echo "$(cat /keys/id_rsa)" > /root/.ssh/id_rsa &&
chmod 600 /root/.ssh/authorized_keys /root/.ssh/id_rsa &&
echo "PubkeyAuthentication yes" >> /etc/ssh/sshd_config &&
echo "AuthorizedKeysFile /root/.ssh/authorized_keys" >> /etc/ssh/sshd_config &&
/usr/sbin/sshd -D -e
ports:
- containerPort: 22
volumeMounts:
- name: ssh-key-volume
mountPath: "/keys/id_rsa.pub"
subPath: id_rsa.pub
readOnly: true
- name: ssh-key
mountPath: "/keys/id_rsa"
subPath: "id_rsa"
readOnly: true
volumes:
- name: ssh-key-volume
configMap:
name: ssh-public-keys
- name: ssh-key
secret:
secretName: ssh-key-secret
六、测试
kubectl get po -o wide
ssh ip 试试