14.11. OpenSSH

寄稿: Lee Chern [FAMILY Given].

OpenSSH はリモートマシンへのセキュアなアクセスに使われるネットワーク接続ツールの集合です。 これは rlogin, rsh, rcp, telnet をそのまま置き換えて使えます。 また、TCP/IP 接続を SSH 経由でセキュアにトンネル/フォワードすることもできます。 OpenSSH はすべてのトラフィックを暗号化し、 盗聴や接続の乗っ取り等のネットワークレベルの攻撃を事実上無効化します。

OpenSSH は OpenBSD プロジェクトによって維持管理されており、SSH v1.2.12 に最新のすべてのバグ修正と更新を適用したものをベースにしています。 OpenSSH クライアントは SSH プロトコル 1 と 2 の両方に互換性があります。

14.11.1. OpenSSH を使うことの利点

telnet(1)rlogin(1) を使う場合、一般にデータはネットワークを平文で流れます。 ネットワークをクライアントとサーバの間のどこかで盗聴することで あなたのユーザ/パスワード情報やセション中を流れるデータを盗むことが可能です。 OpenSSH はこれらを予防する為にさまざまな認証と暗号化の方法を提供します。

14.11.2. sshd を有効にする

sshd は、 FreeBSD の Standard インストールの途中で、 オプションとして表示されます。 sshd が有効になっているかどうかを確認するには、 rc.conf ファイルを確認してください。

sshd_enable="YES"

次に起動したときから OpenSSH のデーモンプログラムである sshd(8) が起動します。 もしくは /etc/rc.d/sshd rc(8) スクリプトを使って、OpenSSH を起動することもできます。

/etc/rc.d/sshd start

14.11.3. SSH クライアント

ssh(1) ユーティリティは rlogin(1) と同様に働きます。

# ssh user@example.com
Host key not found from the list of known hosts.
Are you sure you want to continue connecting (yes/no)? yes
Host 'example.com' added to the list of known hosts.
user@example.com's password: *******

ログインは rlogintelnet でセッションを張った時と同様に続きます。 SSH はクライアントが接続した時、 サーバの信頼性の検証のために鍵指紋システム (key fingerprint system) を利用します。 初めての接続の際にのみ、ユーザは yes と入力することを要求されます。 これ以降の login では保存されていた鍵指紋を照合することで検証されます。 SSH クライアントは保存されていた鍵指紋が login しようとした際に送られてきたものと異なっていた場合には警告を表示します。 指紋は ~/.ssh/known_hosts に、また SSH v2 指紋の場合は ~/.ssh/known_hosts2 に保存されます。

デフォルトでは、OpenSSH サーバはの最近の版では SSH v2 のみの接続を受け付けるように設定されています。 クライアントはバージョン 1 および 2 のどちらかを選択できます。 バージョン 2 は、旧バージョンよりも堅固で安全です。

ssh(1) コマンドに、プロトコル v1 と v2 についてそれぞれ、引数 -1 または -2 を渡すことで、利用するプロトコルを強制できます。

14.11.4. Secure copy

scp(1) コマンドは rcp(1) と同様に働きます。 安全な方法で行っているほかは、ローカルのファイルをリモートマシンへ、 あるいはリモートマシンのファイルをローカルにコピーするのは同じです。

#  scp user@example.com:/COPYRIGHT COPYRIGHT
user@example.com's password: *******
COPYRIGHT            100% |*****************************|  4735
00:00
#

前回の例でこのホストの指紋がすでに保存されていれば この scp(1) を使う時に検証が行なわれます。

scp(1) に渡される引数は、cp(1) のものと似ており、ファイル (1 つまたは複数) が 1 つめの引数になり、コピー先が 2 つめの引数になります。 ファイルはネットワーク越しに SSH を通して送られるので、 引数に指定するファイルには user@host:<path_to_remote_file> という形式をとるものがあります。

14.11.5. 設定

システム全体の設定ファイルは、OpenSSH デーモン、クライアントの両方とも /etc/ssh ディレクトリにあります。

ssh_config はクライアントの動作設定、 sshd_config はデーモンの動作設定を行ないます。

さらに、rc.conf オプションの sshd_program (デフォルトは /usr/sbin/sshd) と sshd_flags により、詳細な設定が行えます。

14.11.6. ssh-keygen

パスワードの代わりに ssh-keygen(1) を使ってユーザの認証用の DSA または RSA 暗号鍵を作ることができます。

% ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_dsa):
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_dsa.
Your public key has been saved in /home/user/.ssh/id_dsa.pub.
The key fingerprint is:
bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com

ssh-keygen(1) は認証に使う為の公開鍵と秘密鍵のペアを作ります。 DSA または RSA 鍵に応じて、 秘密鍵は ~/.ssh/id_dsa または ~/.ssh/id_rsa に保存され、 公開鍵は ~/.ssh/id_dsa.pub または ~/.ssh/id_rsa.pub にそれぞれ保存されます。 公開鍵はセットアップのために、 DSA または RSA のどちらを使う場合にも、 リモートマシンの ~/.ssh/authorized_keys ファイルに含まれてなければなりません。

これでパスワードの代わり SSH 鍵を使ってリモートマシンに接続できるようになったはずです。

ssh-keygen(1) でパスフレーズを使っている場合は、 秘密鍵を使うためにユーザは毎回パスフレーズを入力する必要があります。 長いパスフレーズを毎回入力しなくてはならない負担は、 ssh-agent(1) を使うと軽減できます。 これについては、 以下の 「ssh-agent および ssh-add」 の節で説明されています。

警告:

システムにインストールされている OpenSSH のバージョンによって、 オプションやファイルに違いが出てくることがあります。 ssh-keygen(1) を参照して、 問題が起こることを避けてください。

14.11.7. ssh-agent および ssh-add

ssh-agent(1) および ssh-add(1) ユーティリティは、 パスフレーズを毎回入力することなしに、 SSH 鍵を利用できるようにメモリに読み込む方法を提供します。

ssh-agent(1) ユーティリティは、 読み込まれた秘密鍵による認証を取り扱います。 ssh-agent(1) は他のアプリケーションの起動に用いられる必要があります。 基本的なレベルではシェルを起動し、 より高度なレベルでは、ウィンドウマネージャも起動します。

シェル上で ssh-agent(1) を使うには、 まず引数としてシェルを起動する必要があります。 次に、ssh-add(1) を実行し、 秘密鍵のパスフレーズを入力することにより、 鍵を追加する必要があります。 一度この過程を終えてしまえば、ユーザは、 対応する公開鍵が置かれているホストに ssh(1) でログインできるようになります。 以下はその例です。

% ssh-agent csh
% ssh-add
Enter passphrase for /home/user/.ssh/id_dsa:
Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)
%

X11 上で ssh-agent(1) を使うには、 ssh-agent(1) への呼び出しが ~/.xinitrc に置かれている必要があります。 これにより、X11 上で起動されるすべてのプログラムにおいて、 ssh-agent(1) サービスが提供されるようになります。 ~/.xinitrc ファイルの例は以下となります。

exec ssh-agent startxfce4

これで、X11 を開始するときにはいつでも ssh-agent(1) が起動され、 このプログラムから XFCE が起動されます。 一度この設定を行い、X11 を再起動した後は有効になりますので、 ssh-add(1) を引数なしに実行し、 すべての SSH 鍵を読み込ませてください。

14.11.8. SSH トンネリング

OpenSSH は暗号化されたセッションの中に他のプロトコルを カプセル化するトンネルを作ることができます。

以下のコマンドは ssh(1)telnet 用のトンネルを作成します。

% ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
%

ssh コマンドは、 次のオプションとともに利用します。

-2

ssh にプロトコルバージョン 2 を使うことを指示します。(古い SSH サーバを使っているときには指定しないでください)

-N

はトンネルだけでコマンドはないことを示します。 省略されると ssh(1) は通常のセッションを開始します。

-f

ssh にバックグラウンド実行を強制します。

-L

ローカルトンネルを localport:remotehost:remoteport という形式で指定します。

user@foo.example.com

リモートの SSH サーバです。

SSH のトンネルは localhost の指定されたポートに listen するソケットを作ることで実現されています。 SSH はローカルのホスト/ポートで受けた接続すべてを SSH 接続経由で指定されたリモートホストのポートへ転送します。

この例では、localhost のポート 5023 がリモートマシンの localhost のポート 23 に転送されるようになっています。 23telnet なのでこれは SSH トンネルを通るセキュアな telnet セッションを作ります。

このようにして SMTP や POP3, FTP 等のセキュアではない TCP プロトコルをカプセル化することができます。

例14.1 SSH を用いた SMTP 用の安全なトンネルの作成
% ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com

user@mailserver.example.com's password: *****
% telnet localhost 5025
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mailserver.example.com ESMTP

ssh-keygen(1) と別のユーザアカウントを組み合わせて使うことでより透過的で悩まずに済むような SSH のトンネル環境を作ることができます。 パスワードを入力するところで暗号鍵を使い、 トンネルは別のユーザ権限で実行することが可能です。


14.11.8.1. 実用的な SSH トンネルの例

14.11.8.1.1. POP3 サーバへの安全な接続

仕事で、外部からの接続を受ける SSH サーバがあるとします。 同じオフィスのネットワークには、POP3 サーバが動いているメールサーバがあるとします。 ネットワークもしくはあなたの家とオフィスの間のネットワーク経路は、 完全に信頼できるものかもしれませんし、そうではないかもしれません。 そのため、電子メールは安全なやり方で見るようにしなければなりません。 解決策は、オフィスの SSH サーバへの SSH 接続を行い、 メールサーバへのトンネルを作成することです。

% ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
user@ssh-server.example.com's password: ******

トンネルが作成されて動作したら、 メールクライアントに対し localhost のポート 2110 に POP3 リクエストを送るように指示できます。 そこへの接続は、トンネルを経由して安全に mail.example.com に転送されます。

14.11.8.1.2. 厳格なファイアウォールをすり抜ける

内向けの接続をフィルタするだけでなく、 外向けの接続もフィルタして、 極端に厳しいファイアウォールルールを課すネットワーク管理者もいます。 リモートのマシンには、SSH 接続と web サーフィンのための 22 番および 80 番ポートにしか接続させてもらえないかもしれません。

あなたは、それ以外の (もしかすると仕事に関係ない) サービスにアクセスしたくなるかもしれません。 例えば、音楽ストリーミングを行う Ogg Vorbis サーバといったものです。 この Ogg Vorbis サーバが 22 番または 80 番ポート以外でストリーミングを行っていたら、 あなたはそのサーバに接続できないでしょう。

それに対する解決策は、 あなたが接続しているネットワークのファイアウォールの外部にあるマシンに対して SSH 接続を行い、Ogg Vorbis サーバへのトンネルに利用することです。

% ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
user@unfirewalled-system.example.org's password: *******

ストリーミングクライアントを localhost の 8888 番ポートに向けると、music.example.com の 8000 番ポートに転送され、 ファイアウォールをすり抜けられます。

14.11.9. AllowUsers ユーザオプション

ログインできるユーザや接続元を制限することは、 通常は良い考えです。 AllowUsers オプションは、 この目的のために使うことができます。 たとえば、 root ユーザが 192.168.1.32 からのみログインできるようにするには、 /etc/ssh/sshd_config ファイルの設定は以下のようになります。

AllowUsers root@192.168.1.32

admin ユーザがどこからでもログインできるようにするには、 ユーザ名そのものを記述してください。

AllowUsers admin

複数のユーザは、以下のように同じ行に追加してください。

AllowUsers root@192.168.1.32 admin

注記:

注意すべきことは、 このコンピュータにログインする必要のあるすべてのユーザを指定することです。 設定されていないと、そのユーザはログインできなくなります。

/etc/ssh/sshd_config への変更が終わったら、 以下を実行して、設定ファイルを sshd(8) に読み込ませてください。

# /etc/rc.d/sshd reload

14.11.10. もっと詳しく知りたい人へ

OpenSSH

ssh(1) scp(1) ssh-keygen(1) ssh-agent(1) ssh-add(1) ssh_config(5)

sshd(8) sftp-server(8) sshd_config(5)

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。