はじめに

このページでは、リモートで動作するFreeBSDサーバにログインして各種コマンドを実行することができるSSHについて、その効能と設定方法について説明します。

SSHとは?

SSH (Secure SHell) は、ネットワークを介し、リモートのマシンにログインして各種コマンドを実行したり、FTPのようなファイル送受信を行うための仕組みです。

通信経路上を流れるパケットはSSLで暗号化されるため、インターネット経由でのアクセスでも高いセキュリティを確保することができます。

一方、従来からあるtelnetでは、コマンドやパスワードが平文で送信されるため、盗聴の危険のあるネットワーク経由で利用するのは極めて危険です。

SSHの設定はそれほど難しいものではありませんので、telnetを利用されている方は、これを機にSSHを利用することをお勧めします。

sshdを有効にする

FreeBSDでは、SSHサーバを動作させるためのdaemonである「sshd」がシステムに標準で付属しているため、SSHを導入にするのは非常に簡単です。
まず、「etc/rc.conf」に以下の記述を追加してください。

「etc/rc.conf」への追加
sshd_enable="YES"

次に、sshdの設定ファイルである「/etc/ssh/sshd_config」を編集します。

「etc/ssh/sshd_config」の編集
Port xxxxx
PasswordAuthentication yes
PermitRootLogin no
PermitEmptyPasswords no

上記の設定は、クライアント側で難しい設定を行わなくても、SSHを利用できる指定です。

ポート番号の設定

「Port xxxxx」は、sshdが利用するポートで、標準では「22」に設定されています。
22番ポートへのアタックは非常に多いため、任意のポートに変更するのが一般的です。
(ポート番号を変更しても、それがセキュリティを決定的に高めることにはなりません、本物のクラッカーはポートスキャンしてSSHが動いているポートを探し出し、そこを突いてきます。)

パスワードでのログインを許可する設定

最後の「PasswordAuthentication yes」は、SSHにおいてパスワードのみでのログインを許容する設定です。
FreeBSDのSSHのデフォルトの設定では、これが「no」になっており、より高いセキュリティが確保できる公開鍵を利用した認証方法を利用するように設定されています。
しかしながら、この公開鍵を利用した認証では、ユーザが公開鍵・秘密鍵のキーペアを生成し、公開鍵をサーバ側に、秘密鍵をクライアント側に、それぞれ設定する作業が必要になります。
「PasswordAuthentication yes」は利用者の利便性を高めるためにセキュリティを犠牲にする設定だと理解してください。

rootのログイン可否/空のパスワード許容の設定

説明しなくてもなんとなくわかりそうなのが、「PermitRootLogin no」と「PermitEmptyPasswords no」で、前者はrootでのログインができないようにする設定、後者は空のパスワードを許容しない設定です。

特定のIPアドレスでのみListenする設定

SSHを動作させるマシンが複数のネットワークに跨っている等、複数のIPアドレスを割り当てられている場合には、特定のIPアドレスでのみSSHを動作させたいケースがあります。
このような場合には、下記のように指定します。

特定のIPアドレスでのみListenする設定
ListenAddress 192.168.16.1

上記のように指定することにより、192.168.16.1のIPアドレスでのみSSHを動作させることが可能です。

クライアントからの接続で、ログインまでに1分程度待たされる場合の回避方法

上記の設定のみでは、クライアントからの接続時に、パスワードのプロンプトが表示されるまでに1分程度待たされるケースがあります。
これは、デフォルトの設定では、sshdがログインしてきたクライアントのIPアドレスからドメイン名を逆引し、ホスト名が正しく引けるかをチェックするためです。

クライアントのIPアドレスがDNS経由で逆引きできない場合、問い合わせがタイムアウトになるまでsshdが待たされるため、結果としてプロンプトの表示に時間が掛かってしまいます。

この不具合を回避するためには、sshd_configに以下の記述を追記してください。

sshdのクライアントIPアドレスのDNS逆引きを抑止する設定
UseDNS no

以上、設定が完了したら、「/etc/rc.d/sshd start」するか、システムを再起動してsshdを起動させてください。

公開鍵認証を利用したセキュリティの強化

上記までの設定では、ログイン認証にIDおよびパスワードのみを利用するため、ブルートフォースアタック(ID/パスワードの総当り攻撃)を掛けられた場合、IDおよびパスワードの弱さによっては悪意を持った第三者にログインを許してしまう場合があります。

これを回避するためには、先ほど紹介した公開鍵を利用した認証方法を利用します。

SSHの公開鍵認証方式では、サーバ側に公開鍵を、クライアント側に秘密鍵を配置し、ログインしてきたユーザが「予めサーバ側に配置されている公開鍵と対応する秘密鍵を持っているか否か」によりログイン認証を行います。

公開鍵認証方式の有効化

SSHの公開鍵認証方式を有効にするには、デフォルトの状態ではコメントアウトされている「/etc/ssh/sshd_config」の以下の記述を有効にします。

「etc/ssh/sshd_config」の編集
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

設定が完了したら、「/etc/rc.d/sshd restart」するか、システムを再起動してsshdを再起動させてください。

キーペアの作成

続いて、公開鍵認証で利用する公開鍵と秘密鍵のキーペアを作成します。
キーペアについては、クライアント側、サーバ側、またはそれ以外の場所のどこで作っても問題ありませんが、ここではFreeBSDがインストールされているシステム上で作成する方法について説明します。

キーペアを作成するには「ssh-keygen」を利用します。

「ssh-keygen」によるキーペアの作成
$ ssh-keygen -t rsa

上記のように入力すると、キーペアの生成場所と、秘密鍵に掛けるパスワードを聞いてきます。
秘密鍵に掛けるパスワードについては、公開鍵認証にてログインする際に入力するパスワードになりますので、忘れないようにしてください。(空白の設定も可能です)

生成場所およびパスワードの設定が完了すると、生成場所に「id_rsa」および「id_rsa.pub」のファイルが出来ているはずです。
前者がクライアント側に配置する秘密鍵、後者がサーバ側に配置する公開鍵になります。
秘密鍵については、漏洩しないようセキュアに保存してください。

サーバへの公開鍵の配置

次に、生成したキーペアのうち、公開鍵のほうをsshdが動いているサーバに配置します。
上記の「/etc/sshd/sshd_config」の設定により、受け入れる公開鍵として、ユーザのホーム下の「.ssh/authorized_keys」の内容が参照されます。

先ほどの「id_rsa.pub」を、以下のようにして「authorized_keys」の中に流し込んでください。

公開鍵の「authorized_keys」への流し込み
$ cat id_rsa.pub >> authorized_keys

上記のようにすると、「authorized_keys」が存在しない場合には新規に作成し、既に存在している場合には「id_rsa.pub」の内容を追記します。

最後に、「authorized_keys」のオーナおよびパーミッションを確認してください。
「authorized_keys」のオーナはsshでログインするユーザのものになっている必要があります。
また、パーミッションは「0600」になっている必要がありますので、ご注意ください。(デフォルトのsshd_configでは、パーミッションが0600になっていないと警告を出してログイン認証を失敗させる設定になっています)

「パーミッションが0600になっていると〜」は「パーミッションが0600になっていないと〜」の誤記でした、訂正させて頂きます。
ご指摘頂いた方、ありがとうございました。

パスワード認証の遮断

sshを利用する全ユーザが公開鍵認証に移行できる場合、パスワードを利用した認証をそのまま有効にしておくことはセキュリティ上のリスクになるため、これを無効にします。
「/etc/ssh/sshd_config」の「PasswordAuthentication」および「ChallengeResponseAuthentication」を以下の通り「no」に設定してください。

「etc/ssh/sshd_config」の編集
PasswordAuthentication no

FreeBSD 12.x以前では、「PasswordAuthentication」のみを「no」に設定しても、「ChallengeResponseAuthentication」が「yes」である限り、パスワードでの認証ができてしまうようです。
設定ファイル内に「ChallengeResponseAuthentication」の設定がある場合には、この値も「no」にしてください。
なお、「ChallengeResponseAuthentication」の設定は、FreeBSD 13.x以降で廃止されています。

クライアント側の設定

sshdが動作しているサーバにアクセスするには、SSHに対応したクライアントが必要です。

FreeBSD付属のSSHクライアント

FreeBSDでは、その名も「ssh」というコマンドで、telnetとほぼ同等の使い勝手でSSHを利用することができます。

「ssh」の利用方法
$ ssh 192.168.16.1 -p 2222

上記の例では、IPアドレス「192.168.16.1」の「2222」番ポートにSSHで接続します。
また、SFTPを利用する場合には、下記のようにします。

「sftp」の利用方法
$ sftp -oPort=2222 192.168.16.1

上記の例では、IPアドレス「192.168.16.1」の「2222」番ポートにSFTPで接続します。

Windows環境でで利用できるSSHクライアント

Windows上で動作するversion 2プロトコルにSSHクライアントとして有名なのは、「PuTTY」やTeraTermの派生ソフトウェアである「UTF-8 TeraTerm Pro + TTSSH2」などです。
前者はMITライセンス、後者はBSDライセンスで配布されているオープンソースソフトウェアになります。

尚、SSHの公開鍵認証を利用する場合には、クライアント側に秘密鍵を設定する必要があります。
各SSHクライアントにおける秘密鍵の設定方法については、それぞれのマニュアルをご確認ください。

変更履歴

2023/11/09

・OSの更新に伴い、設定ファイルの記述内容が変更されていることに対応。
 → 「プロトコルバージョンの設定」の記述を削除。
 → 「ChallengeResponseAuthentication」についての記述を変更。

2009/09/01

・「パーミッションが0600になっていると〜」の誤記を修正。

2009/06/09

・「ChallengeResponseAuthentication」を「no」に設定しない限り、パスワード認証ができてしまう点について追記。

2013/02/03

・システムを再起動する以外に、sshdを起動/再起動する方法を追記。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まさにこれだ
4 (50%)
参考になった
3 (38%)
これじゃない
1 (13%)

【まさにこれだ】 「ChallengeResponseAuthentication」についても「no」に設定する、という情報を探していました。ありがとうございました。 (2021/11/28 Sun 18:22:27)