Linux Raspberry Pi

ラズパイにパスワード無しで安全にSSHログインする方法【リモート開発】

更新日:

ラズパイにリモートアクセスしてファイル編集する際、毎回SSHログインでパスワード入力するの面倒ですよね。また、ラズパイをデフォルトの「ユーザ:pi、パスワード:raspberry」のままインターネットにつないでいる状態も危険です。

今回は、毎回のパスワード無しで且つ通信の安全を確保しながらログインする方法を紹介します。ラズパイで紹介しますが、考え方はLinux OS全般で使えるログイン方法です。

かなり手間がかかりますが、安心してラズパイを使用するための下準備だと思って、早い段階で設定しましょう!

私の環境は以下の通りです。

  • PC:Windows10 pro
  • ターミナル:GitBash
  • ラズパイ:3B+
  • ラズパイOS:2019-04-08-raspbian-stretch-lite

ラズパイにパスワード無しで安全にSSHログインする方法

安全・安心・快適ログイン設定手順

  • 公開鍵認証でログイン
  • ルートユーザ&パスワードでのログイン禁止
  • エイリアスで快適SSHログイン

上記の流れで設定することで、最終的には

>ssh raspi

などと、簡単な入力で目的のラズパイにパスワード入力無し&安全な接続でログインできることを目指します。接続先のユーザ名もIPアドレスもパスワードも必要ありません。非常に手軽でおすすめです。

安全を無視すれば、3つ目の手順「パスワード無しでSSHログイン」を実施すれば簡単にログインできます。しかし、今やネットを経由する開発において、安全を考慮しなければ犯罪に加担してしまうケースも想定されます。(理由は下記に述べます)。安全&安心&スマートにログインすべく、上記の3つの流れで実施して下さいね^^

以下、設定方法です。*すでにラズパイにSSH接続できる前提です。TeraTermやGitBashなどからログインしておいてください。

ココがポイント

WindwsでLinuxコマンドを使うにはGit Bashというターミナルアプリがおすすめです。sshログインやssh-keygenコマンドはPowerShellでも使えますが、chmod(権限変更コマンド)はPowerShellにはありません。GitBashについては下記記事をどうぞ。

➡「Windows版VSCodeのターミナルって結局どれがいいの?

1.公開鍵認証でのログイン方法

ラズパイにフォルダ作成+権限設定

ラズパイ側での操作

ホームディレクトリでの作業です。ホームディレクトリとは、ラズパイにログインした直後に居るディレクトリ(以下フォルダ)のことです。今どこにいるかわからなくなってしまったら、ターミナルに「cd ~」と打ち込むことで、どの階層からでもユーザホームに戻れます。

mkdir .ssh
chmod 700 .ssh

1)mkdir .ssh
これは「.ssh」フォルダを作成するという意味です。これから作る公開鍵認証用のファイルを収めておくフォルダになります。

2)chmod 700 .ssh
こちらは、.sshフォルダを700権限に変更(change mode)するという意味です。700を設定すると、.sshファイルは所有者はフルアクセスできますが、所有者以外は操作できなくなります。公開鍵を入れておく大切なフォルダですので、安易にアクセスされない権限を設定します。

Linuxのアクセス権限については、下記にわかりやすくまとめました。

Linux権限
Linuxのアクセス権限:わかりやすくまとめてみた【ラズパイ初心者向け】

ラズパイをいじっていてたまにぶつかる壁:ファイルやディレクトリの権限(パーミッション)。 ネットや書籍に書いてある通りに設定すれば大抵上手くいきます。しかし、Linuxの権限ってdrwxr-や700な ...

続きを見る

パソコン側での操作

パソコン側に公開鍵・秘密鍵の作成

*GitBashなどのターミナルでの作業になります。作業フォルダはどこでも構いません。私は C:\Users\userで作業しました。

mkdir .ssh
cd .ssh
ssh-keygen

1)mkdir .ssh
こちらは、ラズパイでの設定と変わりません。ログインする側のPCにも同様に.sshフォルダを作っておきます。

2)cd .ssh
.sshフォルダに移動します。

3)ssh-keygen -t ecdsa -b 521
このコマンドで公開鍵(id_esdca.pub)と秘密鍵(id_ecdsa)を作成します。「-t ecdsa」は鍵の種類にecdsaを指定するオプション。「-b 521」は鍵長を521bitに指定するオプションです。この設定がかなり強固なセキュリティとなります。

コマンドを実行すると

Enter file in which to save the key (C:\Users\user/.ssh/id_ecdsa):

と聞かれます。公開鍵・秘密鍵のペアをどこに保存するか聞かれています。間違いなければエンターを押します。

Enter passphrase (empty for no passphrase):

次はパスワードの入力を求められますが、空のままエンターを押します。

Enter same passphrase again:

次はパスワードの再入力を求められます。ここでも空のままエンターします。これで鍵が作られます。

ll(もしくはls)コマンドで.ssh内のファイルを見てみましょう。

御覧のようにid_ecdsa(秘密鍵)ファイルとid_ecdsa.pub(公開鍵)の2つが生成されていることが確認できます。

ssh-keygenには様々なオプションがあり、鍵の種類など指定できます。現状ではオプション無しでそのままコマンドを打つと、2048bitsのrsaタイプの鍵が生成されます。一般的に利用される強固な暗号化が適用されるタイプですが、できるだけ強い鍵を利用したいので「-t ecdsa -b 521 」を指定しています。

パソコン側での操作

パソコン側からラズパイに公開鍵の移動
scp ~/.ssh/id_ecdsa.pub pi@raspberrypi.local:/home/pi/.ssh/

ユーザ名やパス、アドレス(@raspberry.localの部分)は適宜読み替えてください。ネットワーク上のラズパイにパソコンからリモートログインしている場合は下記のようなコマンドになるかと思います。

scp ~/.ssh/id_ecdsa.pub pi@192.168.11.30:/home/pi/.ssh/

上記コマンドの実行で、PC内に作成した公開鍵(id_ecdsa.put)をラズパイにコピーできます。実行後、いくつか質問されますので答えていきましょう。

Are you sure you want to continue connecting (yes/no)?

接続し続けますか?という問いですので「yes」と入力します。

pi@raspberrypi.local's password:

つぎはラズパイへのログインパスワードを聞かれますので入力します。

パス間違いなどで、エラーでなければ正常にファイルが遅れています。続けて今送信した公開鍵(id_ecdsa.put)をパソコンから削除しておきます。これを削除しないと公開鍵&秘密鍵をペアで盗まれてしまい、公開鍵認証を導入する意味がなくなってしまいます。必ず削除を実行してください。

rm ~/.ssh/id_ecdsa.pub
chmod 600 ~/.ssh

id_ecdsa.pubの削除に合わせて.sshの権限も変更します。 「chmod 600」は権限をファイルの所有者のみ読取・書込可とする設定です。.sshフォルダは秘密鍵が入っている重要なフォルダですので、所有者が間違って編集したり、また、他のユーザにアクセスされることの無いよう、600という権限を付与します。

ラズパイ側での操作

ラズパイ側で公開鍵の登録

一番最初に作ったラズパイの.sshフォルダにログインし、フォルダ内にPCから送った公開鍵(id_ecdsa.pub)があることを確認します。

ls ~/.ssh

.ssh内にid_ecdsa.pubがあることが確認できました。

cat ~/.ssh/id_ecdsa.pub >> ~/.ssh/authorized_keys

つぎは、上記コマンドを実行します。
公開鍵が認証キー(authorized_keys)に登録されます。このコマンドの書き方であれば、authorized_keysファイルが無ければ新規作成し、存在すれば公開鍵がauthorized_keys内に追記されます。

chmod 600 ~/.ssh/authorized_keys

忘れないうちにauthorized_keysを所有者のみ読取・書込可としておきます。

ここまでの設定でパスワードを聞かれずにラズパイへログインできるようになります。

しかし、ここで止めてしまうと「パスワードを聞かれずにログインできるようになった」くらいの効果しかありません。次項の「ルートユーザでのログイン禁止」を実施しないと安全性は確保できません。併せて設定しちゃいましょう!

2.ルートユーザ&パスワードでのログイン禁止設定方法

ラズパイのルートユーザ名は「root」となっています。基本的にユーザ「pi」でログインする方が多いので、piがルートユーザと思っている方もいるかもしれませんね。ルートユーザはすべての権限を持っています。通常は間違いを防ぐためにルートユーザでのログインはせず、「sudo」コマンドなどでルート権限を一時的に借りるなどして、Linuxの核になるようなファイルを編集します。

ラズパイ側での操作

編集するのは「/etc/ssh/sshd_config」というファイルです。Linuxでのファイル編集はviというエディターを使いますが、キーボード操作がかなり独特で、慣れないと保存すらできないでしょう。ちょっとこちらのサイトで勉強してから編集に入った方が確実かと思います。面倒ですが、これがLinuxです。

sudo vi /etc/ssh/sshd_config

上記コマンドでviによる編集モードに入ります。sshd_configファイルは「ルート権限」というラズパイの大元のアクセス権限が無いと編集できないファイルです。この大元の権限を一時的に借りるのか「sudo」というコマンドです。(superuser do)の意味だそうです。

このviで編集する項目は次の通りです。

#PermitRootLogin prohibit-password

もしくは

#PermitRootLogin yes

となっている項目。これをPermitRootLogin noに書き換えます。行頭の「#」マークは消してください。これで文字通りルートユーザでのログインが不可となります。

#PasswordAuthentication yes

次は上記項目をPasswordAuthentication no と変更します。行頭の「#」マークは消してください。

変更を上書き保存し、変更を反映します。

sudo /etc/init.d/ssh restart

これでパスワードによるログインが不可能か確認してみましょう。確認するには、公開鍵認証が登録されていないPCからパスワードログインを試みてみると良いでしょう。おそらく下記のような結果となるはずです。

TeraTermでパスワードログインを試みた例

3.エイリアスでSSHログイン設定方法

エイリアスとは別名のことです。この設定をしておくと、SSHログインする際に

>ssh raspi

などの短いフレーズでSSHログインできます。通常、公開鍵認証を設定した状態でもSSH接続は<ユーザー名@ipアドレス>といった組み合わせが必要ですよね。これが毎度毎度だと面倒になります。

そこでエイリアス(別名)を使うことで<ユーザー名@ipアドレス>を短縮できるのです。以下設定方法になります。

エイリアス設定方法

パソコン側での操作

パソコン側で「.ssh」フォルダに移動します。

次のコマンドを打って、configファイルを新たに作成します。内容は下図の通りです。

vi config

1)Host raspi
raspiの部分はお好きな名前に変えてください。sshログイン時の短縮名になります。

2)HostName
ラズパイのipアドレスになります。ラズパイのアドレスは固定しておきましょう。IPアドレスを固定していない場合はホスト名を入力します。ラズパイのホスト名は「raspberrypi」です。ただ、同じネットワーク上にラズパイがいくつもあるとやっかいなので、通常はラズパイのIPアドレスを固定して使います。

3)port
変更していなければラズパイのポート番号は「22」です。セキュリティ的には初期設定のままではよくないとされています。

4)User
変更していなければ、ラズパイのデフォルトユーザ名は「pi」です。

5)IdentityFile
ここに秘密鍵のパスを入れます。記事冒頭からの解説通りに設定していれば、秘密鍵のパスは「~/.ssh/id_ecdsa」となります。

以上を保存して、下記コマンドでsshログインしてみてください。パスワードも聞かれずにログインできるはずです。

>ssh raspi

公開鍵認証でのみのログインが許された状態且つルートユーザではログインできない強固なセキュリティが構築できました。大変お疲れさまでした<(_ _)>

VSCodeにも公開鍵認証の設定をしよう【SSH FS編】

ラズパイをVSCodeから編集している場合、【SSH FS】等の拡張機能を入れているかと思います。PCからのログインを公開鍵認証のみに設定すると、いままでの設定ではログインできなくなりますので、併せてVSCodeのSSH FSにも公開鍵認証の設定を入れます。

1)VSCodeを開き、SSH FSの普段接続しているラズパイの接続名を右クリックします。

すると、ポップアップメニューに「edit configuration」という項目がありますのでクリックします。

2)これまで接続できていた設定が表示されます。

まずパスワードの項目はもう必要ないので「Password」項目から削除しておきましょう。

あとは、上図赤枠内の項目「Private Key」の個所に、パソコン内のid_ecdsaのフルパスを入力するだけです。私の場合は、users/user/.sshフォルダ内に公開鍵を作りましたので、下記のようになりました。

C:\Users\user\.ssh\id_ecdsa

この設定をSAVEして完了です。接続してみてください。手順やパスに間違いが無ければつながるはずです。

なぜラズパイのセキュリティ確保が必要なのか

日経Linux2019/3月号の記事によると、ルータは毎日4000回以上も中国などのIPアドレスから攻撃されていることが実証されています。

家庭のルーターは、工場出荷の状態のまま運用されている方も多いですよね。攻撃者にルーターを突破されれば、そこに接続されたラズパイやPC、スマート家電にアクセスされるのは時間の問題。

ラズパイなどIoTデバイスは、”Bot”といわれる、サイバー攻撃を手助けするプログラムを埋め込まれやすい為、実害はなくとも犯罪に加担する結果となります。ウイルス感染を防ぐためにも、家庭内においてもセキュリティの確保が必要と感じています。

セキュリティに関するおすすめ記事
➡「IoTセキュリティ今すぐできる対策2項目【情報漏洩待った無し】

➡「製造業ITセキュリティ意識が低いと何が起こるのか【情報漏洩だけじゃない】

余談:公開鍵認証はどれくらい安全なのか?

パスワードの設定と、それを破る攻撃者の攻防はイタチごっこです。どんなにパスワードの文字数を多くしたり、大文字小文字、記号を入れても、それを突破する技術やツールで攻撃者は狙ってきます。となると、公開鍵認証はどれくらい安全なの?と気になりますよね。

私はセキュリティの専門家ではありませんので確かなことは言えませんが、公開鍵認証の安全性について書かれた記事から考察します。

公開鍵認証の仕組みについてはこちら

公開鍵認証は、パスワードでの認証と違い「電子署名」を利用して認証しています。署名というのはサインですね。公開鍵の認証システムはその署名が確かに登録されたユーザーによる署名だと認証してログインを許可しています。

公開鍵認証には「公開鍵・秘密鍵」双方が必要になることは上述の通りですが、サーバ側:公開鍵というドアをクライアント側:秘密鍵で開錠してログインしているわけではないんですね。生成された”解読・流用困難な署名”によって認証しています。そして認証の段階では通信そのものが暗号化されているとのこと。私もまったく勘違いしていましたが、そのようです。

秘密鍵で生成された署名を公開鍵が検証する

これが公開鍵認証の仕組みとなっています。パスワードのように「総当たり」や「推測」が不可能に近いため、安全な認証と言われています。

ただ、鍵(PC)を奪われてしまえば、署名自体を作り出せるのでアウトです。

参考にしたサイト

◆公開鍵について
◆ルートユーザでのログイン禁止について
◆エイリアスでの快適SSHログインについて

さいごに

ここのところヒシヒシと感じるのは、「ただIoTで遊ぶにしてもセキュリティに関しては知っていないとヤバい!」ということです。持っているラズパイがサイバー攻撃の土台にされれば、悪いのは当然攻撃者です。しかし、世間的には甘いセキュリティでIoTデバイスを使っていたあなたも非難されるでしょう。

セキュリティに無知では危険を知らずに火薬を扱うようなものですので、気を付けたいですね。

あなたにおすすめの記事はこちら
➡「パソコンのVS CodeからラズパイのPythonファイルを直接編集しよう!

タグ

カテゴリー

  • この記事を書いた人
アバター

from-age35

中小企業エンジニアです。35歳で急遽プログラミングを覚えることになり、PythonやJavaScriptなどをゆっくりマイペースに覚えています。先端スキルには疎いですが、楽しくコーディングしてます♪最近の興味は【WEB開発】です

-Linux, Raspberry Pi
-,

Copyright© 35からのプログラミング , 2019 All Rights Reserved Powered by AFFINGER5.