戻る

Cygwinで便利!

OpenSSH は Cygwin のコア部分 (cygwin1.dll) と切り離せません。
そのため Cygwin のアップデートにともなって設定内容が大きく変化します。
私も各バージョンの Cygwin で OpenSSH を使えるようにするために、
今まで何度か設定の変更を必要とされました。
今後もその状況は変わらないと思いますので、
ここの記述を参考に設定しても OpenSSH が動かない場合は
いろいろと柔軟に設定してみてください。

(2003/08/03)
Cygwin 1.3.22 で OpenSSH をサービス化した場合は、
net コマンドなどの Windows Native のコマンドの
出力を受け取れない bug が存在します (情報ソース)
この回避方法は「SSH daemon を inetd 経由で起動すること」です。


なお、このページは Cygwin 1.3.22 を元に記述しました。
また、このページでの作業は Administrators に所属しているユーザで
行うことを想定しています。
戻る

OpenSSH を使う

なぜ OpenSSH を使うのか

いきなりですが、Windows をリモート管理することを考えてください。
何を思いつきますか?
この中で、コンシューマーレベルで使えて
(Windows 2000 Server は普通もってないでしょ・・・)
無料 (低価格) のもので、コンソールで使うもので、セキュリティを守れるもの・・
と選ぶと、おおむね Cygwin 上の OpenSSH になるでしょう。

というより、OpenSSH が有能すぎて、
メリットが多すぎて、それに対抗できるものがありません。
コンソールでリモート管理がしたいなら迷わず入れましょう。


また、GUI だけでリモート管理する場合は、
単体アプリなら pcAnyware がずば抜けてよいと思いますが、
結構金額が高いです。
これに対抗して OpenSSH (トンネリング) + VNC などを使えば、
ほぼ同じ事が 無料 で行えてしまいます。

私的には、「もう、入れるっきゃないよね!」 です。

必要なパッケージのインストール

私のページのインストール方法を使用した人は
特に確認する必要はありませんが、
それ以外の方法でインストールした人は Cygwin 本体以外に
以下のパッケージをインストールしておく必要があるので確認してください。
また、これらは Cygwin 本体と深くかかわっています。
必ず同時期に配布されているパッケージですべて統一してください。
一部分だけのアップデートなどを行ってはいけません。
そして、インストールは Cygwin 標準の setup.exe から実施しましょう。

OpenSSH サーバのセットアップ

パッケージのインストールが完了して、
準備が整ったら、OpenSSH を Windows 上のサービスにインストールしましょう。
本来、設定はかなり大変だったはずなのですが、
インストール用のスクリプトが準備されていて、Cygwin では比較的簡単です。

以下のコマンドを実行してください。
$ ssh-host-config
基本的にすべてに y と答えて、
# ホストキーを上書きするかどうかはきちんと考慮しましょう!
環境変数に CYGWIN=ntsec nosmbntsec とかを答えて
スクリプト完了後に再起動すれば
デフォルトのコンフィグで使えるようになります。

以上で、OpenSSH が "CYGWIN sshd" という名前でサービスに登録されました。

OpenSSH クライアントのセットアップ

OpenSSH で先ほどセットアップしたのは Server のほうです。
Server / Client モデルなので、次にクライアント側のセットアップが必要です。

OpenSSH サーバを利用したいクライアントマシンに、
クライアント側の設定を行います。
これまたインストール用のスクリプトが準備されています。

以下のコマンドを実行してください。
$ ssh-user-config
入力を求められるパスフレーズは人から推測されにくくて、
かつ、長さが長いもの (私は 16 文字) を考えた上で、
すべてのキーに同じ物を使ったほうが絶対良いです。
キーごとに使うパスワードが違うと、絶対痛いめをみるはずです。
# 試したことはありませんけど・・・。

以上で、OpenSSH クライアントの設定が完了です。

実際に使う

Server / Client モデルなので、サーバ側 & クライアント側両者について、
組み合わせた設定を行う必要があります。
セキュリティについて考えるときには、サーバの設定を締める ことになり、
クライアント側をそれに合わせて設定を行うようになります。

デフォルトのままなら、
$ ssh サーバのIPアドレス
でつながると思いますので、まずは接続を確認してください。
接続が確認できたら、そのあとはマニュアルやWeb、書籍を参照しながら
/etc/sshd_config とクライアントの設定をいじっていくことになります。
内容については SSH の仕組み自体も機能も複雑なので、
すべてを記述するのはとてもむりです。
# 私もすべてを知ってるわけじゃないですし
設定の詰め方は各自の努力次第です。

ただ、ひとつの参考として、私が用いている
「ガチガチのシステム」の作り方だけ述べましょう。
ルーズな方に移行するのは (比較的) 簡単ですから。


まずはサーバの設定は以下のコンフィグどおりです。
/etc/sshd.config
パスワード認証は行わず、SSH2 による公開鍵認証系だけを許可した設定です。
また、私は OpenSSH サーバとは別に、
パケットフィルタでソース IP を制御しているので、
設定していませんが、OpenSSH サーバだけで通信を制御する方は
/etc/hosts.allow や /etc/hosts.deny
を使うことをおすすめしておきます。
これがサーバ側の設定として最もカタイと思います。

次にクライアント側をこれに合わせて設定します。
認証が公開鍵暗号系なので、クライアント側の SSH2 の公開鍵をマージして
サーバ側の ~/.ssh/ 配下に authorized_keys という名称で
保存しましょう。
パーミッションは 644 で良いでしょう。
この作業は 各ユーザごとに行えば完了です。

この状態では、authorized_keys に対応した秘密鍵を持っている
クライアントのみが ssh で接続できるようになります。
かなりセキュアな環境に出来ると思います。
もちろん接続時は、SSH2 を許可して接続しましょう。
明示的に SSH2 で接続するならこんな感じになります。
$ ssh -2 -l "サーバ側でのユーザ名" "サーバのIPアドレス"


最後に、おすすめの書籍を一冊だけご紹介です。
OpenSSH セキュリティ管理ガイド

トラブルに対処する

OpenSSH を使うまでにはいくつかの難関があります。
  1. サービスを起動できるようにする
  2. クライアントが接続できるようにする
  3. セキュリティレベルを上げる
それぞれのおおむねの対処法を記述します。


「1. サービスを起動できるようにする」に引っかかったときは、
ほぼ間違いなく owner / group 及び パーミッションの設定依存です。
以下のように設定されていることが望ましいと思います。
(以下のものは標準の設定より、より現実的なパーミッションです)

/etc の内容(抜粋)
-rw-r--r--+   1 admin    admins       165 Jul 22  2001 ssh2.motd
-rw-r--r--+   1 admin    admins      1049 Sep 24 07:47 ssh_config
-r--------    1 SYSTEM   admins       668 Jul 22  2001 ssh_host_dsa_key
-r--r--r--    1 SYSTEM   admins       605 Jul 22  2001 ssh_host_dsa_key.pub
-r--------    1 SYSTEM   admins       530 Jul 22  2001 ssh_host_key
-r--r--r--    1 SYSTEM   admins       334 Jul 22  2001 ssh_host_key.pub
-r--------    1 SYSTEM   admins       883 Jul 22  2001 ssh_host_rsa_key
-r--r--r--    1 SYSTEM   admins       225 Jul 22  2001 ssh_host_rsa_key.pub
-rw-r--r--+   1 admin    admins      1655 Nov  4 23:15 sshd_config
/var の内容(抜粋)
drwx------+   2 SYSTEM   admins         0 Feb  1 07:12 empty/
drwxrwxr-x+   5 SYSTEM   admins      4096 Feb  1 16:38 log/
drwxrwxr-x+   2 SYSTEM   admins         0 Feb  1 16:40 run/
'ls -l' で表示される属性の一番右に "+" がついているのは
owner / group / other の rwx で表示できる以外のアクセス権が
ついていることを示していて、大雑把にいうと
NTFS 上のアクセス権設定で SYSTEM アカウントに
アクセス権 (フルコントロール) がついているということです。
# 詳しく知りたい方は getfacl と setfacl を調べてください

ですので、まずは上記の二つのディレクトリ配下に相当する
Windows 上のフォルダに対して、NTFS で SYSTEM ユーザに
フルコントロールのアクセス権を設定します。
その後、chown chmod で上記のようなアクセス権設定としましょう。
おそらく以上で起動できるようになると思います。

なお、起動できない対処をするとき、
ssh-host-config スクリプトと
/var/log/sshd.log が多くの情報を与えてくれます。
起動できなくて行き詰まったら、これらは必ず参照すべきです。



「2. クライアントが接続できるようにする」に引っかかった時は、
まず最初に /etc/hosts.allow /etc/hosts.deny に問題が無いか確認しましょう。
Cygwin の OpenSSH は /etc/hosts.allow /etc/hosts.deny を参照します。
これが問題なければ、サーバとクライアントのメッセージを詳細表示にして、
どこが問題なのか確認するしかありません。

サーバ側のメッセージを詳細にするには、
レジストリをいじるのが近道です。
"CYGWIN sshd" サービスを一度停止したあと、
以下のレジストリファイルで on/off を設定したあとで開始してください。
デバッグメッセージを on (debug_sshd.reg)
デバッグメッセージを off (normal_sshd.reg)
出力は /var/log/sshd.log に吐き出されます。

クライアント側のメッセージを詳細表示にするには
"-v" オプションをつけてください。
出来る限り多く情報がほしい場合は、"-v -v -v" オプションをつけてください。

あとは出力メッセージから問題解決を頑張ってください。
ちなみに公開鍵認証系では大抵、サーバに置いてある公開鍵の
パーミッションと所有権の問題でした。
その際に望ましい公開鍵のパーミッションは以下のとおり。

~/.ssh での 'ls -la' の内容
drwxr-xr-x+   2 k-square admins      4096 Feb  1 07:07 ./
drwxr-xr-x+   6 k-square admins      4096 Feb  2 23:39 ../
-rw-r--r--+   1 k-square admins      1013 Aug  1  2002 authorized_keys
-rw-r--r--+   1 k-square admins      2512 Aug  1  2002 authorized_keys2



「3. セキュリティレベルを上げる 」に引っかかった時は、
・・・難しいです。
情報を集めましょう。
これは個人で頑張ってもらうしかないです。
それでも分からなければ、私の例をそのまま真似てください。

便利な使用法

私もすべてのコマンドを使えるわけではありませんが・・・。
ポイントは、SSH2とポートフォワーディングとscpです。
セキュアに便利に使うためにもみんなで使っていきましょう!!
以下の例を参考にどうぞ。


基本的な接続
$ ssh -l サーバでのユーザ名 \
> -p サーバのポート番号 サーバのIPアドレス



ポートフォワーディング
$ ssh -l サーバでのユーザ名 \
> -C -N -L ローカルポート:サーバからみたあて先IP:あて先ポート
> -p サーバのポート番号 サーバのIPアドレス

ローカルの 5000 番ポートから 123.123.123.123 の OpenSSH サーバの
5900 番ポートに トンネルを張る場合の例は以下のとおり。
このとき、ローカルの 5000 番ポートに向けて通信を行うと、
123.123.123.123:5900 につながります。
VNC を使うときはこういう方法がおすすめです。
$ ssh -C -N -L 5000:127.0.0.1:5900 123.123.123.123

ローカルの 5000 番ポートから 123.123.123.123 の OpenSSH サーバを
経由して 123.123.123.254 の 23 番ポートに
トンネルを張る場合は以下のとおり。
このとき、ローカルの 5000 番ポートに向けて通信を行うと、
123.123.123.254:23 につながります。
リモートから ルータ (L3SW) を telnet で設定するときはこういう方法になります。
$ ssh -C -N -L 5000:123.123.123.254:23 123.123.123.123



scp (セキュアコピー)
$ scp -v \
> サーバでのユーザ名@サーバのIPアドレス:サーバ上のファイル名 \
> ローカルのファイル名

123.123.123.123 の OpenSSH サーバ上の /etc/man.config を
ローカルの /man.config としてコピーする例は以下のとおり。
$ scp -v 123.123.123.123:/etc/man.config /man.config
戻る

OpenSSH を使わなくなったら

Windows 上のサービスからアンインストール

Cygwin をアンインストールするときや、
OpenSSH を使わなくなったときなどはサービスからアンインストールしましょう。

以下のコマンドでアンインストールができます。
$ cygrunsrv -R sshd
サービスから名前が消えていることを確認してください。
Valid XHTML 1.0 Strict Valid CSS!
戻る