【发布时间】:2015-11-15 16:35:41
【问题描述】:
我想做以下事情:
- 从我的开发机器创建 Digital Ocean 液滴(以分发我的测试,这花费了太长时间)。
- 安全地向 Droplet 发出命令。
- 销毁液滴。
我被困在 #2 上。我可以通过 Digital Ocean API 成功创建 Droplet,我可以在 authorized_keys 区域设置我的 SSH 密钥,但是如果我允许 Digital Ocean 创建密钥,那么我无法验证服务器的公钥。
现在通常情况下,如果这是在同一个数据中心内,那就不用担心了,因为我可以依靠 Digital Ocean 不实施 MITM 攻击,因为它们无论如何都有根,但是因为我是从我的开发机器连接我需要一种信任公钥的方法。
我尝试了各种 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 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
所以我知道我正确解码了它们。
我尝试过其他密钥类型,但如果可能的话,我想使用 ecdsa 密钥,因为它是我其他盒子的默认设置。我在这里做错了什么?另外,我是唯一一个这样做的人吗?我有谷歌,看起来常见的答案是人们只是自动信任生成的公钥,如果你在做这个跨数据中心,我认为这很疯狂,因为任何随机的 ISP(或者,在我的情况下,咖啡馆)都可以被动地MITM你。
【问题讨论】:
-
没有
ecdsa-sha2-nistp256这样的类型。在手册页中,有来自[-t dsa | ecdsa | ed25519 | rsa | rsa1]的选择(至少在我的 ubuntu 上)。 -
@Jakuje 感谢您的想法,但将 ti 更改为
ecdsa或rsa并不能解决问题。
标签: security ssh digital-ocean cloud-init