もぐてっく

人は1つ歳をとるたび、1ビットづつ大きくなれると信じてた。

Windows10タブレットにMSYS2を入れてsshデーモンを立ち上げてみた

これまでのあらすじ

Windows10タブレットDELL Venue 8 Pro)に、Linuxっぽい環境を構築するMSYS2と、現時点で最強と思われるBluetoothキーボードのMicrosoft Wedge Mobile Keyboardを組み合わせて、外出先でも快適にRubyのコードが書ける環境を手に入れました。

しかしながら自宅に帰ればメイン環境のMacBookAirがある訳で、残作業をわざわざタブレットでするのもめんどい訳です。

なので、タブレットsshデーモンを動かしてMBAからリモートアクセスできる様にしました。
Windowsサービスなのでログインしてなくても電源を入れてればOKです。

sshデーモンの設定

まずはsshデーモンを設定していきましょう。
MSYS2 Shellを起動してください。

opensshのインストール

pacman -s openssh

鍵ペアの生成

他のディストリと違って、sshデーモン用の鍵は自動生成されないので作ります。

ssh-keygen -A

ユーザ作成

sshデーモンは一般的に管理者権限で起動します。

しかし、この状態で万一攻撃を受けた場合、システムへの被害が甚大になるので、sshデーモンは幾つかの処理を一般ユーザの権限で実行します。そのためUsersグループの一般ユーザのアカウントが必要になります。

ユーザアカウントの操作にはWindowsコマンドプロンプトを使います。

コマンドプロンプトを「管理者として実行」で起動してください。

今回はsshdと言うアカウントを作成します。

net user sshd /add /active:no

Windowsファイアウォールのルール作成

MSYS2 Shellで試しにsshデーモンを起動してみましょう。

/usr/bin/sshd

Windowsファイアウォールがサーバ待ち受けを許可するか聞いてくるので許可します。

他の端末からWindowsにログインする時のユーザ名とパスワードでログインできれば成功です。

ssh越しにみるとLinuxライクな何かにしか見えないですね。良い。

Windowsサービス化

次に、Windowsにログインしなくてもsshできるようにサービス化します。

サービス化には、同じくWindowsLinuxっぽいことをするcygwinの成果物を使用します。

  1. cygrunsrv:LinuxっぽいコマンドをWindowsサービス化する。
  2. editrights:ユーザアカウントに特殊な権限を付与する。

どちらのコマンドもpacmanからインストール可能なのですが・・・

pacman -S cygrunsrv editrights

何故かeditrightsはMSYS2 64bit版にしかありません。
今回のターゲットは32bitなWindows10タブレットなので、ソースからコンパイルします。

editrightsのコンパイル

pacman -S make gcc tar

curl -O http://ftp.jaist.ac.jp/pub/cygwin/x86/release/editrights/editrights-1.03-1-src.tar.xz

tar xvf editrights-1.03-1-src.tar.xz
tar xvf editrights-1.03-1.src/editrights-1.03.tar.bz2

cd editrights/
sed -i -e "s/stricmp/strcasecmp/g" main.c

make
make install

アカウントの追加

sshデーモンをWindowsサービス化するには特殊な権限を持つAdministratorsのアカウントが必要です。
sshdは内部でsetreuid()を呼びますが、Windowsサービスのユーザ("LocalService"とか)にはこれを呼ぶ権限がないためです。

こちらも、コマンドプロンプトを「管理者として実行」で作業します。
追加するユーザはcygrunsrvとします(パスワードもcygrunsrv)。

net user cygrunsrv cygrunsrv /add
net localgroup Administrators cygrunsrv /add

editrights -u cygrunsrv -a SeAssignPrimaryTokenPrivilege
editrights -u cygrunsrv -a SeCreateTokenPrivilege
editrights -u cygrunsrv -a SeTcbPrivilege
editrights -u cygrunsrv -a SeServiceLogonRight

sshデーモンをサービスとして登録する

サービス登録に管理者権限が必要なので、MSYS2 Shellを「管理者として実行」して作業します。

cygrunsrv --install sshd -u cygrunsrv -w cygrunsrv -p /usr/bin/sshd -a -D

cygeunsrv --start sshd

動作確認

一旦Windowsタブレットを再起動して、ログイン画面の状態で他の端末からssh接続してみます。
bashのプロンプトが出れば完成です。