OpenSSHサーバの設定

/ Linux/Unix / Comment[0]

SSHはネットワーク越しのホスト間において非常に高レベルな暗号化回線の実現を行うものです。Secure SHellという通り主な利用方法は遠隔操作ですが、暗号化回線を用いたファイル転送やポート転送なども実現できます。

Linuxでは主にOpenBSDによるOpenSSHが利用されています。UbuntuServer14.04を例にSSHのインストールと設定をメモります。長いこと使わんと忘れてしまうので。

インストール

インストール済みの場合がほとんどですが、手動でインストールする場合は以下のようにします。
# apt-get install ssh

重要ファイル、ユーティリティ

/etc/ssh/sshd_config
設定ファイル
/etc/ssh/ssh_host_*_key
ホスト秘密鍵
/etc/ssh/ssh_host_*_key.pub
ホスト公開鍵
~/.ssh/known_hosts
接続先ホストの公開鍵の格納先
ssh-agent
認証エージェント
ssh-add
秘密鍵を追加するコマンド
ssh-keygen
ペア鍵を作成

設定

SSHサーバの設定ファイルは/etc/ssh/sshd_configです。
以下が重要かと思われる主な設定項目です。

Port
ポート番号
ListenAddress
待ち受けアドレス
HostKey
ホスト鍵のパス
SyslogFacility
ログファシリティ
LogLevel
ログのプライオリティ
LoginGraceTime
接続からログインまでの許可時間(秒)
PermitRootLogin
rootログインを許可するか否か
MaxAuthTries
認証のリトライ許容回数
PubkeyAuthentication
公開鍵認証を許可するか否か(ver2のみ)
AuthorizedKeysFile
公開鍵を登録するファイル(~/.ssh/authorized_keys)
PasswordAuthentication
パスワード認証を有効にするか否か
PermitEmptyPasswords
空パスワードを許可するか否か
UsePAM
PAMを使用か否か
X11Forwarding
Xアプリケーションを起動した際にウインドウ転送をするか否か
AllowUsers
ログインを許可するユーザ
DenyUsers
ログインを拒否するユーザ
AllowGroups
ログインを許可するグループ
DenyGroups
ログインを拒否するグループ

設定例

基本的な設定

#基本設定
Port 22
Protocol 2
ListenAddress 0.0.0.0

#ホスト鍵
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_rsa_key

#ログ関係
SyslogFacility AUTHPRIV
Loglevel INFO

#ログイン関係
LoginGraceTime 1m
PermitRootLogin no
MaxAuthTries 3

#認証関係
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
PermitEmptyPasswords no
UsePAM yes

#X転送
X11Forwarding yes

設定を反映させるにはデーモンを再起動します。Ubuntuの場合は特殊でSSHサーバは「ssh」です。
# service ssh restart
または、
# killall sshd; `which sshd`

SSHの認証について

SSHではホスト認証とユーザ認証の二つのプロセスを踏みます。ホスト認証では接続先のホストが接続しようとしている正規ホストであるかを認証します。正規ホストであることを確認したらいよいよユーザ認証が行われます。

ホスト認証

ホスト認証とは、接続先ホストの正当性を確認するもので公開鍵暗号方式で行われます。
OpenSSHインストール時にペア鍵が自動で作成されます。通常このペア鍵は/etc/ssh/に配置されています。

  • /etc/ssh/ssh_host_dsa_key
  • /etc/ssh/ssh_host_dsa_key.pub
  • /etc/ssh/ssh_host_rsa_key
  • /etc/ssh/ssh_host_rsa_key.pub
  • /etc/ssh/ssh_host_ecdsa_key
  • /etc/ssh/ssh_host_ecdsa_key.pub

ホストの公開鍵と秘密鍵はホストごとにユニークであり、クライアントの接続時にホスト公開鍵がクライアントに送信されます。クライアントは所持しているホスト公開鍵と一致するかどうかを確認することで正当性を確認します。ホスト鍵はデフォルトでは~/.ssh/known_hostsに格納されます。
初回接続時や相手のIPアドレスが変わった場合など、known_hostsに登録されていない場合や齟齬がある場合は以下のようなメッセージが表示されます。

The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
ECDSA key fingerprint is 63:40:ea:4c:4d:a7:2e:1d:7f:52:a8:a4:44:17:2f:7e.
Are you sure you want to continue connecting (yes/no)? 

予め以下のコマンドで正規サーバのフィンガープリントを取得しておき、メモなりなんなりで覚えておきましょう。
$ ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub

256 63:40:ea:4c:4d:a7:2e:1d:7f:52:a8:a4:44:17:2f:7e  root@overlord (ECDSA)

公開鍵認証によるユーザ認証

ホスト認証が通るとユーザ認証に進みます。ユーザ認証では公開鍵認証が試されます。ペア鍵を作成するにはssh-keygenコマンドを使います。

書式: ssh-keygen [オプション]

主なオプション

  • -f 鍵ファイル名を指定
  • -t 暗号化方式を指定(dsa rsa ecdsa)
  • -p 鍵ファイルのパスフレーズを変更
  • -P 古いパスフレーズを指定
  • -N 新しいパスフレーズを指定
  • -lフィンガープリントを表示


$ ssh-keygen -t ecdsa
$ ls ~/.ssh/

id_ecdsa  id_ecdsa.pub known_hosts

以下二つのファイルが作成されました。pubがついていないほうが秘密鍵で予めクライアントに渡しておきます。

id_ecdsa.pub

ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCgshaZuP706f3GAnK7E7VFoMUY2l/xM99PlTcsr9W+XUDg/o8tgxWapZCuzB7p8q5IGOGT1VjQ9TBNK1i/ar4w= c@overlord

id_ecdsa

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAwjlr/GJ2FI9iZKNHGTswgVe/tZq64RnO6FKeUetL9W2orUTH
ulEH+mg1S6lwIS6VzqNSCn/Y935qfpgMMLODsu938zZmP3sl3VWb5gnFuOO1V/Z4
p/yy/dBF4CZqTSCNQxaY3LovP9LUnGVaOB2kNCP00gY7d1mzh2so/Rqj900nf9vU
EfCBHwEdU630iI06DLgpeLHl7VlDMsn3o0hsD75Od5W6NTjmiZ0e8jhzVoJHFWNz
l/zi2VyOZyzJ6N5ya042qvlpztA4xXitLXzRFlHhrb4VIozLYtPZsAv/X3I8SrBC
deerJOeh8aIWGQQwbAAuNDrnS2gp+o5klffmDwIDAQABAoIBAQCOs9H7pfxMLu2E
M9NRXoPNBMP+kqksKuIzIEDiv5cXxHJinF6DLnZGLbq61MtmFexL3wOwYy7u6Rsl
2GFchwkEt53SPO3zRnATp4rcAeIcbnIXJyiPhMOeaSBuCMuhz4D7Aedehg2hPy6n
mnAnOuAizyhaB+o5TtbxcHK1RJWkZOtPnZKijd8T03JtjwlACOKSMcMjsuajIkZU
Zft62gR3or+kTvV+M/B6jXGde/LIpZecAOD0BKmF7ZJV6RLZhvPWj5lgfPcC0RdJ
Y31vYpjUUVqfHvxhZkcnBnpz784MWcrI+Y7Bm8THvQA+FzNEcmXRNrHqj4sNkmR+
Qqo/pxJBAoGBAO/K7KVwngVIOdC0Kq5WCTnkw+o3g5F0JbZZMfPwM0nvrA0ZV1k+
LwIGdegJMFWasMTeOqorxadh80H4LpbdfgATt4sHn9T7bsQEcqPtVRFWqutBK1tP
uEzx+oYs1KVAaJd2eDPZuzUk4e9c/PpYWgj6UK6j2jIZrhnFpw1dMZr9AoGBAM9a
Cew8sFfZD9Nb6/Olzvh746GaIDJqcBujC31LRnlZfmAfr8JrvSEg33DdpWXi0Xb6
gZE2QV4ziPvGQB6zSI7ESDMEVOfOiBBdhsllEqbqbYHtLmq2Rubp6FUH52yD94ej
KBEEfb+E7NvnwWKMiGoHq/55BRtJTZiEp9Z3E7D7AoGAQfhD7qfy8WUTctV+QIQu
+Zx0QcWQDr4zed1EHuZgVeD4JopoO4ceC6KXYYTVpVdvdlnlLdfpAsmx0N5kguDg
v0itYDRyxnd927OVjn/GvYRodVxyfyaJf7G6yJsgzW3Q2IqhOzKVjGNfPSkJ+B3C
d2HWPJWbe9kQyspT0RtogEkCgYAD+H5uJq9dz0tNSdpX3Rn8iirOwmvRa1ZgQRwM
Ny/PTRZtcs3j1DpX8xA0UhpDvDc0pxFqHXbc/fGmmKJLtDU0fq+/Qlr54WubnJ7j
JmtYBO856LfV1U3ASERptHALFO/dihNPWB2sWDhM8cAzSeum1CTIB7tATYQN4qRw
J/GZlwKBgA4dx+1IMxQB9M9VnadTsIvn0WNeEdH5RIE1Lrd3mWdt/S3p89uksR47
1cikTXDmAon1rDcxnWgyTW1NdPpmoW1vI9uuKm4MOxEqxoKmrOyNFnPvvO+pAN7w
RU76iOpW9j/VmBAYJ2SalUYxaz5l1eQjFN1r3JbdAEOTwHvG5ns/
-----END RSA PRIVATE KEY-----

この秘密鍵を使えるようにするには公開鍵をauthorized_keysにそのまま追加します。
$ cat ~/.ssh/id_ecdsa.pub >> ~/.ssh/authorized_keys

公開鍵がauthorized_keysに追加されていれば秘密鍵が使用可能になります。
authorized_keysは他のユーザに改変されないようにパーミッションは644以下に設定します。
クライアント側は秘密鍵id_ecdsaを他のユーザに読み取られないように600に設定します。

~/.ssh/にデフォルトのファイル名(id_ecdsaやid_rsaなど)で鍵ファイルが配置されている場合、接続時に自動でその鍵を参照して認証に使用されます。
$ ssh user@192.168.1.1

Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-49-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Tue Apr 21 23:34:41 JST 2015

  System load:  0.0               Processes:           121
  Usage of /:   35.7% of 7.21GB   Users logged in:     1
  Memory usage: 25%               IP address for eth0: 10.0.1.1
  Swap usage:   0%                IP address for eth1: 192.168.1.1

  Graph this data and manage this system at:
    https://landscape.canonical.com/

Last login: Tue Apr 21 23:34:42 2015 from 192.168.1.3
c@sibyl:~$

ペア鍵にはパスフレーズを付与することが可能です。パスフレーズを付与することで暗号の強度が上がるとともに、鍵の不正利用を防ぐことが期待できます。しかし、接続するたびにいちいち尋ねられては、鍵認証のメリットであるパスワード入力を省けるというメリットが薄れます。

そこでssh-agentを利用します。ssh-agentでは秘密鍵をメモリ上に保存するためパスフレーズの入力を省けます。

ssh-agentの子としてbashを起動
$ ssh-agent bash
ssh-addで秘密鍵を追加します。このときに一回だけパスフレーズを求められます。
$ ssh-add
$ ssh-add srv_id_rsa

ssh-agentが保存している秘密鍵の一覧は-lオプションで確認できます。
$ ssh-agent -l

2048 27:69:f3:b8:17:70:74:9f:75:b9:2d:8a:f2:f8:51:8c /home/rj/.ssh/id_rsa (RSA)
2048 63:ab:e9:5c:f2:80:bb:c2:84:60:b4:92:fe:a2:40:38 srv_id_rsa (RSA)
関連記事

コメント

:
:
:
:
:
管理人のみ表示を許可