OpenSSH

2007/8/21更新

対応バージョン: 4

一部のOSでは/dev/randomが実装されていないため、sshd起動時に必要な乱数生成ができない。

例えばSolaris8の場合パッチ#112438-03を適用して適切な設定を行うことで/dev/randomが導入できる。

(*) あらかじめパッチを/var/spool/patchに展開しておくこと。

# cd /var/spool/patch/112438-03
# patchadd /var/spool/patch/112438-03
# ln -s /kernel/drv/sparcv9/random /dev/random

2007/8/21更新

対応バージョン: 4

この事象はバックグラウンドでアクティブなプロセスが走っている時に起こることがある。

これが発生するかどうかは例えば次のコマンドを実行させて確かめることができる。

% sleep 20 & exit

bashユーザなら/etc/bashrcか~/.bashrcのどちらかに以下の内容を設定しておくことで問題を解決できる。

shopt -s huponexit

それ以外のシェルを使用している場合は各シェルのマニュアルを参照してアクティブなジョブが終了するときにHUPシグナルを発行するようなオプションを設定する。

2007/8/21更新

対応バージョン: 4

SSHサーバの設定に問題がない場合、以下のような原因が考えられる。

アクセス元ホストのIPアドレスを逆引きし、結果を待つ分時間がかかる(/etc/hostsやネームサーバにアクセス元ホストが登録されていない)。
アクセス元へident要求を出し、タイムアウトになるぶん時間がかかる。

2008/7/28更新

対応バージョン: 5

OpenSSH-5.1で実装された「VisualHostKey」機能を使用すると接続先ホストの公開鍵のfingerprintを従来の16進だけでなくASCIIアートとして表示させることができる。

この機能は実験的な実装のためデフォルトでは無効になっているが、以下のいずれかの方法で有効化することができる。

各ユーザ毎の設定 (~/.ssh/config)
VisualHostKey yes
システムワイドの設定 (/usr/local/etc/ssh_config)
VisualHostKey yes
ssh使用時にオプションとして指定
% ssh -o "VisualHostKey yes" foo@host

実行結果

Host key fingerprint is f2:94:08:bd:26:7b:90:d9:da:e5:b8:a3:02:25:78:3a
+--[ RSA 2048]----+
|                 |
|     .           |
|.   . .          |
|o o  = o .       |
| =  = * S        |
|E    B B         |
| o  o + o        |
|  .  ...         |
|   .....         |
+-----------------+

尚、この設定はsshコマンドとssh-keygenコマンドに適用される。

2014/11/26更新

対応バージョン: 6.4p1

SSHには1と2のバージョンがありそれぞれ手順が異なるが基本的な流れは同じで、クライアント側で認証鍵を生成して公開鍵をサーバ側に登録しておくことによってパスワードなしでのログインが可能となる。

以下、それぞれのバージョンにおける設定手順を示す。

SSHバージョン2

作業は全てSSHクライアント側で作業する。

まずパスフレーズなし(-N '')のDSA鍵を生成する。

client% ssh-keygen -t dsa -N ''
Generating public/private dsa key pair.
Enter file in which to save the key (/home/foo/.ssh/id_dsa): <- Enter
Created directory '/home/foo/.ssh'.
Your identification has been saved in /home/foo/.ssh/id_dsa.
Your public key has been saved in /home/foo/.ssh/id_dsa.pub.
The key fingerprint is:
SHA256:F6mLrskhIaxfh2+rbmwK8kRRtF8EiashbipUhHN8ce0 foo@client
The key's randomart image is:
+---[DSA 1024]----+
|   .o.=O*o.oE    |
|   . =o++....    |
|  . . *oo.o      |
|   ..o.+ . .     |
|  .. o..S .      |
| .  o.o. o       |
|o..  *o .        |
|oo* *.           |
|.=+B+.           |
+----[SHA256]-----+

これで~/.ssh配下に秘密鍵(id_dsa)と公開鍵(id_dsa.pub)が作成される。

公開鍵はSSHサーバ側にコピーして~bar/.ssh/authorized_keysに追記する必要があるが、ssh-copy-idコマンドを使用すればこれらの作業を代行してくれる。

client% ssh-copy-id -i ~/.ssh/id_dsa.pub bar@server

以上の作業によりクライアントからパスワードなしでサーバにログインできるようになる。

client% ssh bar@server
server%

SSHバージョン1

作業は全てSSHクライアント側で作業する。

まずパスフレーズなし(-N '')のRSA鍵を生成する。

client% ssh-keygen -N ''
Generating public/private rsa key pair.
Enter file in which to save the key (/home/foo/.ssh/id_rsa):  <- Enter
Your identification has been saved in /home/foo/.ssh/id_rsa.
Your public key has been saved in /home/foo/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Yt4zXxGFoDS6IBR34ROFKR7fZPOrV3e2VRZiruNxShg foo@client
The key's randomart image is:
+---[RSA 2048]----+
|  o.. +=+ .. ..  |
| . .ooo++o  .+ . |
|  ...+++.o  + . .|
|   ..o.o.E.  o  o|
|      + S o.o  ..|
|     o o ..=.o. +|
|      . +.o.*. oo|
|        .+.+   . |
|         ..      |
+----[SHA256]-----+

これで~/.ssh配下に秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が作成される。

公開鍵はSSHサーバ側にコピーして~bar/.ssh/authorized_keysに追記する必要があるが、ssh-copy-idコマンドを使用すればこれらの作業を代行してくれる。

client% ssh-copy-id -i ~/.ssh/id_rsa.pub bar@server

以上の作業によりクライアントからパスワードなしでサーバにログインできるようになる。

client% ssh bar@server
server%

2007/8/21更新

対応バージョン: 4

OpenSSH-2.9.8以前はSSHのバージョン1と2で使用するファイルが異なっていたが(最後に2が付くファイルがバージョン2用)、OpenSSH-2.9.9以降は両者が統合され、2が付くファイルは「後方互換のためだけに」使用されることになった。

今まで分けて管理していた鍵情報は単にcat等で連結すれば継続使用可能である。

2008/4/21更新

対応バージョン: 5

パスワード認証、公開鍵認証のどちらの方式を利用する場合でも、まずあらかじめサーバ側に鍵ペアを用意しておく必要がある。

OpenSSHでは鍵の利用方式としてSSH 1の頃から使われているRSAと、SSH 2のみで利用できる「より強固な」DSAの両者が利用できる。

以降の説明ではDSAの鍵生成の手順を説明するが、RSAの場合であっても鍵ファイルの名前が違う等の違いを除けば基本的な仕組みは同じである。

# ssh-keygen -t dsa -N "" -f /etc/ssh/ssh_host_dsa_key
Generating public/private dsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
83:6e:93:68:72:d6:9c:b2:d1:d5:bb:91:0e:4a:cf:d9 root@matrix.private.jp

→ /etc/sshにssh_host_dsa_key(秘密鍵)、ssh_host_dsa_key.pub(公開鍵)が生成される。秘密鍵は厳重に管理し、root以外に読み書き権がないようにする。

2007/8/21更新

対応バージョン: 4

-Lオプションを使用して以下の方法で行う。

例) serverのpop3(110)ポートを同ホストの10000ポート経由でclientに転送する

client% ssh -L 10000:server:110 server

尚、1024番ポート以下の特権ポートはrootのみ使用可能なので一般ユーザによる利用はそれ以降のポート番号を利用すること。

2007/8/21更新

対応バージョン: 4

準備

まずSSHのサーバとなるマシン上でsshdを起動しておく。

XプロトコルのSSH転送をするためにはあらかじめsshdに以下の設定をしておく必要がある。

/etc/ssh/sshd_config
X11Forwarding yes
X11DisplayOffset <num>

また、上記マシンにおいてXクライアントがXプロトコルのSSH転送を許すために以下の2通りのどちらかの設定をしておく必要もある。

各ユーザ毎の設定 (~/.ssh/config)
ForwardX11 yes
システムワイドの設定 (/etc/ssh/ssh_config)
ForwardAgent yes
ForwardX11 yes

接続

設定が済んだらsshでサーバマシンに接続する。

ここではサーバマシンをserverとして説明する。

client% ssh server
XXX@server's password: ********

接続が成功するとDISPLAY環境変数には自動的にserverのsshdが管理するXサーバ番号が割り当てられているのが確認できる。

ここでのXサーバ番号はsshd_configのX11DisplayOffsetで設定したであり、netstatを実行すると6000 + のポートがLISTEN状態になっていることが確認できる。

server% printenv DISPLAY
DISPLAY=server:10.0

server% netstat -a
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4       0      0 *.6010        *.*             LISTEN
:

この状態でxterm等のXアプリケーションを起動するとXプロトコルのデータはSSHによって(暗号化されて)トンネル接続される。

netstatで状態を見るとESTABLISHEDに変わっている。

server% netstat -a
Proto Recv-Q Send-Q Local Address Foreign Address (state)
tcp4       0      0 server.6010   client.3301     ESTABLISHED
:

リモートのXクライアントを起動するためにわざわざログインシェルを起動したくない場合はsshに-fオプションを付けてリモートで実行するコマンドを指定するとログインシェルがバックグラウンドで動作するので便利である。

client% ssh -f server xterm

2008/7/27更新

対応バージョン: 5.1p1

sshd_configには様々な設定項目があるが、ここでは主な項目について説明する。

尚、OpenSSHのバージョンによって設定項目の種類やデフォルト値が異なる場合があるので注意すること。

全般設定

Port

sshdが動作するポート番号。

デフォルトは22。

AddressFamily

sshdが動作するアドレスファミリを指定する。

取りうる値は以下のとおり。

any

すべて

inet

IPv4のみ

inet6

IPv6のみ

デフォルトはany。

ListenAddress

sshdが接続を受けつけるローカルアドレスを指定する。

複数指定したい場合は1行1設定にて複数行記述する。

デフォルトではすべてのローカルアドレスに対して接続を受けつけるようになっている。

尚、Portオプションはこのオプションよりも前に指定しておく必要がある。

Protocol <2|1>

sshdで使用するSSHプロトコルのバージョンを指定する。

両方のプロトコルを使用する場合は2,1のようにカンマで区切って記述する。

デフォルトは2,1。

HostKey

秘密鍵を格納しているファイルを指定する。

デフォルトは上記Protocolオプションで指定しているプロトコルによって異なる。

2

/usr/local/etc/ssh_host_dsa_key 及び

/usr/local/etc/ssh_host_rsa_key

DSA/RSA両方の鍵ファイルを必要とするが、どちらか片方でもsshdは動作する。

1

/usr/local/etc/ssh_host_key

KeyRegenerationInterval

鍵の再生成間隔。

サーバ鍵は(一度でも使われると)ここで指定された秒数ごとに自動的に再生成される。

このように鍵を再生成する目的は、後でそのマシンに侵入して盗聴したセッションを解読されたり鍵を盗まれたりするのを防ぐためである。

この鍵はどこにも格納されない。

0を指定すると鍵はまったく再生成されなくなる。

デフォルトは3600(秒)。

mやhを付けて分/時間の指定も可能。以降、時間に関するオプションは全て同様。

ServerKeyBits

サーバ鍵のビット数を指定する。

デフォルトは1024で、最小は512、最大は32768である。

SyslogFacility

LogLevel

syslogのファシリティ/レベルを指定する。

デフォルトはそれぞれAUTH、INFO。

LoginGraceTime

ユーザがこの時間内でログインに成功できないとサーバは接続を切る。

この値を0にすると時間に制限はなくなる。

デフォルトは2m(120秒)。

PermitRootLogin

rootがSSHを使ってログインできるかどうかを指定する。

デフォルトはyes。

StrictModes

各ユーザのSSH関連の指定ファイルのモードや所有者をチェックするかどうかを指定する。

yesにしておくと各ユーザの$HOME/.ssh/のパーミッションが甘く(例えばワールドに書込権があるように)設定された場合に、他人がここに関連ファイルを置いてSSH経由でアクセスするのを防ぐことができる。

デフォルトはyes。

ForceCommand

クライアントが指定したコマンドを無視し、ここで指定されたコマンド、及び~/.ssh/rc(存在すれば)を強制的に実行する。

このコマンドはそのユーザのログインシェルの-cオプションを使って実行される。

この設定項目は通常Match(後述)と組み合わせて使用する。

セキュリティ

AllowUsers

接続対象のローカルユーザを絞る場合に使用する。スペースで区切って複数指定可能。

userのみ指定すれば任意のホストからuserで指定したユーザにのみ接続を許可する。

user@hostという形式にすれば指定したホストからのみuserで指定したユーザに接続を許可する。

デフォルトは全てのホストからローカルの全ユーザに対して接続を許可。

例) 任意のホストからfooユーザにのみ接続を許可

AllowUsers foo

例) 上記に加え、192.168.0.1からbarユーザに対して接続を許可

AllowUsers foo bar@192.168.0.1

AllowGroups

接続対象のローカルグループを絞る場合に使用する。スペースで区切って複数指定可能。

AllowUsersと異なりホストを指定することはできない。

デフォルトはローカルの全グループに対して接続を許可。

認証

MaxAuthTries

1接続あたりの最大認証回数を使用する。

デフォルトは6。

RSAAuthentication

RSA認証を許可するかどうかを指定する。

デフォルトはyes。

(*) SSHプロトコルのバージョン1を使用している場合にのみ有効。

PubkeyAuthentication

公開鍵認証を許可するかどうかを指定する。

デフォルトはyes。

(*) SSHプロトコルのバージョン2を使用している場合にのみ有効。

AuthorizedKeysFile

認証の際に使用される公開鍵を格納しているファイルを指定する。

デフォルトは.ssh/authorized_keys。

RhostsRSAAuthentication

RSA認証が成功している時.rhostsや/etc/hosts.equivを使用した認証を行ってよいかを指定する。

デフォルトはno。

(*) SSHプロトコルのバージョン1を使用している場合にのみ有効。

HostbasedAuthentication

公開鍵認証が成功している時.rhostsや/etc/hosts.equivを使用した認証を行ってよいかを指定する。

デフォルトはno。

(*) SSHプロトコルのバージョン2を使用している場合にのみ有効。

IgnoreUserKnownHosts

RhostsRSAAuthentication、あるいはHostbasedAuthenticationの各認証においてユーザの~/.ssh/known_hostsのファイルに記載されたホスト公開鍵を使用しないかを指定する。

yesなら使用しない、noなら使用する。

デフォルトはno。

IgnoreRhosts

RhostsRSAAuthentication、あるいはHostbasedAuthenticationの各認証において.rhosts及び.shostsによる認証機能を無効にするかどうかを指定する。

yesなら無効にする、noなら有効にする。

デフォルトはyes。

yesの状態でも/etc/hosts.equiv及び/etc/shosts.equivは有効である。

PasswordAuthentication

UNIXのパスワード認証を行うかどうかを指定する。

デフォルトはyes。

公開鍵認証だけを行いたい場合はこの値をnoにする。

PermitEmptyPasswords

空のパスワードを許可するかどうかを指定する。

デフォルトはno。

ChallengeResponseAuthentication

チャレンジレスポンス認証を許可するかどうかを指定する。

デフォルトはyes。

KerberosAuthentication

Kerberos認証を許可するかどうかを指定する。

この認証はKerberosチケットを使うという形で行われる。

あるいはPasswordAuthenticationがyesならユーザのパスワードはKerberos KDC(Key Disstribution Center)を経由して確認される。

このオプションを使うためにはサーバはKDCのidentityを検査するKerberos servtabを必要とする。

デフォルトはno。

KerberosOrLocalPasswd

これが指定されているとKerberos経由のパスワード認証が失敗した時そのパスワードが/etc/passwdなどの別のローカルな機構によって確認される。

デフォルトはyes。

KerberosTicketCleanup

ユーザのチケット用キャッシュをログアウト時に自動的に消去するかどうかを指定する。

デフォルトはyes。

KerberosGetAFSToken

AFSが有効でユーザがKerberos 5 TGT(Ticket-granting Ticket)を持っている場合、そのユーザのホームディレクトリにアクセスする前にAFSトークンを取得しようと試みる。

デフォルトはno。

GSSAPIAuthentication

GSSAPI(Generic Security Service API)ベースのユーザ認証を使用するかどうかを指定する。

デフォルトはno。

(*) SSHプロトコルのバージョン2を使用している場合にのみ有効。

GSSAPICleanupCredentials

ユーザがログアウトする時にその証明書キャッシュを自動的に消去するかどうかを指定する。

デフォルトはyes。

(*) SSHプロトコルのバージョン2を使用している場合にのみ有効。

UsePAM

PAM(Pluggable Authentication Module)インタフェースによる認証を許可するかどうかを指定する。

デフォルトはno。

yesに設定した場合、全ての認証形式に対してChallengeResponseAuthenticationを使用したPAM認証と、PAMアカウント及びセッションモジュールの処理が許可される。

このためにPasswordAuthentication、あるいはChallengeResponseAuthenticationのいずれかを許可する必要がある。

パケット転送

AllowTcpForwarding

TCP転送を許可するかどうかを指定する。

デフォルトはyes。

GatewayPorts

リモートホストがクライアント側に転送されたポートに接続することを許可するかどうかを指定する。

デフォルトはno。つまりsshdはリモート転送ポートをループバックアドレスにバインドする。

転送されたポートをローカルからのみ利用可能にしたい場合はnoを、任意のアドレスからも利用可能にしたい場合はyesを、あるいはクライアント側にバインドすべきアドレスを指定させたい場合はclientspecifiedをそれぞれ指定する。

X11Forwarding

X11転送を許可するかどうかを指定する。

デフォルトはno。

X11DisplayOffset

sshdがX11転送をするときに最初に使われるディスプレイ番号を指定する。

これはsshdが本物のXサーバと衝突してしまうのを防ぐ。

デフォルトは10。

X11UseLocalhost

転送されたXサーバをsshdがループバックアドレスにバインドするかどうかを指定する。

デフォルトはyes。つまりsshdは転送されたXサーバをループバックアドレスにバインドし、DISPLAY環境変数のホスト名の部分をlocalhostに設定する。

これによりリモートホストから転送されたXサーバに接続することはできなくなる。

しかし古いXクライアントの場合この設定では動作しないことがある。そのような場合は設定をnoにして転送されたXサーバがワイルドカードアドレスにバインドされるようにできる。

その他

PrintMotd

ログイン時に/etc/motdを表示するかどうかを指定する。

デフォルトはyes。

PrintLastLog

ユーザが対話的にログインしたとき、そのユーザが前回ログインした日付と時刻を表示するかどうかを指定する。

デフォルトはyes。

TCPKeepAlive

ネットワークがダウンしたりクライアントホストがリブートした際にサーバが通知するかどうかを指定する。

デフォルトはyes。

この指定をyesに設定しておくと何らかの原因でSSHセッションが切れた場合にそのセッションが永久にハングしつづけることを回避する。

尚、TCPKeepAliveを禁止するにはサーバとクライアント双方でこの設定をnoに指定する必要がある。

UseLogin

ログインセッションでloginを使用するかどうかを指定する。

デフォルトはno。

UsePrivilegeSeparation

受けつけるネットワークトラフィックを処理するためにsshdがroot権限を分離するかどうかを指定する。

デフォルトはyes。

yesに設定すると認証が成功した際にそのユーザの権限をもつ子プロセスが新たに作られる。

PermitUserEnvironment

sshdが~/.ssh/environment及び~/.ssh/authorized_keysにおけるenvironment=オプションを処理すべきかどうかを指定する。

デフォルトはno。

環境変数の変更はユーザにLD_PRELOADなどを使ってアクセス制限を回避させてしまう恐れもあるので注意して設定する必要がある。

Compression

圧縮、あるいは遅延圧縮(*)を許可するかどうかを指定する。

デフォルトはdelayed。

(*) 遅延圧縮とは、そのユーザが認証されてから初めて圧縮を許可すること。

ClientAliveInterval

sshdは暗号化された経路を介して一定時間ごとにクライアントに応答を要求するメッセージ(client alive message)を送るが、その際何もデータが送られてこなかった場合にタイムアウトする時間を秒数で指定する。

デフォルトは0(メッセージを送らない)

(*) SSHプロトコルのバージョン2を使用している場合にのみ有効。

ClientAliveCountMax

無反応のクライアントに対してsshdがclient alive messageを送ってみる最大回数を指定する。

client alive messageに対する応答が連続してこの回数分なかった場合、sshdは接続を切ってセッションを終了する。

デフォルトは3。

例えば前述のClientAliveIntervalが10(秒)に設定されClientAliveCountMaxが5の設定の場合、反応しないSSHクライアントはおよそ10(秒) x 5(回) = 50秒後に接続が切られる。

(*) SSHプロトコルのバージョン2を使用している場合にのみ有効。

UseDNS

リモートホスト名の検証にDNSを使用するかどうかを指定する。

デフォルトはyes。

yesの場合、sshdはIPアドレスからリモートホスト名を逆引き検索して得た名前を正引きして同じIPアドレスになるかどうか確認する。

PidFile

sshdのPIDファイル。

デフォルトは/var/run/sshd.pid

MaxStartups

まだ認証されていない段階の接続を最大で同時にどれくらい受け付けるかを指定する。

これを超える接続は認証が成功するかあるいは接続のLoginGraceTime(ログイン猶予時間)が切れるまで受け付けられず捨てられる。

デフォルトは10。

もうひとつの方法はコロンで区切った3つの値を与えることにより早期のランダムな接続拒否を許可することである。

この値は「start:rate:full」(開始時:確率:最大数)のような形をとる(例:"10:30:60")。

sshdは認証以前の接続がstart(この例では10)個を超えるとこれ以後の接続要求をrate/100(この例では30%)の確率で拒否しはじめる。

この確率はfull(この例では60)個の接続が来るまで線形に増えつづけ、最大数に達した時点でそれ以降すべての接続を拒否するようになる。

PermitTunnel

tunデバイスの転送を許可するかどうかを指定する。

デフォルトはno。

yes/noの他に以下の設定も指定可能。

point-to-point

layer 3

ethernet

layer 2

yesを指定すると上記2設定の両方を許可したことになる。

ChrootDirectory

認証の後にchrootをおこなうパス名を指定する。

このパスを含めてそこに到達するすべてのディレクトリはrootの所有でなければならず、、また他のいかなるユーザやグループも書き込めないようになっていなければならない。

chroot後は接続ユーザにとってそこが/(ルート)になるので例えばshをはじめとしてstdinや/devノードなどセッションに必要なプログラムやファイルが用意されている必要がある。

デフォルトはnone(chrootしない)。

Banner

認証が許可される前にリモートユーザに提示されるファイルを指定する。

noneを指定した場合、バナーは表示されない。

デフォルトはnone。

(*) SSHプロトコルのバージョン2を使用している場合にのみ有効。

Subsystem

外部サブシステム(ファイル転送デーモンなど)を設定する。

このオプションへの引数はサブシステム名とそのサブシステムに要求があったとき実行されるコマンドを与える。

例えばsftp-server(8)はファイル転送サブシステムsftpを実装したものである。

(*) SSHプロトコルのバージョン2を使用している場合にのみ有効。

Match <条件>

特定の条件に対する限定的な設定を指定できる。

例えばあるユーザの接続に対してのみsshdの挙動を変えたいような場合などに使用する。

Match行にある全ての条件が満たされた場合、これ以降の設定項目は次のMatch指令が現れるまでグローバルな設定よりも優先される。

Matchオプションの引数はひとつ以上の「種類 パターン」の組み合わせによって指定される。

使用可能な種類は以下の4種類である。

User (ユーザ名)
Group (グループ名)
Host (ホスト名)
Address (アドレス)

また、Matchオプションが使用できる設定は以下のいずれかに限られている。

AllowTcpForwarding
Banner
ForceCommand
GatewayPorts
GSSApiAuthentication
KbdInteractiveAuthentication
KerberosAuthentication
PasswordAuthentication
PermitOpen
PermitRootLogin
RhostsRSAAuthentication
RSAAuthentication
X11DisplayOffset
X11Forwarding
X11UseLocalHost

例)

Match User foo
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand cvs server

関連資料・記事

2008/4/21更新

対応バージョン: 5

SSHの認証方式には「パスワード認証方式」と「公開鍵認証方式」2種類がある。

以下、それぞれの特徴とサーバ - クライアント間のセッションの流れについて説明する。

パスワード認証方式

メリット

サーバ側にあるアカウントのパスワードを知っていればよいのでクライアント側で特別な作業は不要

デメリット

暗号化されているとはいえ、パスワードがネットワーク上を流れるのでパスワードを盗まれる可能性がないとはいえない。
そもそもパスワードが第三者に知られてしまえば効果がない。

サーバ - クライアント間のセッションの流れ

使い方はtelnet等のサービスとほぼ同じで、ログインする際にパスワードを入力する。

この方式ではサーバとクライアントのセッションは以下のような流れになる。

1. クライアントがサーバに対して接続要求

2. サーバが公開鍵を提示するのでクライアントはそれを入手

3. クライアントはサーバの公開鍵を用いて自身が乱数を用いて生成した共通鍵(セッション鍵)を暗号化

4. クライアントは暗号化された共通鍵をサーバに送付

5. サーバは受け取った(暗号化された)共通鍵を自身の秘密鍵で復号化

6. サーバ - クライアント間で共通鍵の照合

7. クライアントは接続先アカウントのパスワードを共通鍵で暗号化してサーバに送付

8. サーバはそのパスワードを受け取ってユーザ認証

9. 以降、その共通鍵を使って暗号化通信

接続例)

host1% ssh foo@host2 

The authenticity of host 'host2 (XX.XX.XX.XX)' can't be established.
RSA key fingerprint is be:ed:4f:35:3b:96:92:4b:a8:ee:1c:38:b0:36:6e:54.
Are you sure you want to continue connecting (yes/no)? ← yes
Warning: Permanently added 'host2' (RSA) to the list of known hosts.
foo@host2's password: ← UNIXパスワード

→ ~foo/.ssh/known_hostsファイルにhost2の公開鍵が追加される。

(*) もし以下のようなメッセージが出て接続を拒否された場合は/etc/hosts.allow等のアクセス制御の設定を見直してみる。

ssh_exchange_identification: Connection closed by remote host

公開鍵認証方式

メリット

ネットワーク上をパスワードが流れる心配がないのでパスワード認証方式より安全

デメリット

前もってクライアントの鍵ペア(公開鍵、秘密鍵)を作成する必要があり、また公開鍵を接続先サーバに「安全に」届けておく必要があるのでパスワード認証に比べて最初の設定が面倒。

サーバ - クライアント間のセッションの流れ

操作方法はパスワード認証と同じだが、ログインする際にパスワード入力の必要がない。

公開鍵認証を有効にするためには前もって自身の公開鍵をサーバ側に登録する必要がある。

この方式ではサーバとクライアントのセッションは以下のような流れになる。

1. クライアントがサーバに対して接続要求

2. サーバ - クライアント間でお互いの公開鍵の照合

3. サーバは乱数を生成しクライアントの公開鍵を使って暗号化

4. サーバは暗号化された乱数をクライアントに送付

5. クライアントは受け取った(暗号化された)乱数を自身の秘密鍵で復号化

6. クライアント、サーバともに上記乱数からMD5でチェックサムを生成

7. チェックサムをサーバ - クライアント間で照合

8. 以降、暗号化通信

接続例)

まず自身の鍵ペアを生成する。

host1% ssh-keygen -d

Generating public/private dsa key pair.
Enter file in which to save the key (/home/foo/.ssh/id_dsa): ← リターン
Enter passphrase (empty for no passphrase): ← パスフレーズ
Enter same passphrase again: ← パスフレーズ再入力
Your identification has been saved in /home/foo/.ssh/id_dsa.
Your public key has been saved in /home/foo/.ssh/id_dsa.pub.
The key fingerprint is:
2b:e1:bd:ca:ef:90:9d:49:6d:71:3b:bd:ed:44:20:f6 foo@host1

host2% ← ログイン成功

→ ~/.sshにid_dsa(秘密鍵)、id_dsa.pub(公開鍵)が生成される。

このうちid_dsa.pub(公開鍵)を「安全な方法で」サーバ側にコピーし、~/.ssh/authorized_keysファイルに内容を追加する。

(*) authorized_keysは公開鍵の鍵束(キーチェーン)なので各クライアントの公開鍵の内容は同ファイルに上書きせずに追加していく必要があるので注意する。

次にサーバに接続してみる。

host1% ssh foo@host2

Enter passphrase for DSA key '/home/foo/.ssh/id_dsa': ← パスフレーズ

host2% ← ログイン成功

もしid_dsa.pubの内容がサーバ側に正しく設定されていない場合、自動的にパスワード認証に切り替わる。

2008/7/27更新

対応バージョン: 5.1p1

公式サイト

準備

導入OS

Fedora 9

デフォルト設定退避

デフォルトでインストールされているSSHサーバを無効にし、関連ファイルを退避する。

まず、既にサービスが起動していれば停止する。

% sudo service sshd status
sshd (pid 1775) を実行中...

% sudo service sshd stop

次に以下の関連ファイルを退避する。

/etc/sshディレクトリ配下

/usr/bin/scp
/usr/bin/sftp
/usr/bin/slogin
/usr/bin/ssh*

/usr/sbin/sshd

/usr/libexec/openssh/*

インストール

配布ファイル展開

% tar zxvf openssh-5.1p1.tar.gz
% cd openssh-5.1p1

make,インストール

% ./configure <オプション>
% make
% sudo make install

インストール物 (man,infoは除く)

/usr/local/etc/moduli
/usr/local/etc/ssh_config
/usr/local/etc/ssh_host_dsa_key (*)
/usr/local/etc/ssh_host_dsa_key.pub (*)
/usr/local/etc/ssh_host_key (*)
/usr/local/etc/ssh_host_key.pub (*)
/usr/local/etc/ssh_host_rsa_key (*)
/usr/local/etc/ssh_host_rsa_key.pub (*)
/usr/local/etc/sshd_config

/usr/local/bin/scp
/usr/local/bin/sftp
/usr/local/bin/slogin -> ./ssh
/usr/local/bin/ssh
/usr/local/bin/ssh-add
/usr/local/bin/ssh-agent
/usr/local/bin/ssh-keygen
/usr/local/bin/ssh-keyscan

/usr/local/sbin/sshd

/usr/local/libexec/sftp-server
/usr/local/libexec/ssh-keysign

/usr/local/share/Ssh.bin

(*) 以下の暗号化方式による鍵ペアがインストール時に生成されて各ファイルに保存される。.pubなしのファイルが秘密鍵、.pub付のファイルが公開鍵。

DSA (SSHプロトコル バージョン2用)

ssh_host_dsa_key

RSA (SSHプロトコル バージョン2用)

ssh_host_rsa_key

RSA (SSHプロトコル バージョン1用)

ssh_host_key

各種設定

基本設定

/usr/local/etc/sshd_configにて基本的な設定を行う。

詳しくは以下を参照のこと。

関連資料・記事

動作確認

sshdを起動する。

% sudo /usr/local/sbin/sshd

待ち受けポートがLISTENになっているか確認する。

% netstat -nat|egrep '(Proto|22)'
Proto Recv-Q Send-Q Local Address  Foreign Address  State      
tcp        0      0 0.0.0.0:22     0.0.0.0:*        LISTEN      

以下のようにしてlocalhostにSSH接続ができればOKである。

% ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
RSA key fingerprint is a6:be:e7:9f:80:1b:c7:e5:bf:c9:43:87:7e:27:70:ee.
Are you sure you want to continue connecting (yes/no)? yes
foo@localhost's password: *****

%

initスクリプト設置

スクリプト編集

既存の/etc/rc.d/init.d/sshdを編集し、関連ファイルのパスを変更する。

(変更前)

25 KEYGEN=/usr/bin/ssh-keygen
26 SSHD=/usr/sbin/sshd
27 RSA1_KEY=/etc/ssh/ssh_host_key
28 RSA_KEY=/etc/ssh/ssh_host_rsa_key
29 DSA_KEY=/etc/ssh/ssh_host_dsa_key

(変更後)

25 KEYGEN=/usr/local/bin/ssh-keygen
26 SSHD=/usr/local/sbin/sshd
27 RSA1_KEY=/usr/local/etc/ssh_host_key
28 RSA_KEY=/usr/local/etc/ssh_host_rsa_key
29 DSA_KEY=/usr/local/etc/ssh_host_dsa_key