zac*_*san 7 security ssh cloud-init digital-ocean
我想做以下事情:
我坚持#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
Run Code Online (Sandbox Code Playgroud)
我试图消除任何错误的可能性,我甚至使用base64编码私钥,认为可能存在一些转义问题.
这是我用来创建密钥的命令:
e = "ssh-keygen -t ecdsa-sha2-nistp256 -f #{loc} -q -N #{password} -C \"\""
system(e)
Run Code Online (Sandbox Code Playgroud)
其中扩展到:
ssh-keygen -t ecdsa-sha2-nistp256 -f /tmp/testing-60f42fcf -q -N 77924d8f4fa12a365c8c003ca091f5ad6a2c4c22 -C ""
Run Code Online (Sandbox Code Playgroud)
我然后base64编码,
private_key = `base64 --wrap=0 #{loc}`.chomp
public_key = `base64 --wrap=0 #{loc}.pub`.chomp
Run Code Online (Sandbox Code Playgroud)
并将其放入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
Run Code Online (Sandbox Code Playgroud)
(别担心,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
Run Code Online (Sandbox Code Playgroud)
所以我知道我正确解码它们.
我尝试过其他键类型,但是如果可能的话我想使用ecdsa键,因为它是我其他盒子的默认值.我在这做错了什么?另外,我是唯一一个这样做的人吗?我已经谷歌了,看起来常见的答案是人们只是自动信任生成的公钥,我认为如果你正在做这个跨数据中心是疯了,因为任何随机的ISP(或者,在我的情况下,咖啡馆)可以被动地MITM你.
我已经确定了解决办法!
犯了两个错误。第一个是这样的:
e = "ssh-keygen -t ecdsa-sha2-nistp256 -f #{loc} -q -N #{password} -C \"\""
Run Code Online (Sandbox Code Playgroud)
添加密码是我出于习惯所做的事情,但当然机器一开始并不知道密码!所以-N #{password}应该将该位删除为:
e = "ssh-keygen -t ecdsa-sha2-nistp256 -f #{loc} -q -C \"\""
Run Code Online (Sandbox Code Playgroud)
第二个错误是我没有设置密钥的权限!所以添加了以下两条命令:
- chmod 600 /etc/ssh/ssh_host_ecdsa_key
- chmod 644 /etc/ssh/ssh_host_ecdsa_key.pub
Run Code Online (Sandbox Code Playgroud)
到runcmd
我真的希望 Digital Ocean 能归还钥匙。如果您也这么认为,请在这里投票: https: //digitalocean.uservoice.com/forums/136585-digitalocean/suggestions/9307569-return-the-droplet-s-ssh-public-key-as-part-of-api
感谢@shazow 问我正确的问题:)
| 归档时间: |
|
| 查看次数: |
661 次 |
| 最近记录: |