OpenSSH for WindowsとRDP

やっとOpenSSH for Windows経由でRDPができた。メモを残す。

RDP(リモートデスクトップ)は基本的に、デフォルトのポート3389同士をあけておけば、RDPサーバーとなるWindowsをクライアントWindowsからリモートで接続して使える。
しかし、インターネットごしだと無用心なので、SSHのポートフォワーディングという機能を利用して、「トンネル」を作る。我が家のインターネットで正式に外部に向かってあけているポートはこのSSHだけ。

なお、ここでの前提はインターネットに22番ポートをあけ、SSH通信ゲートウェイとRDPしたいマシンが同じであることとしてます。

SSHによる公開鍵と秘密鍵を使ったユーザ認証

SSH1の話は完全に無視。SSH2のありがたいところは、パスワードの代わりに公開鍵と秘密鍵を利用することが出来る。
パスワードのように、パスフレーズというものを使うが、これは秘密鍵を使うための鍵と思っておけばいいだろう。

もちろん、あらかじめ公開鍵と秘密鍵のペアを作成し、接続するSSHサーバ側にクライアントの公開鍵を登録しておく必要がある。クライアント側が秘密鍵をもつ。この鍵で暗号化されたパスワードのやり取りが終われば、通常のDES3で暗号化される。素晴らしい!

(きちんと確かめていないが、OPENSSHサーバーは共通鍵の置き方として、
サーバーが必ず見に行くところ/etc/authorized_keysファイルにリストしておく方法と、ユーザーのhomeディレクトリにおく方法があるようだ。私はもっぱら/etc/authorized_keysファイルに羅列する、鍵束方法を使っている。)

OpenSSHの導入方法

OpenSSHはもともとLinux上で動作する。Windows上で動作させようと思ったらCygwinというWindows上でUnixインターフェースを提供する大きなパッケージ群の導入の必要がある。

一度、俺もOpenSSH動かしたさに導入したが、ほんとにデカい。邪魔。

同じことを感じる人は多いらしく、「SSHをWindowsで動かすためだけに、CygWinを導入するのはバカらしいよね」とCygWinからOpenSSHが動作するために必要なパッケージを作りなおしてくれたのがOpenSSH for Windowsだ。だから完全にGNU下のオープンソース。ありがたや、ありがたや。私が知る限りだが、WindowsをSSHサーバーにするには最もメジャーなパッケージのようだ。(商用製品もあります)

301 Moved Permanently

日立ソフト様が導入を丁寧に説明してくれてるので、「環境設定」の前までやる。

以下、コマンドプロンプトから。

0. > cd c:Program FilesOpenSSHbin

1.mkgroupコマンドで許可グループファイルをつくる。
(Windowsのローカルのみを許可)

> mkgroup -l >> ..etcgroup

2.ユーザーの権限ファイルを作る。
(Windowsのローカルのみを許可。つまりSSHではこのWindowsのログインユーザー名とパスワードを使うことを指定している。)

> mkpasswd -l -u username >> ..etcpasswd

*ココでusernameはサーバーマシンへログオンするためのユーザー名

ここまでは、ネット上によく出てる。

2. Configを変更。最低限以下をやる。

OpenSSHetcsshd_configを以下のようにかえる。
Protocol 2
# StrictModesとは、CygWinをCYGWIN=ntsecで動かしているモード
StrictModes no

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile /etc/authorized_keys

最低限はこれだけ。保管する。

3.サーバー側で公開鍵と秘密鍵をRSAで作る。
(クライアント側で作るとまったく違う作業となる)
> cd ..bin
で、ssh-keygenプログラムがあることを確認
> ssh-keygen -t rsa
と入力し、キーファイルをdocument and settingのどこか、などと聞かれる。
そこで、
   /etc/id_rsa
とこのとおり入力。
パスフレーズを二回(入力と確認)聞かれるので忘れないパスフレーズをいれる。

etc内に、ふたつのファイルができているハズ。id_rsaとid_rsa.pub
> copy id_rsa.pub  authorized_keys
コマンドで登録リスト作成。(もし、公開鍵がいくつかある時はこのファイルにマージしていくこと)
id_rsaはクライアントで使う、秘密鍵なので大事にメディアの保存する。

4.これでサーバーは起動できる。
> net start opensshd

クライアント側

puttyが世界的に人気なので導入する。
http://www.sodan.ecc.u-tokyo.ac.jp/2002/article/tips/ssh/putty.shtml

日本語パッチを上書き

●PuTTYgenを使って鍵を変更。
OpwnSSH for windowsで作った鍵はそのままputtyでは使えないらしい。
id_rsaキーをPutty形式に変換する。
puttygenでloadする。作ったパスフレーズを入れると画面にimportedとでる。
SSH-2 RSAに際下段のラジオボタンがセットされているのを確認してから、"save private Key"ボタンをおす。ファイル名id_rsa.ppkで保管。

あとから、puttyのダイアログでファイルのありかを指定するので、安全なところならどこでもいい。

とりあえず、ここでputtyからログインしてみましょう。

Puttyの構成
IPアドレスいれて、SSHになっているか確認。
セッションに好きな名前をいれる。

SSHのタブで認証パラメータに先のppkファイルを指定し、ロード。

SSH-認証のところに、先のid_rsaのありかを登録。

SSH トンネルで、

3390 → 22 — Internet — 22 SSH サーバー → 3389 RDPホスト

を思い描いて設定する。リモートのRDPしたいサーバーのアドレスとポートを192.168.1.1:3389という感じで設定する。

セッションを「保管」しとくと、次回に便利です。

つながるとユーザーIDを聞かれるので入力。パスフレーズを入れて接続。もし、パスフレーズをなしにしておくと、ほんとうにパスワードなしで繋がる。

Puttyはこのまま。RDPを立ち上げると、Windowsのユーザーログインダイアログが出てくくる。(ハズ)

クライアント側ポートを3390としたのは、3389は別にローカルで使うかも知れないので避ける。トンネリングなので、インターネットごしであっても自分のところに出ているポートと接続する。クライアントデスクトップにlocalhost:3390でログインする。

※以上、足掛け2ヶ月かかった設定でしたが、SSHがとおる環境ならどこからでも我が家のWindowsを扱えるようになった。

コメント

  1. 面白いブログですね。
    これからもチョクチョク見させていただきます。
    更新よろしくお願いします。

  2. dara-j より:

    バッチファイルでserviceコマンドもどき

    Windowsのバッチファイルでlinuxのserviceコマンドもどきを作るというバカなことを試みてみたり。誰かすでにやっていそうだけど。

    @echo off

    rem 'restart' の場合
    if "%2" == "restart" goto RESTART