我想做以下事情:
我坚持#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你。
答案 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向我提出正确的问题:)