ssh 1.2 インストールメモ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− # 序章 #--------------------------------------------------------------------------------------------- + 特徴 +--------------------------------------------------------------------------------------------- ssh(Secure Shell) はネットワークを介してコンピュータにログインするプログラムで、遠隔地のマシンでコマンドを実行したり他のマシンへファイルを移したりするために使われます。ssh は強力な認証と安全ではない経路を通じての安全な通信を提供します。 + 移植版openssh バージョン情報 +--------------------------------------------------------------------------------------------- openssh はOpenBSD プロジェクトにて開発された安全な通信を行うプログラムです。これを、Openssh 移植チームが多くのオペレーションシステムに移植したものが移植版openssh となり、フリーで提供されています。移植版openssh は移植版であることが分かるように、通常正式バージョン番号の前に「p」を付けたバージョン番号で管理されます。 + 提供する機能 +--------------------------------------------------------------------------------------------- ▼ セキュアなリモート操作機能 リモートログインは通常telnet やftp、あるいはrlogin やrsh を使って行ないます。計算機のユーザはssh のインストールされている計算機であればtelnet の代わりにslogin あるいはrcp の代わりにscp をftp の代わりにsftp を使えば従来のコマンドとほぼ同様のことができようになります。 ▼ 認証/通信の暗号化機能 telnet などは接続先のホストの認証は行なわず、ユーザ認証だけを行い、端末から入力したパスワードの文字列はそのままネットワーク経由で接続先のホストに送られてユーザ認証がなされてしまいます。一方 ssh は暗号システムを使ってホスト認証及びユーザ認証を行ない、またユーザのパスワードを含めてすべてのデータの通信を暗号化して行ないます。これにより通信が傍受されてもユーザのパスワードが守られ、またTCP/IP の接続に対しても強力な認証機構があるのでIP アドレス偽装、IP ソースルーチング、DNS 偽装、途中のホストによるデータの操作、といった不正アクセスの攻撃を防ぐことができるのです。 ▼ ポートフォワード機能 ssh のサーバあるいはクライアントにproxy(中継) サーバを作成して、ssh の通信を利用してproxy との間の通信を暗号化する「ポートフォワーディング機能」が利用できます。これはその都度ユーザが設定して利用する機能でありますが、ftp やpop などのセキュアでない通信の時に利用することにより、セキュリティを高めることができます。これらのフォワーディング機能はファイヤーウォールをまたがっての通信にも利用可能です。 + ssh が防ぐ攻撃 +--------------------------------------------------------------------------------------------- ssh を導入することにより下記の攻撃を未然に防ぐことができます。 1. クライアントIP スプーフィング(偽装) 接続してきたローカルホストに対して、偽りのリモートホストがあたかも他の信頼できるマシンから来たかのように偽装する時に用います。 2. IP ソースルーティング 3. DNS 偽装 4. 途中にあるホスト上での平文パスワードの傍受 5. 途中のホストを操作してのデータ操作(改竄) # 暗号化方式 #--------------------------------------------------------------------------------------------- + 暗号技術 +--------------------------------------------------------------------------------------------- ssh の中心的な機能である「認証」及び「通信の暗号化」には暗号技術が使われています。暗号技術では、暗号化及び復号化を行なう「鍵」の扱い方法が重要な要素の1 つであり、大別して1 つの秘密鍵で暗号化も復号化もおこなう共有鍵暗号方式と、暗号化をおこなう鍵と復号化をおこなう鍵との異なる1 組の鍵を用いる公開鍵暗号方式との2 種類があります。ssh での認証は公開鍵暗号方式で行ない、通信データの暗号化は共有鍵暗号方式で行なっています。 + 共有鍵暗号方式 +--------------------------------------------------------------------------------------------- 1 つの共通の鍵で暗号化及び復号化を行う方式です。公開鍵暗号方式と比べて、アルゴリズムが簡単であり処理時間が短いので、大きなデータを暗号化するのに向いています。 ▼ ssh が使用している主な共有鍵暗号方式 ・DES 方式 ・3DES 方式 ・IDEA 方式 ・Blowfish 方式 + 公開鍵暗号方式 +--------------------------------------------------------------------------------------------- 公開鍵暗号方式は、共有鍵暗号方式を利用する場合の鍵の管理をいかに行なうかという課題を解決するために開発されました。 ssh による公開鍵暗号方式の認証では、認証するホストが公開鍵を持ち、認証されるホストにて作成された文字列が正当であるかを判断します。 ▼ 暗号手順 1. 受け手は一組の公開鍵と秘密鍵を作成して、通信相手に公開鍵を送る。 2. 通信相手はその公開鍵で暗号文を作成し、受け手に送る。 3. 受け手は送られてきた暗号文を秘密鍵で平文のメッセージに戻す。 暗号文の復号化は秘密鍵だけで可能であり、公開鍵ではできないので、秘密鍵を厳重に管理し他に漏れないようにすれば、公開鍵を一般に公開して安全な暗号通信が可能です。 なお、公開鍵暗号のシステムは暗号通信の用途以外にも使用されています。例えば、電子署名の用途。秘密鍵でメッセージを暗号化することができるのは本人だけであり、暗号化されたメッセージを受け取ったものは公開鍵で復号化して、発信者の認証を行なうことができるという特質を利用しています。 ▼ ssh が使用している主な公開鍵暗号方式 ・rsa 方式 ・dsa 方式 # 認証方式 #--------------------------------------------------------------------------------------------- + 認証種類 +--------------------------------------------------------------------------------------------- ssh の認証は段階を追って行われます。まず、ローカルホストが正しいリモートサーバーと通信しているかどうかの認証を行います。この時、同時に通信(セッション) を暗号化する際に必要となるセッションキー(共通暗号鍵) をローカルホスト、リモートサーバー共に安全に交換します。 ローカルホストによるリモートサーバー認証が終わったら、次はリモートサーバーによるローカルホスト認証が行われます。つまり、ユーザー認証が行われますが、この時点でセッションは完全に暗号化されているので、通信自体は安全です。 + ローカルホストによるリモートサーバーのホスト認証 +--------------------------------------------------------------------------------------------- ローカルホストによるリモートサーバーのホスト認証は、ローカルホストが意図するリモートサーバーと接続しようとしているかを確認するために行われます。 もし、リモートサーバーが偽りのサーバーであった場合は、ローカルホストの通信情報が全て第三者に知られてしまいます。これを一般的にリモートサーバーのなりすましといいます。 リモートサーバーのホスト認証時には同時に、通信の暗号化を行なう共有鍵暗号システムで使用するsession key の交換も行われます。正常にsession key の交換が行われた以降の処理は全て暗号化されます。 ssh1 によるログインでは、公開鍵暗号システムrsa を用いてリモートサーバのホスト認証及び、session key の交換が行われます(rsa 方式)。 ssh2 では、rsa 方式に加えて 認証を公開鍵暗号システムdsa で、session key の交換はDiffie-Hellman 鍵配送方式で行う方式が使われおり、後者(dsa 方式) が標準になっています。 ▼ rsa 方式によるリモートサーバーホスト認証手順 ssh client がssh server に接続要求をする。 ↓ 要求を受け取ったssh server は公開host key と公開server key、それと併せて自分がサポートする共有鍵暗号システムのリストをssh client に送る。 ↓ ssh client は、送られてきた公開host key を自分のknow host key データベースに既に登録してあるhost key と比較して公開host key が一致することを確認する。一致しない場合は自身のknow host key として登録するかをユーザーに尋ね、OK ならば登録する。 ↓ さらにssh client は内部でsession key をランダムに作成し、送られてきた公開host key、 公開server key にてsession key を暗号化し、ssh server に送信する。この時、送られてきた共有鍵暗号システムのリストよりサポートしている暗号方法を選択し、同時に送信する。 ↓ ssh server は受け取ったsession key の復号化を秘密host key、秘密server key を用いて行なう。復号化した文字を再度ssh client に送信し、client 側で暗号前session key との一致が確認できた時点で、ssh client は正当なssh server と接続していることが確認される。 ▼ リモートサーバーホスト認証にて使用される暗号鍵 ・host key 1024-bit のrsa key あるいはdsa key が使用されています。ssh のサーバデーモンであるsshd のインストール時に作成されます。 ssh-keygen を用いてキーの大きさを変更することもできます。 ・server key server key は768-bit のrsa key でホスト認証のために使われます。sshd 起動時(セッション確立時) に作成され、その後1 時間ごとに自動的に更新されます。ファイルに保存されることは一切ありません。server key の目的は、host key で暗号化した通信を記録して解読されることを防ぐためにあります。この一定時間ごとに変化するserver key で修飾することにより暗号の解読を困難にしています。 ・session key ssh ではセッションの通信が共有鍵暗号方式により暗号化されます。session key はセッションの通信の暗号化に用いられる256 ビット長の乱数です。 + リモートサーバーによるローカルホストのホスト、ユーザー認証 +--------------------------------------------------------------------------------------------- ssh によるユーザー認証は下記の4 つの方法が提供されています。実際に利用される認証方法はssh サー バーの運用方針と、ユーザー側の設定によって決定されるでしょう。なお、ssh1 ではディフォルトでrhostsによる認証、ホストベース公開鍵認証、ユーザーベース公開鍵認証、パスワード認証の順に有効な認証を試みます。 ↓ rhosts 認証 ↓ ホストベース公開鍵認証(rhosts 認証+公開鍵暗号) ↓ ユーザーベース公開鍵認証 ↓ UNIX 標準のパスワード認証 ▼ UNIX 標準のパスワード認証 UNIX 標準のパスワードによる認証を行います。ローカルホストはユーザが入力したパスワードをリモートサーバに送り、リモートサーバーでは通常のパスワード認証ルーチンでチェックします。この時、パスワード自体は既に暗号化されて送信されるので通常のtelnet よりかは安全に通信することができます。 ▼ rhosts による認証 R 系サービスにて行われている/~.rhosts、または/etc/hosts.equiv によるホスト、ユーザー認証を行います。/~.rhosts、または/etc/hosts.equiv に登録されている許可されたホスト、またはユーザーに限ってはパスワード無しでログインできてしまうので、IP 偽装などの攻撃には非常に弱いです。 ▼ ホストベース公開鍵認証(rhosts 認証+公開鍵暗号) 上記のrhosts による認証に加え、ローカルホストの公開鍵認証を行います。 ● ssh client の前準備 rhosts 認証を行うため、ssh_config ファイルの次の設定項目を編集します。 SSH1 の場合:RhostsRSAAuthentication yes SSH2 の場合:HostbasedAuthentication yes ● ssh server の前準備 ssh server の接続先ユーザーにて.rhosts ファイル、もしくはknown_hosts の管理作業を行い、それを基にホスト認証を行う場合はsshd_config ファイルの次の設定項目を編集します。 IgnoreUserKnownHosts no IgnoreRhosts no また、ホストベース公開鍵認証を有効にするために次の設定項目を編集します。 SSH1 の場合:RhostsRSAAuthentication yes SSH2 の場合:HostbasedAuthentication yes ● ssh server のホストベース認証の用意 rhosts 認証を行うため、SSH 接続先ユーザーのホーム配下に.rhosts ファイルを作成します。 例 test.com から接続される場合 ----------------------------- test.com ------------------------------------------------------------ 次に、ホストベース認証を行うため、ssh client のホスト公開鍵(ssh_host_key.pub ファイルの内容) を~/.ssh/known_hosts ファイルに登録します。このとき、そのままコピーするだけではなく、文初に接続元のFQDN とIP アドレスを登録します。 例 test.com から接続される場合 ----------------------------- test.com,[test.com のIP アドレス] 1024 〜 〜 以降 ssh client のssh_host_key.pub の内容 ------------------------------------------------------------ ▼ ユーザー認証と公開鍵暗号方式による認証 ● ssh client の前準備 ssh-keygen を用いて公開key(identity)、秘密key(identity.pub) を作成します。なお、鍵を作成する際にはパスフェーズを入力する必要があります。 ● ssh server の前準備 ssh client にて作成された公開key(identity.pub) をリモートサーバー上のログインするユーザーのホームディレクトリ配下authorized_keys ファイルに登録します。 ● SSH 接続手順 ssh server によるログイン受付時にssh client は公開key、及びユーザー名をssh server に送る。 ↓ ssh client より送られてきた公開key が自身が持っているauthorized_keys 中に存在するかを確認する。 ↓ ssh server が公開key の存在を確認した場合は、即座に乱数を作成し、公開keyにて暗号化したデータ(challenge データ) をssh client に送る。 ↓ ssh client は受け取ったchallenge データを秘密key とパスフレーズにより復号可し、結果をMD5 でハッシュ計算。ハッシュ計算結果をssh server に送る。 ↓ ssh server で発生させた乱数をssh client 同様MD5 ハッシュ計算をし、その結果がssh client から送られてきたデータと一致していれば認証成立。 # インストール #--------------------------------------------------------------------------------------------- + openssh のインストール方法 +--------------------------------------------------------------------------------------------- openssh のソースをインターネットよりダウンロード後、ソースを解凍します。 # su root # cd /usr/local/src/ # wget openssh-3.8p1.tar.gz # tar zxvf openssh3.8p1.tar.gz openssh を解凍後、openssh ディレクトリに入りインストール作業を行います。 # cd openssh-3.8p1 # ./configure --prefix=/usr/local/ssh --with-etcdir=/usr/local/ssh/etc \ --with-pam --with-pid-dir=/var/run --with-ssl-dir=/usr/bin \ --with-tcp-wrappers --with-md5-passwords \ --with-privsep-path=/var/empty --with-privsep-user=sshd --with-md5-passwords # make # make install + rsa ユーザー認証を省略する +--------------------------------------------------------------------------------------------- rsync などのツールによってssh をシェルから利用する場合はssh する度に発生するrsa ユーザー認証が妨げとなります。そこで、rsa ユーザー認証で入力するパスフレーズをクライアント側ssh のメモリに蓄え、サーバーにssh 接続する度に入力するパスフレーズを省略させることができます。 ● 認証エージェントとは? 認証エージェント(ssh-agent) はユーザーのパスフレーズをメモリにて管理します。認証エージェントを起動した際は、UNIX ソケットを作成し、/tmp/ssh-[UserName]/agent-socket-[ProcessID] に保存します。そして、ユーザがssh する度にこのソケットを通してssh-agent にアクセスして秘密鍵を得ます。 ● 認証エージェントを利用する まずは認証エージェントを起動します。認証エージェントはssh 接続先のユーザーになってから起動するのが普通です。というのも、認証エージェントを起動したユーザー以外のユーザーは認証エージェントを利用できないからです。 # su [UserName] # ssh-agent bash 次に、ssh-agent にrsa ユーザー認証で用いるクライアント側秘密鍵を登録します。 # ssh-add # Need passphrase for /home/[UserName]/.ssh/identity ([UserName]@[Host]) # Enter passhrase: ******** # Identity added: /home/[UserName]/.ssh/identity ([UserName]@[Host]) これより、ssh で接続する度にソケット経由でssh-agent を起動、ssh-add で登録した秘密鍵をssh 接続先に自動的に転送し、rsa ユーザー認証なしでssh ログインすることが可能となります。 # ポートフォワード #--------------------------------------------------------------------------------------------- + 概要 +--------------------------------------------------------------------------------------------- ssh のポートフォワード機能は、ssh で暗号化された通信路を暗号化されていない通信に提供する。つまり、telnet やPOP3 などの暗号化されていない通信をssh が作った安全なトンネルの中で行うことができる。 ポートフォワードの例(POP3 と暗号化通信する): =============== =============== + Mail client + + Mail server + + Port 8001 + + Port 110 + + ↑ + + ↑ + + │ + + │ + + ↓ + + ↓ + + Port 22 ←──────────────→ Port 22 + =============== ssh で暗号化された通信路 =============== tiguer dolphin 上記の例はホスト【 tiguer 】からホスト【 dolphin 】にssh 経由でのメール受信(POP3) する様子である。Mail client からMail server に到達するまでにPort 22 を経由して接続していることが分かる。なお、上記のPort 8001 はクライアントが任意に決定したポートで、クライアントはPort 22 を透過的に使用してサーバーと通信を行う。 ssh 通信路の確立はssh クライアント、ssh サーバーにて行われる。実際必要となるプログラムと接続コマンドは下記の通り。下記接続コマンドを用いることでクライアントとサーバーとのssh 接続は確立される。その後、クライアントで用意されたローカルポート(下記のlocalport) に使用するサービス(ポート) を指定して接続するとssh 通信路を用いたポートフォワードがなされる。 接続するために必要なプログラム: 1. クライアントssh プログラム(ssh) 2. サーバープログラム(sshd) 接続コマンド(クライアント側で実行): # ssh -L localport:host:hostport localport ・・・ 自ホストの転送元ポート番号 host ・・・ 転送先ホスト名 hostport ・・・ 転送先ポート番号 + 接続手順 +--------------------------------------------------------------------------------------------- 上記で説明した概要の実際の接続手順を下記に示す。(クライアント、サーバー共にlinux を想定する)。なお、ssh 通信路部は次のプログラムが実現する。 手順1: tiguer コンソール上でdolphin とのssh 通信路を確立する。 # ssh -L 8001:localhost:110 dolphin ※ 上記のlocalhost はdolphin から見たlocalhost のこと。つまり、dolphin 自身を指す。 手順2: ssh 通信路を経由してdolphin とPOP3 接続する。 # telnet localhost 110 ※ ここでのlocalhost は自身のlocalhost。つまり、tiguer 自身を指す。