【问题标题】:Creating ssh secrets key file in kubernetes在 kubernetes 中创建 ssh 密钥文件
【发布时间】:2020-02-24 23:49:00
【问题描述】:

如果我使用 kubectl 从 id_rsa 文件创建秘密:

kubectl create secret generic hcom-secret --from-file=ssh-privatekey=./.ssh/id_rsa

然后将秘密挂载到容器中

"volumeMounts": [
        {"name": "cfg", "readOnly": false, "mountPath": "/home/hcom/.ssh"}
      ]

"volumes": [
      {"name": "cfg", "secret": { "secretName": "hcom-ssh" }}
    ],

生成的文件不是 id_rsa 而是 ssh-privatekey 并且其中的许可不是 ssh 期望的 600

这是一种正确的方法吗,或者任何人都可以详细说明应该如何做到这一点?

【问题讨论】:

  • 如果您希望名称为 id_rsa,您可能应该这样做 --from-file=id_rsa=./.ssh/id_rsa
  • id_rsa 不是有效的文件名 - 正则表达式验证失败。即使我生成一个 json 文件并尝试对其进行编辑并使用 id_rsa 作为文件名,它也不会加载该密钥
  • 我明白了,Kubernetes 似乎有一个奇怪的限制,其中秘密名称(和其他名称,如标签)必须是有效的 DNS 名称,符合 [a-z0-9]([-a-z0-9]*[a-z0-9])? 这里是 relevant code跨度>
  • 我实际上可以使用文件名,因为我可以使用 -i 将它传递给 ssh,但我必须在我的 docker 容器中将权限级别更改为 600

标签: ssh kubernetes


【解决方案1】:

Kubernetes 的官方机密文档涵盖 this exact use-case。

要创建秘密,请使用:

$ kubectl create secret generic my-secret --from-file=ssh-privatekey=/path/to/.ssh/id_rsa --from-file=ssh-publickey=/path/to/.ssh/id_rsa.pub

要将秘密挂载到您的容器中,请使用以下 Pod 配置:

{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "secret-test-pod",
    "labels": {
      "name": "secret-test"
    }
  },
  "spec": {
    "volumes": [
      {
        "name": "secret-volume",
        "secret": {
          "secretName": "my-secret"
        }
      }
    ],
    "containers": [
      {
        "name": "ssh-test-container",
        "image": "mySshImage",
        "volumeMounts": [
          {
            "name": "secret-volume",
            "readOnly": true,
            "mountPath": "/etc/secret-volume"
          }
        ]
      }
    ]
  }
}

到目前为止,Kubernetes 实际上并没有办法控制密钥的文件权限,但a recent Pull Request 确实添加了对更改密钥路径的支持。根据this comment1.3 添加了此支持

这里是权限相关的 Github 问题:

【讨论】:

  • 谢谢 - 我从 PR 中看到它实际上是在 1.4 中,但不是在 1.3 中。同样为了完整性,您在此处发布的文档是不准确的,因为它实际上声明它将挂载一个名为 id_rsa 的文件,并且该挂载引用了一个名为 ssh-key-secret 的秘密,而 kubectl 行创建了一个名为 my-secret 的秘密。
  • 我明白了,请随时提出修改建议,我会接受,如果不可行,我将在今天晚些时候添加修改。
  • 似乎这样做不会保留换行符,到目前为止,我在使用没有换行符的键时遇到了麻烦。是否存在解决方法?
  • 文件权限是否已确认有效?我想我使用的是 1.6 并且具有类似的设置,ssh 密钥和配置具有完整的读写权限
  • 在入口点添加一个工作区: if [ -f /home/jenkins/.ssh/id_rsa ];然后回显“为 ssh 私钥设置正确权限” chmod 600 pwd.ssh/id_rsa fi
【解决方案2】:

从 kubernetes-1.4 开始,事情变得更简单了。这是我对如何改进the official Kubernetes howto 的看法。

要创建秘密,请使用:

kubectl create secret generic ssh-keys --from-file=id_rsa=/path/to/.ssh/id_rsa --from-file=id_rsa.pub=/path/to/.ssh/id_rsa.pub

要将秘密挂载到您的容器中,请使用以下 Pod 配置:

apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
  labels:
    name: secret-test
spec:
  volumes:
  - name: ssh-keys-v
    secret:
      secretName: ssh-keys
      defaultMode: 0600 
  containers:
  - name: ssh-test-container
    image: mySshImage
    volumeMounts:
    - name: ssh-keys-v
      readOnly: true
      # container will see /root/.ssh/id_rsa as usual:
      mountPath: "/root/.ssh"

还有点挑剔:id_rsa.pub 几乎从未使用过,除非需要,否则我不会费心将其保密。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2018-09-19
    • 2018-08-19
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多