- Visual Studio Code (VSCode)をダウンロードしてインストールする
- Visual Studio Codeを日本語化する(ラズパイ側は後の節で説明)
- ラズパイ側でviコマンドを使ってSSH設定する(sshd_config編集)
- VSCodeとラズパイをSSH接続し、リモート制御できるようにする
- SSHリモート上でラズパイ側のコマンドラインメッセージを日本語対応にする
- 最低限のセキュリティ設定
- ちょっとしたSSHトラブルシューティング
- VSCodeを完全削除(アンインストール)する方法
- まとめ
【目次】
なぜVisual Studio Codeを使うことになったのか
05.SSHリモート上でラズパイ側のコマンドラインメッセージを日本語対応にする
VSCode自体は日本語化できましたが、なぜかSSH接続のラズパイ側のコマンドラインメッセージは日本語化されていません。前回記事のImagerによるインストールで、ラズパイ側のロケール設定したはずなのに…。
そう言えば、ラズパイ側にディスプレイ接続した時のコマンドラインは全て英語でした。今さら気付いたのですが、つまりラズパイ側は日本語化されていなかったというわけです。
ということで、まずは下図の様に拡張機能を表示させてみると、Japanese Language Packのところに「SSH: xxxxxxx にインストール」という項目があったので、そこをクリックしました。
(図05-01)
すると、インストールされて下図の様になりました。
これでコマンドラインに明らかに間違いの「abc」というコマンドを打っても、英語のメッセージのままで、日本語が表示されませんでした。
(図05-02)
ならば、ダメ押しで以下のコマンドを打って日本語パックをインストールします。
sudo apt-get install language-pack-ja
(今回はapt-get
を使いましたが、aptで良いらしい)
すると、下図の様になるので、Yキーを押してエンターします。
ダウンロードとインストールし終わると、下図の様になります。
このメッセージでは再起動不要と書いてありますが、念のためsudo reboot
して、ラズパイを再起動してみました。
でも、ダメでした。
どうもうまくいかなかったので、結局以下のサイトを参考にさせて頂きました。
https://penpen-dev.com/blog/ubuntu-locale/
まず、localectl
というコマンドを打ちます。
すると、下図の様に現在のロケール設定が表示されます。
(図05-06)
これでは、LANG がC.UTF-8
となっていて、日本語設定ではありません。
キーボードレイアウトだけが日本語対応となっていました。
そこで、以下のロケール設定コマンドを打って、現在使用可能なロケールを確認します。
localectl list-locales
(図05-07)
先ほど言語パックをインストールしたので、やはりja_JP.UTF-8
が表示されていますね。使えるはずです。
そこで、システムロケールをja_JP.UTF-8
にセットするコマンドを打ちます。
sudo localectl set-locale LANG=ja_JP.UTF-8
(図05-08)
コマンドを打っても何もメッセージが表示されなかったのですが、実はこのままではまだ反映されていません。
sudo reboot
でラズパイを再起動します。
すると、下図の様に明らかに間違いコマンドの「abc」と打つと、日本語メッセージが表示されました。
(図05-09)
ならば、sudo apt update
コマンドを打ってみます。
(図05-10)
やったね。やっと日本語化できましたよ。ここまで長かった…。
念のため、下図の様にlocalectl
コマンドを打って、現在のロケール設定を確認してみます。
(図05-11)
ヨシ!
LANG=ja_JP.UTF-8
となっているので、これでラズパイ側の日本語化完了です。
06.最低限のセキュリティ設定
先に述べたポート番号変更等に加えて、さらに最低限のセキュリティ強化をやってみます。
参考にさせて頂いたサイトは以下です。
https://qiita.com/nokonoko_1203/items/94a888444d5019f23a11
https://qiita.com/quailDegu/items/63114ba1e14416df8040
RasbianとUbuntu Serverでは異なるかもしれませんが、概ね以下の対策が最低限かと思われます。(もっとあるよという方がいたら、コメント投稿で教えてくださ~い)
- SSH接続で公開鍵認証方式のみにし、パスワード認証禁止にする
- SSH接続のポート番号を変更
- rootユーザーのSSHログイン禁止
.ssh
フォルダとauthorized_keys
ファイルのパーミッション設定- ファイアウォール設定で必要最低限のポート番号のみを許可する
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)
この様に、.ssh
フォルダのパーミッションは
drwx------
となっていました。
頭の d はディレクトリという意味です。
r は readで読み取り可
w は writeで書き込み可
x は実行可
そして、左の3文字が「所有者」、中央が「グループ」、右の3文字が「その他」という権限に分けて、8進数表記で数値化してきます。
8進数表記では下図の様になります。
(図06-02)
読み込み = 4
書き込み = 2
実行 = 1
として、足し算すれば簡単ですね。
そして、所有者のみが読み書き実行可能で、グループやその他は全て禁止ということになるので、下図の様にパーミッションを数値化できるわけです。
(図06-03)
よって、.ssh
フォルダのパーミッションは700でした。
つまり、セキュリティ対策は既にOKということになります。
次に、以下のコマンドを打ちます。
cd .ssh
.ssh
フォルダに移動して、ls -la
コマンドを打ちます。
すると、authorized_keys
ファイルのパーミッションは下図のようになりました。
(図06-04)
-rw-------
となっています。
頭のハイフン-
は、ファイルという意味です。
つまり、パーミッションは下図の様な意味になります。
(図06-05)
これで、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)
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を完全に削除(アンインストール)する場合は、以下のようすれば、完全に削除することができました。
- Windowsの「アプリと機能」を使って、VSCodeをアンインストールする
.vscode
フォルダを削除する
パス:C:\Users\ユーザー名\.vscode
Code
フォルダを削除する
パス:C:\Users\ユーザー名\AppData\Roaming\Code
これで過去の設定も全て削除されると思います。
まとめ
以上、ラズパイ(Raspberry Pi 4B)とVisual Studio Code(VSCode)とのSSHリモート接続の方法を自分流で説明しました。
一度接続完了してしまえば、改めて設定方法を見返すことはありませんが、例えばOSを最新版にアップグレードしたり、VSCodeをカスタマイズし過ぎて新たに再インストールしたい場合等にやり方をすっかり忘れてしまうんですね。そんな時には備忘録として記録すべきだと改めて強く思った次第です。
今後、Linuxコマンド集も備忘録としてアップしたいなと思っています。
そろそろラズパイにPythonをインストールしたいと思います。
ではまた…。
コメント
大変参考になりました。ありがとうございます。
たそがれローディーさん
記事をご覧いただき、ありがとうございます。
去年の2月に投稿したものですけど、うれしいコメントありがとうございま~ス!!!
(^^)