Linuxとフリーウェアでやって行く大人のための学習記録

GIMPやInkscapeで画像処理をちゃっちゃと済ませて楽しいPCライフを送るブログです。王道とも言える手法を効率良く処理する方法を模索していきます。

さくらVPSでdebianを使っていく~sshに鍵認証方式を追加してよりセキュアに対策

さくらVPSにdebian8をインストールして、TCPWrapperで制限を掛けましたが、まだ簡単にできるセキュリティ対策は有るので設定しておきます。

SSHサーバの認証は、一般的なパスワード認証に加えて、SSL証明書による電子鍵による接続認証を使うことが出来ます。

この電子鍵にはパスフレーズと呼ばれる一種のパスワードも組み合わせており、電子鍵のペアを組み合わせる事とパスフレーズを正しく入力できる事の二段階のセキュリティを実現出来ますので、セキュリティ目的には使わないと損だと言える位の効果があると思います。

私は今まで使っていた鍵のペアを持っている(バックアップしていた)のでそれを使いますが、LinuxSSHにはたいてい鍵を生成する機能が付いているのでそれで生成しても良いでしょう。

電子鍵ペアの生成

まずは電子鍵(証明書)のペアをdebian側で生成します。とりあえずまだSSHサーバは通常のパスワード方式にしているので、sshで接続してコマンドを実行します。

パスフレーズ(passphrase)を入力しろと言ってくるので、通常使うパスワード以外のフレーズを二回入力します。このパスフレーズを元に鍵が作られ、忘れると鍵が使い物にならなくなるので必ず覚えておく必要があります。

user1@debian:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Created directory '/home/user1/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa.
Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
xx:77:xx:ff:ff:xx:55:77:xx:33:xx:77:66:xx:55:44 user1@debian
The key's randomart image is:
+---[RSA 2048]----+
|               .E|
|                .|
|               ..|
|              . o|
|        S    . o.|
|         .    +o.|
|        o    oo.*|
|       . .. o .*B|
|        .. o   o%|
+-----------------+
user1@debian:~$

こんな状態でメッセージが表示されると、ユーザーホームディレクトリに.sshというフォルダが生成され、その中に「id_rsa」、「id_rsa.pub」という2つのファイルができています。正体は単なるテキストファイルですが覚えるのは不可能な位長い証明書ファイルです。catコマンド等で中を見て見ると良いでしょう。

秘密鍵と公開鍵

この2つの鍵ファイルを使うのですが、用途は下の様になります。

  1. id_rsa
  2. id_rsa.pub

1の方が非常に大切な鍵です。「秘密鍵」とも呼ばれるファイルで自分でしっかり管理する必要があります。同様にパスフレーズも忘れない様にします。

2の方はファイル名に.pubと付いている通り、Public(公衆の)で使用する鍵で「公開鍵」と呼ばれます。サーバー管理者に渡して設置して貰ったりもします。

ちなみに公開鍵をなくした場合でも、秘密鍵を持っていれば公開鍵は生成出来ます。残念ながらというか想像がつくとおり秘密鍵を無くしたりパスフレーズを忘れると二度と同じ鍵ペアを生成出来ないのでしっかり管理した方が良いです。サーバー1台だけだったら鍵を変えれば良いのですが、複数台を管理していると何かと面倒くさい思いをする事になります。

既にSSHで接続できているのであれば、SCPやSFTPでサーバーに接続できると思うので、2つのファイルを手元にダウンロードしてバックアップとして厳重管理で保管しておくことをオススメします。ここではSCPやSFTPの事(ファイル転送)には触れません。

SSHサーバーの設定(id_rsa.pubの設置)

ここからは主旨を記しておきます。なぜなら私は秘密鍵と公開鍵を手元にバックアップして持っており、私にとっては鍵の生成手順は不要だからです。今回のサーバートラブルに際しての対処は、手元で保管している公開鍵をサーバーに転送してSSH鍵認証を設定します。

内情を書くと他のサーバーでもこの秘密鍵を使っているので鍵を変えたくないのです。電子鍵はリアルな鍵と違ってこういう部分が本当に便利です。

さて、第一の手順としてはホームディレクトリの~/.sshフォルダ内に生成された「id_rsa.pub」を「authorized_keys」に名前変更します(もしくは手持ちのファイルをここに転送してファイル名を合わせます)。そしてパーミッションを600に変更します。600にしてしまうのは他人には見せる必要が無いからで0にして自分以外はアクセス出来ない様にしてしまう訳です。言うまでもなくセキュリティに直結する部分ですから。

第二の手順として~/.sshフォルダはパーミッション700にするのが一般的です。私のdebian環境では生成された時から自動的に700にされていました。この辺りは気が利いていると思います。

手元に「id_rsa」を入手したら、第三の手順。いよいよSSHサーバーをパスワード認証から、鍵認証方式に変更してレベルアップさせます。VPSはインターネットにむき出しな状態だと言えるので脆弱さが残るパスワード認証は禁止してしまいます。

$ sudo vi /etc/ssh/sshd_config

余談ながらsshd_configは全体(全ユーザー)に関係するファイルなのでsudoでviを実行る必要があります。もし一般ユーザーでsshd_configを開いたら上書き保存出来ません。変更する権限が無いからです。

# Change to no to disable tunnelled clear text passwords
#PasswordAuthentication yes
PasswordAuthentication no

このファイルを編集し保存した後、SSHサーバー(デーモン)を再起動すれば、パスワード認証を受け付けなくなります。

$ sudo /etc/init.d/ssh restart

つまり秘密鍵ファイルを持っていて、パスフレーズを知っていないともうSSHではアクセス出来なくなります。さくらVPSの場合はコンソール画面を扱えるのでもし鍵の設定にミスがあったとしても大丈夫ですが、遠隔操作等の場合は現地まで行って直接コンソールを叩かないとミスした部分を修正出来なくなりします。この設定はミスが無い様に注意することとちょっとした覚悟が必要な作業です。

Windowsクライアントでは一手間必要

通常、Linux等のUNIX系では手元に持って来た「id_rsa」ファイル(秘密鍵)があれば、SSHでログインできるのですが、Windows系のSSHクライアントは、秘密鍵から独自の鍵を生成する手間があります。一般的な概念(秘密鍵と公開鍵のペア)のルールから外れるので、初めての人は戸惑うと思います。

理由としてLinuxのほとんどがOpenSSHを使っていますが、Windowsアプリ(PuTTY)はOpenSSHを実装しておらず証明書に違いが生じるため変換が必要らしいです。PuTTYがOpenSSHを実装しない理由が分からないんですけど、勝手な希望を言えばそれをやってくれたらこういう煩わしさはなくなるのになぁと思います。

さて、私はPuTTYというWindowsアプリを使用してSSHを使用していますが、PuTTY用の証明書生成アプリ(PuTTYgen.exe)を使ってid_rsaファイルを使って.ppkファイルを生成します。そして出来上がった.ppkファイルをPuTTYに登録すると、SSHサーバーに置いてきたファイル(id_rsa.pub[authorized_keys])とペアの鍵として使用出来る様になる仕組みです。

PuTTY Download Page

この辺りは結構帳尻合わせなところがあるので、初めての人は混乱するかも知れませんが、公開鍵と秘密鍵のペアで鍵認証が行われるのがSSHの鍵認証の基本概念です。そこにSSHの実装に種類がある為に互換性を持たせる為に、変換という手順が必要になる訳です。鍵認証の原理は何も変わっていません。

実はPC側でも鍵ペアを作れる

更に混乱させてしまうかもしれませんが、Windowsアプリ(PuTTYgen.exe)によって乱数を生成してPuTTY秘密鍵(id_rsa.ppk)ファイルと、公開鍵(id_rsa.pub)ファイルのペアを生成する事も出来ます。つまりLinuxでも鍵ペアは作れるし、Windowsアプリでも鍵ペアは作れるという訳です。ことWindows環境でのSSHクライアント使用においては、Windows側で作った方がシンプルだったりします。

文章だと非常に煩わしいので整理すると、話に出てくるのは3つのファイルです。

  1. id_rsa秘密鍵
  2. id_rsa.pub(公開鍵)
  3. id_rsa.ppk(PuTTY秘密鍵-id_rsaを元に生成)

私はどちらで作ったか記憶していないのですが、大切に管理しているUSBメモリーの中には、id_rsa.pub、id_rsa、id_rsa.ppkと言う3つのファイルがあるので、Linux(OpenSSH)側で鍵ペアを生成して、秘密鍵を元にPuTTYgen.exeで.ppkファイルを作ったのだと思います。

いずれにしてもWindows環境のSSHアプリからdebianSSH(OpenSSH)に接続するには、OpenSSH版のid_rsa.pub(公開鍵)と、PuTTY独自のid_rsa.ppk(秘密鍵)という鍵ペアが必要になる事を理解しておく必要があります。

最後に

あえて手順主導で記さなかったのは、将来的に私自身がこの仕組(理屈)を忘れてしまい、何が何だっけ?という状態になりかねなく、自分にとっての備忘録が第一の目的だからです。概念が理解出来ていれば手順は検索すれば多くの人が紹介して下さっているのでなんとでもなると思っています。

私以外の人がこの説明(文章)を読んで理解出来るかは私にはわかりませんが、自分にとって分かりやすいでと思われる説明を自分にむけて記録しておきます。