Raspberry Piに公開鍵認証を使ってssh接続する

電子工作

Raspberry Piに固定IPアドレスを割り当てて、Macのターミナルからssh接続できるようにしました。今回は、もうちょっと安全&簡単に接続できるように設定してみます。

ssh接続時の認証方法

前回までのRaspberry Piセットアップで、Raspberry Piに固定IPアドレスを割り当て、Macのターミナルアプリからssh接続できるようにしました。なお、ssh接続するときはパスワード認証をして接続していました。

このパスワード認証ですが、接続の度にパスワードを入力する必要があってちょっと面倒です。また、いずれRaspberry Piを外出先などの外部からアクセスできるようにしたいと考えていますので、パスワードが破られたりしたら困ります。特に今回インストールしたRaspbianの場合、自動的にユーザIDが “pi”、パスワードが “raspberry”のユーザアカウントが生成されています。うっかりこのままにしておくと第三者にアクセスされる危険性もあります。

そこで、sshに用意されているもうひとつの認証方法の設定をしようと思います。その認証方法とは、公開鍵を使用して認証する方法です。言葉で説明してもわかりづらいので、図で説明してみますね。

まず、パスワード認証の方から手順の確認です。パスワード認証の場合は以下のような手順でMacからRaspberry Piに接続します。

Raspi ssh passwd

(1)Macのターミナルアプリからsshコマンドを使用してRaspberry Piに接続要求します。次に(2)Raspberry Piのsshサーバからパスワード要求があります。ここでユーザはパスワードを入力、リターンキーを押すと、(3)パスワードが送信されます。Raspberry Piのsshサーバは指定されたユーザIDのパスワードを認証して、正しければ接続を確立します。

次に、公開鍵を使った接続の手順です。公開鍵認証を使う場合、MacとRaspberry Piに予め設定をしておく必要があります。

その設定概略です。まず鍵となるファイルをMacで生成します。この段階で、公開鍵と秘密鍵ができます。これらの鍵ファイルのうち、公開鍵ファイルをRaspberry Piにセットします。さらにRaspberry Piのsshサーバ設定を変更します。このように一度設定しておくと、あとはパスワード入力せずに接続できるようになります。

この鍵ファイルに使用する公開鍵暗号方式はとてもすぐれたアルゴリズムで、仕組みに興味のある方は、「世界でもっとも強力な9のアルゴリズム」という本にとてもわかりやすく解説されていますので、是非読んでみて下さい!よくこんなものが思いついたなぁ、と関心しますよ!

ということで、設定部分は文章でわかりづらいかもしれませんので、以下に図解します。

Raspi ssh key preparation

はじめに、(1)Mac上で鍵ペアを作成します。具体的にはターミナルアプリ上で、”ssh-keygen”というコマンドで作成します。このコマンドにより公開鍵と秘密鍵が作成されます。次に(2)公開鍵をRaspberry Piに保存します。さらに(3)Raspberry Piのsshサーバ設定ファイルを、鍵認証するように設定します。

この設定を行っておけば、以降はssh接続する場合パスワードの入力は必要なくなります。つまり、

Raspi ssh key

(1)ssh接続すると、あとは自動的に(2)鍵認証されて、問題なければ(3)接続されます。

この方式の場合、気づかれたかもしれませんが、接続元のコンピュータに秘密鍵ファイルがないと接続できないわけです。ということで、パスワード認証より安全に接続できます。そのかわり、秘密鍵は厳重に管理する必要があります。

sshの鍵ファイル認証のイメージはつかめたでしょうか。それでは具体的に設定に入る前に、作業の流れを確認します。

作業の流れ

作業の手順は以下のようになります。

  1. Mac上で鍵ペア(公開鍵と秘密鍵)ファイルを作成します。
  2. (1)で作成した鍵ファイルのうち公開鍵ファイルをRaspberry Piに送信して保存します。
  3. Raspberry Piのsshサーバ設定ファイルに以下の変更を加えます。
    – 鍵ファイル認証方式を有効にする
    – セキュリティを上げるために、パスワード認証を無効にする
    – さらにセキュリティを上げるために、接続ポート番号を変更する
    – さらにセキュリティを上げるために、rootログインを禁止する

それでは、これからこれらの作業を順番に行っていきます。自分が何をしているか分からなくならないようにこの作業手順を頭に入れておいてください。

 

(1)Mac上で鍵ペアファイルを作成する

はじめにRaspberry Piに接続するMac上で鍵ファイルを作成します。この鍵ファイルを生成するには、ターミナルアプリで “ssh-keygen” というコマンドを使用します。それでは早速生成してみます。まず、アプリケーション → ユーティリティ → ターミナルを開きます。ターミナル上で以下のように入力します。

ssh-keygen -t rsa

コマンドのパラメータとして、”-t rsa”を指定していますが、これは鍵の種類をRSA鍵、というものに指定することになります。このコマンドを入力すると、鍵の保存場所とパスフレーズをどうするか聞いてきます。鍵の保存場所はデフォルトのままで問題ありません。また、あまりよくないかもしれませんが、パスフレーズは設定しなくても問題ありません。

鍵の保存場所については以下のように聞いてきますので、そのままリターンキーを押します。

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/tool-lab/.ssh/id_rsa): 

次に、パスフレーズを着ていきますので、そのままリターンキーを押します。

Enter passphrase (empty for no passphrase): 

確認のため、もう一度入力するように要求してきます。そのままリターンキーを押します。

Enter same passphrase again: 

この後、以下のような情報が表示され、鍵ペアが生成されます。

Your identification has been saved in /Users/tool-lab/.ssh/id_rsa.
Your public key has been saved in /Users/tool-lab/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx tool-lab@iMac.local
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|        S    .   |
|       o ...  + o|
|      . . .o +.=.|
|       o .o++o.=.|
|      . o    .+.o|
+-----------------+

鍵ファイルが作成された場所はこのメッセージに書かれています。最初の1行目は秘密鍵ファイルの格納場所とファイル名です。ここでは/Users/tool-lab/.ssh/フォルダ(“tool-lab”はユーザ毎に異なります)、つまりホームフォルダの.sshフォルダに “id_rsa” というファイル名で秘密鍵が生成された、とかかれています。2行目は公開鍵ファイルの格納場所とファイル名で、/Users/tool-lab/.sshフォルダに “id_rsa.pub” というファイル名で生成された、と書かれいます。

念のためファイルがあるか確認してみましょう。ターミナルで以下のコマンドを入力します。

ls .ssh

先ほど生成した2つのファイルがあればOKです。これで公開鍵と秘密鍵のファイルが生成できました。

 

(2)公開鍵ファイルをRaspberry Piに保存する

次に、(1)で作成した公開鍵ファイルをRaspberry Piに送信します。Raspberry Piに送信するには、”scp”コマンドを使用します。これは、secure copyの略で、コンピュータ間のファイル転送をセキュアな状態で行うコマンドです(scp用の独自のセキュア通信方法があるわけではなく、sshを使用してファイル転送しています)。書き方は以下のようになります。

scp [送信するファイル] [ユーザID]@[Raspberry PiのIPアドレス]:

私の環境の例では以下のようになります。

scp .ssh/id_rsa.pub pi@192.168.1.101:

このコマンドを入力するとパスワードを聞いてきます。これは、Raspberry Piの “pi”ユーザのパスワードになりますので気をつけて下さい。もう少し詳しく説明すると、scpコマンドはsshを使用してRapsberry Piに接続して、sshを使ってファイル転送します。そのため、scpコマンドを実行するとssh接続する必要があるため、ssh接続先のパスワードを聞かれる、というわけです。

これで、公開鍵をRaspberry Piに送信しました。なお、転送したファイルはどこにいくかというと、scpで転送先を指定しませんでしたので、デフォルトとなる “pi”ユーザのホームフォルダに置かれます。

この先は、Raspberry Pi上での作業になります。Mac上での作業ではありませんので注意してください。

 

(3)Raspberry Piのsshサーバ設定を変更する

これから、MacのターミナルからRaspberry Piに接続して作業を行いますが、注意点があります。MacからRapsberry Pi接続するのにsshを使います。接続したら、sshの設定を変更します。設定が有効になったか確認するために、一旦sshを抜けて、再度sshで接続して確認します。

お気づきかもしれませんが、sshの設定変更を間違うと、設定確認のためsshを抜けて、再度sshで接続するとき、接続できない、ということになってしまいます。こうなると、リモートから接続できなくなりますので、再度、Raspberry Piにキーボード、マウス、ディスプレイを接続して、ローカル環境で立ち上げる必要があります。自分はRaspberry Piに限らず、何度もあります。ssh接続できなくなる度に「あ゛〜」ってなりますので注意してください。

そこで、このsshサーバ設定の変更は、ちょっと工夫をします。具体的には、Macのターミナルアプリのウインドウを2つ開きます。1つのウインドウはRaspberry Piに接続したままにして、Raspberry Piの設定変更専用のウインドウにします。もう1つウインドウは接続確認用として、Raspberry Piにssh接続したり、切ったり(exitしたり)して動作確認をします。設定が間違ったまま1つ目のウインドウを閉じてしまうと、ローカル環境を作って作業することになるので注意してください。

それでは、Macのターミナルアプリを立ち上げて、ウインドウを2つ開いて下さい。シェルメニュー → 新規ウインドウを選択するとウインドウがひとつ開きますので、2回繰り返します。

これからは、Raspberry Piにずっと接続したまま、Raspberry Piのsshサーバ設定の変更作業を行うウインドウを作業ウインドウ、ssh接続を確認するウインドウを確認ウインドウ、と呼ぶことにします。

それでは、作業ウインドウからRaspberry Piに接続します。コマンドは覚えましたか? “ssh pi@[Raspberry PiのIPアドレス]” です。パスワードを聞かれますので、piユーザのパスワードを入力します。接続できたら以下のプロンプトが表示されます。

pi@raspberrypi ~ $ 

はじめの作業手順に書きませんでしたが、Raspberry Piの公開鍵はpiユーザのホームディレクトリに置かれています。この公開鍵ファイルはssh接続で使用しますので、ホームフォルダに.sshフォルダを作成して、そこに保存しておきます。なお、公開鍵ファイルの情報は通常 “authorized_keys” というファイルに追記していきますので、そのようにします。また.sshフォルダ、authorized_keysのアクセス権も変更しておきます。

まず、以下のコマンドで.sshフォルダを作成します。

pi@raspberrypi ~ $ mkdir .ssh

次に、ホームディレクトリにある公開鍵ファイル “id_rsa.pub” の情報を.sshフォルダのauthorized_keysファイルに書き出します。

pi@raspberrypi ~ $ cat id_rsa.pub >> .ssh/authorized_keys
pi@raspberrypi ~ $ chmod 700 .ssh
pi@raspberrypi ~ $ chmod 600 .ssh/authorized_keys

これで公開鍵ファイルの処理は終わりです。ホームフォルダの公開鍵ファイルはもう必要ありませんので削除しておきましょう。

pi@raspberrypi ~ $ rm id_rsa.pub

続いて、sshサーバの設定ファイルを変更します。sshサーバ設定ファイルは、”/etc/ssh/sshd_config”です。それでは以下のコマンドを入力して編集します。

pi@raspberrypi ~ $ sudo nano /etc/ssh/sshd_config 

設定ファイルの出現順に合わせて、以下の順番で設定していきます。

  1. 接続ポート番号を変更する
  2. rootログインを禁止する
  3. 鍵ファイル認証方式を有効にする
  4. パスワード認証を無効にする

まず接続ポート番号を変更しておきます。sshのデフォルトポート番号は22番です。これを適当なポート番号に変更します。ただ、ポート番号は予め目的が決められたものがありますので、それ以外のものに指定します。空いてある番号を探すにはこのページがよいと思います。このページは0番ポートから65535番ポートまで、どの番号が何の目的で使われているかまとめられています。この表に書かれていない番号を使います。ここでは例えば28987番にすることにします。

設定ファイルの始めの方に、”Port 22″という記述がありますので探して下さい。これはポートを22番に指定する行ですが、これを28987に変更します。”Port 28987″という記述に変更します。なお、元の記述を残しておきたい場合は、残しておきたい行の行頭に”#”を付け加えます。”#”はコメント行を意味します。元の行を残す場合は以下のようにファイルを編集することになります。

#Port 22
Port 28987

以降の作業も元の記述を残しておきたい場合、同様に作業してください。

続いて、rootログインを禁止します。”PermitRootLogin”という設定項目があるので、以下のように変更します。すでにこのようになっている場合は変更の必要はありません。

PermitRootLogin no

次に、公開鍵ファイル認証を有効にします。しばらく下の方に行くと設定がありますので、以下のように変更してください。

RSAAuthentication    yes
PubkeyAuthentication yes
AuthorizedKeysFile   %h/.ssh/authorized_keys

最後に、パスワード認証を無効にします。さらに下の方にいくと、”PasswordAuthentication yes”という記述がありますので、以下のようにyesをnoに変更します。

PasswordAuthentication no

これで設定が終わりました。設定が終わったら、ファイルを保存してエディタを終了します。ファイル保存はCtrl+Oを押します。Ctrl+Oを押と、保存ファイル名を聞かれますので、そのままリターンキーを押します。Crtol+Xを押してエディタを終了します。

さらに変更した設定を有効にするため、以下のコマンドを入力してsshサーバを再起動します。

sudo /etc/init.d/ssh restart

これで、Macからssh接続するとき、パスワード認証は無効、鍵ファイルで接続できるようになっているはずです。それでは、もう1つのターミナルウインドウ、確認ウインドウで接続確認してみます。鍵ファイルで接続するには、

ssh -i [秘密鍵ファイル] -p [ポート番号] pi@[Raspberry PiのIPアドレス]

というように指定します。Raspberry PiのIPアドレスが192.168.1.101の場合、以下のようになります。

ssh -i .ssh/id_rsa -p 28987 pi@192.168.1.101

これで、パスワード認証がなく、すぐに接続できれば成功です。うまく接続できない場合、例えば相変わらずパスワードを聞かれてしまう場合などは、どこかに設定ミスがありますので確認します。特に間違えやすいのは、”authorized_keys”のファイル名やsshd_configファイルの設定し忘れなどです。接続できない場合は、作業ウインドウで再度作業します。

うまくできたら、2つのウインドウはRaspberry Piに接続された状態だと思いますので、両方のウインドウでexitコマンドを使用して、Raspberry Piからログアウトしてください。

 

面倒くさくなってない?

これでssh接続するたびに、パスワード入力が必要なくなりました!

ん? ………

でも、なんかssh接続するときのコマンドが長くなってしまって、パスワード認証の方が早かったような気がしませんか。これでは元も子もないので、もうちょっと簡単にssh接続できるようにします。

Macのターミナルからssh接続をするとき、sshコマンドの細かいパラメータはファイルに書いておき、それを名前で指定して接続することができます。例えば、接続したいRaspberry Piの名前を “raspi” としておくと、ssh接続したい場合は、

ssh raspi

と入力すれば接続できるようになります。このような設定をしておきましょう。

まず、Macのターミナルアプリでウインドウを開きます。設定ファイルは、.sshフォルダの下にconfig、というファイル名で作成します。このファイルを作成しましょう。以下のコマンドを入力します。

nano .ssh/config

このファイルは以下のようなフォーマットで記述します。

Host [接続するときに指定する名前。上の例ではraspiを指定する]
HostName [Raspberry PiのIPアドレス]
User [ユーザID]
Port [ポート番号]
IdentityFile [秘密鍵ファイル]

今まで設定した内容では、実際の記述は以下のようになります。

Host raspi
	HostName 192.168.1.101
	User pi
	Port 28987
	IdentityFile ~/.ssh/id_rsa

設定ファイルを書いたら、Ctrl+Oで保存、Ctrl+Xでエディタを終了します。うまく接続できるか確認してみましょう。

ssh raspi

うまく接続できれば成功です。これでパスワード入力なしに簡単にRaspberr Piに接続できるようになりました。

« »

  • 持田

    丁寧な解説で助かりました。
    Raspberry2 と Win8.1 Cygwinの間で接続できました。

    しかし、同じWin8.1機からrootでも接続できるようにする方法が分かりません。
    /root/.ssh/authorized_keys を置いただけではダメなようです。
    仕組みが理解できていないからでしょうが何とかならないでしょか。