サーバへログインする際に毎回パスフレーズを入力するのって面倒ですよね。今回はSSH公開鍵認証を使用してパスワード(パスフレーズ)不要でリモートサーバにログインする方法を紹介します。
SSH公開鍵認証でパスワード無しでログインする
メリット
まずは、設定することのメリットなに?について説明します。
まずは当たり前ですが、リモートホストへログインするときにパスワードの入力が不要です。たとえば
1 2 3 |
# ssh hostname または # ssh 192.168.1.10 |
などだけでログインできます。通常は、以下のようになります。
1 2 |
# ssh hoge@192.168.1.10 hoge@192.168.1.10's password: ★パスワードを入力しないといけない |
これを応用した使い方ですが、バックアップをスクリプトで自動化していて scp でリモートサーバへ送ろうとすると、通常はパスワードを入力する必要があるので上手くいきませんが、この設定をすることでパスワード不要で行うことができます。rsync で同期をとる場合や SFTP でも同じですね。
設定手順
実際に設定してみます。
まずは、認証で使用する鍵ペア(公開鍵+秘密鍵)を作成します。つくり方は以下のページで紹介しています。※パスフレーズを入力するところでは、何も入力せずにエンターキーを押下して進んでくださいね。
鍵ペアが作成できたでしょうか。以下のようにファイルが出来上がっていると思います。
1 2 3 |
$ ls ~/.ssh/ id_rsa # 秘密鍵 id_rsa.pub # 公開鍵 |
次に、接続先のホストへ公開鍵を登録します。
1 2 3 4 5 |
$ cd ~/.ssh $ ssh-copy-id hoge@192.168.1.10 hoge@192.168.1.10's password: ★接続先ホストのhogeユーザのパスワードを入力 Number of key(s) added: 1 |
登録できました。それでは、SSH接続してみます。
1 |
$ ssh 192.168.1.10 |
パスワードの入力をパスワードを聞かれずにログインできれば成功です。よかったですね。
ただ、この設定手順では、接続元/接続先のユーザが同じ場合でないと接続できません。今回の場合は、両方のホストにhogeユーザがいないとダメです。じゃあ、接続先では別のユーザとしてログインしたい!っていうときの設定手順を紹介します。
接続先で別のユーザでログインするときの設定手順
例えば、以下のような場合を想定。
接続元のユーザ | hoge |
接続先のユーザ | foo |
この場合、接続元の hoge ユーザで鍵ペアをつくるところまでは同じです。
その後、hogeユーザの公開鍵を接続先に送るときにfooユーザを指定して、以下のように鍵をコピーします。
1 2 3 4 5 6 |
$ whoami hoge $ ssh-copy-id foo@192.168.2.30 ★fooユーザを指定する foo@192.168.2.30's password: ★fooユーザのパスワードを入力 Number of key(s) added: 1 |
接続先サーバでfooユーザで確認してみると。
1 2 3 4 5 6 7 8 |
$ whoami foo $ ls ~/.ssh/ authorized_keys $ more authorized_keys ssh-rsa AAAAB・・・・・7euRF5/ hoge@Cent74SV |
公開鍵(authorized_keys)の最後に「hoge@サーバ名」のコメントが着いています。ここまでできたら、SSH接続が可能です。sshコマンド実行時は ユーザ名@ホスト名 と指定します。
1 |
ssh foo@192.168.2.30 |
ただ、このやり方だと、sshコマンドを実行するときに毎回 ユーザ名@ホスト名 と指定しないといけない。そこで、もう少し簡単になる方法があるので紹介します。
SSH接続用設定ファイルを作成
簡単になる方法とは、接続設定用のコンフィグを作成しておくことができるのです。内容は以下のように作成する。
1 2 3 4 5 |
Host foo-Cent73sv HostName 192.168.2.30 Port 10022 User foo IdentityFile ~/.ssh/id_rsa |
接続元のssh接続を利用するユーザのホームディレクトリ配下に config ファイルを作成します。
Host | 識別子(sshコマンドの引数に渡す識別子) |
HostName | 接続対象(IPアドレス or ホスト名) |
Port | ポート番号(省略可能/省略した場合は22を使用) |
User | 接続先サーバでのユーザ名 |
IdentityFile | 秘密鍵ファイル |
作成が完了したら、パーミッションを秘密鍵と同様に600に変更して、接続する。
1 2 |
$ chmod 600 /home/hoge/.ssh/config $ ssh foo-Cent73sv |
ちなみに、configのパーミッションは644だとエラーとなる(以下のようなメッセージが表示されるので気づけるとは思う)
1 2 |
$ ssh foo-Cent73sv Bad owner or permissions on /home/hoge/.ssh/config |
Host に指定する識別子は、@マークを含めると上手く動かない。例えば、foo@Cent73sv など。恐らく、sshの通常の構文として解釈されるのではないかと思われる。そのため、Cent73sv が名前解決できてfooユーザで接続したい場合(通常の構文と同じ)であれば、接続はできるがconfigは使用されていないことになるので注意が必要です。ココらへんの考えは推測なので検証してみた。
Host に「@」を含まない場合
1 2 3 4 5 6 7 8 9 10 |
$ more config Host foo-192.168.2.30 HostName 192.168.2.30 User foo IdentityFile ~/.ssh/id_rsa $ ssh foo-192.168.2.30 Last login: Mon Mar 19 03:21:54 2018 ### 接続OK |
問題なく接続できます。
Host に「@」を含む場合 ※Cent73sv というホスト名は名前解決できない
1 2 3 4 5 6 7 8 9 10 |
$ cat config Host foo@Cent73sv HostName 192.168.2.30 User foo IdentityFile ~/.ssh/id_rsa $ ssh foo@Cent73sv ssh: Could not resolve hostname cent73sv: Name or service not known ### 接続NG |
接続できません。これは、HostName にIPアドレスを指定しているにもかかわらず接続できないのでconfigは参照されていないことがわかりました。
Host に「@」を含む場合 ※接続対象はIPアドレスで指定 and 待ち受けていないPort番号を指定
1 2 3 4 5 6 7 8 9 10 11 |
$ cat config Host foo@192.168.2.30 HostName 192.168.2.30 Port 12345 User foo IdentityFile ~/.ssh/id_rsa $ ssh foo@192.168.2.30 Last login: Sun Mar 18 18:48:04 2018 from 192.168.2.42 ### 接続OK |
接続できました。configの Port で実際には待ち受けていない 12345番ポートを指定しているにもかかわらず接続ができているということは、やはりconfigは参照されていないようです。(リモートサーバのssh待ち受けポートは22番)
動きとしては、推測した通りでまず間違いないと思うけど、ココらへんはあくまで検証の結果ということでお受け止め下さい。
まとめ
日々のサーバログイン時の手間をへらすだけでなく、自動ログインをスクリプトに組み込んで日々の運用タスクを自動化できるとよいですね。
以上です。
↓↓↓ 持っていると便利な一冊。