SSH1, SSH2: Secure Shell の利用 (TeraTerm Pro)

ssh(Secure Shell)は、通信路を暗号化することで安全な通信を行うことを目的に作られたものです。主にtelnet/rlogin/rcp といったコマンドの代替えとなるプログラムが用意されています。 特に、遠隔でサーバなどをメンテナンスする際に利用される telnet コマンドを置き換える目的で利用されます。telnet コマンドでは、パスワードや操作内容が平文でネット上を流れるため重要なサーバーにアクセスするには適していません。しかし、ssh は通信路を暗号化するため盗聴されても内容を理解することが出来ません。また、単純なパスワードではなく、パスフレーズといった文章を利用したり、S/MIME や PGP でも利用されている PKI方式(公開キー/秘密キー)を採用可能なため、なりすましも簡単には出来ません。

* パッケージの入手とインストール

ssh には、使用上制限のあるオリジナル ssh (www.ssh.com) と オープンな OpenSSH (www.openssh.org) があります。ここでは、OpenSSH を利用した Secure Shell の導入方法を記述します。OpenSSH は、多くの UNIX に対応しておりインストール方法がほとんど同じです。ただし、GNU Compiler でのコンパイルしか動作確認していない様です。また、ここでは説明していませんが TCP Wrapper や 疑似乱数ジェネレーター(PRNG)を利用することでセキュリティーを強化することが出来ます。セキュリーティー向上のため、最新のバージョンのモジュールをダウンロードしてインストールしてください。

必要なモジュール (改ざんがないか md5 や PGP で signatureをチェックしてください)

openssl-0.9.7b.tar.gz
( http://www.openssl.org/)

zlib-1.1.4.tar.gz
( http://www.gzip.org/zlib/)

openssh-3.6.1p1.tar.gz
( http://www.openssh.org/ または packetstorm)

インストール手順 (スーパーユーザーで作業)

# gzip -dc zlib-1.1.4.tar.gz | tar xf -
# cd zlib-1.1.4
# ./configure
(ダイナミックライブラリを作りたければコマンドラインオプション --shared を指定)
# make
# make install
  
# gzip -dc openssl-0.9.7b.tar.gz | tar xf -
# cd openssl-0.9.7b
# ./config
(ダイナミックライブラリを作りたければコマンドラインオプション shared を指定する [ ./config shared ])
(その際にダイナミックライブラリのサーチパス[ldconfig, crle, etc]をきちんと設定)
# make
# make test
# make install
 
# gzip -dc openssh-3.6.1p1.tar.gz | tar xf -
# cd openssh-3.6.1p1
# ./configure
(ライブラリの指定:./configure --with-zlib=/usr/local/lib --with-ssl-dir=/usr/local/ssl)
# make
# useradd sshd
(sshd ユーザーを登録。安全運営のためシェル[例:/bin/false]やパスワードなどをきちんと設定してね。)
# make install

これらのインストールで /usr/local ディレクトリーにインストールされます。

上記の make でホストキーが生成されますが、手動でホストキー(RSA1:SSH1, RSA:SSH2, DSA:SSH2)を生成するには以下のように実行します。

# ssh-keygen -t rsa1 -f /usr/local/etc/ssh_host_key -N ""
# ssh-keygen -t dsa -f /usr/local/etc/ssh_host_dsa_key -N  ""
# ssh-keygen -t rsa -f /usr/local/etc/ssh_host_rsa_key -N ""

ホストキーを生成を実行すると、ssh_host_key, ssh_host_key.pub ... が作成されます。

* サーバーの起動

まず、Secure Shell サーバー(sshd) の設定ファイルである /usr/local/etc/sshd_config を編集します。ここでは、セキュリティー上不具合のありそうな設定や認証方法は無効にしています。(キー認証が必須な設定です。経路だけを暗号化し、後は通常の telnet (rlogin) のようにパスワード認証を利用したいのなら PasswordAuthentication を有効にして下さい。)

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options change a
# default value.
 
Port 22
#Protocol 2,1
#ListenAddress 0.0.0.0
#ListenAddress ::
 
# HostKey for protocol version 1
HostKey /usr/local/etc/ssh_host_key
# HostKeys for protocol version 2
HostKey /usr/local/etc/ssh_host_rsa_key
HostKey /usr/local/etc/ssh_host_dsa_key
 
# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768
 
# Logging
#obsoletes QuietMode and FascistLogging
SyslogFacility AUTH
LogLevel INFO
 
# Authentication:
LoginGraceTime 120
PermitRootLogin no          # root によるログインを禁止する
StrictModes yes             # キーを保管するディレクトリ等のパーミッションを検査
 
RSAAuthentication yes       # RSA による認証を許可する
PubkeyAuthentication yes    # PublicKey による認証を許可する
AuthorizedKeysFile .ssh/authorized_keys
 
# rhosts authentication should not be used
RhostsAuthentication no     # rhosts による認証を禁止する
# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes            # .rhosts を無視する
# For this to work you will also need host keys in /usr/local/etc/ssh_known_hosts
RhostsRSAAuthentication no  # rhosts と RSA の両方での認証は禁止する
# similar for protocol version 2
HostbasedAuthentication no  # ホストベースによる認証を禁止する
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
IgnoreUserKnownHosts no
 
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no   # UNIXパスワードによる認証を禁止する
PermitEmptyPasswords no     # 空パスワードは許可しない
 
# Change to no to disable s/key passwords
ChallengeResponseAuthentication no      #チャレンジ・レスポンス認証
 
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
 
#AFSTokenPassing no
 
# Kerberos TGT Passing only works with the AFS kaserver
#KerberosTgtPassing no
 
# Set this to 'yes' to enable PAM keyboard-interactive authentication
# Warning: enabling this may bypass the setting of 'PasswordAuthentication'
#PAMAuthenticationViaKbdInt no
 
#X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PrintMotd yes
#PrintLastLog yes
#KeepAlive yes
#UseLogin no
#UsePrivilegeSeparation yes
#PermitUserEnvironment no
#Compression yes
 
#MaxStartups 10
# no default banner path
#Banner /some/path
#VerifyReverseMapping no
 
# override default of no subsystems
Subsystem sftp /usr/local/libexec/sftp-server

あとは、作成された Secure Shell サーバーを起動することで UNIX 側の準備は完了です。

# /usr/local/sbin/sshd

Secure Shell サーバーをシステム起動時に動作させるように /etc/rc.local/etc/rc.d 等に追加しておくと良いでしょう。

* RSA,DSA認証キーの作成

Secure Shell では、今までの UNIX パスワードを利用して通信路のみを暗号化する利用方法があります。しかし、UNIXパスワードだけでの認証ではなりすましが容易なので、ここでは RSA, DSA 認証を利用する方法を記述します。

まず、Secure Shell サーバー(sshd) がインストールされている UNIX マシン(必ずしも実際に利用するマシンでなくても構いません)に、sshを利用したいアカウントでログインします。次に、ssk-keygen コマンドを実行して ssh によるログイン時に利用するパスフレーズを入力します。 すると、ホームディレクトリに .ssh ディレクトリーが作成され、秘密キーと公開キーが作成されます。以下では、SSH 1 用の RSAキーと SSH 2 用の RSA, DSAキーを作成しています。

作成された、.ssh ディレクトリー(0700)や秘密キー(0600)、公開キー(0644)のパーミッションはセキュアな状態で作成されますがきちんと確認してください。また、sshd の設定で StrictModes が yes になっていると HOME ディレクトリーのパーミッションもチェックします(StrictModes が yes で、HOME ディレクトリーの Group, Other の write パーミッションが許可されているとログインできません)。

  user01@gateway$
  user01@gateway$ ssh-keygen -t rsa1
  Generating public/private rsa1 key pair.
  Enter file in which to save the key (/home/user01/.ssh/identity):<Return>
  Created directory '/home/user01/.ssh'.
  Enter passphrase (empty for no passphrase):(パスフレーズ)
  Enter same passphrase again:(パスフレーズ)
  Your identification has been saved in /home/user01/.ssh/identity.
  Your public key has been saved in /home/user01/.ssh/identity.pub.
  The key fingerprint is:
  64:43:07:45:38:65:cd:9c:e3:a2:42:8f:7b:fb:5c:ba user01@gateway.foobar.co.jp
  user01@gateway$
  user01@gateway$ ssh-keygen -t rsa
  Generating public/private rsa key pair.
  Enter file in which to save the key (/home/user01/.ssh/id_rsa):<Return>
  Enter passphrase (empty for no passphrase):(パスフレーズ)
  Enter same passphrase again:(パスフレーズ)
  Your identification has been saved in /home/user01/.ssh/id_rsa.
  Your public key has been saved in /home/user01/.ssh/id_rsa.pub.
  The key fingerprint is:
  69:e8:4c:57:89:fb:7b:6b:8a:8c:6a:9c:5b:d0:4f:1a user01@gateway.foobar.co.jp
  user01@gateway$
  user01@gateway$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/user01/.ssh/id_dsa):<Return>
Enter passphrase (empty for no passphrase):
Enter same passphrase again:(パスフレーズ)
Your identification has been saved in /home/user01/.ssh/id_dsa.
Your public key has been saved in /home/user01/.ssh/id_dsa.pub.
The key fingerprint is:(パスフレーズ)
70:7a:cc:cc:1d:d3:58:b4:a5:75:e9:f3:68:27:84:6b user01@gateway.foobar.co.jp
user01@gateway$ user01@gateway$ cd .ssh user01@gateway$ cp identity.pub authorized_keys user01@gateway$ cat id_rsa.pub >> authorized_keys user01@gateway$ cat id_dsa.pub >> authorized_keys user01@gateway$ ls -l total 8 -rw-r--r-- 1 user01 staff 1185 Sep 26 11:49 authorized_keys -rw------- 1 user01 staff 736 Sep 26 11:49 id_dsa
-rw-r--r-- 1 user01 staff 612 Sep 26 11:49 id_dsa.pub -rw------- 1 user01 staff 951 Sep 26 11:49 id_rsa -rw-r--r-- 1 user01 staff 232 Sep 26 11:49 id_rsa.pub -rw------- 1 user01 staff 537 Sep 26 11:48 identity -rw-r--r-- 1 user01 staff 341 Sep 26 11:48 identity.pub user01@gateway$

【公開キー】

ssh-keygenコマンドによって作成された identity.pub, id_rsa.pub, id_dsa.pub が公開キーとなります。このファイルを、ssh を利用してログインしたい UNIXサーバーの $HOME/.ssh/ ディレクトリーに authorized_keys という名前のファイルに保存(追加)しておきます(OpenSSH の古いバージョンでは、authorized_keys2を利用する場合があります)。もし、SSHの環境が出来上がるまでログインするマシンにアクセス出来ないような場合、生成した identity.pub, id_rsa.pub, id_dsa.pub を自分のホームディレクトリーの下の .ssh ディレクトリーにある authorized_keys ファイルに追記してもらうようシステム管理者に依頼してください(この時、秘密キーは渡さないでください)。パーミッションは、.ssh ディレクトリー(0700)、公開キーファイル(0644)にします。HOME ディレクトリーのGroup, Other の write パーミッションをチェックします。

【秘密キー】

同じようにssh-keygen コマンドによって作成された identity, id_rsa, id_dsa が秘密キーとなります。このファイルは、自分が直接利用する Secure Shellクライアントで利用します。この秘密キーは、絶対に他人に渡らないように注意して下さい。(ここでは、gateway というホストでキーを作成しています。もし、gateway というホスト自身が他の SSH サーバーにアクセスすることがないのであれば秘密キーを削除しておくと良いでしょう。)

認証方法 秘密キー 公開キー 公開キーの保存/追加先
SSH 1 RSA 認証 identity identity.pub authorized_keys
SSH 2 RSA 認証 id_rsa id_rsa.pub authorized_keys(authorized_keys2)
SSH 2 DSA 認証 id_dsa id_dsa.pub authorized_keys(authorized_keys2)

* 実際のログイン

幾つかコマンドが用意されていますが、詳しくはドキュメントを読んで下さい。それでは、早速ログインする手順について記述します。 gateway.foobar.co.jp というホストに user01 というアカウントでログインすると仮定して記述しています。

【UNIX系 OS の場合】

クライアントとなるマシンが UNIX(Solaris, FreeBSD, Linux, Mac OS Xなど)の場合、秘密キー identity(id_rsa) を自分のホームディレクトリーの下の .ssh ディレクトリーに置きます($HOME/.ssh/identity, $HOME/.ssh/id_rsa)。.ssh ディレクトリーのパーミッションは 0700 で秘密キーのパーミッションは 0600 が良い。OpenSSH のコマンドを利用するため、クライアントとなるマシンに OpenSSH のパッケージがインストールされている必要があります。ただし、Secure Shellサーバー(sshd) が動作している必要はありません。

user01@client$ slogin gateway.foobar.co.jp
The authenticity of host 'gateway.foobar.co.jp(192.168.0.1)' can't be established.
Key fingerprint is 1024 69:e8:4c:57:89:fb:7b:6b:8a:8c:6a:9c:5b:d0:4f:1a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gateway.foobar.co.jp,192.168.0.1' (RSA) to the list of known hosts.
Enter passphrase for RSA key 'user01@gateway.foobar.co.jp':(パスフレーズ)
Last login: Wed Sep 26 10:07:04 2001 from gateway.foobar.co.jp
FreeBSD 3.5.1-RELEASE (GATEWAY) #0: Wed Sep 26 12:01:18 JST 2001
user01@gateway$ 

slogin コマンドを使用していますが、実体は ssh コマンドと同じです。ユーザーを指定したければ "-l" コマンドラインオプションを使用して下さい。

【Windowsの場合】 以下の利用では、SSH1になります。

Windows の場合、いくつか Secure Shell 対応のターミナルソフトがありますが、最も利用されている(?)TeraTermProを利用します。TeraTermProは、寺西 高 氏が作成した Windows 上で動作する telnet クライアントです。この TeraTermPro に、Robert O'Callahan 氏が作成した TTSSH と呼ばれる TeraTermPro 用の SSH Plug-in を追加します。

TeraTermPro は、 Vector にある寺西氏のページ から tterm23.zip をダウンロードしてインストールします。 TTSSH は、Robert O'Callahan 氏のサイト から ttssh154.zip をダウンロードします。ダウンロードした ttssh154.zip を、TeraTermPro をインストールしたディレクトリに展開します(デフォルトは C:\Program Files\TTERMPRO\)。 そのまま展開すると、readme.txt が重複するので別名に変更するなり上書きするなりしてください。

それぞれインストールが終了したら、秘密キー identity ファイルを適当なところにコピーします。TeraTermProをインストールしたディレクトリーで構いません。しかし、ここで注意が必要なのは、PC を複数人で共有している場合です。その場合、秘密キーはリムーバブルメディアに保存しておきユーザーごとにメディアを入れ替えて利用することをお勧めします。 ここでは、 TeraTermProをインストールしたディレクトリーに置いています。

コマンドは、ttermpro.exe ではなく ttssh.exe になります。

ttssh.exe

ttssh.exe を起動すると、以下のようなウィンドウが表示されます。

TTSSH1

ここでは、Cancel ボタンを押し、メイン画面から初期設定を行います。

まず、Setup メニューから「SSH...」を選ぶと、以下のような画面が表示されます。

TTSSH2

SSH Known Hosts の「Read/write file:」ボタンを押し、C:\Program Files\TTERMPRO\ssh_known_hosts (TeraTermProをインストールした場所を指定しています)をセットします。 あとは、OK ボタンを押してこの設定を終了します。

次に、Setup メニューから「SSH Authentication...」を選びます。すると、以下のような画面が表示されます。

TTSSH3

User name: に、自分のログイン名(アカウント)を設定します。
次に「Use RSA key to login」をチェックし、 「Private key file:」ボタンを押し秘密キー(C:\Program Files\TTERMPRO\identity)をセットします。 続いて、OK ボタンを押してこの設定を終了します。

Windows 側の設定は、これで完了なので続いて接続確認を行います。

File: メニューから「New connection...」を選ぶと、以下のような画面が表示されます。

TTSSH4

ログインするホスト(gateway.foobar.co.jp)を入力し、ServiceSSH をチェックします。TCP Port #22 になっていることが確認できます。 OK ボタンを押して、指定したホストに接続します。
このとき、以下のような警告が表示されます。これは、上記で設定したファイル ssh_known_hosts がないのでエラーメッセージを出力しています。

TTSSH5

この時点で、ssh_known_hostsファイルが作成されるので、OKボタンを押して次のステップに進んで下さい。また、gateway.foobar.co.jp にアクセスするのは初めてなので 以下のような警告が出ます。

TTSSH6

次回も gateway.foobar.co.jp にアクセスする場合、毎回警告を表示しないように、「Add machine and its key to the known hosts list」をチェックして known hosts リストに登録します。Continue ボタンを押して次に進みます。

TTSSH7

このウィンドウで、パスフレーズを入力して OK ボタンを押せば gateway.foobar.co.jp にユーザー user01でログインします。

 

【Mac OS 9 の場合】

● MacSSH (http://www.macssh.com/)を利用する方法

MacSSH は、SSH2-互換の形式(SECSH 形式)のキーを使用するので OpenSSH で利用するにはキーの扱いが異なります。そこで、MacSSHで利用するキーの生成と公開キーの変換をしなくてはなりません。

■ 秘密キーや公開キーの生成

MacSSHを起動し、Favorites メニューの 「Edit Favorites...」を選びます。

MacSSH1

Edit ボタンを押して設定をします。 すでに別の設定を作っている場合、New ボタンで新しく作ってください。

MacSSH2

SSH2タブ上で、"Initialize SSH..." ボタンをクリックしすると SSH2 Key を作成する画面が表示されます。DSA か RSA にするか選択し適当な Label を付けます(デフォルトのままでも構いません)。

MacSSH3 MacSSH4
 

ここでは、DSA を選択して Create ボタンをクリックします。(RSA を利用したければ、RSA を選択してください)

MacSSH5

その後、パスフレーズの入力を求められるので適切なパスフレーズを入れてください。

MacSSH

確認のため、再度パスフレーズの入力を求められます。上記で入力したパスフレーズと同じものを入力します。

MacSSH6

最初のパスフレーズと一致すると、キーの生成が完了します。

MacSSH7

キーは、Macintosh HD:システムフォルダ:初期設定:MacSSH: フォルダ内に置かれます。 identity は秘密キーなので、絶対に他人に渡らないようにしてください。identity.pub は公開キーです。キーは暗号化されています。

ここで、接続するサーバーに置くための暗号化されていない公開キーを作成しておきます。キーを作成する画面を出して "Export Public Key" ボタンをクリックします。

MacSSH8

公開キーを保存する場所を聞いてきます。

MacSSH9

ここで保存した公開キーを、サーバーに転送(FTPなどを利用)して登録します。 ただし、MacSSH が作成した公開キーは SSH2-互換の形式(SECSH 形式)なので OpenSSH で利用するために変換が必要になります。

サーバー側で、転送した公開キーを変換し登録をします。(転送した公開キー identity.ssh2.pub は、ホームディレクトリーにあるものとします)

user01@gateway$ ssh-keygen -i -f ~/identity.ssh2.pub > ~/.ssh/id_dsa_ssh2.pub
user01@gateway$ rm ~/identity.ssh2.pub
user01@gateway$ cd ~/.ssh
user01@gateway$ cat id_dsa_ssh2.pub >> authorized_keys

余談: 逆に OpenSSH の公開キーを SSH2 で利用するには、ssh-keygen コマンドで -i コマンドラインオプションの変わりに -e を使用します。

■ サーバへの接続

MacSSH を起動します。File メニューの「Open Connection」を選びます。

"Host Name:" に、接続先のホスト名を入力し、Connect ボタンをクリックします。

MacSSH10

ログイン名とパスワードを聞いてくるが、ログイン名だけ入力し、パスワードは空欄のまま OK ボタンをクリックします。

MacSSH11

サーバーにアクセスするのが初めての場合、以下のような警告が出ます。ホストの情報を受け取ることを許可するために "Accept & Save" ボタンをクリックします。(2回目から、このダイアログは表示されなくなります)

MacSSH12

次にパスフレーズの入力を求めるダイアログが出るので、パスフレーズを入力してサーバーにログインします。

MacSSH13

認証が成功すると通常の telnet と同じ操作が行えるようになります。

MacSSH14

 

● Java で書かれた MindTerm というSSH 対応ターミナルエミュレータを利用する方法

MindTerm は、Mindbright Technology (http://www.mindbright.se/mindterm/)が Free で公開している SSH 対応のターミナルエミュレータです。ZIP で圧縮された最新版のバイナリーを入手し、解凍して下さい。さらに、Java で動作するため Apple から MRJ SDK (http://developer.apple.com/java/) を入手してインストールします。

MRJ SDK をインストールすると、Tools の中に JBindery というプログラムを見つけることが出来ます。

MindTerm1

ここで、JBindery を起動し、File メニューの「Open...」を選び mindtermfull.jar を開きます。

MindTerm2

次に、Class name: として mindbright.application.MindTerm を指定します。

MindTerm3

この後、File メニューの「Save As...」を選びアプリケーションとして保存します。

MindTerm4

ここで、JBindery は終了してください。(Run ボタンを押して MindTermを起動しても構いません)
JBindery で作成した MindTerm.App を起動します。

MindTerm5

以下のような画面があらわれます。

MindTerm6

Settings メニューの「SSH Connection...」を選び Serverや Username、Authenticationを rsa にして秘密キー(identity) をセットします。

MindTerm7

OK ボタンで gateway.foobar.co.jp の接続に行きます。

MindTerm8

パスワードの入力を要求されるので、パスフレーズを入力します。これで、gateway.foobar.co.jp にログインできます。

MindTerm のポートフォワーディング機能を利用し、ポート23 の通信路を暗号化して BetterTelnet や NCSA Telnet の日本語版でアクセスする方法もあります。
手順は、MindTerm の Tunnels メニューから「Basic...」を選び、 表示されたウィンドウで Local Port:23protocol: として telnetRemote host:gateway.foobar.co.jp を入力して Add ボタンをクリックすることで設定されます。あとは BetterTelnet などで localhost にアクセスすることで、MindTerm で指定した gateway.foobar.co.jp にログインできます。 ポートフォワーディングを利用することで、RSA, DSA認証機能はないがアプリケーションでやりとりされるデータはSSHの通信路を通るので盗聴されても情報が漏れる危険性が少なくなります。

* ポートフォワーディング

SSHには、任意のTCP/IPアプリケーションでやり取りされるデータを、SSHサーバとSSHクライアント間の暗号化された通信路を利用可能にするポートフォワーディングと呼ばれる機能があります。この機能を利用して、ネットワークにパスワードを流す telnet や POP, FTP の通信を安全なものにすることができます。通信全体が暗号化されるため、パスワードだけでなく通信内容すべてが保護されます。