FreeBSD ハンドブック
Prev | Chapter 14. セキュリティ | Next

# 14.10. OpenSSH

寄稿: Chern Lee.

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

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

## 14.10.1. OpenSSH を使うことの利点

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

## 14.10.2. sshd を有効にする

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

    sshd_enable="YES"

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

## 14.10.3. SSH クライアント

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

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

ログインは `rlogin` や telnet でセッションを張った時と同様に続きます。 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` を渡すことで、利用するプロトコルを強制できます。

## 14.10.4. Secure copy

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

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

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

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

## 14.10.5. 設定

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

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

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

## 14.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 -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) は 多重にパスワード化された秘密鍵の管理に使われます。

## 14.10.7. SSH トンネリング

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

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

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

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

`-2`

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

`-N`

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

`-f`

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

`-L`

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

`user@foo.bar.com`

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

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

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

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

典型的な SSH トンネル

    % ssh -2 -N -f -L 5025:localhost:25 user@mailserver.foobar.com
    user@mailserver.foobar.com's password: *****
    % telnet localhost 5025
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 mailserver.foobar.com ESMTP

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

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

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

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

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

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

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

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

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

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

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

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

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

OpenSSH

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

sshd(8) sftp-server(8)

Prev | Home | Next
IPsec | Up | ストレージ