15.10. OpenSSH

寄稿: Lee Chern [FAMILY Given].

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

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

15.10.1. OpenSSH を使うことの利点

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

15.10.2. sshd を有効にする

rc.conf ファイルに 以下の行を追加してください。

sshd_enable="YES"

次に起動したときから ssh デーモンが起動します。 もしくは単に sshd デーモンを実行しても構いません。

15.10.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 v1 と SSH v2 両方の接続を受け付けるように設定されています。 クライアントはそのどちらかを選択できます。 バージョン 2 は、旧バージョンよりも堅固で安全です。

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

15.10.4. Secure copy

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

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

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

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

15.10.5. 設定

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

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

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

15.10.6. ssh-keygen

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

% ssh-keygen
Initializing random number generator...
Generating p:  .++ (distance 66)
Generating q:  ..............................++ (distance 498)
Computing the keys...
Key generation complete.
Enter file in which to save the key (/home/user/.ssh/identity):
Enter passphrase:
Enter the same passphrase again:
Your identification has been saved in /home/user/.ssh/identity.
...

ssh-keygen(1) は認証に使う為の公開鍵と秘密鍵のペアを作ります。 秘密鍵は ~/.ssh/identity に保存され、 公開鍵は ~/.ssh/identity.pub に保存されます。 公開鍵はリモートマシンの ~/.ssh/authorized_keys にも置かなければなりません。

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

ssh-keygen(1) でパスフレーズを使っている場合は、 ユーザは秘密鍵を使うために毎回パスフレーズの入力を行なう必要があります。

同じ目的で、ssh-keygen -d (FreeBSD FreeBSD-CURRENT では ssh-keygen -t dsa) コマンドを使って SSH v2 DSA 鍵を生成することもできます。 これは、SSH v2 セッション専用の DSA 公開/秘密鍵を生成します。 公開鍵は ~/.ssh/id_dsa.pub に保存され、秘密鍵は ~/.ssh/id_dsa に置かれます。

DSA 公開鍵はリモートマシンの ~/.ssh/authorized_keys2 内におきます。

ssh-agent(1)ssh-add(1) は 複数のパスワード化された秘密鍵の管理に使われます。

15.10.7. 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 に転送されるようになっています。 23 は telnet なのでこれは SSH トンネルを通るセキュアな telnet セッションを作ります。

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

例15.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 のトンネル環境を作ることができます。 パスワードを入力するところで暗号鍵を使い、 トンネルは別のユーザ権限で実行することが可能です。


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

15.10.7.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 に転送されます。

15.10.7.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.myserver.com
user@unfirewalled.myserver.com's password: *******

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

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

OpenSSH

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

sshd(8) sftp-server(8)

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

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

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