CORY's twilight zone > 98備忘録 (tips)[an error occurred while processing this directive] > SSHで公開鍵暗号による認証を使う
サーバ管理などに欠かせない遠隔操作に使われるSSH。さらにファイル転送(sftp)にも活用されますが、従来のIDとパスワードによる認証が破られる事案が増えているようで、危険視されています。 一方でレンタルサーバやクラウドなどのインターネットサービスはますます多様化し、インターネット経由のリモートアクセスが不可欠な場面は多々あります。
そうした場面では、従来のパスワード認証を不可とし、公開鍵認証のみ有効にする方法で、セキュリティを確保するのが一般的になってきました。
筆者が管理するサーバでも様々な対策を採っており、その中のひとつとして公開鍵認証にも対応しています。今では端末ソフトの対応も出揃い、難しいことはないので管理業務の一環で設定してしまう人が多いのでしょうが、意外とまとまった情報が無いように感じられたので、今更ではありますが、主な設定内容をここにまとめておきます。
なお、本稿ではサーバ側(sshd)に FreeBSD (OpenSSH) を、端末側に FreeBSD と Windows を想定していますが、他にも OpenSSH を採用しているUnix系OS、例えば NetBSD など他のBSD系OS、多くの Linux や Mac OS X (OpenSSH) でも同様に対応できるでしょう。
※pageant については個人的に非推奨なので本稿では扱わない。
◆ 端末側が Windows の場合 ◆ 端末側が FreeBSD (Linux, Mac OS X) の場合 ◆ サーバが Windows の場合
Windows には標準でSSHクライアントが用意されていないので、おのずと何かしらのSSHクライアントを用意することになる。Windows では Tera Term(TTSSH2、原作者公認のオープンソースプロジェクト)と PuTTY が有名だが、Cygwin + OpenSSH を使うこともできる。
公開鍵認証に対応しているSSHクライアントなら基本的に何でもいいが、ここでは筆者が長年愛用している Tera Term を(サーバ側は OpenSSH を)例にする。
Tera Term、PuTTY、OpenSSH などが持っている鍵生成機能を使う。 (OpenSSH の例は後述、PuTTY は本稿では扱わない。)
Tera Term では、起動時に表示される「新しい接続」をキャンセルし、メニューから「設定」→「SSH鍵生成」。パラメータは既定値 (RSA 2048bit) で必要充分かと。
生成した秘密鍵と公開鍵をそれぞれ保存するが、秘密鍵の方にはパスワードをかけておく。このパスワードはサーバのログインパスワードとは無関係で、秘密鍵を使う時に入力を求められるもの。
秘密鍵を持っている(使える)人は該当サーバにログインできることを意味するので、秘密鍵とそのパスワードは厳重に管理する必要がある。端末が Windows Vista 以降の場合はファイルのアクセス権などがある程度は有効に機能するので、C:\Users\ログイン名 フォルダより下など、自分(と管理者)以外は見られないよう設定されている場所に保存すると良いかと。 ファイル名(規定値は id_rsa)は任意で構わない。後々のことを考え、何に使う秘密鍵(または公開鍵)なのかを判るようにしておくこと。
Tera Term をインストールした場所(C:\Program Files 以下など)は他のユーザも見られる場所なので、そういう場所には保存しないこと。 職場や学校などの共用のパソコンを使う場合は、USBメモリなどに入れて持ち歩くことになるだろうが、その場合は紛失対策でパスワードロックに対応したUSBメモリ製品(右図に例)を使うか、(端末OSが Windows 7 以降に限られるならば)BitLocker To Go などを使うと良い。
公開鍵の方も一旦保存してから、サーバに設置する。 鍵はテキストファイルなので、Tera Term でサーバにSSH接続して
% cat >> ~/.ssh/authorized_keys
を実行してから、公開鍵ファイルを Tera Term にドラッグ&ドロップして「ファイル送信」する(右図、送信後に行頭で Ctrl+D を入力)と簡単だが、他の方法で転送しても構わない。
公開鍵を設置する場所は ~/.ssh/authorized_keys。ファイルが無ければ作り、他の公開鍵を併用する場合は追記する。
追加した公開鍵ファイルのパーミッションは、サーバの利用状況等により、600, 604, 644 いずれかに設定しておく。
% ll ~/.ssh/ total 10 -rw------- 1 hoge user 730 5月 11 00:00 authorized_keys -rw-r--r-- 1 hoge user 31287 5月 7 21:13 known_hosts % chmod 600 ~/.ssh/authorized_keys
メニューから「設定」→「SSH認証」を開くと、SSH接続時のユーザ名、認証方式(ここでは「RSA/DSA/ECDSA鍵を使う」)、秘密鍵ファイルのパスなどを予め指定しておくことができる。ここで設定し記憶させておくことで、都度入力する手間を省くことができる。
SSH認証の設定をした後は、メニューから「設定」→「設定の保存」を実行。
ここで保存する TERATERM.INI ファイルには秘密鍵ファイルのパスが記録されるので、Tera Term をインストールしたフォルダではなく、ユーザフォルダに置いておく方が良い。(共用パソコンで使う必要がある場合は、秘密鍵を入れたUSBメモリ等に一緒に入れておく。)
この場合は、Tera Term を呼び出すショートカットファイルも新たに用意し、/F=C:\Users\hoge\TERATERM.INI パラメータを追加しておくと便利。
SSH1 を停止し、より安全性の高い SSH2 のみを有効にしているサーバが増えている。SSH2 では多くの暗号アルゴリズムを選べるよう設計されており、Tera Term にも順次追加されているようだが、昔から Tera Term を使っている(以前生成した TERATERM.INI を使い続けている)と、後から追加されたアルゴリズムが利用不可になってしまう場合がある。
この場合は接続中に、サーバで使われている暗号アルゴリズムが使えないという意味の「unknown Encrypt algorithm(ctos):…」(=右図)といったエラーが出て落ちることがある。
「設定」メニュー→「SSH」→「優先する暗号アルゴリズムの順」リストを確認し、「<以下の暗号アルゴリズムは使用されません>」以下にSSH2用のアルゴリズムが多く追加されている場合は、これに該当しているかもしれない。
上記の設定ダイアログで設定変更(GUIで変更した後は「設定」→「設定の保存」が必要)しても良いし、テキストエディタで TERATERM.INI を直接編集し、最新の配布ファイルに含まれている TERATERM.INI から「CipherOrder」の行を移しても良いだろう。
下記は Version 4.89 配布ファイルに含まれる TERATERM.INI の該当箇所の例。
; Cipher algorithm order ; 2...DES(SSH1), 3...3DES(SSH1), 6...Blowfish(SSH1), 7...3DES-CBC, ; 8...AES128-CBC, 9...AES192-CBC, :...AES256-CBC, ;...Blowfish-CBC, ; <...AES128-CTR, =...AES192-CTR, >...AES256-CTR, ?...Arcfour, ; @...Arcfour128, A...Arcfour256, B...CAST128-CBC, C...3DES-CTR, ; D...Blowfish-CTR, E...CAST128-CTR, F...Camellia128-CBC, ; G...Camellia192-CBC, H...Camellia256-CBC, I...Camellia128-CTR, ; J...Camellia192-CTR, K...Camellia256-CTR ; 0...Ciphers below this line are disabled. CipherOrder=K>H:J=G9I<F8C7D;EB30A@?62
サーバにリモートログインする人全員が、公開鍵認証によるログインへ移行したら、従来のパスワード認証は無効に設定する。この時点で、総当たり攻撃などによる不正ログイン・パスワード漏出を防ぐ効果が期待できるようになる。
sshd の設定には root(管理者)権限が必要。root になってから sshd の設定ファイルをエディタで開き、
% su # ee /etc/ssh/sshd_config
下記のように書き換える(項目が無い場合は追加、行頭 # はコメント文)。 (※)
RSAAuthentication yes PubkeyAuthentication yes PasswordAuthentication no ChallengeResponseAuthentication no PermitRootLogin no
※最近の FreeBSD では PasswordAuthentication と PermitRootLogin の既定値が no になっているが、Linux などには yes になっているものもあるようなので、念のため確認し、特に必要がなければ no にしておく。
※RSAAuthentication, PubkeyAuthentication は既定値で yes になっているはずなので、基本的には設定不要。設定ファイル中にコメント行で # RSAAuthentication yes と書かれている場合は、yes が既定値になっている。
その後 sshd を再起動して上記設定を有効にする。
# ps ax | grep sshd 285 ? Is 0:00.43 /usr/sbin/sshd 16464 ? Is 0:00.32 sshd: hoge [priv] 19619 ? S 0:00.59 sshd: hoge@ttyp0 17097 ttyp0 RV 0:00.00 grep sshd (csh) # kill -HUP 285
この状態で、端末からパスワード認証(とチャレンジレスポンス認証)による接続を試してみて、接続できなければ、設定終了。
暗号化されずにファイル転送される FTP に替わって、最近では ssh のサブシステムである sftp が使われる機会が増えているが、別途 sftp が使われているサーバでパスワード認証を禁止したい場合は、sftp も公開鍵認証に移行する必要がある。
sftp で公開鍵認証に対応しているファイル転送ソフトには FileZilla や WinSCP がある。
FileZillaでは、メニューの「編集」→「設定」、ダイアログの「接続」→「SFTP」ページを開き、公開鍵認証欄に秘密鍵を登録する。その後、サイトマネージャでログオンの種類を「インタラクティブ」に設定。
なお、FileZilla では秘密鍵のパスワード保護に対応しておらず、秘密鍵を暗号化せずに保存せねばならないので要注意。(FileZilla はサイトマネージャにパスワードを登録すると平文で記録されるので、パスワード認証をする場合もパスワードは登録しない方が良い。)
FTP については、FFFTP などで FTPS (FTP over SSL) とワンタイムパスワード併用などによる対策も考えられる。
OpenSSH から OpenSSH へ接続する場合の設定方法。基本的な流れは Windows端末の場合と同じ。 (端末・サーバ両方で OpenSSH が使える状態になっていることが前提になる。)
まずは端末側にログインし(Mac OS X ではOS標準の Terminal を開く)、鍵ペア(秘密鍵と公開鍵)を生成する。
Last login: Sun May 11 00:00:00 2014 from *.*.*.* FreeBSD 9.2-RELEASE-p5 (GENERIC) #0: Tue Apr 29 18:53:19 UTC 2014 Welcome to FreeBSD! % ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/hoge/.ssh/id_rsa): [Return] Enter passphrase (empty for no passphrase): (password) (※) Enter same passphrase again: (password) Your identification has been saved in /home/hoge/.ssh/id_rsa. Your public key has been saved in /home/hoge/.ssh/id_rsa.pub. The key fingerprint is: 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 hoge@client.jp The key's randomart image is: +--[ RSA 2048]----+ | oB+... | | | | . * | | o . | | | | + = . . . | | | | | | | +-----------------+ % ll ~/.ssh/id_rsa* -rw------- 1 hoge user 1766 5月 11 00:00 /home/hoge/.ssh/id_rsa -rw-r--r-- 1 hoge user 402 5月 11 00:00 /home/hoge/.ssh/id_rsa.pub
※ここで設定するパスワードは秘密鍵を保護するためのもの。サーバのログインパスワードとは異なる。
省略する場合(非推奨)は単にReturnを入力。
これで、ユーザディレクトリ内の所定の場所(ホームディレクトリ直下の .ssh ディレクトリ内)に鍵ペアが生成されているはず。アクセス権も適切に設定されているはずだが、念のため確認し、もし違っている場合は、秘密鍵 (id_rsa) は 600、公開鍵 (id_rsa.pub) は 644(レンタルサーバや学校などの共用サーバにいる場合は604)に chmod しておく。
% chmod 600 ~/.ssh/id_rsa % chmod 644 ~/.ssh/id_rsa.pub
公開鍵 id_rsa.pub の中身はテキストファイルなので、これをサーバ側の所定の場所 ~/.ssh/authorized_keys に追加(上書きではない)する。
% cat ~/.ssh/id_rsa.pub | ssh hoge@server.jp "cat >> ~/.ssh/authorized_keys"
これで、公開鍵認証でのログインができるようになっているはず。実際にログインできることを確認する。
% ssh hoge@server.jp
Enter passphrase for key '/home/hoge/.ssh/id_rsa': (password) (※)
Last login: Mon May 11 00:00:00 2014 from *.*.*.*
NetBSD 5.1 (GENERIC) #0: Sun Nov 21 20:29:26 JST 2010
Welcome to NetBSD!
% ll ~/.ssh/
total 10
-rw-r--r-- 1 hoge user 402 May 11 00:00 authorized_keys
-rw-r--r-- 1 hoge user 8517 Apr 17 06:35 known_hosts
※ここで入力するパスワードは秘密鍵を生成した際に付けたもの。サーバのログインパスワードではない。
ここまで見て分かるように、公開鍵認証を行うと、サーバのログインパスワード入力が不要になる。秘密鍵を保護するパスワードを省略した場合は、秘密鍵のパスワード入力も求められないので、つまり公開鍵を ~/.ssh/authorized_keys に置くことで、秘密鍵を置いてある端末にログインできる人なら誰でもサーバへログインできるようになる。状況により新たなセキュリティホールにもなり得るので、秘密鍵(を置いた端末)の扱いにはくれぐれも注意すること。
また、秘密鍵は同じ物を再生成できないので、バックアップを取るなど大切に、かつ厳重に保管しておくこと。
Windows は標準でSSHクライアント・サーバが使えないので、何かしらインストールしてやる必要がある。Linux的な操作をしたければ Cygwin + OpenSSH を入れたら良いが、Windows (DOS) のコマンドプロンプトを遠隔操作したい場合は、freeSSHd を入れてやる。詳しい手順は本稿では割愛。詳しくは下記の記事を参照:-)
(ちなみにWindowsのコンソールは遅いわ、一部文字が化けるわで、調子が良いとは言えないけど、遠隔操作ができるだけでもありがたい時があるのよね。ファイルサーバでシンボリックリンクを張るとか、タスクを設定するとか。)
【参考】
更新日 : 2016年01月31日 (7754)
CORY's twilight zone > 98備忘録 (tips)[an error occurred while processing this directive] > SSHで公開鍵暗号による認証を使う