ソフトウェアとハードウェアの境界

ホビー開発に関する誰得情報満載☆

Raspberry Pi でサーバ構築③(ssh公開鍵編)

公開鍵の理論

sshでシステムにログインする場合、アカウントの認証のために、公開鍵暗号を利用することが一般的である。
理由はもちろんセキュリティ上の問題で、悪意のある第三者が不正にログインすることを防ぐためである。
また、単純にファイルの転送などを行う場合にも、そのファイルに暗号をかけて送受信したりする場合もある。
暗号鍵には、基本的な概念として、以下の2つの暗号方式がある。

  • 共通鍵暗号方式
    暗号をかける方と暗号を解く方が同じ鍵を利用する。
  • 公開鍵暗号方式
    暗号をかける方と暗号を解く方が異なる鍵を利用する。

共通鍵暗号方式と、その問題点

共通鍵暗号方式では、暗号をかける側、あるいは解く側が、暗号に利用する鍵を1つ用意する。
その鍵を「どうにかして」鍵作成者から利用者へ送り届ける。
そして、暗号をかける人と解く人が同じ鍵を利用して暗号のかけられた文書を転送し合う。

共通鍵暗号方式

f:id:tokixy56:20151012175749j:plain ここで問題となるのは、①の「鍵の届け方」である。
例えば、鍵をそのままの形でメールなどで送ってしまえば、鍵データを盗まれてしまう可能性がある。
もちろん物理的に手書きのものを渡すこともできるかもしれないが、何キロも離れた人物に渡すのは現実的ではない。
公開鍵暗号方式は、その「鍵の転送問題」を解決するため誕生した。

公開鍵暗号方式 (RSA)

その理論は、非常に難解であった。笑

公開鍵暗号方式(RSA) 公開鍵の作成

f:id:tokixy56:20151012180716j:plain
充分に大きな素数とモジュラー算術が要となっている。
この公開鍵を、サーバ上などに公開する。

公開鍵暗号方式(RSA) 秘密鍵の生成

f:id:tokixy56:20151012181934j:plain
このとき、(p-1)(q-1)は、他者に知られないようにする。
これが秘密鍵の要となる。
したがって、この鍵はネットワークなどを通じて転送するべきではない。

公開鍵暗号方式(RSA) 復号

f:id:tokixy56:20151012181947j:plain

また、この公開鍵暗号方式は、モジュラー算術における指数演算が、一方向関数であり、逆向きに計算して復号するのは極めて困難である、ということを根拠にして利用されている。
したがって、公開鍵がわかったからといって、元のメッセージは簡単に計算できない。

公開鍵暗号方式(RSA) 例

f:id:tokixy56:20151012184651j:plain 上記の例では、素数を11、17としているが、実際にはもっと大きな素数とする。
秘密鍵の生成は簡単にはいかないが、ユークリッドの互除法を用いれば比較的簡単に求めることができる、らしい。
非常に難解ではあるが、詳しく知りたい人は、暗号文の歴史とともに、この本を読んでみると良いかもしれない。

www.amazon.co.jp

ssh公開鍵の設定

と、本題に入ろう。
実際にsshサーバに公開鍵を設定する場合、公開鍵の理論など全く知る必要がない。
我々は、それも知らずにありがたく利用させてもらおうではないか。笑

ssh公開鍵の作成

今回はTeratermSSH公開鍵の生成機能を利用する。
クライアント側がLinuxなどのUnix環境、あるいは、Cygwinなど利用できる環境である場合、ssh-keygenコマンドを利用すれば、公開鍵、秘密鍵を作成することができる。

Teraterm ssh公開鍵の作成

Teratermを起動し、メニューの[設定]→[SSH鍵生成...]を選択。
f:id:tokixy56:20151012210642p:plain
下記の画面が表示され、RSAが選択されていることを確認したら、生成ボタンをクリック。
f:id:tokixy56:20151012211054p:plain
一度生成ボタンをクリックすると、下記のように、パスフレーズ入力テキストボックスに入力できるようになるので、どちらのテキストボックスも同じパスフレーズ(パスワード)を入力する。
コメントは「メインPCで作成」とか入力しとけばよし。
パスフレーズ(パスワード)入力後、もう一度生成をクリック。
f:id:tokixy56:20151012211344p:plain
[公開鍵を保存]、[秘密鍵を保存]でそれぞれの鍵を保存する。
ここで保存した公開鍵、id_rsa.pubを、RPiへ転送する。

RPi(サーバ)側の設定

前回の記事では、Sambaの設定をした。
tokixy56.hatenablog.com
※ちなみに、ちょっとまずい部分があったので、前回の記事も修正している…汗
Windowsの[ネットワーク]から、RPiのディレクトリを探して、id_rsa.pubファイルを転送しておこう。
転送が終わったら、sshでRPiに接続する。
ファイルを転送したディレクトリに移動し、以下のようにする。

RPi 公開鍵の設定f:id:tokixy56:20151012225942p:plain
$ mkdir ~/.ssh
$ sudo mv id_rsa.pub ~/.ssh/authorized_keys

次に、sshd設定ファイルを編集する。

sshd設定ファイルの編集 /etc/ssh/sshd_config
#...33行目あたり...
#以下のコメントを外す
AuthorizedKeysFile %h/.ssh/authorized_keys
#以下の行を追加
PasswordAuthentication no

上記の編集が完了したら、sshデーモンをrestartする。

$ sudo /etc/init.d/ssh restart

これで、RPiに接続する際には、id_rsa秘密鍵を使用して接続しなければなくなった。

RPi 公開鍵(秘密鍵)を使用したssh接続

これもTeratermを利用する。
Unix系、Cygwin等であれば、以下のコマンドで接続できるであろう。

$ ssh ユーザ名@192.168.x.xxx -i id_rsa

あとは、パスフレーズ(パスワード)を入力すればいい。

Teratermでは以下のように接続する。

Teraterm 秘密鍵ssh接続

f:id:tokixy56:20151012225833p:plain
IPアドレス(今回は例として192.168.0.150を使用)を入力し、接続。
下記のようなウィンドウが表示される。
f:id:tokixy56:20151012225942p:plain
ユーザ名、ssh公開鍵を作成した時と同じパスフレーズを入力し、[RSA/DSA/ECDSA/ED25519鍵を使う]にチェックを入れ、[秘密鍵]ボタンをクリックすると、ファイル選択ダイアログボックスが表示されるので、先ほど作成した秘密鍵を選択する。
設定完了後、[OK]ボタンをクリックすると、接続完了だ。

次回予告

Apacheの設定でもしたいなと思う。
gitサーバを立ち上げることは今のところあまり考えていない…
github使うのがやっぱり良いですよね。
CGIRuby on Railsでやってみたいなぁと思う。
Pythonも興味あるけど、やっぱりまつもと氏リスペクトです。