it-swarm-vi.com

Làm cách nào để thêm khóa công khai của riêng tôi vào Vagrant VM?

Tôi gặp vấn đề với việc thêm khóa ssh vào máy ảo Vagrant. Về cơ bản các thiết lập mà tôi có ở đây hoạt động tốt. Khi các VM được tạo, tôi có thể truy cập chúng thông qua vagrant ssh, người dùng "vagrant" tồn tại và có một khóa ssh cho người dùng này trong tệp authorized_keys.

Điều tôi muốn làm bây giờ là: có thể kết nối với các VM đó thông qua ssh hoặc sử dụng scp. Vì vậy, tôi chỉ cần thêm khóa công khai của mình từ id_rsa.pub vào authorized_keys - giống như tôi đã làm với ssh-copy-id

Có cách nào để nói với Vagrant trong quá trình thiết lập rằng khóa công khai của tôi phải được đưa vào không? Nếu không (có khả năng, theo kết quả google của tôi), có cách nào để dễ dàng nối thêm khóa công khai của tôi trong quá trình thiết lập mơ hồ không?

56
tehK

Sao chép khóa công khai mong muốn sẽ rơi thẳng vào giai đoạn cung cấp . Câu trả lời chính xác phụ thuộc vào việc cung cấp những gì bạn thích sử dụng (Shell, Chef, Puppet, v.v.). Điều quan trọng nhất sẽ là một nhà cung cấp file cho khóa, một cái gì đó cùng với điều này:

config.vm.provision "file", source: "~/.ssh/id_rsa.pub", destination: "~/.ssh/me.pub"

Chà, thực ra bạn cần phải thêm vào ủy quyền, sử dụng một nhà cung cấp thực sự, như Con rối . Ví dụ: xem Quản lý khóa ủy quyền SSH bằng con rối .

34
Remus Rusanu

Bạn có thể sử dụng mô-đun Tệp lõi của Ruby, như vậy:

  config.vm.provision "Shell" do |s|
    ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
    s.inline = <<-Shell
      echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
      echo #{ssh_pub_key} >> /root/.ssh/authorized_keys
    Shell
  end

Ví dụ hoạt động này nối thêm ~/.ssh/id_rsa.pub vào ~/.ssh/authorized_keys của cả người dùng gốc và người dùng gốc, điều này sẽ cho phép bạn sử dụng khóa SSH hiện có.

59
Meow

Có một cách "thanh lịch" hơn để hoàn thành những gì bạn muốn làm. Bạn có thể tìm khóa riêng hiện có và sử dụng nó thay vì gặp rắc rối khi thêm khóa công khai.

Tiếp tục như vậy để xem đường dẫn đến khóa riêng hiện có (xem bên dưới để IdentityFile ): 

chạy 

  ssh-config 

kết quả:

 $ vagrant ssh-config
Host magento2.vagrant150 
 Tên máy chủ 127.0.0.1 
 Người dùng mơ hồ 
 Cổng 3150 
 UserKnownhostsFile /dev/null
 StricthostKeyChecking không 
 Mật khẩu xác thực số 
 Danh tính "/Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key"
 Danh tính Chỉ có 
 LogLevel FATAL 

Sau đó, bạn có thể sử dụng khóa riêng như thế này, cũng lưu ý công tắc để tắt xác thực mật khẩu

 ssh -i /Users/madismanni/m2/vagrant-magento/.vagrant/machines/magento2.vagrant150/virtualbox/private_key -
31
Madis Maenni

Tôi kết thúc bằng cách sử dụng mã như:

config.ssh.forward_agent    = true
config.ssh.insert_key       = false
config.ssh.private_key_path =  ["~/.vagrant.d/insecure_private_key","~/.ssh/id_rsa"]
config.vm.provision :Shell, privileged: false do |s|
  ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  s.inline = <<-Shell
     echo #{ssh_pub_key} >> /home/$USER/.ssh/authorized_keys
     Sudo bash -c "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys"
  Shell
end

Lưu ý rằng chúng ta không nên cứng đường dẫn mã đến /home/vagrant/.ssh/authorized_keys vì một số hộp mơ hồ không sử dụng tên người dùng vagrant.

8
smartwjw

Mã ngắn hơn và đúng hơn phải là:

ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
config.vm.provision 'Shell', inline: 'mkdir -p /root/.ssh'
config.vm.provision 'Shell', inline: "echo #{ssh_pub_key} >> /root/.ssh/authorized_keys"
config.vm.provision 'Shell', inline: "echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys", privileged: false

Nếu không, .ssh/authorized_keys của người dùng sẽ thuộc về người dùng root.

Tuy nhiên, nó sẽ thêm một dòng trong mỗi lần chạy cung cấp, nhưng Vagrant được sử dụng để thử nghiệm và VM thường có tuổi thọ ngắn, vì vậy không phải là vấn đề lớn.

7
sekrett

Câu trả lời xuất sắc này đã được thêm bởi user76329 in a bị từ chối Chỉnh sửa được đề xuất

Mở rộng trên Ví dụ của Meow , chúng tôi có thể sao chép các khóa ssh pub/private cục bộ, đặt quyền và tạo idempotent script nội tuyến (chạy một lần và sẽ chỉ lặp lại nếu điều kiện kiểm tra thất bại, do đó cần phải cung cấp)

config.vm.provision "Shell" do |s|
  ssh_prv_key = ""
  ssh_pub_key = ""
  if File.file?("#{Dir.home}/.ssh/id_rsa")
    ssh_prv_key = File.read("#{Dir.home}/.ssh/id_rsa")
    ssh_pub_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  else
    puts "No SSH key found. You will need to remedy this before pushing to the repository."
  end
  s.inline = <<-Shell
    if grep -sq "#{ssh_pub_key}" /home/vagrant/.ssh/authorized_keys; then
      echo "SSH keys already provisioned."
      exit 0;
    fi
    echo "SSH key provisioning."
    mkdir -p /home/vagrant/.ssh/
    touch /home/vagrant/.ssh/authorized_keys
    echo #{ssh_pub_key} >> /home/vagrant/.ssh/authorized_keys
    echo #{ssh_pub_key} > /home/vagrant/.ssh/id_rsa.pub
    chmod 644 /home/vagrant/.ssh/id_rsa.pub
    echo "#{ssh_prv_key}" > /home/vagrant/.ssh/id_rsa
    chmod 600 /home/vagrant/.ssh/id_rsa
    chown -R vagrant:vagrant /home/vagrant
    exit 0
  Shell
end
7
Stevie Howard

Không có bài viết cũ nào làm việc cho tôi mặc dù một số đã đến gần. Tôi đã phải tạo các khóa rsa với keygen trong thiết bị đầu cuối và đi với các phím tùy chỉnh. Nói cách khác, đánh bại từ việc sử dụng các khóa của Vagrant. 

Tôi đang dùng Mac OS Mojave kể từ ngày đăng bài này. Tôi đã thiết lập hai hộp Vagrant trong một Vagrantfile. Tôi đang hiển thị tất cả các hộp đầu tiên để người mới có thể nhìn thấy bối cảnh. Tôi đặt thư mục .ssh trong cùng thư mục với tệp Vagrant, nếu không thì sử dụng thiết lập user9091383.

Tín dụng cho giải pháp này đi đến coder này.

Vagrant.configure("2") do |config|
  config.vm.define "pfbox", primary: true do |pfbox|
        pfbox.vm.box = "ubuntu/xenial64"
        pfbox.vm.network "forwarded_port", Host: 8084, guest: 80
        pfbox.vm.network "forwarded_port", Host: 8080, guest: 8080
        pfbox.vm.network "forwarded_port", Host: 8079, guest: 8079
        pfbox.vm.network "forwarded_port", Host: 3000, guest: 3000
        pfbox.vm.provision :Shell, path: ".provision/bootstrap.sh"
        pfbox.vm.synced_folder "ubuntu", "/home/vagrant"
        pfbox.vm.provision "file", source: "~/.gitconfig", destination: "~/.gitconfig"
        pfbox.vm.network "private_network", type: "dhcp"
        pfbox.vm.network "public_network"
        pfbox.ssh.insert_key = false
        ssh_key_path = ".ssh/"  # This may not be necessary.  I may remove.
        pfbox.vm.provision "Shell", inline: "mkdir -p /home/vagrant/.ssh"
        pfbox.ssh.private_key_path = ["~/.vagrant.d/insecure_private_key", ".ssh/id_rsa"]
        pfbox.vm.provision "file", source: ".ssh/id_rsa.pub", destination: ".ssh/authorized_keys"
        pfbox.vm.box_check_update = "true"
        pfbox.vm.hostname = "pfbox"
        # VirtualBox
          config.vm.provider "virtualbox" do |vb|
            # vb.gui = true
            vb.name = "pfbox" # friendly name for Oracle VM VirtualBox Manager
            vb.memory = 2048 # memory in megabytes 2.0 GB
            vb.cpus = 1 # cpu cores, can't be more than the Host actually has.
          end
  end
  config.vm.define "dbbox" do |dbbox|
        ...
0
Preston

Đây là một chủ đề tuyệt vời giúp tôi giải quyết một tình huống tương tự như các poster ban đầu mô tả.

Trong khi cuối cùng tôi đã sử dụng các cài đặt/logic được trình bày trong smartwjw's answer, tôi đã gặp một trở ngại vì tôi sử dụng biến VAGRANT_HOME môi trường để lưu công cụ thư mục vagrant.d trên ổ cứng ngoài hệ thống.

Vì vậy, đây là mã được điều chỉnh mà tôi đang sử dụng trong Vagrantfile của mình để phù hợp với biến môi trường VAGRANT_HOME đang được đặt; ma thuật của người Ma-rốc xảy ra trong dòng này vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d":

config.ssh.insert_key = false
config.ssh.forward_agent = true
vagrant_home_path = ENV["VAGRANT_HOME"] ||= "~/.vagrant.d"
config.ssh.private_key_path = ["#{vagrant_home_path}/insecure_private_key", "~/.ssh/id_rsa"]
config.vm.provision :Shell, privileged: false do |Shell_action|
  ssh_public_key = File.readlines("#{Dir.home}/.ssh/id_rsa.pub").first.strip
  Shell_action.inline = <<-Shell
    echo #{ssh_public_key} >> /home/$USER/.ssh/authorized_keys
  Shell
end
0
JakeGould

Đối với các nhà cung cấp Shell nội tuyến - thông thường khóa công khai có chứa khoảng trắng, nhận xét, v.v. Vì vậy, hãy đảm bảo đặt dấu ngoặc kép (thoát) xung quanh var mở rộng sang khóa chung: 

config.vm.provision 'Shell', inline: "echo \"#{ssh_pub_key}\" >> /home/vagrant/.ssh/authorized_keys", privileged: false
0
Dick Visser

Câu trả lời của Madis Maenni là gần nhất với giải pháp tốt nhất:

cứ làm đi:

vagrant ssh-config >> ~/.ssh/config
chmod 600 ~/.ssh/config

sau đó bạn chỉ có thể ssh thông qua tên máy chủ.

Để nhận danh sách tên máy chủ được cấu hình trong ~/.ssh/config

grep -E '^Host ' ~/.ssh/config

Ví dụ của tôi:

$ grep -E '^Host' ~/.ssh/config
Host web
Host db
$ ssh web
[[email protected] ~]$
0
Gregory