ラズパイ(Raspberry Pi 4B)をVisual Studio Codeでリモート操作する設定(備忘録)

ラズパイ4BとVSCodeをSSHリモートで接続する Raspberry Pi (ラズパイ)

    【目次】

    なぜVisual Studio Codeを使うことになったのか

  1. Visual Studio Code (VSCode)をダウンロードしてインストールする
  2. Visual Studio Codeを日本語化する(ラズパイ側は後の節で説明)
  3. ラズパイ側でviコマンドを使ってSSH設定する(sshd_config編集)
  4. VSCodeとラズパイをSSH接続し、リモート制御できるようにする
  5. SSHリモート上でラズパイ側のコマンドラインメッセージを日本語対応にする
  6. 最低限のセキュリティ設定
  7. ちょっとしたSSHトラブルシューティング
  8. VSCodeを完全削除(アンインストール)する方法
  9. まとめ

05.SSHリモート上でラズパイ側のコマンドラインメッセージを日本語対応にする

VSCode自体は日本語化できましたが、なぜかSSH接続のラズパイ側のコマンドラインメッセージは日本語化されていません。前回記事のImagerによるインストールで、ラズパイ側のロケール設定したはずなのに…。
そう言えば、ラズパイ側にディスプレイ接続した時のコマンドラインは全て英語でした。今さら気付いたのですが、つまりラズパイ側は日本語化されていなかったというわけです。

ということで、まずは下図の様に拡張機能を表示させてみると、Japanese Language Packのところに「SSH: xxxxxxx にインストール」という項目があったので、そこをクリックしました。

(図05-01)

拡張機能の Japanese Language Pack の 「SSH:ユーザー名 にインストール」をクリック

拡張機能の Japanese Language Pack の 「SSH:ユーザー名 にインストール」をクリック

すると、インストールされて下図の様になりました。

これでコマンドラインに明らかに間違いの「abc」というコマンドを打っても、英語のメッセージのままで、日本語が表示されませんでした。

(図05-02)

拡張機能の Japanese Language Pack の SSHリモートをインストールしても、リモート側のコマンドラインは日本語化されない

拡張機能の Japanese Language Pack の SSHリモートをインストールしても、リモート側のコマンドラインは日本語化されない

ならば、ダメ押しで以下のコマンドを打って日本語パックをインストールします。

sudo apt-get install language-pack-ja

(今回はapt-get を使いましたが、aptで良いらしい)

(図05-03)

すると、下図の様になるので、Yキーを押してエンターします。

(図05-04)

ダウンロードとインストールし終わると、下図の様になります。

(図05-05)

このメッセージでは再起動不要と書いてありますが、念のためsudo reboot して、ラズパイを再起動してみました。
でも、ダメでした。

どうもうまくいかなかったので、結局以下のサイトを参考にさせて頂きました。

https://penpen-dev.com/blog/ubuntu-locale/

まず、localectl というコマンドを打ちます。
すると、下図の様に現在のロケール設定が表示されます。

(図05-06)

localectl コマンドの様子

localectl コマンドの様子

これでは、LANG がC.UTF-8 となっていて、日本語設定ではありません。
キーボードレイアウトだけが日本語対応となっていました。

そこで、以下のロケール設定コマンドを打って、現在使用可能なロケールを確認します。

localectl list-locales

(図05-07)

localectl list-locales コマンドの様子

localectl list-locales コマンドの様子

先ほど言語パックをインストールしたので、やはりja_JP.UTF-8 が表示されていますね。使えるはずです。

そこで、システムロケールをja_JP.UTF-8 にセットするコマンドを打ちます。

sudo localectl set-locale LANG=ja_JP.UTF-8

(図05-08)

sudo localectl set-locale LANG=ja_JP.UTF-8 コマンドでロケールをセットした様子

sudo localectl set-locale LANG=ja_JP.UTF-8 コマンドでロケールをセットした様子

コマンドを打っても何もメッセージが表示されなかったのですが、実はこのままではまだ反映されていません。

sudo reboot でラズパイを再起動します。

すると、下図の様に明らかに間違いコマンドの「abc」と打つと、日本語メッセージが表示されました。

(図05-09)

明らかに間違いコマンド「abc」と打った様子

明らかに間違いコマンド「abc」と打った様子

ならば、sudo apt update コマンドを打ってみます。

(図05-10)

apt update コマンドで、メッセージが日本語化されているのがわかる

apt update コマンドで、メッセージが日本語化されているのがわかる

やったね。やっと日本語化できましたよ。ここまで長かった…。

念のため、下図の様にlocalectl コマンドを打って、現在のロケール設定を確認してみます。

(図05-11)

localectl コマンドで、ロケールが LANG=ja_JP となっている

localectl コマンドで、ロケールが LANG=ja_JP となっている

ヨシ!
LANG=ja_JP.UTF-8 となっているので、これでラズパイ側の日本語化完了です。

06.最低限のセキュリティ設定

先に述べたポート番号変更等に加えて、さらに最低限のセキュリティ強化をやってみます。
参考にさせて頂いたサイトは以下です。

https://qiita.com/nokonoko_1203/items/94a888444d5019f23a11
https://qiita.com/quailDegu/items/63114ba1e14416df8040

RasbianとUbuntu Serverでは異なるかもしれませんが、概ね以下の対策が最低限かと思われます。(もっとあるよという方がいたら、コメント投稿で教えてくださ~い)

  1. SSH接続で公開鍵認証方式のみにし、パスワード認証禁止にする
  2. SSH接続のポート番号を変更
  3. rootユーザーのSSHログイン禁止
  4. .ssh フォルダとauthorized_keys ファイルのパーミッション設定
  5. ファイアウォール設定で必要最低限のポート番号のみを許可する

1~3番までは、既に前節で済ませてあるので、ここでは割愛します。

Rasbianならば、piユーザーの削除などがありますが、UbuntuならUbuntuユーザー削除ですね。
ただ、前回記事のようにRaspberry Pi Imagerを使ってUbuntu Serverをインストールすると、なぜかUbuntuユーザーが消えていました。
たぶん、Imagerはセキュリティ対策が予め施されているんでしょうね。

また、この他のセキュリティ対策としてrootユーザーのパスワード設定があると思いますが、前節までで説明したように設定すると、rootユーザーでログインできないようになっていました。

では、順番に説明していこうと思います。

06-01. SSH接続で公開鍵認証方式のみにし、パスワード認証禁止にする

これは、03節で説明したので、そちらをご参照下さい。
ラズパイ側のsshd_config ファイルを編集します。

06-02. SSH接続のポート番号を変更する

これも、03節と04節で説明したので、そちらをご参照下さい。
ラズパイ側のsshd_config ファイルと、Windowsパソコン側のconfigファイルのポート番号を22番以外にして合わせます。

06-03. rootユーザーのSSHログイン禁止にする

これも03節で説明したので、そちらをご参照ください。
sshd_config ファイルを編集します。

06-04. .ssh フォルダとauthorized_keysファイルのパーミッション設定

上記のサイトの情報や、その他のネット上の情報では、.ssh フォルダのパーミッションは700、authorized_keys ファイルのパーミッションは600に設定するとあります。

では、VSCodeでラズパイ側の/home/ユーザー名/ 配下にある.ssh フォルダのパーミッションを調べます。

下図の様にコマンドを打ちます。

ls -la

(図06-01)

ls -la コマンドでファイルやフォルダのパーミッションを確認

ls -la コマンドでファイルやフォルダのパーミッションを確認

この様に、.ssh フォルダのパーミッションは

drwx------

となっていました。

頭の d はディレクトリという意味です。
r は readで読み取り可
w は writeで書き込み可
x は実行可

そして、左の3文字が「所有者」、中央が「グループ」、右の3文字が「その他」という権限に分けて、8進数表記で数値化してきます。
8進数表記では下図の様になります。

(図06-02)

パーミッションを8進数表記

パーミッションを8進数表記

読み込み = 4
書き込み = 2
実行 = 1
として、足し算すれば簡単ですね。

そして、所有者のみが読み書き実行可能で、グループやその他は全て禁止ということになるので、下図の様にパーミッションを数値化できるわけです。

(図06-03)

ls -la コマンド表示のパーミッションと数値の対比

ls -la コマンド表示のパーミッションと数値の対比

よって、.ssh フォルダのパーミッションは700でした。
つまり、セキュリティ対策は既にOKということになります。

次に、以下のコマンドを打ちます。

cd .ssh

.ssh フォルダに移動して、ls -la コマンドを打ちます。
すると、authorized_keys ファイルのパーミッションは下図のようになりました。

(図06-04)

authorized_keys ファイルのパーミッション確認

authorized_keys ファイルのパーミッション確認

-rw-------

となっています。
頭のハイフン- は、ファイルという意味です。
つまり、パーミッションは下図の様な意味になります。

(図06-05)

authorized_keys ファイルのパーミッションと数値の対比

authorized_keys ファイルのパーミッションと数値の対比

これで、authorized_keys ファイルのパーミッションは600でしたから、既にセキュリティ対策済みということです。

これから、おそらく、前回記事で説明したように、Raspberry Pi Imagerでインストールすると、必要なファイルのパーミッションはいい具合に設定されているっぽいですね。

06-05. ファイアウォール設定で必要最低限のポート番号のみを許可する

Ubuntuのファイアウォールを使って、通信ポート番号を必要最低限のみ開放し、その他は全て閉じておくことで、ポートスキャンなどの攻撃を防御します。

Ubuntuのファイアウォールはufw というコマンドを使います。
ufw はDebian系とUbuntuで使われているファイアウォールだそうです。

まず、以下のコマンドを打って、Ubuntuファイアウォールの状態を確認します。

~$ sudo ufw status
状態: 非アクティブ

このように非アクティブと表示されたので、ファイアウォールが動作していませんでした。

では、次に、ホワイトリスト方式にするために、デフォルト設定は着信を全て拒否します。
以下のコマンドです。(ファイアウォールはまだ有効にしていないのでSSHリモートには影響ありません)

~$ sudo ufw default deny
デフォルトの incoming ポリシーは 'deny' に変更しました
(適用したい内容に基づいて必ずルールを更新してください)

次に、開放するポートを指定していきます。
今後はPythonサーバーを作ることが目的なので、私個人の独断で以下のポートを開放したいと思います。

  • 80/tcp  インターネット通信の標準ポート
  • 443/tcp SSL通信の標準ポート
  • 55555/tcp ラズパイSSHリモートでconfig設定したポート
  • 123/udp NTPサーバー時刻同期に使うポート

では、この4つのポートを開放する以下のコマンドを打ちます。

~$ sudo ufw allow 80/tcp
ルールをアップデートしました
ルールをアップデートしました(v6)
sudo ufw allow 443/tcp
ルールをアップデートしました
ルールをアップデートしました(v6)
sudo ufw allow 55555/tcp
ルールをアップデートしました
ルールをアップデートしました(v6)
sudo ufw allow 123/udp
ルールをアップデートしました
ルールをアップデートしました(v6)

これで、IPv4とIPv6のポートが開放されました。

では、ファイアウォールを有効にする以下のコマンドを打って、y と入力します。

~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ファイアウォールはアクティブかつシステムの起動時に有効化されます。

このメッセージのように、システムを再起動しないとファイアウォールは有効にならないようです。
よって、以下のコマンドで再起動します。

sudo reboot

ラズパイが再起動し、VSCodeも再起動したら、Ubuntuファイアウォールの状態を以下のコマンドで確認します。

~$ sudo ufw status
状態: アクティブ
To                         Action      From
--                         ------      ----
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
55555/tcp                  ALLOW       Anywhere
123/udp                    ALLOW       Anywhere
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)
55555/tcp (v6)             ALLOW       Anywhere (v6)
123/udp (v6)               ALLOW       Anywhere (v6)

これで、とりあえずのセキュリティ設定は完了です。

因みに、設定したファイアウォールを個別に削除したい場合は、まず、以下のコマンドを打って、ファイアウォール設定の番号一覧を表示させます。

~$ sudo ufw status numbered
状態: アクティブ

To                         Action      From
--                         ------      ----
[ 1] 80/tcp                     ALLOW IN    Anywhere
[ 2] 443/tcp                    ALLOW IN    Anywhere
[ 3] 55555/tcp                  ALLOW IN    Anywhere
[ 4] 123/udp                    ALLOW IN    Anywhere
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)
[ 7] 55555/tcp (v6)             ALLOW IN    Anywhere (v6)
[ 8] 123/udp (v6)               ALLOW IN    Anywhere (v6)

そうしたら、カッコ内の消去したい番号を確認し、消去コマンドを打ちます。
例えば、123/udp の[4]番を消去すると、以下のようになります。

~$ sudo ufw delete 4
削除:
allow 123/udp
操作を続けますか (y|n)? y
ルールを削除しました

これで123ポートのudpが削除されました。
一応、statusで確認してみます。

~$ sudo ufw status numbered
状態: アクティブ

To                         Action      From
--                         ------      ----
[ 1] 80/tcp                     ALLOW IN    Anywhere
[ 2] 443/tcp                    ALLOW IN    Anywhere
[ 3] 55555/tcp                  ALLOW IN    Anywhere

[ 4] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 5] 443/tcp (v6)               ALLOW IN    Anywhere (v6)
[ 6] 55555/tcp (v6)             ALLOW IN    Anywhere (v6)
[ 7] 123/udp (v6)               ALLOW IN    Anywhere (v6)

削除されているようです。
ちなみに、番号は削除された分、スライドして、以前の番号と変わったようです。

では、やはり123/udp は必要なので、改めて追加しておきます。

~$ sudo ufw allow 123/udp
ルールを追加しました
すでに存在するルールは追加せずに飛ばします (v6)

再度、番号一覧で追加されたか確認します。

~$ sudo ufw status numbered
状態: アクティブ

To                         Action      From
--                         ------      ----
[ 1] 80/tcp                     ALLOW IN    Anywhere
[ 2] 443/tcp                    ALLOW IN    Anywhere
[ 3] 55555/tcp                  ALLOW IN    Anywhere
[ 4] 123/udp                    ALLOW IN    Anywhere
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)
[ 7] 55555/tcp (v6)             ALLOW IN    Anywhere (v6)
[ 8] 123/udp (v6)               ALLOW IN    Anywhere (v6)

元の番号順に戻りましたね。

これで、ufwを再読み込みします。

~$ sudo ufw reload
ファイアウォールを再読込しました

念のためsudo reload コマンドでラズパイを再起動しておけばOKです。

以上、ラズパイ4B Ubuntu Server 22.04 の最低限のセキュリティ設定でした。
他にこうした方が良いという情報がありましたら、コメント投稿していただけると助かります。

【補足】

NTPサーバーと時刻同期する場合は、ntpdate コマンドが有名ですが、Ubuntu 22.04 ではntpdate不要です。
システムが勝手に同期してくれるような設定になっているようです。
Ubuntu 22.04 では、timedatectl コマンドで時刻同期設定やタイムゾーンを変えられます。
(参照サイト)
https://atmarkit.itmedia.co.jp/ait/articles/1906/13/news007.html

07.ちょっとしたSSHトラブルシューティング

ラズパイとVSCodeのSSH接続設定を済ませて、いざ初めてのSSH接続しようとしたら、以下のエラーメッセージが出て、ログ出力が表示されました。

(図07-01)

"ユーザー名" への接続を確立できませんメッセージ

“ユーザー名” への接続を確立できませんメッセージ

(Visual Studio Codeメッセージ)
“xxxxxxxx” への接続を確立できません。

(ログ出力)
Received install output: プロセスが、存在しないパイプに書き込もうとしました。
Failed to parse remote port form server output
Resolver error: Error:

(大まかな翻訳)
受け取ったインストール出力: プロセスが、存在しないパイプに書き込もうとしました。
サーバー出力からのリモートポートの解析に失敗しました
解決エラー:エラー

このエラーでは何が原因か不明なので、ログ出力ウィンドウ内で「Ctrl + F」キーを押してerror という単語を検索すると、以下の様なメッセージが上の方にありました。

(図07-02)

出力ターミナルで「error」キーワードで検索した様子

出力ターミナルで「error」キーワードで検索した様子

PS: adding key to ssh-agent
[18:19:14.023] >
> ssh-add
> C:\Users\ユーザー名\.ssh\raspi_key
[18:19:14.040] > E
[18:19:14.054] > Error connecting to agent: No such file or directory
> 85ac0ddd1135##5##
[18:19:14.054] ssh-add failed

ssh-agent が何やら関係していて、SSHの秘密鍵のファイルとディレクトリが見つからず、ssh-add failed と表示されています。
秘密鍵は存在しているのに、なぜ見つからないのか訳が分らず、ネットでいろいろ調べましたが、よくわかりませんでした。

実は、これ、超単純な自分のミスというオチだったんです。
それは、ラズパイにVSCodeでSSHリモート接続する際に、パスワードを求められますが、その時にうっかりラズパイのログインパスワードを入力してしまっていたんです。
これに気付くのに結構時間を浪費してしまいました。
要は、秘密鍵のパスフレーズを入力すれば、このエラーは出ずにSSH接続成功していたんです。
後で気付いた時には何てアホな間違いだったんだろうと思いましたね。
でも、これ、しばらくVSCodeのSSHリモートを使っていないと、すっかり忘れてしまうんですねぇ~。

08.VSCodeを完全削除(アンインストール)する方法

トラブルシューティングとして、VSCodeインストールを失敗したり、意味不明な拡張機能をインストールしすぎてゴチャゴチャしてしまったり、その他いろいろカスタマイズしすぎて元に戻したい場合に、VSCodeを再インストールしたい時があると思います。

実は私自身、このブログを書く随分前からVSCodeをインストールしたのですが、拡張機能をいろいろインストールし過ぎてカオス状態になった状態でしばらく使わずに放置しておいたら、インストールの仕方を忘れてしまって、再インストールしても前の設定が残ったままになってハマった経験があります。

VSCodeを完全に削除(アンインストール)する場合は、以下のようすれば、完全に削除することができました。

  1. Windowsの「アプリと機能」を使って、VSCodeをアンインストールする
  2. .vscode フォルダを削除する
    パス:C:\Users\ユーザー名\.vscode
  3. Codeフォルダを削除する
    パス:C:\Users\ユーザー名\AppData\Roaming\Code

これで過去の設定も全て削除されると思います。

まとめ

以上、ラズパイ(Raspberry Pi 4B)とVisual Studio Code(VSCode)とのSSHリモート接続の方法を自分流で説明しました。

一度接続完了してしまえば、改めて設定方法を見返すことはありませんが、例えばOSを最新版にアップグレードしたり、VSCodeをカスタマイズし過ぎて新たに再インストールしたい場合等にやり方をすっかり忘れてしまうんですね。そんな時には備忘録として記録すべきだと改めて強く思った次第です。

今後、Linuxコマンド集も備忘録としてアップしたいなと思っています。
そろそろラズパイにPythonをインストールしたいと思います。

ではまた…。

コメント

  1. たそがれローディー より:

    大変参考になりました。ありがとうございます。

    • mgo-tec mgo-tec より:

      たそがれローディーさん

      記事をご覧いただき、ありがとうございます。

      去年の2月に投稿したものですけど、うれしいコメントありがとうございま~ス!!!
      (^^)

タイトルとURLをコピーしました