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%
2018/6/3更新
対応バージョン: 7.6p1
SSHの鍵ペアのうち公開鍵を紛失してしまった場合は以下のコマンドで秘密鍵から復元できる。
% ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
上記はRSA鍵の場合であるが、DSA鍵も同様の手順で復元できる。
% ssh-keygen -y -t dsa -f ~/.ssh/id_dsa > ~/.ssh/id_dsa.pub
なお、秘密鍵を紛失してしまった場合は復元する術がないので再度鍵ペアを作成する必要がある。
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で設定した
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