ToB企服应用市场:ToB评测及商务社交产业平台

标题: sshpiper 在 Kubernetes 上的应用 [打印本页]

作者: 盛世宏图    时间: 2023-7-17 01:48
标题: sshpiper 在 Kubernetes 上的应用
sshpiper 在 Kubernetes 上的应用

介绍

GitHub Repo
一个反向代理目标服务器的 proxy,客户端想请求某个 ssh 服务器,直接请求的是 sshpiper 服务,再经由 sshpiper 服务转发到对应的 ssh 服务器,相当于一个中间人。
一开始并不理解这种组件的用处,但实际用了之后感觉还是蛮有意思的。
设想有这样一种场景,你有多个 ssh 服务器,你可能要不停切换 ssh 服务器,这过程中有可能使用不同的 ssh 秘钥来连接。而且如果是想从公司外网连进来,ssh 服务器的端口要对外网开放,会有很大的安全隐患。
ssh 可以通过密码、秘钥两种方式鉴权连接,密码方式相对简单,我也主要是使用秘钥模式连接的,这里主要介绍秘钥连接。
原理

完成整个连接过程,需要有两套秘钥(即两套公钥私钥),我们这里分别称为 PublicKey_X,PrivateKey_X,PublicKey_Y,PrivateKey_Y,其中:
客户端持 PrivateKey_X ssh 请求 sshpiper,sshpiper 使用 PublicKey_X 进行校验,校验之后 sshpiper 持 PrivateKey_Y 请求服务器,服务器持 PublicKey_Y 进行校验。
此处提及的 ssh 密钥,公钥均为 ssh-rsa XXXXXX 形式,私钥均为 pem 形式,即类似:-----BEGIN PRIVATE KEY----- 开头,-----END PRIVATE KEY----- 结尾
优点(个人总结)

Kubernetes 上的应用

目标:运行一个可以通过 sshpiper 访问的 pod。
安装

在 kubernetes Pod 中使用 sshpiper,先按照此处文档在集群中安装和部署 sshpiper 服务:
https://github.com/tg123/sshpiper/tree/master/plugin/kubernetes
我使用了手动安装,共两步:
启动 sshpiper 服务时,使用如下 yaml 配置:
  1. # sshpiper service
  2. ---
  3. apiVersion: v1
  4. kind: Service
  5. metadata:
  6.   name: sshpiper
  7. spec:
  8.   selector:
  9.     app: sshpiper
  10.   ports:
  11.     - protocol: TCP
  12.       port: 2222
  13.       targetPort: 2222
  14.       nodePort: 30022
  15.   type: NodePort
  16. ---
  17. apiVersion: v1
  18. data:
  19.   server_key: | # 此配置暂时没发现用处,直接使用官方提供的样例中的值即可
  20.     LS0tLS1CRUdJTiBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0KYjNCbGJuTnphQzFyWlhrdGRqRUFBQUFBQkc1dmJtVUFBQUFFYm05dVpRQUFBQUFBQUFBQkFBQUFNd0FBQUF0emMyZ3RaVwpReU5UVXhPUUFBQUNCWUhWV01lNzVDZ3Rzdm5rOWlTekJFU3hSdjdMb3U3K0tVbndmb3VnNzcxZ0FBQUpEQnArS0d3YWZpCmhnQUFBQXR6YzJndFpXUXlOVFV4T1FBQUFDQllIVldNZTc1Q2d0c3ZuazlpU3pCRVN4UnY3TG91NytLVW53Zm91Zzc3MWcKQUFBRUJKSDU3eTFaRTUxbVo2a2VsWUR0eDQ1ajBhZGdsUk5CY0pZOE94YTY4TEJWZ2RWWXg3dmtLQzJ5K2VUMkpMTUVSTApGRy9zdWk3djRwU2ZCK2k2RHZ2V0FBQUFEV0p2YkdsaGJrQjFZblZ1ZEhVPQotLS0tLUVORCBPUEVOU1NIIFBSSVZBVEUgS0VZLS0tLS0K
  21. kind: Secret
  22. metadata:
  23.   name: sshpiper-server-key
  24. type: Opaque
  25. ---
  26. apiVersion: apps/v1
  27. kind: Deployment
  28. metadata:
  29.   name: sshpiper-deployment
  30.   labels:
  31.     app: sshpiper
  32. spec:
  33.   replicas: 1
  34.   selector:
  35.     matchLabels:
  36.       app: sshpiper
  37.   template:
  38.     metadata:
  39.       labels:
  40.         app: sshpiper
  41.     spec:
  42.       serviceAccountName: sshpiper-account
  43.       containers:
  44.       - name: sshpiper
  45.         imagePullPolicy: IfNotPresent
  46.         image: farmer1992/sshpiperd:latest
  47.         ports:
  48.         - containerPort: 2222
  49.         env:
  50.         - name: PLUGIN
  51.           value: "kubernetes"
  52.         - name: SSHPIPERD_SERVER_KEY
  53.           value: "/serverkey/ssh_host_ed25519_key"
  54.         - name: SSHPIPERD_LOG_LEVEL
  55.           value: "trace"
  56.         volumeMounts:
  57.         - name: sshpiper-server-key
  58.           mountPath: "/serverkey/"
  59.           readOnly: true         
  60.       volumes:
  61.       - name: sshpiper-server-key
  62.         secret:
  63.           secretName: sshpiper-server-key
  64.           items:
  65.           - key: server_key
  66.             path: ssh_host_ed25519_key
  67. ---
  68. apiVersion: rbac.authorization.k8s.io/v1
  69. kind: Role
  70. metadata:
  71.   name: sshpiper-reader
  72. rules:
  73. - apiGroups: [""]
  74.   resources: ["secrets"]
  75.   verbs: ["get"]
  76. - apiGroups: ["sshpiper.com"]
  77.   resources: ["pipes"]
  78.   verbs: ["get", "list", "watch"]
  79. ---
  80. apiVersion: rbac.authorization.k8s.io/v1
  81. kind: RoleBinding
  82. metadata:
  83.   name: read-sshpiper
  84. subjects:
  85. - kind: ServiceAccount
  86.   name: sshpiper-account
  87. roleRef:
  88.   kind: Role
  89.   name: sshpiper-reader
  90.   apiGroup: rbac.authorization.k8s.io
  91. ---
  92. apiVersion: v1
  93. kind: ServiceAccount
  94. metadata:
  95.   name: sshpiper-account
复制代码
启动成功后如下图:

镜像准备

由于需要访问 ssh 服务,所有业务 Pod 的基础镜像需要运行 ssh 服务并暴露 ssh 接口。还需要将 PublicKey_Y 写入目标容器的 .ssh/authorized_keys 文件中。
这里我用官方使用的 lscr.io/linuxserver/openssh-server:latest 镜像,它提供了 PUBLIC_KEY 环境变量,在启动时自动将其中配置的 public_key 写入 .ssh/authorized_keys 文件中。
除此之外,亦可以通过设置 ConfigMap,将 public_key 挂载进容器的路径下。
启动容器
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: host-publickey
  5. spec:
  6.   replicas: 3
  7.   selector:
  8.     matchLabels:
  9.       app: host-publickey
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: host-publickey
  14.     spec:
  15.       containers:
  16.       - name: host-publickey
  17.         image: lscr.io/linuxserver/openssh-server:latest
  18.         imagePullPolicy: IfNotPresent
  19.         ports:
  20.         - containerPort: 2222
  21.         env:
  22.         - name: USER_NAME
  23.           value: "user"
  24.         - name: PUBLIC_KEY
  25.           value: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDgMF4AKRaRf3V2+6T7rluYW37t5TwuQDcdT966jKhKNHBkLHuT/YhBuWkpHuGR3Wh3S3zGAZ73vZ8zJHXsOPmBakkxPa9lqSHMj7Y0mN/0XvpcIHIdphzKUiEIP65N6OG2ZtYaZYti8wDNs1rW+V2Vx5IlOcT8IiNQ5FNvOozS9w=="
  26. ---
  27. apiVersion: v1
  28. kind: Service
  29. metadata:
  30.   name: host-publickey
  31. spec:
  32.   selector:
  33.     app: host-publickey
  34.   ports:
  35.     - protocol: TCP
  36.       port: 2222
复制代码
创建 pipe

pipe 就是第一步安装中安装的 CRD。它负责定义 from 和 to 的相关信息,以及保存前面提到的 PublicKey_X 和 PrivateKey_Y
  1. apiVersion: v1
  2. data:
  3.   ssh-privatekey: |
  4.     LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlDWGdJQkFBS0JnUURnTUY0QUtSYVJmM1YyKzZUN3JsdVlXMzd0NVR3dVFEY2RUOTY2aktoS05IQmtMSHVUCi9ZaEJ1V2twSHVHUjNXaDNTM3pHQVo3M3ZaOHpKSFhzT1BtQmFra3hQYTlscVNITWo3WTBtTi8wWHZwY0lISWQKcGh6S1VpRUlQNjVONk9HMlp0WWFaWXRpOHdETnMxclcrVjJWeDVJbE9jVDhJaU5RNUZOdk9velM5d0lEQVFBQgpBb0dCQU5ZcG5rS3MvYUEwa0hQL1pOWUE5QU1SdEtseHlSR3R5bmkzNmQ5dnF2eG9KODJxS010dzhROUlIY3RvCmNyZXpPSzV0Y0Y1L0FldE1PNTdSZjgwUGlGaHNvenowWnJkU2dzNXNZa2N4aS9CQTNBa05UNXh4aVo0STQxOEoKRStVemZnVDFOT0Y5bnNzbWoxQWVnNlJ1d3RYbVJkWElRUm1wcEtVVjBNcENERGJoQWtFQStiTk0wQzhxaHFpeQpyVWg0VFpSUWhGc0FyRTMzL1NoVzNobU5pdUd0Qjc3QnVXSFBWVDlnaDFpV0Mwby9CV0FSZUlSR05WbUdhZGtTClUxZCswdk8wdVFKQkFPWFlUT1dLZEd6MWZKVGJNWDdnNUVsRmV0NVpEV3hwZFEzWWpiUEQzRDg2cDNaN1JrVHMKQ1RQdDd1VjVzZXpZZWJKK1B5SnI5WVEzOXBybm02S0xUUzhDUUhVZEpYL1hQMmpkSXNDblp0VnNKTCtQTnllWgpnaUNZbFBXaW9vSnJDbzdCWjNjZGF2TWV3SlY2ZFJWaWcyQndDSUd2K0lYNU1WUGYzZnA4NVJ6bjlQRUNRUURiClhvU1dHSDFpZVRLOGlEQkhYckhEMVJLZUlQU1U0bG9jS3ZHai8yMjQwMng5d3M2Z2ZYK1RGcWFLVW9vaytiKzkKUW8xVGR5TFBYUEo3aWs2YTVzVjFBa0VBN1FPc1lPZ0FXeFZzbCttdFBva3VkS3FUa2lYaDNVNFp5Si8zWDZ5YgpwVjVkQWtLQlRMdjVwMFdEQlcyVDB5UmpaMGNDME01ckkyMHI2ejdnWktCeFJnPT0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0=
  5. kind: Secret
  6. metadata:
  7.   name: host-publickey-key
  8. type: kubernetes.io/ssh-auth
  9. ---
  10. apiVersion: sshpiper.com/v1beta1
  11. kind: Pipe
  12. metadata:
  13.   name: pipe-publickey
  14.   annotations:
  15.     privatekey_field_name: ssh-privatekey # this is optional, default is ssh-privatekey
  16. spec:
  17.   from:
  18.   - username: "test"
  19.     authorized_keys_data: "c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCQVFERThzZnBiOXkweVNRMTRsaWpQNnc5QWg2UEF6SC9hdGdXVDB5c3NZL29aSGJONDlwUHk4OWt1NC9ndmUwWEZOcE5HMGN2aThOQ3J5aDdNNDBZWnN1KzlXY1BpR2RXRnVuVG4xMGhWWmVQaGhTQk5WUVByMU16dy9MNHpTb3U2amozdWh4aHI1a3pNdi9pbWY1WFFHT2U5WEVKaTBoK29lbVlPUkxybUNvKzhWUFkvb29SL2tIY3J5L3ZuVVdoek1GYzNXMC9Pck80Q2ZvUlBnc1VabGREVnZmU0toUnlQQllISkJhaHUza0xLWC9VRk9ZRnRzd2lZTWtMWHpwY0JjSmJnUDE0RHFaNGIxZEhmZHp5MGZCYThyTVJFWEI5NHErNlhnV1cvRDlKbUQzaURQd2pRengySVRTZXRCSUlhYjlvYWkzRWd0TTdDQk13ZE5tdk5mQXQgNzYwNzUyNTgwQHFxLmNvbQo="
  20.   to:
  21.     host: 10-244-3-30.default.pod.cluster.local:2222
  22.     username: "user"
  23.     private_key_secret:
  24.       name: host-publickey-key
  25.     ignore_hostkey: true
复制代码
Piper 中所填写的 privateKey,
注意:
上面我使用 pod-ip-addres.namespace.pod.cluster-domain.example 方式作为 to.host 。创建 pipe 之后,通过命令 ssh test@sshpiperIP -p 30022 -i ~/.ssh/id_rsa

应用场景和业务流程


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4