サルでもできる実用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 はどうなるんだっ! • 眠いので寝てもいいですか? – くわしいことは倉品師匠に訊いてください。
© Copyright 2024 ExpyDoc