安全にリモートでサーバーに接続して操作を行うために必須なのが「SSH」です。SSHで通信を行うための下準備に必要な「共通鍵暗号」を用意する際に使うコマンドが「ssh-keygen」です。
本連載では、ネットワーク管理の基本コマンドを順を追って紹介していきます。基本書式と用法、主要なオプション、用例サンプルを示しますので、manやhelp代わりに通読し、各コマンドでできることを順次おさらいしてみてください。
なお、本連載では、執筆時点の最新版Red Hat Enterprise Linux(RHEL)およびCentOS環境で動作を確認しています。解説では「Bash」シェルを使ったサンプルを示しています。コマンドのサンプルなどで一部環境に依存した出力例となる場合がありますので、その際には適宜ご自身の環境に合わせて読み替えてください。また、本稿に出現するネットワーク通信特有の用語については「用語解説」の項目を設けて別途補足しています。本文と併せて理解に役立ててください。
今回はSSH通信を行う際に必要な鍵ペアを用意するコマンド「ssh-keygen」を見ていきます。SSHは暗号技術を使ってリモートホスト上で安全にコマンドを実行する際に利用するプロトコルです。「ssh」はそのプロトコルに対応したコマンドとして利用されます。本稿で紹介するssh-keygenコマンドは、SSH通信でリモートホストにアクセスする際、自動認証/ログインを行う場合の事前準備で利用します。
なお、本稿では、大文字で「SSH」と表記した場合はプロトコルを、小文字で「ssh」と表記した場合はコマンドを指します。
ssh-keygenコマンドを理解するために、まずは「SSH(Secure SHell)」と「公開鍵暗号」の仕組みを簡単に見ていきましょう。
SSHは、リモートでサーバーにアクセスし、安全に接続することを目的に作られたプロトコルです。SSHプロトコルのバージョンには「1」と「2」の2種類があり、互換性はありませんが、現在広く利用されているsshコマンドのほとんどが両方のバージョンに対応しており、明示することで使い分けが可能です。ただし、過去にSSH1の脆弱(ぜいじゃく)性が指摘されたこともあり、Linuxディストリビューションの多くが採用する「OpenSSH」などのSSHサーバー/クライアントは、セキュリティ上の観点から、2がデフォルトになっていることがほとんどです。SSH2を使っていたとしても、脆弱性が発見された場合は非常に危険ですから、利用する際には常にセキュリティ情報を確認し、最新の状態を保つように留意してください。
SSHを利用する際に使うのがsshコマンドです。sshコマンドでは、通信内容の暗号化と復号化に「共通鍵暗号」を利用します。暗号化・複号を行うには、サーバーとクライアントが同じ鍵(共通鍵)を持たねばならず、通信をするたびにランダムな共通鍵を作成してサーバーとクライアント双方で受け渡しますが、その安全のために共通鍵を暗号化する目的で公開鍵暗号が利用されます。
そのため、sshコマンドを利用する場合には、事前準備として一対の鍵(公開鍵と秘密鍵)を作成しておき、サーバー側に公開鍵を、クライアント側に秘密鍵を用意しておきます。
この際、Linux環境で共通鍵を用意するために使うコマンドが「ssh-keygen」コマンドです。
なお、暗号化/複号方式はSSH1、2それぞれで次のような選択ができます。それぞれの初期値のパスは次の通りです(表1)。
鍵の種類 | 公開鍵ファイル(初期値) | 秘密鍵ファイル(初期値) |
---|---|---|
SSH1/RSA | $HOME/.ssh/identity.pub | $HOME/.ssh/identity |
SSH2/RSA | $HOME/.ssh/id_rsa.pub | $HOME/.ssh/id_rsa |
SSH2/DSA | $HOME/.ssh/id_dsa.pub | $HOME/.ssh/id_dsa |
ssh-keygenコマンドの主なオプションは次の通りです(表2)。
オプション | 意味 |
---|---|
-1 | 鍵ファイルをSSH1からSSH2の形式に変換する |
-C | 鍵のコメントを新規作成する |
-b | 鍵の長さを指定する(最低値は768bit、初期値は2048bit) |
-c | 鍵のコメントを指定する |
-f | ファイルを指定する |
-i | 鍵ファイルの情報を表示する |
-l | 公開鍵の情報(種別、指紋、コメントなど)を確認する |
-p | 秘密鍵のパスフレーズを変更する |
-t | 鍵タイプを指定する(rsa/dsa) |
sshで利用する秘密鍵と公開鍵の鍵ペアを作成する場合、「-t」オプションに続けて鍵の種類を指定します。下記サンプルでは「RSA」方式の鍵を指定しています。
ただし、現在はSSH2が主流のため、多くのLinuxディストリビューションで採用されている「OpenSSH」の最新版では「RSA」がデフォルトに設定されています。そのため、この環境でコマンドを利用する際には、下記サンプルのように明示的にオプションで鍵の種類を指定せずにコマンド名だけを実行しても結果は同じになります。
下記のようにコマンドを実行すると、秘密鍵ファイル「id_rsa」と公開鍵ファイル「id_rsa.pub」が「~/.ssh」ディレクトリ以下に作成されます。
なお、下記出力結果にあるように、秘密鍵と公開鍵だけでログインできるようにする場合は、パスフレーズを入力しない(空の状態で改行する)ようにします。
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/shinobu/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again:
作成した鍵ペアのうち公開鍵を、リモートホスト(SSHサーバー)の所定の位置へ登録しておくとユーザー認証に利用できます。OpenSSHを利用している場合、サーバー側のユーザーのホームディレクトリ直下に「.ssh」ディレクトリを用意し、そこに鍵束ファイル(authorized_keys)を作成し、秘密鍵を登録していきます。
なお、かつては「~/.ssh/authorized_keys」にSSH1の公開鍵を、「~/.ssh/authorized_keys2」にSSH2の公開鍵を登録するよう使い分けていましたが、OpenSSH 3.0以降は「~/.ssh/authorized_keys」に一本化されています。
下のサンプルではリモートホストにアクセスして、「.ssh」ディレクトリを作成、パーミッション(アクセス権)を700(rwx------、ディレクトリのオーナー以外はRead/Write/Executeともに不可)に設定した上で、ホームディレクトリ直下の/id_rsa.pubの内容を、/.ssh/authorised_keysに配置しています。その上でファイルのパーミッションを600(オーナーのRead/Write以外不可)に変更しています。
$ mkdir ~/.ssh $ chmod 700 ~/.ssh $ cd ~/.ssh $ cat ~/id_rsa.pub >> authorized_keys $ chmod 600 authorized_keys
鍵に保存された「パスフレーズ」を変更する場合は、「-p」オプションを指定してssh-keygenコマンドを実行します。
すると、秘密鍵のパス(初期値は~/.ssh/id_rsa)の確認を求められるので、実際のパスフレーズを入力します。承認されると、新しいパスフレーズの入力が求められるので、指示に従い入力すれば変更できます。
$ ssh-keygen -p Enter file in which the key is (/home/shinobu/.ssh/id_rsa): Enter old passphrase: Key has comment '/home/shinobu/.ssh/id_rsa' Enter new passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved with the new passphrase.
本稿で言及したコマンドに関連するネットワーク用語は次の通りです。必要に応じて参考資料も確認して理解を深めましょう。
暗号化と復号を同じ暗号化キーで行う方式。訳語としては「秘密鍵」ですが、公開鍵暗号方式のプライベートキーを「秘密鍵」と呼ぶため、混同しないように「共通鍵」あるいは「対称鍵」と呼びます(ネットワーク用語辞典「共通鍵暗号方式」の項目より。詳細は同項目を参照)。鍵の仕組みそのものについては「sshを便利にする公開鍵暗号」を参照ください。記事はWindows環境を前提としてますが、解説内容はOSを問わず共通です。
秘密鍵(プライベートキー)と公開鍵(パブリックキー)の二つを一組として暗号通信を行う方式。公開鍵で暗号化したものは秘密鍵でしか復号できず、秘密鍵で暗号化したものは公開鍵でしか復号できないという性質を持ちます(ネットワーク用語辞典「公開鍵暗号方式」の項目より。詳細は同項目を参照)。
Linux環境のコマンドラインでパーミッション(アクセス権)設定を変更する場合は、600や700などのように数値で指定します。「ls」などの標準で持つコマンドで任意のディレクトリを一覧表示すると分かるように、ファイルやフォルダーにはアクセス権が設定されています。リストの表示は、「rwxrw---」などのように表示されます。
それぞれ、左から順に三つずつのセットで「オーナー」「ユーザー」「ゲスト」のアクセス権設定を示しており、r=読み出し許可、w=書き込み許可、x=実行許可、-(記載なし)は不許可を意味しています。
コマンドラインからこれを指定する際、rwxの文字でも指定できますが、これを数字に落とし込んだ表現でも指定できます。
具体的には「rwx」(読み出し、書き込み、実行とも許可)のとき、これを「0」と「1」で表すと「111」となります。2進数の「111」は、10進数表記では「7」です。同様に、「rw-」は2進数では「110」であり、これを10進数で読むと「6」となります。
よって、本稿記事にある「700」は、「オーナーは読み込み・書き込み・実行許可、それ以外は(0なので)不可」、全ての操作を終えた後に「600」を指定しているのは、オーナーであっても読み書き以外の操作を禁止するためです。
Copyright © ITmedia, Inc. All Rights Reserved.