AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 465675
Accepted
iamAguest
iamAguest
Asked: 2018-08-30 23:30:32 +0800 CST2018-08-30 23:30:32 +0800 CST 2018-08-30 23:30:32 +0800 CST

AWS 实例允许我在没有密码的情况下第一次使用私钥进行 ssh

  • 772

这不是关于在服务器上复制公钥然后 ssh-ing,如果你打算这样做的话。

所以我做了一个 AWS Linux 实例,我做了一个 ssh 密钥对,它自动下载了私钥。

现在我可以通过简单的方式连接到我的 AWS Linux 实例:

ssh -i key_they_gave_me ec2-user@AWSinstanceIP

我如何为我自己的 Linux 虚拟机设置这种东西?这样有人就可以使用私钥 ssh 进入它,而不需要密码?

编辑:我不是在谈论复制 id_rsa.pub。我知道该怎么做,而 AWS 实例不需要这样做。这就是我想要的。

ssh
  • 3 3 个回答
  • 146 Views

3 个回答

  • Voted
  1. cryptarch
    2018-08-31T01:47:18+08:002018-08-31T01:47:18+08:00

    SSH 允许使用空密码。ssh-keygen您可以通过在提示输入密码时简单地按 enter来复制它。来自man ssh-keygen:

    该程序还要求输入密码。密码可以为空以指示没有密码(主机密钥必须有一个空密码),或者它可以是任意长度的字符串。

    这是作为各种云服务的一部分生成的密钥的标准行为。如果您使用 Google 或 Microsoft 云,我希望您会发现同样的事情会发生。它可能看起来不安全,但替代方案也不是很好。他们需要以某种方式授予您访问 VM 的权限。

    对于任何担心安全的人,ssh-keygen还有一个无需更改公钥即可更改私钥密码的功能:

    ssh-keygen -p -f key_they_gave_me
    

    就我个人而言,我默认使用密码短语,但将无密码密钥存储在 LUKS 卷中。当我知道我将要经常使用 sshing 时,我将无密码密钥安装在默认密钥的顶部。当我完成工作后,我会卸载,所以任何入侵者仍然需要处理密码。这避免了很多时候对 ssh-agent 的需求,同时对密钥的安全性进行了很多控制。

    • 3
  2. RobotJohnny
    2018-08-31T02:08:07+08:002018-08-31T02:08:07+08:00

    您在询问 AWS 的基础设施如何生成 ssh 密钥。除非任何为 AWS 工作并被允许披露该信息的人(极不可能),否则您将无法得到完整的答案。

    最重要的是,您要寻找的答案完全取决于您使用的虚拟化后端。

    话虽如此,AWS 的公开信息是,他们现在使用自己自制的KVM虚拟化平台,而不是XEN像过去那样使用。

    所以我们可以大胆猜测 AWS 是如何做到的,或者至少提供一种通过 kvm 主机执行此操作的方法。我知道的最常见的方法是virt-sysprep在带有标志的qcow2图像上使用。--ssh-inject

    例子

    首先在 kvmhost 上生成公钥ssh-keygen。假设您的用户是iamAguest并且您已将新的公钥存储在/home/iamAguest/.ssh/id_rsa.pub

    然后,您将运行virt-sysprep以将这些密钥注入到图像中:

    virt-sysprep -a a_linux_image.qcow2 --run-command 'useradd iamAguest' --ssh-inject iamAguest:file:/home/iamAguest/.ssh/id_rsa.pub 
    

    然后,一旦您使用该映像部署了一个实例a_linux_image.qcow2,您就应该能够使用新生成的密钥通过 ssh 登录。

    亚马逊是如何通过点击按钮做到这一点的?

    一个足够简单的脚本就可以做到这一点,但在 AWS 规模的平台上,这无疑会非常复杂。

    如果您只是运行自己的 kvm 实例,那么像下面这样简单的事情就可以解决问题:

    #!/usr/bin/bash
    
    # get image and user from user input
    image=$1
    user=$2
    
    # fail if no user input
    if [ -z "$image" ] || [ -z "$user" ]; then
        echo "you must enter a filepath to an image and a user name to run this"
        echo "e.g: inject_ssh.bash <image> <user>"
        exit 1
    fi
    
    # create ssh key for current logged in user with no passphrase
    echo -e "/home/$user/.ssh/id_rsa\n\n" | ssh-keygen
    
    # inject key into image 
    virt-sysprep -a $image --run-command "useradd $user" --ssh-inject $user:file:/home/$user/.ssh/id_rsa.pub
    

    但是请注意,最好先复制图像,这样如果您打算将其作为消费者解决方案提供,那么您仍然拥有一个没有任何密钥的干净图像。在脚本中加入更多验证也是一个好主意;这只是一个简单的例子。

    • 0
  3. Best Answer
    iamAguest
    2018-09-14T23:25:11+08:002018-09-14T23:25:11+08:00

    我实际上找到了这样做的方法。其实很简单。

    假设您有 machine1 和 machine2,并且您希望能够从 machine1 访问 machine2 而无需处理 machine1 的密钥,通过一种方法可以让 machine1 的用户甚至从除 machine1 以外的另一台机器访问 machine2。

    你ssh-keygen在 machine2 上做。你这样做cat /path/.ssh/id_rsa.pub >> /path/.ssh/authorized_keys,然后chmod 600 /path/.ssh/authorized_keys,最后你将id_rsapermission.pem 文件复制并提供给 machine1。

    这样 machine1 可以连接到 machine2 做ssh -i permission.pem thatuser@machine2。machine1 的用户可以随身携带 permission.pem,无需密码即可从任何机器连接到 machine2。

    当然这是不安全的,但你也可以使用密码。我想知道的是作为一个概念如何去做。这回答了它。

    • 0

相关问题

  • 为什么 ssh 实用程序被视为 pty?

  • Auto-SSH 手动工作,但不在后台工作

  • 远程运行 X 应用程序,在远程主机上运行 GUI [关闭]

  • rsync 端口 22 和 873 使用

  • SCP突然中止:管道损坏,消息验证码不正确

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve