快適なssh環境を整える3つの方法! .ssh/config、Include、bash-completionを活用

2018年3月8日

ラズパイやWebサーバーなど、sshで接続して作業することは多々あると思います。しかし、鍵認証だったり特別なポートを使っていると毎回コマンドを打ち込むのが面倒。。。

そんな時に使える、快適なssh環境を整える方法をまとめました。

はじめに

今回は、
(1).ssh/configとIncludeを使って簡単に接続する方法
(2)公開鍵暗号方式を使って接続する方法
(3)bash-completionを使ってホスト名をタブキーで補完する方法
を紹介します。

環境は以下の通りです。

  • 接続元(sshのクライアント):
    mac(macOS 10.13.3 High Sierra)
  • 接続先(sshのサーバー):
    Raspberry PiやWebサーバーなど

※自宅のローカルネットワーク環境(DHCP)でテストしています。

※エディターとして記事中ではvimを使用していますが、ご自身の好みでnanoviなどを適宜使用しください。

(1).ssh/configとIncludeを使ってシンプルな記述でssh接続する方法

~/.ssh/configに設定を書くと、シンプルな記述でssh接続できるようになります。

また、OpenSSH 7.3 以上の場合、configをホスト毎に分割して記載できます。Includeによる分割に対応しているバージョンかどうかを確認するにはターミナルにssh -Vと打ち込みましょう。

$ ssh -V
 OpenSSH_7.6p1, LibreSSL 2.6.2

 

Includeが使える環境の場合

はじめに、ホスト毎の設定ファイルを入れるディレクトリを作ります。

$ install -m 0700 -d ~/.ssh
$ mkdir -p ~/.ssh/conf.d/hosts

~/.ssh/configファイルの先頭に、先ほど作ったディレクトリを参照する記述を加えます。

$ vim ~/.ssh/config
 # 以下の1行を先頭に記載
 Include conf.d/hosts/*

次に、ホスト毎の設定ファイルを作ります。
ここでは、ラズパイ(pi@raspi-zw1.local)に接続する設定です。

$ vim ~/.ssh/conf.d/hosts/rpi-zw1
Host rpi-zw1 raspi-zw1
	HostName raspi-zw1.local
	User pi
  • 1行目のHostの後に、接続先ホストのエイリアスを書きます。複数指定する場合はスペースで区切ります。
  • 2行目のHostNameには、ホスト名を省略せずに書きます。mDNSが有効なローカルネットワークであれば、ホスト名.localを指定しておけばOK。(mDNSを利用したSSHについてはコチラの記事参照)
  • 3行目のUserには、接続するユーザー名を書きます。
    その他、ポート番号を指定(Port xxxx)したり、鍵を指定(IdentityFile ~/.ssh/path/to/key)したりできます。

設定が終わったら、接続できることを確認してみましょう(sshの後にHostに指定したエイリアスを入力してEnter)

$ ssh raspi-zw1

無事に接続できれば成功です。

参考
~/.ssh/configについて
`Include`キーワードで`ssh_config`を分割できるようになった件

 

(2)公開鍵暗号方式で接続する方法

パスワードを毎回打ち込むのは面倒な上にセキュリティ上あまりよろしくありません。XSERVERなど、パスワードでのログインを一切禁止して、その代わりに公開鍵暗号方式を使って接続するようになっています。

ここでは、公開鍵・秘密鍵を作成して公開鍵暗号方式で接続する方法を紹介します。

まずは現状把握

今使っている鍵があるか、また強さはどの程度かを調べます。

$ ls -la ~/.ssh

id_rsa.pub などがあると思います。※無ければ次の「鍵の作成」に進んでください。

その鍵の暗号強度を調べます。
鍵の長さが2048以上で、RSAなどであればOKです。

$ ssh-keygen -lf ~/.ssh/id_rsa.pub
 2048 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx hoge@iot-plus.net (RSA)

 

鍵の作成(接続元のPCで作業)

新しく、公開鍵秘密鍵のペアを作成しましょう。

接続先毎に個別の鍵を作ることもできます。試しにローカルネットワークにあるラズパイ用の鍵を作ってみます。

ホームディレクトリに.sshが無い場合は以下のコマンドで作成します。

$ install -m 0700 -d ~/.ssh

作成したディレクトリ内で作業します。

$ cd ~/.ssh/
 $ ssh-keygen -t rsa -b 4096 -C "hoge@example.com" -f ~/.ssh/id_rsa_rpi
 Generating public/private rsa key pair.
 Enter passphrase (empty for no passphrase): ## ← 必ずパスフレーズを設定する!
 Enter same passphrase again:
 Your identification has been saved in /Users/hoge/.ssh/id_rsa_rpi.
 Your public key has been saved in /Users/hoge/.ssh/id_rsa_rpi.pub.

パスフレーズは、空白にしない必ず何かを設定してください。

鍵ができたか確認します。

$ ls ~/.ssh/
 id_rsa_rpi
 id_rsa_rpi.pub

ここで、

  • id_rsa_rpi
    秘密鍵。接続元のPC(クライアント)に保管します。外部に漏れたらアウトなので取扱注意です!
  • id_rsa_rpi.pub
    公開鍵。接続先のサーバー(ここではラズパイ)に設置(登録)します。

 

接続先に公開鍵を設置する

作成した公開鍵(id_rsa_rpi.pub)を、接続先(ラズパイ)に登録します。

登録方法はいくつか考えられます。

(1)手元にラズパイがある場合はUSBフラッシュメモリに入れてコピーして、ラズパイ上で公開鍵の中身を開いて登録するか、

(2)sshで接続できる場合は、PC上でクリップボードにコピーしてラズパイ上のauthorized_keysに追加して登録するなどです。

汎用的な(2)の方法を説明します。

まず、PC上で公開鍵の中身をクリップボードにコピーします。

$ pbcopy < ~/.ssh/id_rsa_rpi.pub

接続先(ラズパイ)にsshでパスワードを使ってログインしたあと、~/.ssh/authorized_keys を開いてコピーした公開鍵を末尾に貼り付けます。

ラズパイのインストール直後などで.sshが無い場合は先に作成します。

$ install -m 0700 -d ~/.ssh

その後、~/.ssh/authorized_keys を作成・編集します。

$ vim ~/.ssh/authorized_keys

他のユーザーから見えないようにパーミッションを変えておきます。

$ chmod 600 ~/.ssh/authorized_keys

一度接続先からログアウトして、再度PCから秘密鍵を指定してログインを試します。

$ ssh -i ~/.ssh/id_rsa_rpi pi@raspberrypi.local

パスフレーズの入力を求められるので、先ほど設定したパスフレーズを入力します。無事に接続できれば成功です。

 

macでsshのパスフレーズ入力にキーチェーンを使えるようにする

公開鍵暗号方式を使った接続時に毎回パスフレーズを入力しないで良いように、キーチェーンに登録できるようにしておきます。

PCで、

$ vim ~/.ssh/config
 #以下3行を追加します。先にIncludeを設定している場合は、それよりも後に記述します。
Host *
 AddKeysToAgent yes
 UseKeychain yes

それから、ラズパイ用に作成した設定ファイルに、使用する秘密鍵を登録します。

$ vim ~/.ssh/conf.d/hosts/rpi3-01
 Host rpi3-01
 HostName raspberrypi.local
 User pi
 IdentityFile ~/.ssh/id_rsa_rpi

IdentityFile で作成した秘密鍵を指定します。

登録が完了したら、ssh接続を試します。

$ ssh rpi3-01

1回目はパスフレーズの入力が求められます。
無事にログインできたらログアウトします。

2回目以降は、先ほど入力したパスフレーズがキーチェーンに登録されていますので、何も入力しなくても接続できるようになります。

参考
お前らのSSH Keysの作り方は間違っている
秘密鍵・公開鍵を作成する(Mac)
SSHの鍵認証設定

 

(3)bash-completionを使ってTabキーでsshの接続先を補完する設定

シェルにbashを使っている人は、bash-completionを使うと、Tabキーを使ってsshの接続先ホストを補完することができます。

まずは、bash-completionをインストールします。
macの場合は管理者権限を持ったユーザーで、

brew install bash-completion

無事にインストールされたら、普段使っているユーザーの設定ファイルにbash_completionを読み込む設定を追記します。

$ vim ~/.bash_profile
# 以下の1行を追記して保存。
 [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion

設定を反映させます。

. ~/.bash_profile

※「.」を使うと、sourceコマンドよりも簡単に設定を反映できます。

そして、おもむろにssh [tab][tab] と打つと、これまでに接続したことがあるホストがずらり!

あとは普通にbashのtabキー補完と同じ要領で入力できます。

known_hostsを参照しているようなので、接続先ホストのエイリアスがホスト名と異なる場合は補完できないので注意が必要です。

sshのconfigファイルを作成する時に、例えば「ホスト名.local」の場合、エイリアスを「ホスト名」としておくと補完しやすくなります(.localも補完されて付いてくるので消してからEnterします)。

※同一ホストで異なるユーザーを切り替えて使用するには少々工夫が必要です。(例えば、エイリアスに「ホスト名_ユーザー名」と記載するなど)

Host rpi_user1
 HostName raspberrypi.local
 User user1

Host rpi_user2
 HostName raspberrypi.local
 User user2

参考
sshのhost名を自動補完させる

 

まとめ

今回は、sshをよく使う人向けに快適な環境を整える3つの方法を紹介しました。
(1).ssh/configとIncludeを使って簡単に接続する方法
(2)公開鍵暗号方式を使って接続する方法
(3)bash-completionを使ってホスト名をタブキーで補完する方法

これで作業が3倍捗りますね!(※但し個人差があります)

みなさま、よいssh生活を(^o^)ノ