ChromebookのLinuxコンテナにSSHでログインする
ChromebookのLinuxコンテナは、外部のPCからSSH(Secure Shell)経由でログインして使えるので、いろいろ遊べる。
必要な設定は、chromeOS的にはポート転送の設定だけでよく、他はLinuxコンテナとクライアントの普通のSSHの設定。Chromebookを意外と簡単にサーバー化できた。
Googleらしいのは、chromeOS上で仮想マシンが動いて、その中でLinuxコンテナが動いて、とても複雑なことをしているわりに、設定はポート転送だけ、あとは普通に動くというのは、やはりすごいことではないだろうか(標準のLinuxコンテナのDebian 11に限った話かもしれない)。
Windows 10のWSLでも、同様のことはできるが、Chromebookほどエレガントではないので、余計にそう感じるのだ。
LinuxコンテナにSSHでログインするのに必要な設定は、次の4点。
- chromeOSのポート転送の設定
- LinuxコンテナのSSHサービスの設定
- Linuxコンテナのユーザーの設定
- SSHクライアントの設定
最初のポート転送だけがchormeOS固有の設定で、他は、普通のSSHの設定の話だ。
chromeOSのポート転送の設定
ポート転送の設定は、設定アプリからおこなう。
詳細設定 > デベロッパー > Linux開発環境を開いて、ポート転送 を選択。
追加ボタン押下で、SSH用のポート番号を追加する。使用できる番号は、1024から65536の範囲。
追加できたら、右側のスイッチをONにし、ポートを有効にする。
Linuxコンテナを起動していないと、このスイッチは操作できない。有効にした後に、Linuxコンテナを停止したり、Chromebookを再起動したりすると、無効に戻ってしまう。
LinuxコンテナのSSHサービスの設定
ここからは、Linuxコンテナの設定。 これらのは内容は、SSHの普通の設定の話なので、Chromebook的には重要なことではない。
Chromebookのターミナルアプリを起動し、まずは管理者権限が必要なSSHサービスを設定する(正確には、Debian 11の設定)。
ファイル sshd_not_to_be_run
ファイル/etc/ssh/sshd_not_to_be_run
を削除かリネームする。
このファイルが存在するとSSHのサービスがスタートに失敗するようになっている。
$ sudo rm /etc/ssh/sshd_not_to_be_run
sshd_configの編集
次に、/etc/ssh/sshd_config
を編集する。
設定例は次の通り。
Port 12345
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
PermitRootLogin no
UsePAM no
AcceptEnv LANG LC_*
一行目のPort
は、前述のポート転送と同じ番号を指定する
ログインの認証方法は、公開鍵認証(PubkeyAuthentication)を有効にし、パスワード認証(PasswordAuthentication)は無効にしている。
しかし、SSHの公開鍵の設定が完了するまでは、パスワード認証も有効にして、とりあえずログインができるかを確認したほうがいいと思う。
sshd.service sshサービスの起動
設定ファイルの修正が終ったら、systemctl
コマンドでサービスを起動する。
$ sudo systemctl restart sshd.service
パラメータのrestart
は、サービスが起動していなければ、自動でstart
になるので、わざわざstart
を選ぶ必要はない。
設定ファイルを修正したら、その都度このコマンドを実行し、修正を反映させる。
SSHサービスが正常に動作しているかは、次のコマンドで確認できる。
$ sudo systemctl status sshd.service
結果がActive: active (running)
であれば、、サービスは起動している。
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Drop-In: /run/systemd/system/service.d
└─zzz-lxc-service.conf
Active: active (running) since Mon 2022-06-19 20:31:59 JST; 14min ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 8502 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 8503 (sshd)
エラーのときはこんな感じ。
Active: failed (Result: exit-code) since Mon 2022-06-19 20:33:31 JST; 16min ago
Linuxコンテナのユーザー設定
次は、一般ユーザーの設定。
ユーザーパスワードの設定
Chromebookのターミナルアプリを起動すると、デフォルトユーザーでログインした状態になっている。このユーザーには、最初はパスワードが設定されていない。
もしSSHのパスワード認証(PasswordAuthentication)でログインできるようにするには、パスワードの登録が必要になる。passwd
コマンドで設定しておく。
sudo passwd ユーザー名
公開鍵認証の設定
公開鍵認証(PubkeyAuthentication)でログインするためには、クライアントの公開鍵をLinuxコンテナに持ってくる必要がある。
ホームディレクトリ配下の~/.ssh/authorized_keys
に、接続を許可するクライアントの公開鍵の内容を追記すればよい。
手動で公開鍵をコピーしてもいいが、クライアント側でssh-copy-id
コマンドを実行したほうが簡単である(後述)。
クライアントの設定
ここからは、クライアント側の設定なので、MacやWindowsのターミナルアプリでの作業になる。
最低限の動作確認
しかし、パスワード認証でログインするだけなら、設定は不要で、必要なのはLinuxコンテナのユーザーとパスワードだけである。
仮にchromebookのユーザー名がlinuxuser、ホスト名がchromebookとすると、次のようにSSHを実行する。パスワードを入力すれば、ログインできるはず。
$ ssh -p 12345 -l linuxuser chromebook
linuxuser@chromebook's password: XXXXX # パスワード入力
これがうまくいけば、Chromebookのポート転送が正しく設定されていることと、SSHの動作確認も最低限できたことになる。
公開鍵認証の設定
さらに、公開鍵認証でログインするための設定を書いていく。
しかし、公開鍵って何?みたいな人は、そもそも、この記事を読んだりしないので、説明は不要ではないかと思うのだが、一応、書いておく。
鍵ファイルの作成
公開鍵と秘密鍵のファイルは、ssh-keygen
コマンドで作成する。
引数なしで実行し、必要な項目を入力すれば、OK。セキュリティの観点からは、要検討だと思うけれど、とりあえず、デフォルトのままで、パスフレーズだけ登録する。
鍵ファイルは、~/.ssh
ディレクトリにつくられる。アルゴリズムはRSA
がデフォルトなので、ファイル名は次のようになる。
~/.ssh/id_rsa
~/.ssh/id_rsa.pub
拡張子.pub
のほうが公開鍵で、名前の通り、公開することが前提のファイル。一方のファイルは秘密鍵なので、絶対に外部に漏らしてはいけない。
パーミッション
~/.ssh
ディレクトリのパーミッションが自分にしかアクセスできないことを確認する。
~$ ls -ld .ssh
drwx------ 1 macuser macuser 62 Jun 24 15:14 .ssh
各ファイルのパーミッションも、公開鍵以外は、自分にしか読みとりできないことを確認する。
~$ ls -l .ssh
total 12
-rw------- 1 macuser macuser 401 Jun 24 15:14 authorized_keys
-rw------- 1 macuser macuser 2602 Jun 24 15:11 id_rsa
-rw-r--r-- 1 macuser macuser 567 Jun 24 15:11 id_rsa.pub
上記のid_rsa.pub
の内容を、Chromebookのlinuxuser側の.authorized_keys
ファイルに追記することで、公開鍵認証によるログインができるようになる。
ssh-copy-idコマンド
前述した、ssh-copy-id
コマンドを使うと、クライアントの公開鍵ファイル~/.ssh/id_rehsa.pub
を、Chrombookのlinuxuserに自動的にコピーしてくれる。使い方はこんな感じ。
$ ssh-copy-id -i .ssh/id_rsa -p 12345 linuxuser@chromebook
ssh-copy-id -i 公開鍵 -p ポート番号 ユーザー@ホスト名
SSHコマンドでログイン
一通り設定ができたら、SSHでログインしてみる。
$ ssh -p 12345 -l linuxuser chromebook
Enter passphrase for key '/Users/macuser/.ssh/id_rsa':
penguin ~
パスフレーズを入力して、ログインできれば、OK。
明示的にパスワード認証を指定するために、オプション-o "PubkeyAuthentication no"
を付与すると、パスワード認証になる。
$ ssh -p 12345 -l linuxuser -o "PubkeyAuthentication no"chromebook
linuxuser@chromebook's password:
オプション-o "PubkeyAuthentication yes"
だと、公開鍵認証でログインできる。挙動の違いを確認して遊んでみるのがよい。
$ ssh -p 12345 -l linuxuser -o "PubkeyAuthentication yes"chromebook
linuxuser@chromebook's password:
Enter passphrase for key '/Users/macuser/.ssh/id_rsa':
公開鍵認証が成功したら、パスワード認証は不要なので、/etc/ssh/sshd_config
のPasswordAuthentication
はno
に変更するのがよいと思う。
注意点
Chromebookは、Linuxコンテナは、あくまで開発環境として用意されているのであって、サーバー的に常用するには制約がある。
Linuxコンテナは自動起動できない
なにかのきっかけでChromebookが再起動した場合、Linuxコンテナは、手動での起動が必要になる。自動で起動させるような設定は今のところ用意されていないようだ。
ポート転送が無効になる
最初に説明したように、ポート転送の設定は、Linuxコンテナを一度終了すると、無効に戻ってしまう。再び設定アプリを起動し、手動で有効に変える必要がある(ポート転送の設定自体は残っているので、スイッチを有効にするだけだが)。
Chromebookのアイドル状態
Chromebookの電源管理は、アイドル状態のモードが選べる。充電時とバッテリー駆動時それぞれ3つのモードを決めるようになっている。
- スリープモードにする
- 画面オフにする
- 画面をオンのままにする
バッテリーのことを考えると、スリープモードにしたいところだが、スリープモードは、SSHでログインして使っていても、Chrombook本体を操作しなければ、スリープモードに入ってしまう。クライアント側のターミナルのフリーズに気付いて、Chromebookのほうを操作すれば、スリープから復帰して、クライアントも復帰する。いちいちこんなことしなくても、そこはGooleらしく自動的にうまくやってくれるといいのだが・・・。
chromeOSのチャンネルをベータ版や開発版に変更すれば、このような制限を回避する方法が提供されていないかと思うが、試したことがないのでわからない。
Chromebookは、Googleらしく自動化が特徴になっていると思うので、妙に設定項目は増やさずに、このままシンプルで、いい感じに自動的にやってくれるのが理想的だと思う。
動作確認の環境
chromeOS version: 102.0.5005.75(Official Build) (64 ビット)