gpt4 book ai didi

security - 在服务器/Digital Ocean Droplet 上手动设置 ssh 主机 key

转载 作者:行者123 更新时间:2023-12-03 22:20:53 25 4
gpt4 key购买 nike

我想做以下事情:

  • 从我的开发机器创建 Digital Ocean 液滴(分发我的测试,这需要很长时间)。
  • 安全地向液滴发出命令。
  • 破坏液滴。

  • 我被困在#2。我可以通过 Digital Ocean API 成功创建 Droplet,并且可以在 authorized_keys 中设置我的 SSH key 。区域,但是如果我允许 Digital Ocean 创建 key ,那么我将无法验证服务器的公钥。

    现在通常如果这是在同一个数据中心内,这不会是一个问题,因为我可以依靠 Digital Ocean 不实现 MITM 攻击,因为它们无论如何都有 root,但是由于我从我的开发机器连接,我需要一个信任公钥的方式。

    我试过遵循各种 cloud-init 指南,但我总是收到错误消息:
    ssh root@178.62.69.133
    Connection closed by 178.62.69.133

    我试图消除任何出错的可能性,我什至使用 base64 编码私钥,认为可能存在一些转义问题。

    这是我用来创建 key 的命令:
    e = "ssh-keygen -t ecdsa-sha2-nistp256 -f #{loc} -q -N #{password} -C \"\""
    system(e)

    扩展到这个:
    ssh-keygen -t ecdsa-sha2-nistp256 -f /tmp/testing-60f42fcf -q -N 77924d8f4fa12a365c8c003ca091f5ad6a2c4c22 -C ""

    我然后base64编码它,
    private_key = `base64 --wrap=0 #{loc}`.chomp
    public_key = `base64 --wrap=0 #{loc}.pub`.chomp

    并将其放入 cloud-init yaml 文件中(不想使用 | 因为它是 Yaml 中的特殊字符,如果可能的话我想避免它):
    #cloud-config
    ---
    runcmd:
    - echo test > /root/test
    - rm /etc/ssh/ssh_host*
    - echo LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tClByb2MtVHlwZTogNCxFTkNSWVBURUQKREVLLUluZm86IEFFUy0xMjgtQ0JDLEY3MDNDNzM1QTAxQzgyNEVBRjhCODA4NkVDREIyMjAwCgpiYlpCa3A2Ujcyd1RRNUsyL2w4QW9YU3FQNllRVjV0aVJETytmU1FqZTlEUjY4MG9wY3RCRGhKRWdPQ0prSkw1CmhOUGxydzUveHFwTHM5UXc3cWJaWlUvRHR0YnlxZTFWUDcyVHBRS1pFL2FDcTdGTWFpbFJrcUpFa3JobVdCcFEKbWtQTW15M3BwVFZZKzJvRDZTdmMzdzZyTW1JTlpKUkltRUxiUk81S2M4bz0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=
    > /tmp/base64_pri && base64 --decode /tmp/base64_pri > /etc/ssh/ssh_host_ecdsa_key
    - echo ZWNkc2Etc2hhMi1uaXN0cDI1NiBBQUFBRTJWalpITmhMWE5vWVRJdGJtbHpkSEF5TlRZQUFBQUlibWx6ZEhBeU5UWUFBQUJCQkVHSDJBS3BVcVE0NVZQWGNFK3h5NXV6elVnajhKelBxODJNaERLV0szaGltUVBReWRPQ0RlRVdyRVJzeCtUTEtPSjBlRElJWU9jT2RWT0FteHZycG1nPSAK
    > /tmp/base64_pub && base64 --decode /tmp/base64_pub > /etc/ssh/ssh_host_ecdsa_key.pub
    - sleep 1 && service ssh restart

    (别担心,那个ssh key/droplet已经被破坏了,这是为了演示目的)

    当我忽略 echo test > /root/test 的其余命令时,我可以验证这一点。运行成功。我也在我的本地机器上测试过这个并且 md5sums 匹配:
    028760a9374f9abd9c2c66eceb20f245  /tmp/pub_key_check
    028760a9374f9abd9c2c66eceb20f245 /tmp/testing-60f42fcf.pub

    2bf65516aaef01c731d061fa4ba788c5 /tmp/pri_key_check
    2bf65516aaef01c731d061fa4ba788c5 /tmp/testing-60f42fcf

    所以我知道我正在正确解码它们。

    我尝试过其他 key 类型,但如果可能,我想使用 ecdsa key ,因为它是我其他盒子的默认值。我在这里做错了什么?另外,我是唯一一个这样做的吗?我在谷歌周围搜索过,看起来常见的答案是人们只是自动信任生成的公钥,如果你在做这个跨数据中心,我认为这很疯狂,因为任何随机的 ISP(或者,在我的情况下,咖啡馆)都可以被动MITM你。

    最佳答案

    我已经确定了解决方案!

    犯了两个错误。第一个是这样的:

    e = "ssh-keygen -t ecdsa-sha2-nistp256 -f #{loc} -q -N #{password} -C \"\""

    添加密码是我的习惯,当然机器一开始是不知道密码的!所以 -N #{password}位应该被删除到这个:
    e = "ssh-keygen -t ecdsa-sha2-nistp256 -f #{loc} -q -C \"\""

    第二个错误是我没有设置 key 的权限!所以添加了以下两个命令:
    - chmod 600 /etc/ssh/ssh_host_ecdsa_key
    - chmod 644 /etc/ssh/ssh_host_ecdsa_key.pub

    runcmd
    我真的希望 Digital Ocean 能把 key 还给我。如果你也这么认为,请在此处点赞: https://digitalocean.uservoice.com/forums/136585-digitalocean/suggestions/9307569-return-the-droplet-s-ssh-public-key-as-part-of-api

    感谢@shazow 问我正确的问题:)

    关于security - 在服务器/Digital Ocean Droplet 上手动设置 ssh 主机 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32145281/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com