VagrantでAnsibleを使うのはSSHの理解がカギ

Pocket

VagrantでAnsibleを使うのは、SSHを使ってリモートホストを操作します。なので、SSHがつながらないと話になりません。

SSHのしくみ

SSHの接続には秘密鍵と公開鍵の2つを使います。

公開鍵は、秘密鍵から作ることができます。

クライアント側とサーバー側の双方で秘密鍵と公開鍵があります。このうち公開鍵をお互いに送って保管することで通信ができます。

サーバーに接続してみて.sshディレクトリにあるauthorized_keysが保管場所。自分のホームディレクトリの.sshディレクトリの中のknown_hostsというファイルが保管場所です。

接続される側(サーバー側)で使われるのがauthorized_keysで、接続する側(クライアント側)で使われるのがknown_hostsです。

SSHクライアントで接続しようとしている場合、まずパスワードで接続してクライアント側の公開鍵をサーバー側に送ります。接続されるサーバー側は、authorized_keysという中にクライアント側の公開鍵をいれます。

そのあとで、サーバー側からサーバー側の公開鍵をクライアント側に送ります。これをクライアント側でknown_hostsに登録することで鍵認証で通信する準備が整います。これは、初めてsshで接続しようとしたときに警告が出てyesと答えると自動でやってくれます。

一度設定が済むと、

ssh -i <秘密鍵> <リモートホスト名>

で接続できます。

Vagrantの場合

Vagrantで作ったゲストOSにSSHを使ってパスワードでログイン

まずは、ゲストOSにパスワードでログインしてみます。

まず、vagrant ssh-configでVagrantが使っているsshの設定を見てみます。

$ vagrant ssh-config

Host default
  HostName 127.0.0.1
  User ubuntu
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/msys32/home/vagrant/vm/ubuntu16.04/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

HostNameが接続時に設定するホスト、Userがユーザー名、Portがポート番号です。-pでポート番号を指定して、ユーザー名とホスト名を@マークで区切って指定します。

$ ssh -p 2222 ubuntu@127.0.0.1

The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established.
ECDSA key fingerprint is SHA256:h8pe0EpC3I5ocDrZ7PGUxjYMIs2Wh8lIsXG0R/C3S5A.
Are you sure you want to continue connecting (yes/no)?

なにやら表示が出ます。これは、サーバー側の公開鍵をホームディレクトリの.ssh/known_hostsに登録してもいいかという意味です。

yesと答えると、パスワードを聞かれます。

ubuntu@127.0.0.1's password:

Vagrantでubuntu/xenail64をゲストに使ったときは、ゲストのパスワードは、C:\ユーザー\自分の名前\.vagrant.dのなかのVagrantfileの中に書かれています。

ubuntu/xenial64の場合は以下のところです。

C:\Users\(your name)\.vagrant.d\boxes\ubuntu-VAGRANTSLASH-xenial64\20170423.0.0\virtualbox\Vagrantfile

これでログインできると思います。

公開鍵認証を使う場合

Vagrantの場合は、ホームディレクトリの.vagrant\machines\(host名)\virtualboxというフォルダの中にprivate_keyがつくられています。これを使って、ゲストOSに接続しています。
Vagrantが最初にvagrant upしたとき、ホストの公開鍵をコピーしてゲストOSのAuthorized_keysに登録しています。これで、パスワードなしでも鍵を使ってログインできるようになっています。

このauthorized_keysを確認してみます。

$ vagrant ssh

で接続して

(remote host) $ cat .ssh/authorized_keys

で、なかを見ると、

ssh-rsa AAAAB3NzaC----すごく長い------CBnRropmyAxL vagrant

みたいにssh-rsaで始まりvagrantで終わっているのがVagrantが送ったクライアント側の公開鍵です。

(remote host) $ exit

でログアウトします。

実際にsshを使って手動で接続してみようと思います。

まず、vagrant ssh-configでVagrantが使っているsshの設定を見てみます。

$ vagrant ssh-config

Host default
  HostName 127.0.0.1
  User ubuntu
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/msys32/home/vagrant/vm/ubuntu16.04/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

HostNameが接続時に設定するホスト、Userがユーザー名、Portがポート番号、IdentityFileが接続時に使う秘密鍵です。

sshで-iで秘密鍵を、-pでポート番号を、ホストの前に@マークで名前を指定して接続してみます。

$ ssh -i .vagrant/machines/default/virtualbox/private_key -p 2222 ubuntu@127.0.0.1

最初に接続したときは、ゲストOS(接続先)の公開鍵が登録されていないため、次のような警告が出ます。

The authenticity of host '[127.0.0.1]:2222 ([127.0.0.1]:2222)' can't be established.
ECDSA key fingerprint is SHA256:+lHBujro5WLFzsFfFSFTQzWS/E35OvSwdr8t8OO/AFo.
Are you sure you want to continue connecting (yes/no)? 

yesと入力しリターンキーを押すとパスワードなしでログインしたと思います。この確認は2度目から出ません。

(remote host)$ exit

でログアウトして、自分のホームディレクトリの.ssh/known_hostsを確認してみます。

$ cat ~/.ssh/known_hosts

[127.0.0.1]:2222 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBE1rZpVqvH1jYQ2lEjm0zc0LORZh7aIH61qIS0msMbBvA0W1s+NTgiftffhTcnON903vw/pWt9tqNhR69wNJsI8=

ホスト127.0.0.1ポート番号2222としてリモートホストの公開鍵が登録されています。

なお、vagrant destroyしたあと、vagrant upでゲストOSを作り直し、sshで接続しようとすると、次のようなエラーになります。

$ ssh -i .vagrant/machines/default/virtualbox/private_key  -p 2222 ubuntu@127.0.0.1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:h8pe0EpC3I5ocDrZ7PGUxjYMIs2Wh8lIsXG0R/C3S5A.
Please contact your system administrator.
Add correct host key in /home/vagrant/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/vagrant/.ssh/known_hosts:3
ECDSA host key for [127.0.0.1]:2222 has changed and you have requested strict checking.
Host key verification failed.

これは、ゲストOSを作り直して公開鍵が変わってしまったために、ホームディレクトリで保存しているゲストOSの公開鍵と違っているためです。

このときは、エディタで~/.ssh/known_hostsの[127.0.0.1]:2222の行を削除すると接続することができます。

このようにvagrant ssh-configで確認した設定値を使って、sshで接続することができます。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください