はじめに
1年ほど前にHomebridgeのプラグインを利用して、リモートでPCを起動したりシャットダウンできるようにしました。
その時に書いた記事ではnet rpcコマンドを利用してPCをシャットダウンしているのですが、net rpcコマンドではパスワードが平文で送信されます。また、Homebridgeで利用しているプラグインの設定ファイルにパスワードを記載する必要があり、こちらも平文で保存されます。そのため、公式では推奨されない方法となっています。
平文での保存を避ける方法として、今回はSSHキーを利用してシャットダウンの操作をできるようにしていきます。
環境
環境に関しては以前とほぼ変わりありませんが、念のために紹介しておきます。
- Homebridgesサーバー
Lenovo Miix 2 8
Xubuntu 22.04.5 LTS - ホストPC
自作PC
OS:Windows 11 Home 24H2
マザーボード:TUF GAMING B560M-PLUS
CPU:Core i5-11400
メモリ:CMG16GX4M2E3200C16 (CORSAIR DDR4-16GB 3200MHz 8GB*2)
SSD:INTEL SSDPEKKF512G8L (512GB スロット1 D:)
WD BLACK SN7100 2TB (2TB スロット2 C: OSインストール)
HDD:WD80EFPX-68C4ZN0 (8TB E:) - いくつかのiOS端末
また、作業の際にWindowsのPCで以下のソフトを使用しています。
- PowerShell
- TeraTerm
- WinSCP
- サクラエディタ
Windows側でOpenSSHサーバーを立てる
SSHを利用するのでWindows側でOpenSSH サーバーを有効化します。
設定→システム→オプション機能→オプション機能を表示または編集するの機能を表示→追加可能な機能を表示するの中にOpenSSHサーバーがあればそれを有効化します。

この中になければPowerShellを管理者権限で実行し
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
を実行してインストールします。
Operation
Running
[ooooooooooooooooooooooooooooooooo ]
こんな感じでインストールが始まります。
おま環かもしれませんが、設定にOpenSSH サーバーがなかったのでPowerShellでインストールしましたが、かなり時間がかかりました。
インストールが終わったので動作確認をします。
Get-Service -Name sshd
RunningになっていればOKです。
次にサービスの起動と自動起動を設定しておきます。
Windowsツールのサービスでも設定できますが、ちょうど管理者権限のPowerShellを開いているので
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'
でサービスの起動と自動起動を設定します。
ファイアウォールの確認もしておきます。
Get-NetFirewallRule -Name *ssh*
表示された結果にEnabled:Trueと表示さていればOKです。
次にsshdの設定を変更します。
設定の変更は管理者権限が必要なので、管理者権限でPowerShellを起動し、
notepad C:\ProgramData\ssh\sshd_config
を実行します。管理者権限のメモ帳でsshd_configが開かれます。
まず、一番下にある
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
この2行を無効化します。
#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
#でコメントアウトして無効化しています。
よくわかりませんがこの2行を無効化していないとうまく接続できないようで、ネット上でも無効化すべきと至る所で書かれています。
次に
# Authentication:
#LoginGraceTime 2m
#PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
の下あたりに
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
を追記します。
PubkeyAuthentication yesで公開鍵認証の有効化、AuthorizedKeysFile .ssh/authorized_keysで鍵のパスを指定しています。
PasswordAuthentication no
を追記することでパスワード認証を無効化することもできます。
SSHキーの作成、登録
鍵の作成
WindowsにSSHサーバーの設定が終了したので、SSHキーの作成と登録を行います。
鍵の作成はHomebridgeサーバーにしているLinux上で行います。
TeraTermで接続し、
sudo -u homebridge ssh-keygen -t ed25519 -f /home/homebridge/.ssh/id_ed25519
と入力して鍵を作成します。
パスフレーズは省略しました。
この時に-f /home/homebridge/.ssh/id_ed25519でディレクトリをしています。
HomebridgeでSSHを利用してシャットダウン操作をするとき、操作するユーザーはHomebridgeになるためです。/home/homebridge/のディレクトリに作成するには管理者権限が必要なのでsudoを入れて実行する必要があります。
鍵の種類はEd25519にしました。
次に権限をHomebridgeのみアクセス可能に変更しておきます。
chmod 600 /home/homebridge/.ssh/id_ed25519
chmod 644 /home/homebridge/.ssh/id_ed25519.pub
秘密鍵はHomebridgeのみ読み書き可能、公開鍵はHomebridgeは読み書き、他は読み込み可能に設定します。
鍵の登録
次にWindowsに公開鍵を登録します。
今回初めてSSHサーバーを利用するという状況であればC:\Users\(ユーザー名)\.ssh にauthorized_keysはないと思います。
なのでWinSCPを利用してLinuxの/home/homebridge/.sshからid_ed25519.pubをコピーしてauthorized_keysにリネームします。
既にauthorized_keysが存在する場合やWinSCPをインストールしていない場合などはTeraTermでLinuxに接続して
sudo -u homebridge cat /home/homebridge/.ssh/id_ed25519.pub
を実行すれば公開鍵の内容が表示されるので、C:\Users\(ユーザー名)\.ssh\authorized_keysに記載する形でも大丈夫です。
この形で登録する場合はサクラエディタなどを利用してUTF-8、BOMなし、改行コードLFで保存します。
また、公開鍵は1行で記載する必要があるので、余分な空白や改行がないか確認してください。
次に、権限の変更を行います。
所有者のみが読み書きできる設定にします。Linuxのパーミッションでいうところの700にします。
# フォルダ
icacls C:\Users\(ユーザー名)\.ssh /inheritance:r
icacls C:\Users\(ユーザー名)\.ssh /grant:r sato:F
# ファイル
icacls C:\Users\(ユーザー名)\.ssh\authorized_keys /inheritance:r
icacls C:\Users\(ユーザー名)\.ssh\authorized_keys /grant:r (ユーザー名):F
継承の無効化をして権限を削除してから所有者のみにフルアクセス権限を与えています。
Homebridgeの設定
Homebridgeで使用しているプラグインの設定を変更します。

Shutdown configurationのShutdown commandを
ssh (ユーザー名)@(IPアドレス) "shutdown /s /f /t 0"
にします。
これでSSHキーを利用してシャットダウンを行えるようになります。
net rpcコマンドを利用していたときのようにパスワードを記述する必要はありません。
おまけ iOS端末からSSHを利用して電源の操作を行う
Homebridgeを使用することでiOSのホームアプリからPCの起動とシャットダウンはできるようになりましたが、せっかくなのでショートカットを利用してスリープと再起動もできるようにしていきます。
ショートカットの新規作成

ショートカットの新規作成からアクションを追加していきます。
今回はメニューから選択を使用して動作を選択できるようにします。
メッセージに動作の選択、項目はスリープ、シャットダウン、再起動の3つにしています。
シャットダウンの動作

それぞれの項目にメニューを追加していきます。シャットダウンはHomeアプリで操作できるので、ホームをコントロールのアクションを利用して操作するようにしています。
再起動の動作

次に再起動の項目を設定します。
再起動はSSH経由でスクリプトを実行のアクションを利用します。
shutdown /r /t 0
スクリプトの欄は上記のように入力します。ちなみに/rを/sにすればシャットダウンになります。/t nで実行するまでの時間を秒単位で指定できます。
SSHの設定
ホストの項目には操作したいPCのIPアドレスを、ユーザーは操作したいPCのユーザー名を入力します。
認証はパスワードからSSHキーに変更します。SSHキーはed25519キーにしました。

SSHキーを選択すると上記のようなポップアップが出ます。公開鍵をコピーをタップしてクリップボードにコピーしてなんらかの方法で操作したいPCにペーストしてauthorized_keysに追記します。私の場合はiCloud経由で行いました。authorized_keysに追記するときは元々記載してあるキーの下に改行して追加していきます。ここでも余計な改行や空白が入らないように注意します。
また、ショートカットアプリで作成したショートカットは同じiCloud IDでログインしている全てのデバイスで使用可能ですが、デバイスごとにSSHキーは異なるので使用したいデバイスすべての公開鍵をauthorized_keysに追記する必要があります。
なおauthorized_keysに記述するとき、SSHキーの空白より後ろは無視されるため、コメントを入れることができます。デバイスの名前などを入れて区別できるようにしておくと管理がしやすくなると思います。
# 公開鍵のサンプル
ssh-ed25519 AAAAB3NzaC1lZDI1NTE5QVdFUlRZU0FNUExFTkVYQU1QTEUgU0FNUExFX0JMVUU= hoge@piyo
上記サンプルでは鍵の最後の=とhoge@piyoの間にスペースが入っているのでhoge@piyoはコメントとなり自由に記述できます。
スリープの設定
スリープも再起動と同様にSSH経由でスクリプトを実行のアクションを利用します。

コマンドは再起動やシャットダウンと異なり
rundll32.exe powrprof.dll,SetSuspendState sleep
上記のコマンドを利用します。
スクリプト以外の項目は再起動と同様に設定します。
最後に
SSH認証を利用することで、Homebridgeのプラグインを利用したシャットダウン操作の設定を平文でパスワードを記入することなく出来るようになりました。副産物としてiPhoneなどからSSH接続でシャットダウン以外にも再起動とスリープが出来るようになりました。
Homebridgeの設定から1年ほど放置していたのは、自分に知識がなかったことが原因だったのですが、AIという手軽に聞けて頼りになるやつが現れて大変助かっております。もちろんAIも完璧ではないので、回答が正しいか検証したりすることは必要ですが、ない時代と比べるとやり方をとても調べやすくなったと思います。
恐らくAIがなければ平文でパスワードを保存せずに実行できる設定って何?で終わっていますので、今後もAIをうまく活用していきたいですね。