Power Point 版 - Echigo BSD Users Group

サルでもできる実用SSH入門
Echigo BSD Users Group 7th meeting
at Toyama prefectural civic center.
12th, July, 2003
INOUE Mikio <[email protected]>
おしながき
• 扱う内容は、FreeBSD 上で運用する
OpenSSH で Protocol 2 の DSA 認証
– 今時の比較的一般的な設定
•
•
•
•
基本的な機能と仕組み
実際の設定
運用
その他の話題
ssh (Secure Shell) の機能
• セッションの暗号化
– 通信の盗聴や改竄を予防
• 安全な認証方式
– ホストの認証と個人の認証
– IP アドレスや DNS の詐称 (なりすまし) を予
防
• port forwarding
– 各 TCP/IP アプリケーションへの応用
公開鍵暗号
• 組になったふたつの鍵
• 暗号化するための鍵 (公開鍵)
– みんなに配っていい鍵。
– この鍵で暗号を作って送ってもらえる。
• 復号化するための鍵 (秘密鍵)
– 絶対内緒の鍵。
– この鍵でのみ暗号を元に戻せる。
• 公開鍵から秘密鍵を作れない
– あくまでも今の所。新しい解読技術で崩壊するかも。
– 秘密鍵からは公開鍵を生成できる。
セッションの暗号化 1/2
1. クライアントがサーバに接続を要求する。
2. サーバはクライアントに、サーバ側の公開鍵*1
を提示する。
3. クライアントは、セッション鍵 (実際の通信に使
用する暗号用の鍵) を生成し、サーバ側の公
開鍵*1で暗号化し、 サーバに送る。
4. サーバは送られたセッション鍵をサーバ側の秘
密鍵*1で復号する。
セッションの暗号化 2/2
5. ここから後のすべての通信は、このセッション
鍵で暗号化される。サーバは、確認のメッセー
ジ (暗号化されている) をクライアントに送る。
6. クライアントは、サーバからのメッセージが確認
できると、次の認証の段階に 移る。鍵が正しく
渡されていなければ、サーバからのメッセージ
が確認できない。 このときは、接続を中断する。
*1
ここでいう「サーバ側の公開鍵・秘密鍵」は、実際にはサーバが固有に持
つ「ホスト鍵」とサーバのメモリ上だけにある 「サーバ鍵」から成ります。
「サーバ鍵」は、一時間毎に作り変えられます。
認証手順の例 1/2
1. サーバが内緒の言葉 (challenge) を作り、認証
したいユーザの公開鍵で challenge を暗号化し
てクライアントに送る。
2. クライアントは、送られてきた暗号を自身の秘
密鍵で復号化する。復号した結果 (response) を
サーバに送り返す。
3. サーバは、送り返されてきた response が、暗号
化前のものと一致するかどうかを調べる。
認証手順の例 2/2
4. 一致してれば認証成功。やったね!
•
•
以上は、Protocol 1 の例で「内緒の言葉」は、乱数に基
づくビット列 が用いられます。
また、Protocol 2 では離散対数を元に計算した署名 が
用いられ、署名の SHA (Secure Hash Algorithm) をとっ
て双方で比較します。
ホスト鍵を作ろう
• FreeBSD の場合、ホストの鍵はインストール後の
最初のブート時に /etc/rc.network (RELENG_4)
とか /etc/rc.d/sshd (HEAD) とかが、勝手に作って
くれます。
たとえば
# /usr/bin/ssh-keygen -t dsa -N "" -f /etc/ssh/ssh_host_dsa_key
確認
ruri@client% ls -l /etc/ssh/ssh_host*
-rw------- 1 root wheel 668 Jun 12
-rw-r--r-- 1 root wheel 608 Jun 12
-rw------- 1 root wheel 533 Jun 12
-rw-r--r-- 1 root wheel 337 Jun 12
-rw------- 1 root wheel 883 Aug 3
-rw-r--r-- 1 root wheel 227 Aug 3
2001
2001
2001
2001
2002
2002
ssh_host_dsa_key
ssh_host_dsa_key.pub
ssh_host_key
ssh_host_key.pub
ssh_host_rsa_key
ssh_host_rsa_key.pub
自分の鍵を作ろう 1/2
• コマンド一発で作れます。どうせ一回しか作りません。
ruri@client% ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/ruri/.ssh/id_dsa):
Enter passphrase (empty for no passphrase): パスフレーズを入力する。
Enter same passphrase again: パスフレーズを入力する。
Your identification has been saved in /home/ruri/.ssh/id_dsa.
Your public key has been saved in /home/ruri/.ssh/id_dsa.pub.
The key fingerprint is: (折り返し)
cf:48:71:f5:32:84:69:e9:2f:4f:b6:f7:4a:16:9e:e2 [email protected]
できた!!
デフォルトだと、~/.ssh が 755 になってるかも知れない。
確認して 700 にしておきましょう。
パスフレーズ
• 暗号化された秘密鍵を読み出すための文字列。
– 4 字以上ということになってるけど、 20 字以上とか長
い方が望ましい。
• 秘密鍵を使う都度入力する必要があるので、sshagent (後述) とか使うと便利。
• パスフレーズ無しの鍵もアリだけど、運用上要注
意。
• もちろん後で変更できます。
自分の鍵を作ろう 2/2
ruri@client% ls –l ~/.ssh/
total 2
-rw------- 1 ruri ruri 736 Jul 11 00:43 id_dsa
-rw-r--r-- 1 ruri ruri 608 Jul 11 00:43 id_dsa.pub
• 秘密鍵が id_dsa
– 暗号化されてます。
– 絶対に内緒なので、NFS とかでホームディレ
クトリを共有してると終了。
• 公開鍵が id_dsa.pub
サーバ側の設定
• 自分の公開鍵をサーバに送る
– メール、フロッピー、口頭、テレパシーなど方法は何で
も構いません。でも、改竄の可能性を心配すれば、
ネットワークを経由しない方が安全かも。
• 公開鍵を登録する
– ~/.ssh ディレクトリがなければ作る。
ruri@server% mkdir ~/.ssh
ruri@server% chmod 700 ~/.ssh
– ~/.ssh/authorized_keys にクライアントで生成
した公開鍵を追加する。
ruri@server% cat id_dsa.pub >> ~/.ssh/authorized_keys
– おしまい。
接続してみる
ruri@client% ssh server.ebug.jp
The authenticity of host ‘server (192.168.0.1)’ can’t be established.
RSA key fingerprint is cf:48:71:f5:32:84:69:e9:2f:4f:b6:f7:4a:16:9e:e2.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘server (192.168.0.1)’ (RSA) to (折り返し)
the list of known hosts.
Enter passphrase for key ‘/home/ruri/.ssh/id_dsa’: パスフレーズを入力する。
Last login: Thu Jul 10 18:11:06 2003 from client.ebug.jp
Welcome to FreeBSD 5.1-RELEASE (GENERIC)
ruri@server% ってな感じでプロンプトがでる。つながった!!
・ パスフレーズを入力する前の 4 行は最初の接続の際だけ確認され
ます。相手のホストを知らないけど接続しても良い? という意味。フィ
ンガープリントを確認して、接続先の正当性を確認する。接続すると
自動的に ~/.ssh/known_hosts に登録される。
プロトコルと認証の方式
• プロトコル
– Protocol 1 - 実装上の互換性が高い
– Protocol 2 - 厳重、多様
• 認証方式 (Protocol 2)
–
–
–
–
公開鍵認証 (DSA 認証または RSA 認証)
パスワード認証 - 運用注意!
対話的認証 (S/Key 認証または PAM 認証)
ホストベース認証 - 運用注意!
ssh-agent で幸せの予感
• 頻繁に使うと毎回パスフレーズを入力するのが
めんどいあなたに代わって、自分専用のエー
ジェントが入力してくれる。
ruri@client% eval `ssh-agent`
ちょっと変な起動の仕方
Agent pid 27900
ruri@client% ps axu | grep ssh-agent
動いてるかの確認
ruri 27900 0.0 0.9 1956 1156 ?? Is
1:06AM
0:00.00 ssh-agent
ruri@client% env | grep SSH
環境変数の確認
SSH_AUTH_SOCK=/tmp/ssh-sCbpye5o/agent.27899
SSH_AGENT_PID=27900
ssh-agent は、起動時に環境変数 SHELL に従って、適切に環境変数を設定してくれます。
ssh-add でちょっと幸せ
• ssh-add を使ってパスフレーズを登録。
ruri@client% ssh-add
Enter passphrase for /home/ruri/.ssh/id_dsa: パスフレーズを入力する。
Identity added: /home/ruri/.ssh/id_dsa (/home/ruri/.ssh/id_dsa)
Identity added: /home/ruri/.ssh/identity ([email protected])
ruri@client% ssh server.ebug.jp 接続してみる
← パスフレーズを訊かれない!
Last login: Thu Jul 12 3:11:06 2003 from client.ebug.jp
Welcome to FreeBSD 5.1-RELEASE (GENERIC)
ruri@server% つながった!!
しあわせ~。
運用上の注意 1/2
• 秘密鍵の管理
– 秘密鍵は他のホストと共有したりして、ネット
ワークに流さない。他のメディアに複製しない。
• パスワード認証
– 暗号化されてるとは言え、パスワードはネッ
トーワークを流れる。
• ホストベース認証/パスフレーズ無し
– 誰でもつなげちゃうので、難しいかも。
運用上の注意 2/2
• バージョンアップ
– 一般的なセキュリティホールの他に、暗号そ
のものが破られる可能性がある。
• その他の設定
– SSH 使ってても TELNET とか FTP とか POP
とかそんなのが全開になってるとダメダメ。
– TCP Wrapper とかルータとか防火壁とか駆使
してがんばりましょう。
OpenSSH と商用 SSH
• 商用版はもちろん今も売ってます。
• 商用版は SSH1 と SSH2 が別になってます。
• Protocol 2 では、OpenSSH と商用版では、鍵の
フォーマットが異なるので変換が必要。
– 商用版の鍵を OpenSSH 用に変換する。
ssh-keygen –i 商用版鍵ファイル > OpenSSH鍵ファイル
– OpenSSH の鍵を商用版用に変換する。
ssh-keygen –e OpenSSH鍵ファイル> 商用版鍵ファイル
パスフレーズが付いた商用版鍵は変換できまへん。事前に商用
版の ssh-keygen でパスフレーズを無しにしておいてください。
クライアントソフトウェア
• Windows 用クライアント
– PuTTY*1、Cygwin 版 OpenSSH
– TTSSH、Telneat*1 (Protocol のみ)
• Macintosh 用クライアント
– MacSSH*1
– Nifty Telnet*1、Better Telnet (Protocol のみ)
• Unix 用クライアント
– OpenSSH、商用 SSH2
– 商用 SSH1
*1 標準の状態だと日本語が使えまへん。
参考
• Secure Shell (secsh) Working Group
– http://www.ietf.org/html.charters/secshcharter.html
• OpenSSH
– http://www.openssh.com/
• SSH Communications Security
– http://www.ssh.com/
• Google
– http://www.google.com/
雑談の種
• ssh には認証局 (Certifying Authority) がな
い。Kerberos を使う?
• OTP (S/Key 認証) はおもしろそうだけど、
誰か使ったことありますか?
• 我が家の Apache はどうなるんだっ!
• 眠いので寝てもいいですか?
– くわしいことは倉品師匠に訊いてください。