在服务器/ Digital Ocean Droplet

时间:2015-08-21 16:32:16

标签: security ssh digital-ocean cloud-init

我想做以下事情:

  1. 从我的开发机器创建数字海洋水滴(分发我的测试,这需要花费太长时间)。
  2. 安全地向Droplet发出命令。
  3. 消灭液滴。
  4. 我坚持#2。我可以通过Digital Ocean API成功创建水滴,我可以在authorized_keys区域设置我的SSH密钥,但如果我允许Digital Ocean创建密钥,那么我无法验证服务器'公钥。

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

    我已尝试过各种cloud-init指南,但我总是收到错误:

    ssh root@178.62.69.133
    Connection closed by 178.62.69.133
    

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

    这是我用来创建密钥的命令:

    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键/ 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
    

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

    我尝试了其他关键类型,但我想尽可能使用ecdsa密钥,因为它是我其他框的默认设置。我在这做错了什么?另外,我是唯一一个这样做的人吗?我已经谷歌了,看起来常见的答案是,人们只是自动信任生成的公钥,我认为如果你做任何随机ISP(或者在我的情况下,咖啡馆),你认为这是疯了)可能被动地MITM你。

1 个答案:

答案 0 :(得分:3)

我已经确定了解决方案!

犯了两个错误。首先是:

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 \"\""

第二个错误是我没有设置密钥的权限!因此添加了以下两个命令:

- chmod 600 /etc/ssh/ssh_host_ecdsa_key
- chmod 644 /etc/ssh/ssh_host_ecdsa_key.pub

runcmd

我真的希望Digital Ocean能够返回密钥。如果您认为这样过于投票:https://digitalocean.uservoice.com/forums/136585-digitalocean/suggestions/9307569-return-the-droplet-s-ssh-public-key-as-part-of-api

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

相关问题