14.8. OpenSSH
戻る〓 | 第14章 セキュリティ | 〓次へ

## 14.8. OpenSSH

寄稿: Lee Chern [FAMILY Given].

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

OpenSSH は OpenBSD プロジェクトによって維持管理されており、 FreeBSD にはデフォルトでインストールされています。 OpenSSH は、 SSH バージョン 1 と 2 の両方に互換性があります。

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

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

### 14.8.2. SSH サーバを有効にする

sshd(8) が有効になっているかどうかを確認するには、 `/etc/rc.conf` の以下の行を確認してください。

    sshd_enable="YES"

この設定により、次のシステムの初期化時に OpenSSH のデーモンプログラムである sshd(8) が起動します。 もしくは service(8) を使って、すぐに OpenSSH を起動することもできます。

    # service sshd start

### 14.8.3. SSH クライアント

ssh(1) を使って、 sshd(8) が動いているシステムに接続するには、 ログインをするユーザ名とホストを指定してください。

    # 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: *******

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

デフォルトでは、sshd(8) の最近の版では SSH v2 の接続のみを受け付けるように設定されています。 クライアントは可能であればバージョン 2 を用い、 バージョン 1 にフォールバックします。 クライアントは、プロトコル v1 と v2 についてそれぞれ、引数 `-1` または `-2` を渡すことで、利用するプロトコルを指定できます。 クライアントにおけるバージョン 1 への互換性は、 古いバージョンへの上位互換のために維持されています。

### 14.8.4. Secure copy

ローカルのファイルをリモートマシンへ、 あるいはリモートマシンのファイルをローカルに安全な方法でコピーするには、 scp(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.8.5. 設定

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

`ssh_config` はクライアントの動作設定、 `sshd_config` はデーモンの動作設定を行ないます。 それぞれのファイル毎にマニュアルページが用意されており、 利用可能な設定オプションについて説明されています。

### 14.8.6. ssh-keygen(1)

パスワードの代わりに 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 鍵を使ってリモートマシンに接続できるようになります。

### 警告:

多くのユーザは、鍵が設計上安全と信じ、 パスフレーズなしに鍵を利用しています。 このような使用方法は 危険 です。 管理者が鍵にパスフレーズが設定されているかを確認する方法は、 手動で鍵を調べる方法です。 秘密鍵のファイルに `ENCRYPTED` という単語が含まれている場合には、 鍵の所有者は、パスフレーズを使用しています。 弱いパスフレーズが使われている間、 少なくともシステムが危険にさらされているときには、 他のサイトへのアクセスには、 あるレベルでのパスワード類推が必要となります。 さらに、公開鍵ファイルに `from` を含めることで、 エンドユーザをより安全にできます。 たとえば、 `ssh-rsa` または `rsa-dsa` の前に、 `from="192.168.10.5` を加えることで、 この IP を持つホストからのユーザのみがアクセスできるようになります。

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

### 警告:

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

### 14.8.7. SSH Agent による鍵のキャッシュ

パスフレーズを毎回入力することなしに、 SSH 鍵を利用できるようにメモリに読み込むには、 ssh-agent(1) および ssh-add(1) を使用してください。

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)
    %

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

    exec ssh-agent startxfce4

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

### 14.8.8. SSH トンネリング

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

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

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

この例では、以下のオプションを使っています。

`-2`

  サーバへの接続に ssh(1) バージョン 2 を使うことを指示します。

`-N`

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

`-f`

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

`-L`

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

`user@foo.example.com`

  指定したリモート SSH サーバへログインに用いるログイン名。

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

この例では、`localhost` のポート `5023` がリモートマシンの `localhost` のポート `23` に転送されるようになっています。 `23` は telnet(1) で用いられるので、これは SSH トンネルを通る暗号化された man.telnet.1; セッションを作ります。

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

例14.1 ssh(1) を用いた 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.8.8.1. 実用的な SSH トンネルの例

##### 14.8.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.8.8.1.2. 厳格なファイアウォールをすり抜ける

内向けおよび外向きの接続両方をフィルタするファイアウォールルールを課すネットワーク管理者もいます。 たとえば、 リモートのマシンからのアクセスに、ssh(1) および web サーフィンのための 22 番および 80 番ポートにしか接続させてもらえないかもしれません。 この場合 22 または 80 番以外を使う他のサービスへのアクセスを妨げます。

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

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

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

### 14.8.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) に読み込ませてください。

    # service sshd reload

### 14.8.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)

戻る〓 | 上に戻る | 〓次へ
14.7. VPN over IPsec〓 | ホーム | 〓14.9. ファイルシステムアクセス制御リスト (ACL)

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

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