ククログ

株式会社クリアコード > ククログ > CygwinのOpenSSHサーバーに公開鍵を使ってログオンする方法

CygwinのOpenSSHサーバーに公開鍵を使ってログオンする方法

mingw-w64を使うことにより、GNU/Linux上でWindows用のバイナリーをビルドすることができます。GNUビルドシステムを使っている場合でもできますし、CMakeを使っている場合でもできます。(CMakeを使っている場合はRuby-GNOME2が指定しているようなオプションを指定するとビルドできます。)

GNU/LinuxでWindows用のバイナリーをビルドしていると、Windows上での動作確認もできるだけGNU/Linuxを使って実施したくなります。

その方法の1つにrdesktopを使ってGNU/Linux上からWindowsのデスクトップにアクセスする方法があります。rdesktopを使う方法は直接Windowsを使ったときと同じことをできることがメリットです。ただ、GNU/Linux上での操作感は失われます。

別の方法としてCygwinでOpenSSHサーバーを動かしてGNU/Linuxからログオンする方法があります。この場合、Cygwin上で実行するため、直接Windowsを使ったときと異なるケースがでてきます。たとえばパス区切り文字で違いがでます。一方、scpによるファイルコピーや、zshgrepを使ったコマンドラインベースの操作を使えます。これはGNU/Linux上からの操作をしやすくなるので非常に便利です。たとえば、make && scp xxx.exe windows-host:と実行すればビルドに成功したらそのままバイナリーをWindowsホストにコピーします。

通常のOpenSSHのセットアップでGNU/Linuxからログオンできるようになります。しかし、公開鍵を使ったパスワード入力無しのログオンはできません。パスワード入力が必須です。これでは前述の「ビルドに成功したらそのままバイナリーをWindowsホストにコピー」のために毎回パスワードを入力しなくてはいけなくて不便です。

ということで、公開鍵を使ったパスワード入力無しでログオンできるようにするOpenSSHのセットアップ方法を説明します。

通常のセットアップ

まずはsetup.exeを使ってopensshパッケージをインストールします。

その後、「管理者権限で」Cygwinのターミナルを起動してssh-host-configを実行します。

途中、次の質問があるので、それぞれ「(yes/no)」の右側に書いている値(「yes」だったり「no」だったり)を入力します。「CYGWIN for the daemon」のところは空でよいです。「Create new privileged user account ...」も「no」で大丈夫です。OpenSSHサーバー用に新しく特権ユーザーを作成しない場合はSYSTEMユーザーがOpenSSHサーバーを実行します。

*** Query: Should StrictModes be used? (yes/no) yes
*** Query: Should privilege separation be used? (yes/no) no
*** Query: Do you want to install sshd as a service?
*** Query: (Say "no" if it is already installed as a service) (yes/no) yes
*** Query: Enter the value of CYGWIN for the daemon: []
*** Query: Do you want to use a different name? (yes/no) no
*** Query: Create new privileged user account 'HOST_NAME\cyg_server' (Cygwin name: 'cyg_server')? (yes/no) no
*** Query: Do you want to proceed anyway? (yes/no) yes

これでOpenSSHサーバーsshdをサービスとして起動する準備ができました。

ただ、このまま起動してもファイアウォールで止められて外からアクセスできません。外からアクセスできるようにファイアウォールの設定をします。

同じターミナル(管理者権限のターミナル)でsshdを起動します。

% sshd -Dd

そうするとWindowsがポートが開いたことを検知してファイアウォールの設定に関するダイアログを表示します。ここで適切なネットワークに対してsshdのポートを開放します。

ファイアウォールの設定が終わったらCtrl-csshdを終了します。

ここまでが通常のOpenSSHのセットアップです。

公開鍵でログオンできるようにする

これまでの通常のOpenSSHのセットアップだけでは、公開鍵を利用したパスワード入力無しでのログオンができません。公開鍵を利用したパスワード入力無しでのログオンを実現するためにはsshdがパスワード無しでユーザーを切り替えられるようにする必要があります。パスワード入力が必要なのはsshdがユーザーを切り替えるためということです。

パスワードなしでユーザーを切り替えるためにLSA(Local Security Authority)認証という仕組みを使えます。いくつか欠点はありますが、SSHで接続してCygwin上で作業する分には困らないでしょう。

このあたりの詳細はCygwinが提供するSwitching the user contextというドキュメントを参照してください。前述の欠点についても説明があります。

LSA認証を有効にするには管理者権限のターミナルでcyglsa-configを実行します。途中で「yes/no」を聞かれるので「yes」と答えてください。

% cyglsa-config
...
Are you sure you want to continue? (yes/no) yes
...

Windowsを再起動するとLSA認証が有効になります。

接続する

これで公開鍵を利用したパスワード入力無しでのログオンができるようになりました。公開鍵のコピーにはssh-copy-idが便利です。もし、WindowsホストのIPアドレスが192.168.0.16の場合は次のようにすれば適切なパーミッションでWindowsホストへ公開鍵をコピーします。なお、このときはパスワードを使ってログオンします。

% ssh-copy-id 192.168.0.16

ssh-agentを使えば次のコマンドでパスワード入力無しでログオンできます。

% ssh 192.168.0.16

まとめ

パスワード入力無しでログオンできるようにCygwinのOpenSSHサーバーをセットアップする方法を説明しました。前述のCygwinのドキュメントなど英語での情報はありますが、日本語でのまとまった情報はなかったのでまとめました。

GNU/Linux上でクロスコンパイルしているときはSSHでWindowsにログオンできると便利です。他にも便利な機会はあるでしょう。そんなときはこの方法を活用してください。