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となる。

主要な設定項目は以下の通り。

設定項目説明
PortSSHで使うポートの設定
Protocol使用するSSHのバージョン
ListenAddredd接続受付アドレス(0.0.0.0ですべて)
HostKeyホスト鍵のファイルパス
SyslogFaciltyログのファシリティ
LogLevelログのプライオリティ
LogGraceTimeログインを試みることのできる最大時間(秒)
PermitRootLoginrootログインの禁止許可
StrictModdesパーミッションを厳密にチェックするかどうか
MaxAuthTimes認証を試みることのできる最大数
RSAAuthenticationSSH1で公開鍵認証を許可するかどうか
PubkeyAuthenticationSSH2で公開鍵認証を許可するかどうか
AuthorizedKeysFile公開鍵を登録するファイル
PasswordAuthenticationパスワード認証の有効/無効化
PermitEmptyPasswords空パスワードの有効/無効
ChallengeResponseAuthenticationチャレンジレスポンス認証の有効/無効化
UsePAMPAMを使用する
X11ForwardingX11フォワーディングの無効/有効化
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-server

13.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.pub

2回目以降の接続は接続先から送られたホスト鍵をKnown_hosts内の鍵と比較し問題がないとユーザ認証に進むこととなる。
そのためこの段階で接続先が悪意あるものによりなりすましされていたら警告が出るようになる。

13.3.3. 公開鍵認証

SSHではホスト認証後にユーザ認証に進む。
ユーザ認証では公開鍵認証が試行される。 公開鍵認証の手順は以下の通り。

  1. サーバ側に公開鍵を登録する
  2. SSH接続時に公開鍵が利用できるか確認が行われる
  3. クライアント側は公開鍵にユーザ名などの情報を加え、秘密鍵で署名しサーバに送信する
  4. サーバはユーザの公開鍵を使用して署名を確認する
  5. 確認できるとログインを許可する

公開鍵

なおユーザの公開鍵と秘密鍵ペアの生成にはssh-keygenコマンドを使用する。

ssh-keygenコマンド

公開鍵と秘密鍵のペアを作成するコマンド。

ssh-keygen [オプション]
オプション説明
-f ファイル名鍵ファイル名の指定
-t暗号化方式の指定(rsa1, dsa, rsa,ecdsa, ed25519)
-p既存の鍵ファイルのパスフレーズを変更する
-P パスフレーズ古いパスフレーズを指定する
-N パスフレーズ新しいパスフレーズを指定する
-lフィンガープリントの表示
-R ホスト名指定されたホスト鍵をknown_hostsから削除する

生成される鍵のデフォルト名は以下の通り。

バージョン秘密鍵公開鍵
Ver1.0identityidentyty.pub
Ver2.0(DSA)id_dsaid_dsa.pub
Ver2.0(RSA)id_rsaid_rsa.pub
Ver2.0(ECDSA)id_ecdsaid_ecdsa.pub
Ver2.0(ED25519)id_ed25519id_ed25519.pub

ユーザの公開鍵を接続先に登録する

ssh-keygenコマンドで公開鍵ファイルを作成した後、接続先ホストの~/.ssh/authorized_keysに登録する。
この際はコマンドを利用する場合はscpコマンドなどで転送する。

なお公開鍵は保存するauthorized_keysファイルは所有者のみ読み書きできるようにしておく。

chmod 600 ~/.ssh/authorized_keys

13.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書式は以下の通り。

ssh -L [ローカルポート]:[リモートホスト]:[リモートポート] [リモートホストユーザ名]@[リモートホスト]

13.3.6. SSHサーバのセキュリティ

SSHサーバをデフォルト設定ではなく、適切に設定するとよりセキュアな運用ができる。
項目は以下の通り。

  • SSH Version1.0の禁止
  • パスワード認証の禁止
  • rootログインの禁止
  • 接続元制限

SSH Version1.0の禁止

SSHバージョン2.0のみを許可することで、SSHバージョン1.0の脆弱性を防ぐことができる。
sshd_configProtocol 2にすることで可能。

パスワード認証の禁止

パスワード認証は原則は無効にした方がよい。
これはブルートフォースアタックやパスワードが知られる危険性があるためである。

同様にsshd_configPasswordAuthentication noと記述する。

rootログインの禁止

rootユーザのリモートログインも基本は許可すべきではない。
sshd_configPermitRootLogin noと記述することでrootログインを禁止にできる。

ログインユーザの制限

ユーザ単位でログイン制限することが可能。
AllowUsersディレクティブでユーザを指定すると、指定していないユーザのログインは禁止にできる。

書式説明
AllowUsers [ユーザ名]ユーザのみログインを許可
AllowUsers [ユーザ名1] [ユーザ名2]ユーザ1, ユーザ2をログインを許可
AllowUsers [ユーザ名]@172.16.0.1172.16.0.1のユーザのみログインを許可
AllowUsers [ユーザ名]@example.comexample.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