コマンドライフ

Windowsでコマンドライフ3:Headless Raspberry piに鍵交換でのssh接続を設定するまでの手順(より便利にするための、ちょい設定もね)

はじめに

Windowsでコマンドライフシリーズの三回目です。今回は、Raspberry piにOS(デスクトップなしのLite版)をインストールするところから、鍵交換でのssh接続をセットアップして、最終的にはパスワードでのssh接続を禁止するところまでの手順について書きます。ポート番号もデフォルトの22番から別のものに書き換えます。

Raspberry piはheadlessで通します。Raspberry piには、モニタもキーボードも一切接続しません。リモートデスクトップ(VNC)も使いません。デスクトップで見たい、フォルダをクリックしたい、そんな誘惑から一切離れて、マウスもキーボードもモニターもなしのRaspberry piをsshを通して操作してみましょう。OSを書き込んだSDをセットして起動させたRaspberry piが、それ以降自分の手の届かないところ(リモート)にある、そういう状況を想定して作業してみます。

用意するもの

今回、Raspberry家族の末っ子、Raspberry pi zeroを使います。Zeroです。Zero WとかZero 2 Wではなく、Zero。5ドルのコンピューターとして2015年に出された製品です(衝撃的でした)。Zero自体にはwifiユニットが載っていないので、USBドングルのものを接続して使います。

これ以外のRaspberry piにはwifiユニットが載っていますので、USBドングルのwifiユニットは必要ありません。

GitBashなどを導入してsshコマンドが使える状態になっているパソコン。これを使ってssh鍵を作ったり、Raspberry piに鍵を送り込んだりします。SDカードへのOSインストールには、Raspberry pi Imagerを使います。これを使うことで、wifiの設定などをあらかじめ書き込むことができるようになりました。

あとはおうちのwifi環境と、wifiに接続されている機器の情報を表示できるアプリ。これは、wifiに接続されたRaspberry piのipアドレスを調べるためのものです。アクセスポイントを管理するためのケータイアプリや、アクセスポイントのweb interfaceがあればそこからアドレスにたどり着くことができると思います。ケータイアプリとしてはFingなどいろいろなものがありますので、新たにネットワークにのったRaspberry piに割り当てられたipアドレスを調べられるようにしておきます。

全体の流れ

まず今日の順路を把握しておきましょう。

1.SDカードにOSを書き込む

2.Raspberry piの初回起動とパスワードでのssh接続確認

3.ssh接続用のkey pair作成(手元のPC上で)

4.scpでpublic keyをRaspberry piに送り込む(手元のPC上から)

5..ssh directoryを作ってpublic keyをauthorized_keysに書き込む(Raspberry pi側)

6..ssh directoryとauthorized_keysのpermissionを設定(Raspberry pi側)

7.鍵を使ったssh接続確認

8.sshd_configを編集(Raspberry pi側)してパスワード接続を禁止する

9.sshdの再起動(Raspberry pi側)

10. パスワードでは接続できないことを確認

長いですね。鍵を用いたssh接続の方法をGoogleなどで検索すると、いろいろな目的の、いろいろな文脈のものが出てきますので、調べれば調べるほど混乱するかもしれません(私がそうでした)。例えば、key pairの作製ですが、sshログイン先のdevice(リモート側)、今回ならRaspberry pi上で作ってprivate keyを手元のPCに持ってくるということも考えられます。私としてはprivate keyは自分の手元(ローカル)で管理が基本です。Public keyは気安く転送できても、private keyについては慎重になりたい。Pairはローカル(手元)で作ってpublic keyをリモートへ転送する、そういう手順をとりたい。

転送後リモートでprivate keyを削除すればいいじゃない、shredコマンドがあるよ、という紹介もありますが、その前にコピーがとられていたら、転送ルートで引き抜かれたら。。。しかし実際そんなことは起こらないでしょうし、二段目のセキュリティとしてパスフレーズも設定しますし、そもそもインストールしたてのRaspberry piには意味のあるファイルはありませんし、実際Raspberry piは自分のうちのLANにつながっていて、電源引っこ抜きで対処できますもの(なにこの口調)。

でも、そうじゃなかったら。リモートが本当にリモートだったら。例えば畑にセンサーとともに設置したRaspberry pi(いいすね、畑)、屋根の上の防水箱の中のRaspberry pi(何を計測しているんでしょうか)、あるいはリモートがレンタルサーバーである場合。その中に取られて意味のあるファイルはないにしても、踏み台にはされたくない。最低限のログイン管理も意識している風に書いているのがこの記事です。

なお、パスワードなしでのssh接続のために、空パスフレーズのprivate keyを使う例が紹介されていたりしますが、この記事ではパスフレーズは必須とします。Private key + パスフレーズの二段構えが鍵交換システムの提供する基本セキュリティだからです。

手順

それでは始めましょう。

1.SDカードにOSを書き込む

まずはOSをインストールしてRaspberry piをwifiに接続させます。

Etcherなどを使って、あらかじめダウンロードしておいたディスクイメージをSDカードに書き込む、というやり方がありますが、その場合にはwifiへの接続設定などをするため、初回起動時にモニタとキーボードが必要となります。

この記事ではRaspberry pi Imager(以下、imager)を使って、SDへの書き込み時にwifiへの接続を含む初期設定を完了させます。ImagerはRaspberry pi OSのページからダウンロードできます。これを用いると、wifiへの接続設定のほか、device名、user名とパスワード、タイムゾーンの設定がすでに行われた状態のSDカードを得ることができます。これによりモニタとキーボードへの接続なしに初回起動時からRaspberry piがwifi LANにのります。これまでたった一度の接続のために用意していたUSBキーボードとそれをつなぐのに必要なAからmicroへの変換プラグ、HDMIの変換プラグがいらなくなるわけです(うれしい)。

Imagerを起動して、CHOOSE OSボタンをクリック。

一番上ではありませんよ、デスクトップ版なんて入れちゃダメです、Zeroは末っ子であんまり力がありませんから。一つ下の、Raspberry Pi OS (other)をクリック。

Raspberry Pi OS Lite (32-bit), no desktop environmentを選びます。え?Liteの64-bitもあるって?それは上のお兄ちゃんお姉ちゃん用なんです。(Raspberry Pi 3/4/400)とありますね。今はZero用、下のおチビちゃんでも活躍できるものを選びます。

さて、ここからですよ。ギアのマークをクリックします。

これから順に、初期設定のお願いをしていきます(SDへのOS書き込み時に入力した設定も必要なファイルに書き込んでくれるのです!)。まずはSet hostnameにチェック。ここはネットワーク上でのdevice名になりますから、一目でわかる名前を付けましょう。私はZeroとしました。

あと、Enable SSHにチェックを入れ、Use password authenticationのラジオボタンをアクティブにします。

次はUsername。前のバージョンのOSではデフォルトでpiユーザーがつくられていましたが、今のバージョン(Bullseye)では自分で作成するようになっています(これまではほとんどのRaspberry piに必ずpiというユーザーがいたので、悪意のある人はパスワードさえ当てればloginできました。Bullseyeからはユーザー名も当てなければならず、彼らにとっては難易度が上がるわけです。これがpi以外の名前が推奨される理由です。以前は別ユーザーを作ってからpiユーザーを無効化するなどの手をとっていました)。

piと入っていますが、何か別の名前を付けましょう。pisonは私が気に入っているというだけですので、みなさまはどうぞもっとファンシーな名前を付けてくださいまし。

パスワードもここで設定します。ここでの入力をパスワードとするユーザーが作成されることになりますので、絶対に忘れないようにしてください。

次がwifiの設定です。これまで苦労してモニタとキーボードを接続して初回起動時に入れていたもの。これをあらかじめここに入力できるのです。。。(泣くなよ)

アクセスポイント名とそこへの接続パスワードを入力します。なんだっけ、という方は、おうちのIT担当の方にお尋ねください。また、ここで入力を間違えますと、モニタとキーボードなしに、、、というウリが崩れ去りますので、自信がない場合にはケータイやほかのパソコンでアクセスポイント名と接続パスワードがあっているか、今一度お確かめください。お願いします。なお、YOUR SSIDとかは、説明ですので、そのまま打たないでください。

次は国と地域、キーボード配列の設定です。お住いの国にあわせて入力してください。以下は日本で、US配列のキーボード(Pの横に[と]がある、2のシフトが@)を使っている場合の例です。

SAVEをクリックして設定画面を閉じます。あとはStorageを指定し、WRITEをクリックしてください。カードにあるもの消されるけど本気?と聞かれますので、ここで引き下がらないならYESをクリック。くれぐれも本意ではないストーレッジが選ばれていないことを確認してください。げ、間違えた、とならないように。

ストーレッジの初期化、書き込み、検証が無事終わると、次のメッセージが出て完了です。CONTINUEをクリックしてカードを取りはずしましょう。

これで初期設定の書き込まれたSDカードの準備が完了しました。

2.Raspberry piの初回起動とパスワードでのssh接続確認

Raspberry piにSDカードをセットして、電源に接続します。特に初回の起動には時間がかかりますので、緑のLEDの点滅が落ち着くまでしばし待ちましょう。点滅はストーレッジへのアクセスも示しているので、チカチカ、チカチッチカ、チチチチカ、(もういいって)などとなっている間は待ちましょう。

さて、LEDの点灯が安定したら、おそらくwifiへの接続も無事に完了しているはずです。用意するもの、のところで書いたアプリなどを用いてRaspberry piの(ものと思われる)ipアドレスを探しましょう。

上はアクセスポイント管理用アプリ(TP-LinkのDeco)での情報、下はFingというアプリ上でのZeroの情報です。IPアドレスは最後が43で終わるもののようです。192.168.XX.YYはたいていのおうちでのプライベートアドレス空間です。似たようなアドレスが表示されるはずです。これをメモします。

Raspberry piのipアドレスがわかりましたので、パスワードでのssh接続をしてみましょう。

GitBashなどのターミナルエミュレーターを開き、ssh ユーザー名@ipアドレスと打ってみます。初回の接続では、下に示すようにremoteからのkey fingerprintが表示され、Are you sure you want to continue…と聞かれます。Device名もあってましたし、きっと正しいハズです。yesとタイプするとfingerprintがknown hostsのファイルに書き込まれ、次回からはこの警告はでなくなります

password:のプロンプトが出ますので、さっき設定したパスワードをタイプします。

Debian GNU/Linuxは全くの無保証だでね、とかいう文が出て、Raspi側のプロンプトがでれば成功です。

接続の切断にはexitを使います。

以下、初回の接続と切断、二回目以降の接続をしたときの様子を示します。

これでパスワードでのssh接続ができることが確認できました。exitでいったん接続から抜けて、プロンプトをこちら側(ローカル)へ戻します。

3.ssh接続用のkey pair作成(手元のPC上で)

鍵はpairで作成されます(鍵の実体は文字列で、ファイルに保存されます)。一つはprivate key(あるいはsecret key)、もう一つはpublic keyです。Public keyはあなたへの通信を暗号化するのに使われます。それを復号化できるのは、pairとなるあなたのprivate keyだけ、となることが十分保証されるような仕組みが用いられます。また、二段目のセキュリティーとして、private keyを使用するためのパスフレーズが設定されます。空のパスフレーズを設定することもできますが、この場合は実質二段目のセキュリティーを放棄することになります。

private keyはあなただけが持ち、それを使うためのパスフレーズもあなたしか知りません

逆向きを考えます。あなたは通信を暗号化して送りたい相手のpublic keyを持っています。それを用いて通信を暗号化し、相手に送ります。相手はそのpublic keyとpairになるprivate keyとそれを使うためのパスフレーズを持っています。これでお互い暗号化通信をすることができます。

もう一度確認します。鍵はpairで作成されます。Private keyを手元に、public keyは通信相手(リモート側、今はRaspberry pi)に渡します。

ssh-keygenコマンドを用いてkey pairを作成します。以下をご覧ください。最終的にファイルが二つできてきます。フォルダ(key_to_zero)を一つ作って、その中で鍵を作成しました。この辺りはご自由に。

引き続いて、public keyをRaspberry pi側に送り込みましょう。

4.scpでpublic keyをRaspberry piに送り込む(手元のPC上から)

scpコマンドを用いて.pubのついた方のファイルをリモート(Raspberry pi)側のhome directoryにコピーします。scpコマンドはパスワードをきいてきます。ssh接続の時に使ったのと同じ、ログインパスワードを入力します。(最終的にパスワードログインを禁止しますと、scpにも鍵による接続が必要になります。今はまだその前の段階なので、ログインパスワードが通ります)

scpコマンドの基本形はcpと同じく以下の通りです。

scp <コピーしたいもの> <行き先>

今回、行き先は、home directory (/home/pison)とし、ファイルの名前はそのままとしたかったので、/home/pison/(ここ書かなくていい)としました。もし、行き先で別名(例えばalternative-file-name.pub)を与えるなら、

/home/pison/alternative-file-name.pub

のようにします。ネットワーク上の行き先は、

<username>@<ipaddress>の後にfull pathを書き、今回の場合は下にあるように、

pison@192.168.XX.YY:/home/pison/

とします。ip addressのあとのコロンを忘れないようにしましょう。

これでファイルが別マシンにコピーできるなんて、ちょっとすごいですね。

5..ssh directoryを作ってpublic keyをauthorized_keysに書き込む(Raspberry pi側)

まず、パスワードでssh接続し、今コピーしたpublic keyが確かにhome directoryにあるかを見てみましょう。

ありました。次は、.ssh directoryを作り、その下にauthorized_keysというファイルにpublic keyの内容を書き込みます。今回は一つ目の鍵となりますが、すでにauthorized_keysがある場合には”>”ではなく”>>”を使って追記するようにしないと新たにファイルが作られてこれまでの内容が消えてしまいますのでご注意。初回から追記のリダイレクト”>>”で説明しているページが多いのはそのためです。これは初回だ、という確信があるならば、

cp key-to-zero.pub .ssh/authorized_keys

でもいいわけです。しかし、authorized_keysがあってもなくてもどちらでも同じ結果となる、追記リダイレクトを使うことにします。

コマンドチェインは以下をご覧ください。

ここまで完了したら、コピーされたpublic keyはいりませんので、rmコマンドで削除してかまいません。

6..ssh directoryとauthorized_keysのpermissionを設定(Raspberry pi側)

地味ですがこのステップは重要です。

.sshは700、authorized_keysは600にします。

もう一息です。Raspi側にpublic keyを登録し、permissionの変更も完了しました。exitしてローカルに戻りましょう。

7.鍵を使ったssh接続確認

sshコマンドにiオプションを付けてprivate key (path)を指定します。パスフレーズを尋ねられます。これは指定したprivate keyを使うためです。上に書いたように、private keyを使うために第二段のセキュリティーとしてパスフレーズを設定しました。

それにしても、鍵でのssh接続ではいったいなにが起こっているのでしょうか。それを説明した図を下に示します。SSH clientがローカル、SSH serverがリモート(Raspberry pi)です。sshの開始時に、リモートは、ステップ5で送り込んだ、

あなたのpublic key (~/.ssh/authorized_keysに書き込みました) — (1)

を使って暗号化したランダムな数字を送信してきます。あなたと(1)のあなたが同一ならばあなたは(1)と一緒に作成されたprivate keyをローカルに持っているはずで、しかもそれを使うためのパスフレーズも知っています。それを使って数字を復号し、リモートに返送します。あなたの復号結果がリモートの用意した数字と一致すれば、sshセッションが開始されます。それ以外の場合は切断されます。

https://info.support.huawei.com/info-finder/encyclopedia/en/SSH.htmlより

ということがわかると、-i で指定するのはprivate key、パスフレーズをきかれることは自然に思えますね。Privateかpublicかどっちだったけ、パスフレーズってログインパスワード?というような混乱は起こらなくなります。

path指定を簡単にするため、private keyのあるフォルダに移動してからssh接続した例を以下に示します。ちなみに、-i オプションは、identity_fileの i です。Private keyがまさにあなたのネットワーク上でのidentityに代わるものなのです。大事に管理しましょう。

鍵を使ってログインできました。

この段階ではまだパスワードでのログインもできます。-i オプションなしでsshコマンドを使い、パスワードでもログインできることを確認してみてください。さて、次はいよいよパスワードでのログインを禁止する設定をします。

8.sshd_configを編集(Raspberry pi側)してパスワード接続を禁止する

ここではsshd_configというsystem設定ファイルを編集します。少し緊張しますね。下手するとsshでのログインができなくなってしまったりします。そうするとお手上げです。これまでせっかくモニタもキーボードも接続することなく、と頑張ってきたものが崩れます。とはいえ、Raspberry piは手の届くところにあるわけですし、もし失敗したら、モニタとキーボードをつないで何とかできます。何なら、SDカード作り直すところから始めてもいいわけです。

しかーし、

私はしつこい。失敗はありうる、でもモニタとキーボードをあんなに小さい末っ子に接続するのは不格好だ、妥協 is not our option。対策をして臨むぞ、諸君。という方針で進むことにします。

と勇ましいようなこと言ってますが、中身はこわごわターミナル二つ法です。

ターミナルウインドウを二つ開けます。AとBと呼ぶことにしましょう。AとB両方からRaspberry piへssh接続します。Aはそのままにしておき、Bを使って設定ファイルを編集、sshdの再起動(次のステップ)をし、exitで接続を切ります。設定がうまくいっていることをBを使って試します。

パスワードでの接続がrejectされること — (あ)

鍵を使った接続ログインはうまくいくこと — (い)

両方うまくいけばそのままにしていたAもexitします。もし、(あ)、(い)の二つがうまくいかない、あるいはどちらもうまくいかない場合にはAを使っていま変更した箇所を見直します。うまくいくまでAでの接続を維持し、変更操作はBから行います。sshの設定を変更したり、sshdの再起動をしたりしても、Aでの接続は維持されます。これが面白いところですね。保険としてもう一つ接続を維持しておいて、何かあったらそれを使って何とかする。手の届かないところにあるdeviceの管理や操作をするための工夫の一つです。

この記事ではすべての場合を網羅しながらAもBもスクリーンショットをのせると煩雑になりすぎますので、上でいうところのBだけを示しながら説明します。

A、B両方からssh接続しておく。パスワードでも鍵+パスフレーズでもよい。AをそのままにしてBで作業。

/etc/ssh/sshd_configを開いて編集します。

sudo nano /etc/ssh/sshd_coufigで編集開始。

いくつかの行をuncommentしたり、書き換えたりしていきます。Comment outされている行は、デフォルトのセッティングを表しています。ということは単にuncommentしても実質意味はない、ということになりますが、私はここを意識していますよ、という表示の意味でuncommentしてもかまいません。下の例ではいくつかそうしています。

ポート番号の変更は、必ずしも必要ありません。デフォルトの22から変更しておくと、悪意ある接続を試みる人たちの苦労が若干増すという程度。結局網羅的にportをたたかれたら意味がないことになりますが、覚えておくといいかもしれません。頻繁に変更してあきらめさせる手もあります。なにより、変更はここでできるということは覚えておきましょう

ログインの制限時間はLoginGraceTimeで、tryの回数制限はMaxAuthTriesで設定します。あまり厳しくしすぎると、自分が入れなくてイライラするもとになりますので、ほどほどに。

StrictModes yesは、上で設定した.sshやauthorized_keysのpermissionが700 600以下であることをチェックします。Public keyといえども、少々厳しくアクセス制限をかけておけ、ということですね(なんせリモート側ですから、普段目がとどきませんので)。

そして最後のPasswordAuthentication no。ここです。これなんです。ここをnoにすると、パスワードでのsshログインができなくなります

設定ファイルを変更するときにまず注意するのは、入力メソッドが英数字になっていることを確認することです。ここが日本語入力を使う我々の落とし穴です。つい、うっかり全角を使ってしまう。しかもフォントやサイズによってはほとんど区別がつかない。特にスペースに至っては最悪です。そういう文字が入り込むとエラーの元ですし、見つけるのが非常に難しい。必ず英数字入力に切り替えてから編集を始めましょう

さて、編集が終わったら、Ctrl+O(オー、write Outと覚えましょう)で編集内容の書き出しをします。下のような表示が最下部にでますので、リターンしてください。当然元のファイルに書き込みますので。

最後にCtrl+Xでnanoを終了します。お茶かコーヒーでもすすりましょう。

9.sshdの再起動(Raspberry pi側)

いよいよですよ。変更を反映させます。ターミナルAはまだそのままに。

sshdの再起動はいくつかのコマンドで行うことができます。たとえば

sudo systemctl restart ssh.service

sudo service ssh restart

など。どちらかを使ってみてください。

さあ、チェックですよ。まだAはそのままに。

10. パスワードでは接続できないことを確認

以下をチェックしましょう。

  • パスワードではログインできない
  • -i オプションでもログインできない

え?-i オプションならログインできないとおかしい!そうですね。でもそれは変更したportを指定しない場合です。入れないのはデフォルトの22番では入れなくなっている証拠です。変更したport番号を指定して試してください。今度は入れるはずです。

portの指定は -p オプションで与えます。50022に変更したのであれば、以下を試します。

ssh -i <path to private key> -p 50022 <user>@<ip address>

以下は私の例です。

うまくいきました!パスワードでは入れません。鍵がないと入れません。カスタムポート番号を知らないと入れません。目的達成!

はい。ご苦労様でした。Aのターミナルでもexitと打って抜けてください。

ついでにssh config, motd suppression

鍵を使ってRaspberry pi zeroにssh接続ができるようになりました。これはこれでうれしいのですが、何かの用事で使おうとすると、面倒なのが -i オプションでの鍵path指定です。ここまでの説明では使いたいprivate keyのあるフォルダにcdして作業していたので、実質ファイル名を指定すればよかったのですが、毎回鍵のあるフォルダに移動して作業するのは不便です。そこで、.ssh/configファイルの出番です。

このファイルにこの後示す書式で設定を書き込んでおくと、current directoryに左右されずに、たとえば、

ssh raspizero

と打てばssh -i <なんちゃら> -p <なんとか><user>@<ipあどれす>

と打ったのと同じ結果が得られます(おお便利)。やってみましょう。

まず、ローカルのhome directory(C:\Users\あなたのユーザー名)に.sshフォルダを作る。(どっとsshですよ)

その中にconfigという拡張子なしのファイルを作り、以下に示すような書式で情報を書き込む。それだけです。

コマンドラインでやった様子を以下に示します。(デスクトップでのマウスクリックでやってもいいですけど、ぜひコマンドラインでやってみてください)

あとはnanoの上で以下の内容を書き込みます。(ご自分のものに合わせてください)

Ctrl+O, return, Ctrl+Xで編集を終了します。

うまくいくとこうなります。current directoryがどこであろうと、ssh raspizeroと打つだけで!

便利すぎ。

もうここまでくると、あとひとつだけ気になりますね、この毎回出るABSOLUTELY NO WARRANTYとかなんとかいうメッセージ。どうにかなりませんかね。

どうにかなるようです。

https://ubuntuforums.org/showthread.php?t=1661626&p=10328706#post10328706

/etc/pam.d/sshdをちょっぴり編集すればいいようです。やってみます。

Raspberry pi zeroにログインして、

exitして、再度sshログインしてみると、

いいですね。このぐらいまで設定しておくと日々、sshを使おうと思えるってもんです。

以上、Raspberry piに鍵交換でのssh接続を設定するまでの手順と、さらに便利に使うためのヒントでした。

PuTTYやWinSCPを使うときの注意

コマンドライフの記事で書くのもおかしいんですが、WinSCPというGUIツールはリモートとのファイルのやり取りにものすごく便利です。これを使う際、sshの鍵が必要になります。ああ、鍵ね、あるある、と上のssh-keygenで作った鍵を使おうとすると、うまくいきません。また、逆にPuTTYgenで作った鍵をRaspberry piとのssh接続に使おうとするとこれまた失敗します。その理由は、ssh-keygenの作るOpenSSHの鍵とPuTTYやWinSCPが使う鍵の方式が異なっていることにあります。どちらで作った鍵も相互に変換して使うことができますので、やり方についてはそれぞれ調べてみてください。ここでは注意点として挙げるにとどめます。適当に調べ始めると混乱します。あらかじめはっきりさせておくことは、以下のどちらにあてはまるか、ということです。

  • 私はssh-keygenで作った鍵を持っている。これをWinSCPで使えるようにしたい
  • 私はPuTTYgenで作った鍵を持っている。これをsshコマンドで使えるようにしたい

それではまた。今日はCNY(Chinese New Year)の第一日目で、外は静か、でも時折にぎやかなドラゴンダンスの太鼓やドラの音が聞こえてきます。いい年になりますように。

ABOUT ME
misson
ものづくりが趣味。頭の中でモヤモヤと渦巻くガスを形として沈殿させるのが趣味。座右の銘その2は:未来は今の積分値


follow us in feedly

COMMENT

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