13.3. OpenSSH
SSHはリモートホスト通信において高いセキュリティで実現するものといえる。
LinuxではOpenBSDによるSSH実装であるOpenSSHが一般的に利用される。
SSHにはVer1.0とVer2.0系があり、それぞれ公開鍵認証のアルゴリズム形式が異なる。
| SSHのバージョン | 公開鍵認証のアルゴリズム | 
|---|---|
| 1.0系 | RSA | 
| 2.0系 | DSA, ECDSA, ED25519, RSA | 
13.3.1. SSH設定
SSHサーバ機能はsshdデーモンにより提供される。
設定ファイルは/etc/ssh/sshd_configとなる。
主要な設定項目は以下の通り。
| 設定項目 | 説明 | 
|---|---|
| Port | SSHで使うポートの設定 | 
| Protocol | 使用するSSHのバージョン | 
| ListenAddredd | 接続受付アドレス(0.0.0.0ですべて) | 
| HostKey | ホスト鍵のファイルパス | 
| SyslogFacilty | ログのファシリティ | 
| LogLevel | ログのプライオリティ | 
| LogGraceTime | ログインを試みることのできる最大時間(秒) | 
| PermitRootLogin | rootログインの禁止許可 | 
| StrictModdes | パーミッションを厳密にチェックするかどうか | 
| MaxAuthTimes | 認証を試みることのできる最大数 | 
| RSAAuthentication | SSH1で公開鍵認証を許可するかどうか | 
| PubkeyAuthentication | SSH2で公開鍵認証を許可するかどうか | 
| AuthorizedKeysFile | 公開鍵を登録するファイル | 
| PasswordAuthentication | パスワード認証の有効/無効化 | 
| PermitEmptyPasswords | 空パスワードの有効/無効 | 
| ChallengeResponseAuthentication | チャレンジレスポンス認証の有効/無効化 | 
| UsePAM | PAMを使用する | 
| X11Forwarding | X11フォワーディングの無効/有効化 | 
| AllowUsers | ログインを許可するユーザ | 
| DenyUsers | ログインを禁止するユーザ | 
| AllowGroups | ログインを許可するグループ | 
| DenyGroups | ログインを許可するグループ | 
| SubSystem | 外部サブシステムの指定(ファイル転送デーモンなど) | 
また/etc/ssh/sshd_configの設定例は以下の通り。
Port 22
Protocol 2
ListenAddress 0.0.0.0
HostKey /etc/ssh/ssh_host_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
SyslogFacility AUTHPRIV
LogLevel INFO
LOGGraceTime 2m
PermitRootLogin no
StrictMode yes
MaxAuthTries 6
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no
UsePAM yes
X11Forwarding yes
# SFTPを行う場合の設定
Subsystem sftp /usr/libexec/openssh/sftp-server13.3.2. ホスト認証/ユーザ認証
SSHでは最初にユーザ認証の前にホストの正当性を確認するホスト認証が行われる。
ホスト認証
ホスト認証は接続先ホストの正当性を確認する検証。
DNSサーバのクラックなど不正なホストに接続されてしまう場合などの対策のために実装されている。
具体的には公開鍵暗号方式を用いることでホストの正当性を保証する。
具体的には公開鍵と秘密鍵を用いて認証を行う。
OpenSSHのインストールでローカルホスト用の公開鍵と秘密鍵が生成される。
このとき秘密鍵は外部に漏れないように厳重に管理する。
なお生成されたファイルは/etc/ssh/以下に保存される。
| ファイル名 | 説明 | 
|---|---|
| ssh_host_key | 秘密鍵(Ver1.0) | 
| ssh_host_dsa_key | 秘密鍵(Ver2.0 DSA用) | 
| ssh_host_rsa_key | 秘密鍵(Ver2.0 RSA用) | 
| ssh_host_key.pub | 公開鍵(Ver1.0) | 
| ssh_host_dsa_key.pub | 公開鍵(Ver2.0 DSA用) | 
| ssh_host_rsa_key.pub | 公開鍵(Ver2.0 RSA用) | 
| ssh_host_ecdsa_key | 秘密鍵(Ver2.0 ECDSA用) | 
| ssh_host_ecdsa_key.pub | 公開鍵(Ver2.0 ECDSA用) | 
| ssh_host_2d25519_key | 秘密鍵(Ver2.0 ED25519用) | 
| ssh_host_2d25519_key.pub | 公開鍵(Ver2.0 ED25519用) | 
SSH接続時にホストの公開鍵がクライアント側に送られる。
このときクライアントは所持するホスト鍵と一致することでホストの正当性を確認する。
ホスト鍵は~/.ssh/known_hostsに格納される。
検証するときにフィンガープリントをクライアント側に登録しておけばサーバに正当性があるかどうか検証できる。
サーバ側の鍵でフィンガープリントは以下のように確認できる。
ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub2回目以降の接続は接続先から送られたホスト鍵をKnown_hosts内の鍵と比較し問題がないとユーザ認証に進むこととなる。
そのためこの段階で接続先が悪意あるものによりなりすましされていたら警告が出るようになる。
13.3.3. 公開鍵認証
SSHではホスト認証後にユーザ認証に進む。
ユーザ認証では公開鍵認証が試行される。
公開鍵認証の手順は以下の通り。
- サーバ側に公開鍵を登録する
- SSH接続時に公開鍵が利用できるか確認が行われる
- クライアント側は公開鍵にユーザ名などの情報を加え、秘密鍵で署名しサーバに送信する
- サーバはユーザの公開鍵を使用して署名を確認する
- 確認できるとログインを許可する

なおユーザの公開鍵と秘密鍵ペアの生成にはssh-keygenコマンドを使用する。
ssh-keygenコマンド
公開鍵と秘密鍵のペアを作成するコマンド。
ssh-keygen [オプション]| オプション | 説明 | 
|---|---|
| -f ファイル名 | 鍵ファイル名の指定 | 
| -t | 暗号化方式の指定(rsa1, dsa, rsa,ecdsa, ed25519) | 
| -p | 既存の鍵ファイルのパスフレーズを変更する | 
| -P パスフレーズ | 古いパスフレーズを指定する | 
| -N パスフレーズ | 新しいパスフレーズを指定する | 
| -l | フィンガープリントの表示 | 
| -R ホスト名 | 指定されたホスト鍵をknown_hostsから削除する | 
生成される鍵のデフォルト名は以下の通り。
| バージョン | 秘密鍵 | 公開鍵 | 
|---|---|---|
| Ver1.0 | identity | identyty.pub | 
| Ver2.0(DSA) | id_dsa | id_dsa.pub | 
| Ver2.0(RSA) | id_rsa | id_rsa.pub | 
| Ver2.0(ECDSA) | id_ecdsa | id_ecdsa.pub | 
| Ver2.0(ED25519) | id_ed25519 | id_ed25519.pub | 
ユーザの公開鍵を接続先に登録する
ssh-keygenコマンドで公開鍵ファイルを作成した後、接続先ホストの~/.ssh/authorized_keysに登録する。
この際はコマンドを利用する場合はscpコマンドなどで転送する。
なお公開鍵は保存するauthorized_keysファイルは所有者のみ読み書きできるようにしておく。
chmod 600 ~/.ssh/authorized_keys13.3.4. ssh-agent
ssh-agentは秘密鍵使用時に尋ねられるパスフレーズの入力の手間を省く機能のこと。
ssh-agentはクライアント側で稼働するデーモンで、秘密鍵をメモリ上に保持しておき、必要時にそれを利用する仕組みとなっている。
そのため毎度パスフレーズを打つ必要がない。
ssh-agentの利用にはssh-agentの子プロセスにbashを起動し、ssh-addコマンドで秘密鍵を登録する。
ssh-agent bash
ssh-addこの設定以降、このbashや子プロセスではパスフレーズの入力が不要となる。
ssh-agentが保持している秘密鍵の一覧はssh-add -lコマンドで確認できる。
13.3.5. SSHポート転送
SSHポート転送(SSHポートフォワーディング)はあるポートに送られてきたTCPパケットをSSHを使用した安全経路でリモートホストの任意ポートに転送すること。
この機能によりPOP、FTPなどの暗号化されていないプロトコルを使った通信の安全性を高めることができる。

ポート転送を行う場合のssh書式は以下の通り。
ssh -L [ローカルポート]:[リモートホスト]:[リモートポート] [リモートホストユーザ名]@[リモートホスト]13.3.6. SSHサーバのセキュリティ
SSHサーバをデフォルト設定ではなく、適切に設定するとよりセキュアな運用ができる。
項目は以下の通り。
- SSH Version1.0の禁止
- パスワード認証の禁止
- rootログインの禁止
- 接続元制限
SSH Version1.0の禁止
SSHバージョン2.0のみを許可することで、SSHバージョン1.0の脆弱性を防ぐことができる。sshd_configのProtocol 2にすることで可能。
パスワード認証の禁止
パスワード認証は原則は無効にした方がよい。
これはブルートフォースアタックやパスワードが知られる危険性があるためである。
同様にsshd_configでPasswordAuthentication noと記述する。
rootログインの禁止
rootユーザのリモートログインも基本は許可すべきではない。sshd_configでPermitRootLogin noと記述することでrootログインを禁止にできる。
ログインユーザの制限
ユーザ単位でログイン制限することが可能。
AllowUsersディレクティブでユーザを指定すると、指定していないユーザのログインは禁止にできる。
| 書式 | 説明 | 
|---|---|
| AllowUsers [ユーザ名] | ユーザのみログインを許可 | 
| AllowUsers [ユーザ名1] [ユーザ名2] | ユーザ1, ユーザ2をログインを許可 | 
| AllowUsers [ユーザ名]@172.16.0.1 | 172.16.0.1のユーザのみログインを許可 | 
| AllowUsers [ユーザ名]@example.com | example.comのユーザのみをログイン許可 | 
| AllowUsers *@172.16.0.1 | ホストが172.16.0.1のユーザのみログイン許可 | 
| AllowGroups wheel admin | グループがwheelとadminユーザのみ許可 | 
接続元の制限
SSHアクセスは/etc/hosts.allowや/etc/hosts.denyで制御できる。
これはsshdが通常TCP Wrapper機能を参照しているからとなる。
前提にlibwrapという機能が利用されている必要があるので確認は以下コマンドで可能。
ldd `which sshd` | grep libwrap