SSH2: Secure Shell の利用 (PuTTY, WinSCP)

以前、SSH1, SSH2 の両方をサポートした環境を構築しましたが、今回は SSH2 に特化した環境を構築します。 また、キー認証のみの設定で、UNIX パスワードによる認証は行えないように設定しています。

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

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

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

openssl-0.9.8h.tar.gz
(http://www.openssl.org/)

zlib-1.2.3.tar.gz
(http://www.zlib.net/)

openssh-5.1p1.tar.gz
(http://www.openssh.org/)

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

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

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

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

# 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 ... が作成されます。

● OpenSolaris で簡単インストール(スーパーユーザーで作業)

# gzip -dc openssh-5.1p1.tar.gz | tar xf -
# cd openssh-5.1p1
# ./configure --with-ssl-dir=/usr/sfw
# make
# groupadd sshd
# useradd -g sshd -s /bin/false sshd
(sshd ユーザーが存在していなければ登録。安全運営のためシェルやパスワードなどをきちんと設定しね。)
# make install

* サーバーの起動

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

#   $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
 
# 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
#ListenAddress 0.0.0.0
#ListenAddress ::
 
# Disable legacy (protocol version 1) support in the server for new
# installations. In future the default will change to require explicit
# activation of protocol 1
Protocol 2
 
# 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 1h
#ServerKeyBits 1024
 
# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
#LogLevel INFO
 
# Authentication:
 
#LoginGraceTime 2m
PermitRootLogin no                      # root によるログインを禁止する
StrictModes yes                         # キーを保管するディレクトリ等のパーミッションを検査
#MaxAuthTries 6
#MaxSessions 10
 
RSAAuthentication no                    # RSA による認証を禁止する (SSH1)
PubkeyAuthentication yes                # PublicKey による認証を許可する
AuthorizedKeysFile .ssh/authorized_keys
 
# For this to work you will also need host keys in /usr/local/etc/ssh_known_hosts
RhostsAuthentication no                 # rhosts による認証を禁止する
# similar for protocol version 2
HostbasedAuthentication no              # ホストベースによる認証を禁止する
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes                        # .rhosts を無視する
  
# 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
#KerberosGetAFSToken no
 
# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCreds yes
 
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
#UsePAM no
 
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#UsePrivilegeSeparation yes
#PermitUserEnvironment no
#Compression delayed
ClientAliveInterval 60   # クライアント生存チェック:一定時間レスポンスが無くても接続を切らないようにする
#ClientAliveCountMax 3
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10
#PermitTunnel no
#ChrootDirectory none
 
# no default banner path
#Banner none
 
# override default of no subsystems
Subsystem   sftp    /usr/local/libexec/sftp-server
 
# Example of overriding settings on a per-user basis
#Match User anoncvs
#   X11Forwarding no
#   AllowTcpForwarding no
#   ForceCommand cvs server

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

# /usr/local/sbin/sshd

Secure Shell サーバーをシステム起動時に動作させるように /etc/rc.local/etc/rc.d 等に追加しておくと良いでしょう。Linux で /etc/rc.d/init.d/sshd がすでにある場合は、内容を /usr/local/sbin/sshd 用に書き換えて使用すると簡単です。Solaris 10 (OpenSolaris) の場合は、/lib/svc/method/sshd を書き換えると簡単です。

OpenSolaris はデフォルトでは、OpenSSH が利用する syslog のファシリティー(AUTH) およびログレベル(INFO) が有効になっていません。ログを出力したい場合、OpenSSHの設定(/usr/local/etc/sshd_config)を変更するか /etc/syslog.conf に追記してください。

* RSA,DSA認証キーの作成

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

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

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

  user01@server$
  user01@server$ 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@server.foobar.co.jp
  user01@server$
  user01@server$ 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@server.foobar.co.jp
user01@server$ user01@server$ cd .ssh user01@server$ cp id_rsa.pub authorized_keys user01@server$ cat id_dsa.pub >> authorized_keys user01@server$ 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 user01@server$

【公開キー】

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

【秘密キー】

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

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

* 実際のログイン

幾つかコマンドが用意されていますが、詳しくはドキュメントを読んで下さい。それでは、早速ログインする手順について記述します。 server.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 server.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 key '/home/shin/.ssh/id_rsa': (パスフレーズ)
Last login: Wed Sep 26 10:07:04 2001 from server.foobar.co.jp
Sun Microsystems Inc.   SunOS 5.8       Generic February 2000
user01@server$ 

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

一定時間レスポンスがない用なときに、セッションが切れてしまうのをクライアント側で防ぐには $HOME/.ssh/configServerAliveInterval 60 を記述しておくとよい。

【Windowsの場合】

Windows の場合、いくつか Secure Shell 対応のターミナルソフトがありますが、SSH2 に対応している PuTTY を利用します。PuTTYは、Simon Tatham 氏が作成した Windows 上で動作するターミナルソフトです。ここで使用するのは、この PuTTY を hdk氏が日本語化したものを利用します。

まず、オリジナルの PuTTY のインストーラーをダウンロードしてインストールします。次に、日本語化された PuTTY をインストールディレクトリー(デフォルト C:\Program Files\PuTTY )に展開します。ショートカットの作成やプログラムメニューへ追加しておくと便利です。

PuTTY http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
PuTTY JP http://hp.vector.co.jp/authors/VA024651/download.html

Pageant PuTTY, PSCP, Plink 用 SSH 認証エージェント
PSFTP SFTP クライアント (Secure FTP)
PuTTY Telnet/SSH クライアント
PuTTYgen RSA キー生成ユーティリティ
puttyjp.exe PuTTY の日本語対応版

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

OpenSSH で作成した秘密キーは PuTTY でそのまま利用することはできません。そこで、PuTTYgen (puttygen.exe) を利用して変換します。

putty.exe

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

PuTTY1

ここで、Load ボタンを押して、秘密キー id_rsa ファイル(C:\Program Files\PuTTY\id_rsa)をロードします。「ファイルの種類」を「All Files」にしないと表示されません。秘密キーには、ssh-keygen で作成したときにパスフレーズをセットしているので以下のようにパスフレーズの入力を求められます。

PuTTY2

パスフレーズが正確に入力できたら、以下のように PuTTY 用の秘密キーが作成できたことがわかります。

PuTTY3

"Save private key" を使って PuTTY用の秘密キーを保存しろとのメッセージ従ってファイルに保存します。

PuTTY4

Save private key:」ボタンを押し秘密キーをファイルに保存します。 保存するファイル名を id_rsa と指定すると id_rsa.PPK というファイルが作成されます。(C:\Program Files\PuTTY\id_rsa.PPK

これで、秘密キーができたので SSHクライアントである PuTTY 日本語版(puttyjp.exe) を起動します。

puttyjp.exe


起動したら、カテゴリーSSH のプロトコルの設定で「2 only」を選択する。SSH2 に特化した設定なので他のバージョンには見向きもしない。

PuTTY5

PuTTYgen で変換した秘密キー (id_rsa.PPK) を、カテゴリー認証で指定する。

PuTTY6

カテゴリー外観で、日本語のフォントを選んでおきます。デフォルトのフォントでは小さいので変更しておいた方がよい。

PuTTY7

カテゴリーセッションで接続する「ホスト名」、「プロトコル」、「保存されたセッション」を指定して「保存」ボタンを押して、これまでの設定を「保存されたセッション」で指定した名前で登録します。

PuTTY8

保存してセッションを選んで「開く」ボタンを押すと、SSH によるサーバーへのログインセッションが開始されます。セッション名をダブルクリックしても開始します。

初めてのサーバーへのログインなので以下のようなホストキーの登録を促すメッセージが表示されます。「Yes」ボタンを押してログインプロセスに進みます。「Yes」ボタンを押すと、2回目以降は表示されません。

PuTTY9

login as:」でアカウント名を指定するとパスフレーズの入力を求められるので、パスフレーズを入力してサーバーにログインします。

PuTTY10

パスフレーズが正しく入力されると、サーバーへログインができます。

PuTTY11

ここまでは、サーバーにログインできるようにするまでの必要最低限の設定を説明しました。デフォルトで、EUC を扱えるようになっているので日本語も問題なく表示できます。

PuTTY は、カテゴリー接続で「自動ログインのユーザー名」を登録できたり、カテゴリー変換で文字コードを変更、カテゴリーでウィンドウの色を細かく設定することもできます。それぞれのカテゴリーで自分好みの PuTTY になるように設定してください。

● Windows 側でキーを作成したいなら

サーバー側で作ったキーを元に説明しましたが、PuTTYgen (puttygen.exe) を利用して新規にキーのペア(公開キー、秘密キー)を作成して公開キーをサーバーに登録することも可能です。

PuTTYgenの「Parameters」で SSH2 RSA (これまで、RSA 認証で説明したが DSA 認証にしたければ SSH2 DSA)を選択して「Generate」ボタンを押します。 blank area でマウスをグルグル動かしているとキーができあがるので、「Key passphrase」「Confirm passphrase」にパスフレーズを入力して「Save public key」および「Save private key」ボタンで公開キーと秘密キーをファイルに保存します。

秘密キーは、PuTTYのカテゴリー認証で指定します。公開キーは、サーバーに登録します。PuTTYgen で作成した公開キーが pc-id_rsa.pub とすると

  user01@server$ ssh-keygen -i -f pc-id_rsa.pub > pc-id_rsa_openssh.pub
  user01@server$ cat pc-id_rsa_openssh.pub >> ~/.ssh/authorized_keys
  user01@server$ rm pc-id_rsa.pub pc-id_rsa_openssh.pub

Windows 側で作った公開キーを、ssh-keygen コマンドを使用して OpenSSH 用に変換して登録します。

● ファイルの転送も安全に(WinSCP)

ファイルの転送を安全に行いたい場合も、Martin Prikryl 氏が開発した WinSCP というクライアントがあります。WinSCP は、PuTTY で作った秘密キーがそのまま使えるので容易に利用することが可能です。

WinSCP を起動したら、カテゴリーセッションで接続する「ホスト名」、「ユーザ名」、「秘密鍵」を指定して「ログイン」ボタンを押してログインの処理に入ります。「保存」ボタンを押して、これまでの設定を「保存されたセッション」で指定した名前で登録しておくと次回からログインが楽になります。SCP/SFTP のいずれを利用するかは目的に応じて...どちらも一長一短...。

WinSCP1

ログイン」ボタンを押すと以下のように、初めてのサーバーへのログインなので以下のようなホストキーの登録を促すメッセージが表示されます。「はい」ボタンを押してログインプロセスに進みます。「はい」ボタンを押すと、2回目以降は表示されません。

WinSCP2

パスフレーズの入力を求められるので、パスフレーズを入力してサーバーにログインします。

WinSCP3

パスフレーズが正しく入力されると、サーバーへログインします。