Raspberry Piには専用のRaspberry Pi OSが用意されていますが、自分は普段はSSH接続でRaspiを操作していること(モニターのHDMIを繋ぎかえるのが面倒なため)、AWSやGCPを触る際はRaspberry Pi OSは使えないことなどから、Raspi4ではUbuntu server22.04 LTSを使用していました。
Raspi5も、Ubuntu serverで使用できるようにセットアップしたので、備忘録です。
クライアントにはMacを使用しています。
MacでのCLI操作には接頭に%を、Raspi(Ubuntu)でのCLI操作には$をつけています。
1. Ubuntu server 24.04.1 LTSをSSDにインストール
最新のUbuntu serverは24.04.1 LTSでしたので、これを使用することにします。
ssdとMacを外付けストレージを使用して接続し、Raspberry Pi OS Imagerを使用して、ssdにubuntu server24.04.01LTSを書き込みます。
2. Raspi5をモニター、キーボードに繋げて起動
ssdを載せたM2 hatとRaspi5本体と接続し、電源ケーブルを差し込んで起動します。
この時点ではwifiにも繋がっていません。
しばらく待つと、モニターにUbuntu server のログイン画面が表示されます。デフォルトユーザーはubuntu (password: ubuntu)です。
まずはubuntuと入力します。
ubuntu login:ubuntu
次に初期パスワードであるubuntuを入力します。
Password:
You are required to change your password immediately(パスワードをすぐに変更してください)と出るので画面にしたがって新しいパスワードを作成します。
「現在のパスワードは?」と聞かれるので、初期パスワードubuntuを入力します。
Current password:
新しいパスワードを入力します。2回入力を求められます。
New password:
3. 新しいユーザーを追加
初期ユーザーのubuntuは誰もが知っていてログインできてしまうので、ユーザーを追加します。
$ adduser hoge_user_name
Adding user `hoge_user_name' ...
Adding new group `hoge_user_name' (1006) ...
Adding new user `hoge_user_name' (1003) with group `hoge_user_name' ...
Creating home directory `/home/hoge_user_name' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for hoge_user_name
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
パスワードを2回入力します。Full name 以下は空欄で大丈夫です。
次に、新しく追加したhoge_user_nameに、sudo権限を追加します。
$ sudo gpasswd -a hoge_user_name sudo
Adding user hoge_user_name to group sudo
現在のユーザーubuntuから、作成したhoge_user_nameに切り替えます。
$ su hoge_user_name
次に、デフォルトユーザーのubuntuを削除します。
$ sudo userdel -r ubuntu
4. ネットワーク設定
まずは、wifiに接続します。そのために、以下のコマンドを実行します。
$ip link show
ip link show の出力のうち、wlan0がwifiなので、wlan0に接続するように、設定を変更します。
$ sudo vim /etc/netplan/50-cloud-init.yaml
50-cloud-init.yamlを、以下のように変更します。
network:
version: 2
wifis:
renderer: networkd
wlan0:
access-points:
YOUR_SSID:
password: "YOUR_PASSWORD"
dhcp4: true
optional: true
変更したnetplanを適用します。
$ sudo netplan apply
これで適用されなければ、rebootしましょう。
いよいよ、SSH接続の設定のための下準備に進みます。まず、ネットワーク関連のパッケージのnet-tools, inetutils-pingをインストールします。
$ sudo apt install net-tools inetutils-ping
デフォルトゲートウェイと、DNSアドレス・サブネットマスクをチェックします。
$ ip route
自分の環境だと、
デフォルトゲートウェイ・DNSアドレス: 192.168.11.1
サブネットマスク: /24
になります。
次に、Raspi5のIPアドレスを固定します。固定していないと、再起動するたびにIPアドレスが動的に割り振られてしまい、クライアント側からIPアドレスを探さないとSSH接続できなくなってしまうためです。以下のコマンドで、現在のIPアドレスを確認します。
$ hostname -I
192.168.11.14
現在のIPアドレスは192.168.11.14です。192.168.11の部分は固定なので、192.168.11.2〜192.168.11.255の中からIPアドレスを選びます。なんとなく、192.168.11.15にしてみます。
このIPアドレスが、既に他の機器で使われていないかを確認します。
% ping 192.168.11.15
使われていなければ、Destination Host Unreachableが出力されます。これでIPアドレスは192.168.11.15に決定しました。
設定に反映させましょう。デフォルトのnetplanの設定ファイルは50-cloud-init.yamlですが、これを上書きするファイルを作ります。
$ sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/60-cloud-init.yaml
/etc/netplanに複数のyamlファイルを配置すると、ファイル名がアルファベット順に読み込まれ、設定項目が重複する場合、後に読み込んだファイルの設定値で上書きされていきます。つまり、設定値の優先順位としては以下のようになります。
99****.yaml > 50****.yaml > 01****.yaml
これにより、デフォルトの50-cloud-init.yamlよりも優先度の高い60-cloud-init.yamlを作り出しています。このファイルを編集しましょう。
$ sudo vim /etc/netplan/60-cloud-init.yaml
以下のように書き換えます。
network:
version: 2
renderer: networkd
wlan0:
dhcp4: false
dhcp6: false
addresses: [192.168.11.15/24]
routes:
- to: default
via: 192.168.11.1
nameservers:
addresses: [192.168.11.1]
rebootして、IPアドレスが192.168.11.15に固定されていることを確認しましょう。
5. SSH接続
デフォルトでは、password認証でのSSH接続はdenyされます。password認証でのSSH接続はセキュリティ的に望ましくないので、公開鍵認証を設定するべきですが、クライアント側で作成した鍵をRaspi側に送信するために、一時的にpassword認証でのSSH接続を許可することにします。
$ cd ~/.ssh/
このフォルダの中の、ssh_config, sshd_config, ssh_config.d, ssh_config.dの全てを確認し、全てのpasswordAuthentificationを一旦yes にします。これによってpassword認証でのSSH接続が可能になります。すぐに公開鍵認証を設定しましょう。
クライアントで鍵の生成を行います。-tオプションで暗号化のアルゴリズムを指定でき、今回はed25519を指定しています。Ubuntu22以降では、RSAはデフォルトで無効化されています。-fオプションで鍵に名前をつけられます。
% ssh-keygen -t ed25519 -f ~/.ssh/id_ubuntu2404
クライアント側で作成した鍵を、Raspiにコピーします。
% ssh-copy-id -i ~/.ssh/id_ubuntu2404.pub hoge_user_name@192.168.11.15
このときに、password入力を求められます。
コピーできたら、クライアント側の設定を変更しておきましょう。
% sudo vim ~/.ssh/config
Host ubuntuRaspi5
HostName 192.168.11.15
User hoge_user_name
IdentityFile ~/.ssh/id_ubuntu2404
これにより、下のように簡単にログインできるようになります。
% sudo ubuntuRaspi5
これでクライアントからRaspi側に公開鍵認証を用いてSSH接続できます。
接続できることを確認したら、Ubuntu server側の、ssh_config, sshd_config, ssh_config.d, ssh_config.dの全てを確認し、全てのpasswordAuthentificationをnoにしましょう。
6. セキュリティ設定
前項でpasswordAuthentificationを禁止しました。他にやるべき設定を挙げてみます。
- RootLoginの禁止
- ファイアウォールの有効化、ポートの変更
あたりでしょうか。
1. RootLogin の禁止
$ sudo vim ~/.ssh/sshd_config
を実行し、PermitRootLogin をno に変更します。
2. ファイアウォールの有効化
$ sudo ufw enable
これでファイアウォールが有効化されます。SSH接続がここで切られる可能性があるので、切られたら再度Raspiをモニターに繋いで下さい。
$ sudo ufw allow 4444
これでポート4444番が有効化されます。ポート番号は1023番以下はすでに使われていることがある(ウェルノウンポート) ので、1024以上が良いでしょう。
ポートを無効化するには、
$ sudo ufw deny 22
のようにします。22番ポートはSSH接続で一般的に使われるので狙われやすく、閉じておいた方がいいでしょう。ここまで設定できれば、Raspi側を再度rebootします。
クライアント側で、ssh_configにポートの設定を追記しましょう。
% sudo vim ~/.ssh/config
Host ubuntuRaspi5
HostName 192.168.11.15
Port 4444
User hoge_user_name
IdentityFile ~/.ssh/id_ubuntu2404
% sudo ubuntuRaspi5
でSSH接続できれば完了です。
これで、長かった設定も終了です。最後までお付き合いいただきありがとうございます。お疲れ様でした。