2.1 公開鍵暗号認証

UNIX パスワード認証を用いた SSH によるログインも暗号化されているとはいえ ユーザアカウントとパスワードをネットワーク上に流している事に代わりはありません。 第三者から暗号化されたデータを解読される可能性が残っています。
これに対して公開鍵暗号を用いて認証を行うと、アカウント情報をネットワーク上に流す事なく、 確実なユーザ認証を行う事ができます。

2.1.1 暗号化とは

大きく分けて2種類あります。二度と元には戻せない暗号化と、元に戻せる暗号化です。 また、暗号化されているデータを再変換して元のデータに戻す事を復号といいます。 データを扱う当事者だけが知っているルールに従って、暗号化・複合化が行われます。

暗号化方式は様々存在しますが、いずれも「共通する操作」と「操作を決定づけるパラメータ」 がひつようになります。共通する操作の事を「アルゴリズム」操作を決定づけるパラメータを 「暗号鍵」と呼んでいます。アルゴリズムが分かっても、暗号鍵をする入手できなければ、暗号を 解読する事はできませんし、その逆に暗号鍵を手に入れれも、アルゴリズムがわからなければやはり解読できません。

2.1.2 公開鍵暗号とは

データの暗号化がアルゴリズムと鍵から生成される事は前項の通りです。 一般に暗号化のための鍵と復号のための鍵が同じ暗号を「秘密鍵暗号」と呼びます。 暗号化と復号が同じ鍵を使う場合は、鍵を相手に送るための手段が問題となります。(鍵配送問題) この問題をクリアしたのが、「公開鍵暗号」という種類の暗号に方式です。 公開鍵暗号では、「暗号化するための鍵(公開鍵)」「復号するための鍵(秘密鍵)」の2つを 用います。公開鍵は、その名の通り公開して誰でも手に入るようにします。暗号化したデータは 受信者だけが持っている秘密鍵によってのみ復号できます。

2.1.3 公開鍵暗号を用いた認証

SSH ではユーザ認証を行うために公開鍵暗号を用いることができます。公開鍵暗号を利用した認証 の手続きは、以下のようなプロセスで行われます。

  1. ログイン先の SSH サーバにあらかじめ、自分の公開鍵を登録する
  2. SSH クライアントで SSH サーバにアクセスする
  3. SSH サーバから公開鍵で暗号化されたランダムな文字列データが SSH クライアントに送信される
  4. クライアントが受信したデータを秘密鍵を使って復号して、そのデータを SSH サーバに送信する
  5. 元の文字列とクライアントが復号して送ってきたデータが一致すれば、認証が完了する。

この認証方法は、”ある公開鍵で暗号化されたデータはペアとなる秘密の鍵によってのみ復号される” という性質を利用しています。

ポイント
公開鍵は暗号化のみ行え、秘密鍵は複合化のみ行える。
公開鍵が盗まれても、秘密鍵が必要になる。また秘密鍵を使うにはパスフレーズが必要になる。

2.2 OpenSSH における公開鍵暗号認証

2.2.1 鍵の生成

SSH サーバに対して公開鍵認証を行うには、まず最初に公開鍵とペアの鍵を作成する 必要があります。クライアント側のユーザが秘密鍵を持つ必要があるので、クライアント 側で作成するのが望ましいです。

プロトコルSSH1SSH2
アルゴリズムRSARSA, DSA
参考) 鍵(キーペア)の作成 ※ アルゴリズム dsa の場合
ssh-keygen -t dsa

上記の ssh-keygen を使って公開鍵と秘密鍵を作成します。
上記コマンドを実行後に鍵ファイル名を指定できますが、通常はデフォルトの ~/.ssh/id_dsa のままにして利用します。
コマンド実行後ファイル名を設定できますが、デフォルトのままにする場合は、エンターキーを空打ちします。その後 パスフレーズの入力を行います。パスフレーズは空文字を設定できますが、セキュリティ向上の為、他人にはわからない文字列を 入力しておきます。
ユーザのホームディレクトリ以下の .ssh の中に公開鍵 id_dsa.pub と 秘密鍵 id_dsa というペアキーが作成されます。

2.2.2 SSH サーバへの公開鍵の登録

公開鍵認証を行うには、ログイン先の SSH サーバに、生成した公開鍵を前もって登録しておく必要があります。 ログイン先のホームディレクトリ以下の .ssh/ の中の authorized_keys というファイルに公開鍵ファイルの内容を 書き込むことで、公開鍵の登録が完了します。

例) 公開鍵のファイルの登録
cat ./id_dsa.pub >> ~/.ssh/authorized_keys

上記のコマンドは、 cat で authorized_keys に公開鍵を追記している事になります。ファイルがない場合は、自動的にファイルが作成 されます。authorized_keys ファイルは上記のように作成した場合、umask で指定されている通り、パーミッションが「644」で作成されます。 他のユーザに変更されないように、「644」または「600」に設定します。また、.ssh ディレクトリは「700」に設定します。パーミッションの 設定が適切なものでないと公開鍵認証が使えない場合があります。(パーミッションが「777」のようにゆるい場合も同様です)

ポイント
.ssh のパーミッション 「700」
authorized_keys のパーミッション 「644」または「600」

2.2.3 公開鍵認証を用いた SSH サーバへのログイン

SSH サーバに公開鍵を登録したら、ログインの準備は完了です。ログインのためには、SSH コマンドを用います。

例) 172.16.0.1 にユーザ user でログインする場合
ssh user@172.16.0.1

パーミッションの設定が適切に行われていれば、自分の秘密鍵を使うためのパスフレーズの入力が求められます。パスフレーズを 入力すれば、ログインが完了します。デフォルトで、~/.ssh/id_dsa ファイルや id_rsa ファイルを自動的に検索され、用いられることになります。

2.2.4 SSH サーバ側の設定

インストールされた SSH サーバはデフォルトで公開鍵認証方式を許可する設定になっています。 これらの設定も SSH サーバの設定ファイル /etc/ssh/sshd_config ファイルにて行います。

設定項目説明
RSAAuthenticationSSH1 の RSA 認証を許可する。デフォルト yes
PubKeyAuthenticationSSH2 の DSA, RSA 認証を許可する。デフォルト yes
AuthorizedKeysFileSSH サーバが参照するユーザの公開パスをホームディレクトリから相対パスで指定できる。
PasswordAuthenticationUNIX パスワード認証を許可する。デフォルト yes

※ デフォルトの設定ファイルでは、こられの設定はコメントアウトされています。

2.3 安全なファイル転送

ssh の暗号化を利用したファイルの転送方法で、scpsftp コマンドがあります。

2.3.1 scp コマンド

scp コマンドは、サーバ側からクライアント側にファイルを送る事も、クライアント側からサーバ側に送る事も可能です。

書式)
scp コピー元のファイル コピー先のファイル
※ リモートファイルの指定は「ユーザ名@ホスト名:ファイル名」と記述します。
例) ホスト 172.16.0.100 のファイル /etc/hosts をカレントディレクトリにコピー
scp user@172.16.0.100:/etc/hosts ~/hosts

scp は cp コマンドの書式とほぼ同じです。-R をつければ ディレクトリ毎コピーも可能です。

2.3.2 sftp コマンド

sftp コマンドも scp 同様に OpenSSH の付属ツールです。scp とは異なり、sftp は対話式でファイルを転送します。 sftp サーバは SSH サーバのサブシステムとして実行する事ができます。
/etc/ssh/sshd_config ファイルの末尾に以下のような記述があります。

subsystem sftp /usr/libexec/openssh/sftp-server

このように記述されていると、sshd 起動時に sftp サーバ /usr/libexec/opnessh/sftp-server も実行されます。
クライアントから sftp に接続するためには、sftp コマンドを用います。

例) ホスト 172.16.0.100 に sftp で接続
sftp user@172.16.0.100

sftp コマンドは、ftp コマンドと同様のものが利用できます。

put
アップロード
get
ダウンロード
cd
ディレクトリ変更
pwd
リモート側のパス表示
quit
終了