ssh 接続で公開鍵認証を使う

いまさらだけど、備忘録として書いておく。

近々 サーバーの移設を計画している。
今は自拠点内にサーバーを設置し公開している。
サーバーの OS は ubuntu であり、日頃のメンテナンスは ssh で接続して行っている。
インターネット側からこのサーバーに接続することを想定していないために、ssh 接続に際しての認証はパスワードだけで済ませている。

このサーバーを外部に移設することを考えているため、ssh 接続に際してもパスワード認証を禁止し、代わりに公開鍵認証に切り替えるつもりだ。
そこで、ssh で公開鍵認証を行うための手順を再検証した。

公開鍵と暗号鍵をどこで作るか

公開鍵認証で使用する公開鍵と暗号鍵の鍵ペアーは、暗号鍵を使用する側で作成するのが鉄則だ。
そうすれば暗号鍵を外に漏らすことも無い。

ssh 接続の場合だと、暗号鍵は接続する側で使用し、公開鍵は接続される側が使用する。
つまり、鍵ペアーを作成すのは ssh クライアントを作成する側になる。

筆者は、日頃 Windows PC で Tera Term を使って ubuntu サーバーに接続しているので、Windows PC で鍵ペアーを作成することになる。
Windows PC で作成した鍵ペアーを作成して、その内の公開鍵だけを USB メモリーや SCP などの方法で、接続先の ubuntu サーバーにコピーするのが、正統な鍵ペアーの作り方だ。

あるサーバーに複数のクライアントが ssh 接続を公開鍵認証で接続するのなら、クライアントそれぞれで鍵ペアーを作成し、全部の公開鍵をサーバーにコピーすればいい。
この場合、サーバーに複数の公開鍵を登録することになるが、これは何の問題も無い。
逆にサーバーで鍵ペアーを作成し、そこで作った暗号鍵を複数のクライアントに配布するようなことはすべきでは無い。

Windows で公開鍵ペアー

さて、Windows PC に公開鍵認証につかう鍵ペアーを作成しようとしても、残念なことにそのコマンドは標準では用意されていない。
このため、何らかのソフトウェアを入手、インストールする必要があるが、ssh 接続をするのであればあれば Tera TremPuTTY などの ssh 接続クライアント ソフトウェアをインストールしていると思われる。
こういった ssh 接続クライアント ソフトウェアには大抵は鍵ペアーを作成する機能が付随しているので、これ以外に追加でインストールするものは何もないだろう。
Windows に標準搭載されている機能だけでは鍵ペアーは作成できないのは残念だが、ssh クライアントすら標準では存在しない以上はしかたないのかもしれない。
筆者は Tera Trem を常用しているので、以下では Tera Trem を用いて鍵ペアーを作成する。

なお、公開鍵認証でつかう鍵には複数の書式が存在する。
linux でよく使われているのは OpenSSH 形式と呼ばれる書式だ。
Tera Trem も同じOpenSSH 形式を使用している。
しかし PuTTY では、俗に PuTTY 形式と呼ばれる独自の書式を使用している。
このため PuTTY (附属の puTTYgen.exe) で鍵ペアーを作成し、公開鍵を linux に持って行くときは、公開鍵の書式を PuTTY 形式から OpenSSH 形式に変換する必要がある。
公開鍵と暗号鍵の書式が異なっていても、鍵ペアーの組み合わせが壊れることはない。

Tera Term で公開鍵ペアーを作る

それでは Tera Trem を起動して、[設定] メニューにある [SSH 鍵生成] サブメニューを実行する。

Teraterm の設定メニューの SSH 鍵生成サブ メニュー

「TTSSH: 鍵生成」ダイアログが開くので、「鍵の種類」から使う鍵の種類を選ぶ。
[RSA1]、[RSA]、[DSA] のいずれかを選んだときは「ビット数」も入力する。
[ビット数] は大きければ大きいほど暗号化強度は高まるが、その分だけ演算時間もかかるようになり、通信時のパフォーマンスが低下する可能性があるが、少なくとも 1024 以上にはすべきだと言われている。

接続先の OS には ubuntu 10.04 を想定しているので、「鍵の種類」を [RSA] に、「ビット数」を 2048 にして「生成」ボタンをクリックする。

鍵生成ダイアログで生成ボタンをクリックする

[RSA1] は ssh でバージョン 1 のプロトコルで使われる鍵の種類なので、これを選ぶことはまずない。
[ECDSA] (楕円 DSA) の方が暗号化強度が高いということだが、これは openssh 5.7p1 からのサポートになるらしい。
ubuntu 10.04 の openssh は 5.3p1 なので ECDSA はまだ使えない。
ubuntu 11.04 で openssh 5.8 になったので、これ以降なら ECDSA を使う方が良さそうな気がする。

鍵が生成されると「TTSSH: 鍵生成」ダイアログの下部にある「鍵のパス フレーズ」欄、「パス フレーズの確認」欄、「公開鍵の保存」ボタン、「秘密鍵の保存」ボタンが使えるようになる。

鍵生成後に鍵ファイルを保存する

生成された鍵を保存するために、「公開鍵の保存」ボタンと「秘密鍵の保存」ボタンのそれぞれをクリックする。
「公開鍵の保存」ボタンをクリックしたときは公開鍵が、「秘密鍵の保存」ボタンをクリックしたときは秘密鍵が保存される。

「鍵のパス フレーズ」欄と「パス フレーズの確認」欄は、生成した暗号鍵にパス フレーズを付けるために使う。
「鍵のパス フレーズ」欄と「パス フレーズの確認」欄に同じ文字列を入力してから「秘密鍵の保存」ボタンをクリックして秘密鍵を保存したときは、その秘密鍵を使う際にここで入力したパス フレーズの入力を要求される。

「鍵のパス フレーズ」欄と「パス フレーズの確認」欄なにも入力しないまま、「秘密鍵の保存」をクリックして秘密鍵を保存したときは、秘密鍵にはパス フレーズが無いままになる。
このときは秘密鍵を使うときにもパス フレーズが要求されない。

秘密鍵が保存されている PC を複数の人で共有しているような場合は、他の人が間違って使う事ができないようにするためにも、秘密鍵にパス フレーズを付けておくべきだろう。

なお、「鍵のパス フレーズ」欄と「パス フレーズの確認」欄に何も入力せずに「秘密鍵の保存」をクリックすると、以下のように「空のパス フレーズを使用しますか?」というメッセージの「警告」ダイアログが表示される。
この警告のダイアログで「はい」をクリックすれば、パス フレーズが無い秘密鍵が保存できる。

パス フレーズが空だと警告される

ubuntu で公開鍵ペアーを作る

ubuntu 上で公開鍵を作成するなら ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa を実行すればいい。
パス フレーズ付きの秘密鍵を作るなら、-N オプションに続くダブル コーテーションで括られた文字列にそのパス フレーズを指定すればいい。
-f オプションに指定したファイルに秘密鍵が、同じファイル名に拡張子 .pub を付けたファイルに公開鍵が作成される。
秘密鍵には ssh-keygen を実行したユーザーだけに読み込みと書き込みのアクセス権が与えらる。
公開鍵は書き込み権は ssh-keygen を実行したユーザーだけに与えられているが、読み込みはすべてのユーザーから可能になっている。
このアクセス権の割り当ては使用意図を考えれば当然だろう。

公開鍵を接続先ホストに登録する

公開鍵と秘密鍵を作成したら、公開鍵を ssh で接続先のホストに登録する。
念のため書いておくが、接続先ホストの OS は ubuntu 10.04 を想定している。

接続先ホストに接続したいユーザーでログインして、公開鍵を保存するファイルを準備する。
公開鍵を保存するファイルは接続するユーザーの ~/.ssh/authorized_keys ファイルだ。

~/.ssh/authorized_keys ファイルが無いときは、以下のコマンドを実行して作成する。
すでに ~/.ssh/authorized_keys ファイルが有るときに、以下のコマンドを実行しても何の問題も起こらないが、念のために最後の一行 ( chmod u=rw,go= ~/.ssh/authorized_keys) は実行した方が望ましい。

上のコマンドを実行したら、さきほど作成した公開鍵をこの ~/.ssh/authorized_keys ファイルに追記する。
作成した公開鍵は、scp や ftp で転送しても良いし、USB メモリを使ってコピーしても良い。

作成した公開鍵を接続先ホストの ~/id_rsa.pub ファイルに転送・コピーしたときは、以下のようにして公開鍵を ~/.ssh/authorized_keys ファイルに追記する。

公開鍵を ~/.ssh/authorized_keys ファイルに追記したら、以下のコマンドを実行して ~/.ssh/authorized_keys ファイルへの書き込み権限を外しておく。
これは何らかの手違いで公開鍵を消してしまったり、書き替えてしまったりしないようにするための安全策だ。

最後に不用になった ~/id_rsa.pub ファイルを忘れずに削除しておく。

これで公開鍵認証で ssh 接続できるようになった。

公開鍵認証で接続できるか確認する

次に、接続先ホストである ubuntu の ssh サーバーでパスワード認証を無効にするのだが、その前に作成した鍵ペアーで接続できることを確認しておく。

常用している ssh クライアントが Tera Trem なので、接続確認にも Tera Trem を使う。
Tera Trem で常と同じように接続先を指定して「SSH 認証」ダイアログを表示させる。

Tera Term の SSH 認証ダイアログで公開鍵認証に使う秘密鍵を指定

「SSH 認証」ダイアログの「ユーザー名」欄には、今までのパスワード認証と同様にログインするユーザー名を入力する。
「パス フレーズ」欄は、今まではログイン パスワードを入力していたが、公開鍵認証では秘密鍵を保存するときに入力したパス フレーズを入力する。
秘密鍵を保存するときにパス フレーズを入力していなければ、空欄のままにする。
その下のラジオ ボタンは、今までのパスワード認証では [プレイン テキストを使う] をチェックしていたが、公開鍵認証では [RSA / DSA 鍵を使う] にチェックを入れ、その横にある「秘密鍵」ボタンで先に保存した秘密鍵のファイルを指定する。

これで「SSH 認証」ダイアログの「OK」ボタンをクリックして、無事に接続先ホストに接続できれば公開鍵認証が正しく動作したと確認できたことになる。

パスワード認証を無効にする

公開鍵認証の動作を確認したら、ssh サーバーでパスワード認証を無効にする。
ubuntu の ssh サーバーの設定は、ホスト ベース認証は最初から無効に、公開鍵認証とパスワード認証は有効になっているので、パスワード認証を無効にするために /etc/ssh/sshd_config ファイルを以下のように修正する。
なお、ここでは diff コマンドによる差分だけを掲載する。

/etc/ssh/sshd_config ファイルを修正したら以下のコマンドを実行して、ssh サーバーを再起動する。

ssh サーバーを再起動したら、今 繋がっている接続を切らず、すぐに別の端末から公開鍵認証で ssh 接続できるか確認しておこう。
万一、/etc/ssh/sshd_config ファイルを間違って修正してしまい ssh 接続できなくなってしまったときでも、たった今 作業した ssh 接続が繋がっていれば直すこともできるが、これを切断してしまっているとどうにもならなくる。

さくらインターネットの VPN サービスなら、最悪でも VPS コントロール パネルのリモート コンソールで何とか操作はできる。

関連記事

  • さくらインターネット VPS サービスを契約してみた2012.4.24 (火) さくらインターネット VPS サービスを契約してみた ubuntu 使いなので、最初にインストールされている CentOS を起動もせず即座に OS 再インストールして ubuntu に入れ替えてしまった。 さくらインターネット VPS サービスではまだ ubuntu 12.04 LTS は提供されていない […]
  • Ubuntu 14.04 LTS を Azure に2015.6.4 (木) Ubuntu 14.04 LTS を Azure に ちょっと、備忘録。 Microsoft Azure に Ubuntu 14.04 LTS の仮想マシンを作ってみた。手順自体はググるなりビングるなりすればすぐに見つかるし、ポータルの UI の変更も多くあるので、あえてここには書かない。 […]
  • ubuntu のインストール直後の調整 (その 3)2010.6.28 (月) ubuntu のインストール直後の調整 (その 3) [ローカル用 Postfix のインストール] ところで ubuntu を含む linux 系の OS で動くアプリケーション (特にサーバー系アプリケーション) では、アプリケーションの状態を syslog […]
  • ubuntu 10.04 をメールサーバーに (PostfixAdmin インストール編)2010.7.11 (日) ubuntu 10.04 をメールサーバーに (PostfixAdmin インストール編) ubuntu 10.04 LTS Server Edition をインストールして、さらに Postfix をローカル用に設定した。 ここからはローカル用に設定した Postfix の設定を変更すると共に、いくつかのパッケージを追加して、クライアント […]

コメントを残す