この演習の目的は通りです。
ssh ( Secure remote SHell )は、secureなtelnetです。secureの意味は、次の二点からなります。
この他にも様々な機能が充実しているために、いまでは、remote shellの代表的なコマンド(2)として利用されています。
この為に、当然のことながらcrackerのターゲットになっています。「secureにする積りでsshにしたら、そのsshにsecurity holeがあって、侵入されてしまった」という笑えない話がありますが、sshのversionには、できるだけ、注意を払いましょう。
もちろん、演習で利用したVersionは「もっての他」であることは、言うまでもありません。
ssh Serverの構築もDHCP Server の構築と同様、次のような手順を踏むことになります。
また、sshは、clientもあった方が便利なので、serverのinstallと同時に、ssh clientのinstallも同時に行うことにします。
rpmファイルの入手は、DHCP Server の構築と同様に、ftpを用いて、おこないます。
Nameに対しては、"ftp"と入力して[Enter]を、Passwordに対しては、単に[Enter]で答えます。
[root@Linux-X /root]# ftp 192.168.3.49 Connected to 192.168.3.49. 220 h49.private.media.cst.nihon-u.ac.jp FTP server (Version \ wu-2.6.1-18) ready. Name (192.168.3.49:ccna): ftp 331 Guest login ok, send your complete e-mail address as \ password. Password: 230-The response '' is not valid 230-Next time please use your e-mail address as your password 230- for example: joe@h10.private.media.cst.nihon-u.ac.jp 230 Guest login ok, access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. ftp>
必要なファイルは、pubの下の更にsslの下においてあるので、まず、そこに移動します。
ftp> cd pub/ssl 250 CWD command successful ftp>
そして、そこにあるファイルのリストをとってみます。
ftp> ls 200 PORT command successful. 150 Opening ASCII mode data connection for directory listing. total 3130 -rw-r--r-- 1 501 501 3505 Oct 13 2001 CA.sh -rw-r--r-- 1 root root 201698 Nov 8 03:20 \ openssh-3.1p1-1.i386.rpm -rw-r--r-- 1 root root 273389 Nov 8 03:20 \ openssh-clients-3.1p1-1.i386.rpm -rw-r--r-- 1 root root 151073 Nov 8 03:20 \ openssh-server-3.1p1-1.i386.rpm -rw-r--r-- 1 root root 962725 Nov 8 03:20 \ openssl-0.9.6-9.i386.rpm 226 Transfer complete. ftp>
この結果から、ファイルが、5つおいてあることが理解ります(3)が、今回必要なのは、この内の下の4つだけです。
この4つをまとめて取るには、次のようにmgetコマンドにファイル名のパターンを指定します。
ftp> mget open* mget openssh-3.1p1-1.i386.rpm? y 200 PORT command successful. 150 Opening BINARY mode data connection for \ openssh-3.1p1-1.i386.rpm (201698 bytes). 226 Transfer complete. 201698 bytes received in 0.228 secs (8.7e+02 Kbytes/sec) mget openssh-clients-3.1p1-1.i386.rpm? y 200 PORT command successful. 150 Opening BINARY mode data connection for \ openssh-clients-3.1p1-1.i386.rpm (273389 bytes). 226 Transfer complete. 273389 bytes received in 0.351 secs (7.6e+02 Kbytes/sec) mget openssh-server-3.1p1-1.i386.rpm? y 200 PORT command successful. 150 Opening BINARY mode data connection for \ openssh-server-3.1p1-1.i386.rpm (151073 bytes). 226 Transfer complete. 151073 bytes received in 0.147 secs (1e+03 Kbytes/sec) mget openssl-0.9.6-9.i386.rpm? y 200 PORT command successful. 150 Opening BINARY mode data connection for \ openssl-0.9.6-9.i386.rpm (962725 bytes). 226 Transfer complete. 962725 bytes received in 1.29 secs (7.3e+02 Kbytes/sec) ftp>
すると、パターンにマッチするファイルのを一つずつ表示しますので、これに対してy [Enter]とすれば、そのファイルを一つずつ転送します。
転送が終ったら、quitでftpコマンドを抜けます。
ftp> quit 221-You have transferred 1588885 bytes in 4 files. 221-Total traffic for this session was 1590716 bytes in 5 \ transfers. 221 Thank you for using the FTP service on \ h49.private.media.cst.nihon-u.ac.jp. [root@Linux-X /root]#
sshのinstallには、rpmコマンドを利用します。今回のinstallでは、次の4つのファイルパッケージをinstallします。
openssh-server-3.1p1-1.i386.rpm : ssh serverパッケージ(5)。sshにより、Networkから、このpcにRemote Loginできるようにするためのパッケージです。
このパッケージを運用するということは、結果的に、このpcがssh serverになることを意味します。
installを開始する前に、まず、既に、install済かどうかを確認してみましょう。この為に、rpmコマンドに-qオプションを付けます。
[root@Linux-X /root]# rpm -q openssl package openssl is not installed [root@Linux-X /root]#
すると、opensslというパッケージがinstallされていないことが理解ります。
DHCP Server の構築をしていれば、dhcpパッケージがinstall済ですから、次のようになります。
[root@Linux-X /root]# rpm -q dhcp dhcp-2.0-4 [root@Linux-X /root]#
既に、install済であれば、敢て、install作業を行う必要はないわけです。
パッケージのinstall原則として、rpmを使います。その意味では、4つのファイルがあるので、一つずつrpmを起動して、installをすればよいわけです。
ところが、ソフトウェアパッケージには、依存関係があります。上記の例であれば、ssh-server, ssh-clientは、sshパッケージを必要とし、sshパッケージはsslパッケージを必要とします。
例えば、sshパッケージをinstallする前に、ssh-serverパッケージをinstallしようとすると、不足しているパッケージがあるという警告が表示され、installされません(6)。
[root@Linux-X /root]# rpm -Uhv openssh-server-3.1p1-1.i386.rpm error: failed dependencies: openssh = 3.1p1-1 is needed by openssh-server-3.1p1-1 libcrypto.so.1 is needed by openssh-server-3.1p1-1 [root@Linux-X /root]#
上記の例では、openssh-3.1p1-1 ( openssh-3.1p1-1.rpmに入っている)と、libcrypto.so.1 ( openssl-0.9.6-9.i386.rpmに入っている)がないので、ssh-serverがinstallできないといっているわけです。
したがって、もし、一つずつinstallするならば、最初にopenssl,次にopenssh、そして、その後に、ssh-client, ssh-server (この間には、依存関係がないので、順番はどちらでもよい.. )をinstallすればよいわけです。
しかし、rpmには、もっと便利な機能があります。実は、依存関係があるようなrpmファイルを複数指定すると、自動てきに、そのファイルの依存関係を調べて、正い順番にinstall作業をおこなってくれます。
[root@Linux-X /root]# ls openss*.rpm openssh-3.1p1-1.i386.rpm openssh-server-3.1p1-1.i386.rpm openssh-clients-3.1p1-1.i386.rpm openssl-0.9.6-9.i386.rpm [root@Linux-X /root]# rpm -Uhv openss*.rpm Preparing... ########################################### [100%] 1:openssl ########################################### [ 25%] 2:openssh ########################################### [ 50%] 3:openssh-clients ########################################### [ \ 75%] 4:openssh-server ########################################### \ [100%] [root@Linux-X /root]#
勿論、すでにinstall済の場合は、何もしませんし、仮に古い版がinstallされていた場合は、update (古いパッケージを削除して、その後で新しいパッケージを入れる)等も行ってくれます。
このように書くと、否定的に聞こえますが、実は、これが、いわゆるパッケージ管理システム( rpm )の真骨頂です。このように、何かをするには、別に何が必要かきちんと管理し、報せてくれるので、install時に迷うことが減るわけです。
もちろん、「何が足りないのかが解っていれば、ついでにそれも」と思うことでしょうし、実は、最近の( rpmの代替や、rpmの後継の.. )パッケージ管理システムは、そのような機能を実現しています。
sshの設定は、/etc/sshの下にあるssh_config ( client用)とsshd_config用の二つです。
[root@Linux-X /root]# ls -al /etc/ssh total 108 drwxr-xr-x 2 root root 4096 Jan 1 01:27 . drwxr-xr-x 30 root root 4096 Jan 1 01:06 .. -rw------- 1 root root 88039 Mar 15 2002 moduli -rw-r--r-- 1 root root 1144 Mar 15 2002 ssh_config -rw------- 1 root root 2500 Mar 15 2002 sshd_config [root@Linux-X /root]#
もちろん、server管理の設定で変更が必要になるのは、sshd_configの方です。ただし、今回は、defaultの設定で問題ないので、これに関する作業はありません。
ssh serverを運用するということは、sshd (ssh daemon)を起動するということです。この為には、起動scriptを実行します。
初めて、sshdを起動すると、sshでの暗号通信のための公開鍵を自動生成しようとするのでしばし時間がかります。二度目以降は、一度生成した鍵を利用しますので、待たされることはありません。
[root@Linux-X /root]# /etc/rc.d/init.d/sshd start Generating SSH1 RSA host key: [ OK ] Generating SSH2 RSA host key: [ OK ] Generating SSH2 DSA host key: [ OK ] Starting sshd: [ OK ] [root@Linux-X /root]#
作成された鍵は、/etc/sshの下に作成されます。
[root@Linux-X /root]# ls -al /etc/ssh total 132 drwxr-xr-x 2 root root 4096 Jan 1 01:34 . drwxr-xr-x 30 root root 4096 Jan 1 01:06 .. -rw------- 1 root root 88039 Mar 15 2002 moduli -rw-r--r-- 1 root root 1144 Mar 15 2002 ssh_config -rw------- 1 root root 668 Jan 1 01:34 ssh_host_dsa_key -rw-r--r-- 1 root root 590 Jan 1 01:34 ssh_host_dsa_key.pub -rw------- 1 root root 515 Jan 1 01:33 ssh_host_key -rw-r--r-- 1 root root 319 Jan 1 01:33 ssh_host_key.pub -rw------- 1 root root 887 Jan 1 01:33 ssh_host_rsa_key -rw-r--r-- 1 root root 210 Jan 1 01:33 ssh_host_rsa_key.pub -rw------- 1 root root 2500 Mar 15 2002 sshd_config [root@Linux-X /root]#
これらのファイルがあれば、二度目は、すぐに起動します。
[root@Linux-X /root]# /etc/rc.d/init.d/sshd stop Shutting down sshd: [ OK ] [root@Linux-X /root]# /etc/rc.d/init.d/sshd start Starting sshd: [ OK ] [root@Linux-X /root]#
次のような実験を行う。
/etc/ssh/sshd_configの内容を次のように書き直して、sshdを再起動すると、今度はrootでのloginができなくなることを確認しよう。
[変更前]
#PermitRootLogin yes
[変更後]
PermitRootLogin no
sshには、様々な機能がありますが、その内の一つは、TCP tunnelによるport fowardingです。
port fowardingというのは、端的に言えば、一つのportへの通信があった場合、そのportへのパケットを他のPCやportに自動的に転送( forwading )する仕組の事です。
それ自身は、sshの機能とは直接は無関係なのですが、sshで通信すると、その「転送された通信部分が暗号化される」ということに重要な意味があります。
例えば、tcpdump の利用法で学んだように、httpやtelnet, popを利用してのpasswordの送信は、tcpdumpを利用して、簡単に覗視ることができます。これでは、何のためにid/passwordが必要なのかよくわかりません(7)。
ところが、sshのport forwardingを利用することによって、この問題を回避する(8)ことができます。
また、通信が、一旦ssh serverを経由するので、もし、clientからは直接接続できないが、ssh serverからなら接続できるようなHostがある場合に、このport forwardingを使って、接続が可能(9)になります。
Local Portのforwardingは、Local Hostへ接続された通信をsshのtunnelを通して、remoteへforwardします。
Linux-Cは、Linux-SのPort (Protocol) Pに接続したい。
例えば、Linux-Sがhttp serverだとすれば、一般にPort番号は80となる。
CのLocal Port QをC, G間のssh接続を経由してSのPort Pにport fowardingするようにする。
例えば、CのPort 8080に接続すると、Sの80に接続することを想定する( Q = 8080, P = 80 )。
Linux-C # ssh -L 8080:Linux-S:80 Linux-G
Linux-C # telnet localhost 8080 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. GET /index.html ... Connection closed by foreign host. Linux-C #
次のようなNetworkを構成する。
Linux-C Linux-T | | >-------+-----------------+----< | 192.168.1.0/24 Linux-G | >-------+----------------------< | 192.168.2.0/24 Linux-S
実験の前に以下の点を確認する。
Local Portのforwardingでは、Local Hostへの接続を、他のHostへ結び付けることができた。これは、自分のHost (Local Host)上で、Client Softwareを動かす場合を想定している。
それに対して、今度は、Remote Hostへの接続を、自分のHostへの接続にForwardする方法について説明する。
この方法は、自分のHost (Local Host)上で、Server Softwareを動かす場合を想定している。
GのPort QをS, G間のssh接続を経由してSのPort Pにport fowardingするようにする。
例えば、GのPort 8080に接続すると、Sの80に接続することを想定する( Q = 8080, P = 80 )。
Linux-S # ssh -R 8080:localhost:80 Linux-G
Linux-C # telnet Linux-G 8080 Trying 192.168.xx.xx... Connected to Linux-G Escape character is '^]'. GET /index.html ... Connection closed by foreign host. Linux-C #
次のようなNetworkを構成する。
Linux-C | >-------+----------------------< | 192.168.1.0/24 Linux-G | >-------+----------------------< | 192.168.2.0/24 Linux-S
実験の前に以下の点を確認する。
Remote fowardingでは、折角のsshの暗号通信の機能は利用されていません。実際、確かめてみれば、Linux-CからLinux-Gへの通信(これは、結果的に、Linux-Sへforwardingされる)は、簡単に覗視が可能です。
しかし、Local PortのForwadingでは、Forwadingを行わなくても、Linux-CとLinux-Sは直接、通信ができたわけなのですが、Remote Portの例では、Linux-CとLinux-Sが直接通信ができないにも拘らず、forwardingによって、通信が可能になりました。
つまり、Localの場合は、sshの暗号化を利用するためにforwardingが利用され、Remoteの場合は、forwadingをするために、sshの暗号通信が利用されているわけです。
Localであれ、Remoteであれ、Forwadingは、IPのRoutingと独立に、しかも、Userが指定できるRouting Controlなので、色々な使い通があります。
例えば、上記のLocalとRemoteを組合せて利用することにより、本来は、通信できない所に、暗号通信を実現することができます。
sshのLocal/Remoteを組み合わせることにより、直接接続できないHostと暗号通信をおこないなさい。