opensshdを用いたsshサーバの構築

いちごパック > サーバ > opensshdを用いたsshサーバの構築

sshサーバについて

Linuxではユーザ名とパスワードでログインします。 しかしながら、インターネットを介してこのログインを実行すると、 ユーザ名やパスワードなど通信の内容を他人に盗み見られてしまい、 不正にアカウントを利用される可能性が高くなります。
sshサーバは、インターネットを介したログインでも通信の内容を盗み見られないように暗号化するためのサーバです。 sshを使ってもユーザ名とパスワードがわかれば不正なアカウントを利用される点はかわりませんが、 少なくともユーザ名とパスワードをインターネット上に直接送ることはなくなります。
opensshdは、Linuxで標準的に使われているsshサーバです。

sshd のオプション

ここでは、sshdのコマンドラインオプションの一部を紹介します。 sshdはコンフィグファイルが必須となっていますので、 通常、sshサーバの設定はコンフィグファイルを利用して行います。
-4sshサーバをIPv4限定で動作させる。
-6sshサーバをIPv6限定で動作させる。
-f configsshサーバのコンフィグファイル名を指定する。デフォルトは /etc/ssh/sshd_config
-p portsshサーバが使うTCPポート番号を指定する。
-Tコンフィグファイルの確認を行い、デフォルト値も含めた完全なコンフィグファイルの内容を表示して終了する。
-tコンフィグファイルとホストキーの確認を行って終了する。コンフィグファイルが正しいなら、何も表示されない。
-o optionコンフィグに記述できるオプションをコマンドラインで与える。

コンフィグファイルの内容

設定項目はたくさんあります。 少なくとも、攻撃されやすいオプションは無効化しておくと良いでしょう。

重要な項目

攻撃のされやすさに大きくかかわる項目を以下に集めました。
PortTCPポートを指定する。デフォルトでは22であるが頻繁に攻撃されるため、別のポートを指定したほうが良い。
Protocolsshのプロトコルバージョンを指定する。2のみを指定する。カンマ区切りで1と2を指定可能であるが、1はセキュリティ問題が見つかったため使われていない。
PubkeyAuthenticationパブリック鍵によるログインを許可するなら"yes"、そうでなければ"no"を指定する。
RSAAuthenticationsshプロトコル1のRSAログインを許可するか。通常は"no"を指定する。
HostbasedAuthentication指定されたホストからのログインを無条件で許可するか。通常は"no"を指定する。
KerberosAuthentication"yes"に設定すると、Kerberosと呼ばれるログイン認証を使う。
PasswordAuthenticationユーザ名とパスワードを使ったログインを許可するのであれば"yes"、そうでなければ"no"を指定する。
GSSAPIAuthenticationGSSAPIと呼ばれるAPIを使ったログインを許可するのであれば"yes"、そうでなければ"no"を指定する。
RhostsRSAAuthentication指定されたホストからのログインを無条件で許可するか。通常は"no"を指定する。
ChallengeResponseAuthenticationPAMがyesのとき、PAMを使ったログインを許可するなら"yes"、そうでなければ"no"を指定する。
PermitRootLoginルートユーザのログインを許可するか。通常は"no"を指定する。
PermitEmptyPasswords空のパスワードによるログインを許可するなら"yes"、そうでなければ"no"を指定する。

好みに応じた項目

以下の項目は、好みに応じて設定すると良いでしょう。
AddressFamily"any"、"inet"、"inet6"のいずれかを指定する。
AllowAgentForwardingAgent Forwardingを使うなら"yes"、そうでなければ"no"を指定する。
AllowTcpForwardingTCPポートのForwardingを使うなら"yes"、そうでなければ"no"を指定する。
AllowUsersスペース区切りの、sshでログイン可能なユーザ名一覧を指定する。
ChrootDirectoryログインしてきたユーザにchrootを適用するなら、chroot先ディレクトリのパスを指定する。
DenyUsersスペース区切りの、sshでのログインを拒否するユーザ名一覧。AllowUsersよりも優先される。
PermitUserEnvironmentセキュリティ上の理由で通常は"no"を指定する。"yes"に設定すると、ログイン時に~/.ssh/environmentに書かれた環境変数を取り込む。
UsePAMLinuxのPAMと呼ばれる共通ライブラリを使ってログイン認証するなら"yes"、そうでなければ"no"を指定する。
X11ForwardingX11 TCPポートのForwardingを使うなら"yes"、そうでなければ"no"を指定する。
LogLevelログの出力量を制御する。FATAL、ERROR、INFO、VERBOSEなど。デフォルトはINFO。
SyslogFacilitysyslogに種類するログの種類を指定する。AUTH、USER、DAEMONなど。デフォルトはAUTH。
UsePrivilegeSeparationsshサーバへの攻撃対策として、sshサーバ自身を特権分離モードで動かすか。"yes"を指定する。
IgnoreRhosts"yes"であれば.rhostsと.shostsを無視する。/etc/hosts.equivと/etc/ssh/shosts.equivはこの設定の影響を受けない。
IgnoreUserKnownHosts"yes"であれば~/.ssh/known_hostsを無視する。
LoginGraceTimeこの時間が経過してもログインできなければ通信を切断する。デフォルトは120秒。
StrictModes"yes"であれば、ログインの直前にhomeディレクトリ等のディレクトリパーミッション設定が正しいかチェックする。
PrintLastLog"yes"であれば、ログイン時に前回のログイン情報を表示する。デフォルトで"yes"になっている。
Subsystemサブシステム名(現在はsftpのみ有効)と、その起動コマンドを与える。
HostKeyサーバのプライベート鍵を与える。プライベート鍵のパーミッションは600か400に設定しておく。複数の鍵を与えるにはHostKey複数回与えれば良い。

コンフィグファイルの例

コンフィグファイルは、例えば次のように記述できます。 最低でもTCPのポート番号を変更し、使わないログイン認証はnoに設定しておきます。 ここでは例としてTCPのポート番号を10022としましたが、別の番号を利用したほうが良いでしょう。
以下の例ではPasswordAuthenticationをyesにしています。 ユーザのパブリック鍵登録が完了した時点で、PasswordAuthenticationはnoに変更すると良いでしょう。
#ではじまる行はコメントとして扱われます。
Port 10022
Protocol 2
UsePrivilegeSeparation yes
StrictModes yes

PubkeyAuthentication yes PasswordAuthentication yes
RSAAuthentication no HostbasedAuthentication no RhostsRSAAuthentication no ChallengeResponseAuthentication no KerberosAuthentication no GSSAPIAuthentication no
PermitRootLogin no PermitEmptyPasswords no
AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no PrintLastLog yes
Subsystem sftp /usr/lib/openssh/sftp-server UsePAM yes
HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key

ログイン時の処理(ユーザ向け)

おおよそ以下のようなことをしています。
  • ユーザのホームディレクトリに移動します。
  • ~/.ssh/rc、/etc/ssh/sshrc を順にチェックし、最初に見つかったファイルを実行します。どちらもなければxauthを実行します。
  • ユーザのシェルを実行します。
  • パブリック鍵の登録方法(ユーザ向け)

    パブリック鍵として、デフォルトでは ~/.ssh/authorized_keys と ~/.ssh/authorized_keys2 がチェックされます。 このファイル形式は次の通りです。
  • 1行に1つのパブリック鍵を登録します。
  • # で始まる行は無視されます。

  • パブリック鍵(sshプロトコルバージョン2)は、次の情報をスペースで区切って記述します。 パブリック鍵を1行で記述するため、1行は非常に長くなります。
    オプションカンマ区切りのオプションです。なくてもかまいません。
    鍵の種類"ssh-dss","ssh-rsa","ecdsa-sha2-nistp256","ecdsa-sha2-nistp384","ecdsa-sha2-nistp521","ssh-ed25519"
    base64形式の鍵base64と呼ばれるテキストに変換された鍵データ
    コメント自由記述部分です。sshdはこの部分を使いません。
    パブリック鍵単位のオプションの一部を紹介します。 例えばfrom="*.jp"を指定しておくと、日本のドメイン以外からは接続できなくなります。
    from="pattern"接続元として許可するリモートホスト名かIPアドレスをpatternに指定する。
    no-port-forwardingTCPポートのフォワーディングを無効にする。
    no-X11-forwardingX11 TCP接続のフォワーディングを無効にする。
    no-user-rc~/.ssh/rcを無効にする。

    sshの鍵のうち、攻撃に対して強いのは521ビット以上のECDSAのようです。 PuTTYのようにECDSAが使えないソフトを利用する場合は、 鍵として4096ビット以上のRSAを選択すると良いでしょう。
    opensshを使って鍵を作りたい場合は、次のコマンドで作成できます。 1行目はECDSA、2行目はRSAの鍵を作成する例です。
    % ssh-keygen -t ecdsa -b 521
    % ssh-keygen -t rsa -b 4096
    
    PuTTYを使う場合はWindows用sshクライアントPuTTYの使い方をご覧ください。