在宅勤務を利用してRaspberryPi上に簡易的なサーバを構築してみたらOSが古かったのでBuster化した

初投稿。

はじめに

今年に入ってからのコロナウイルス感染症流行を受けて、私も例にもれず在宅勤務が多くなっています。
4月の緊急事態宣言以降は特に顕著で、月の半分以上が在宅勤務という状況(ライフラインの維持に関わる仕事)でありながら、
情報セキュリティの名のもとに主にPC周りの環境が強い制約を受けており、通常行っている業務の7〜8割が実施不可能な状況で、「在宅勤務とは?」という状況なのだが、それでも家に居ろ!出社するな!と言われているのだから仕方がない...。

ただ、業務もできることが少なく、1日を無駄にするのも勿体無いので、自分のために使うことにしました。
2〜3年前に購入して放ってあったRaspberry Pi 3 Model Bを使って、簡易的なサーバを構築してサーバの構築やプログラミングの勉強ができる環境を作成してみました。
(一応、業務にも関わるスキルなので、業務のためのインプットという名目で)
その流れを備忘録として記録しておくことにします。

使用した物

・Raspberry Pi 3 Model B+
・1TB 外付けHDD
・32GB USBメモリ(自宅に転がっていた)
・Macbook Pro(15-inch, Early 2016)

作業工程

こちらから好みのディストリビューションを選択してダウンロードします。
私はRaspberry Pi OS(以前はRaspbianでしたね)を選択しました。
というより購入当時に入手したイメージがMacに残っていたので、それを再利用(これが良くない)。

1. OSのインストール

USBメモリにOSを書き込むステップ。
Macbook Proの端末.appから以下を実行します。
なお、ダウンロードしたOSイメージは~/Downloadsに保存されているものとして記載します。

cd ~/Downloadshdiutil 
convert -format UDRW -o <変換後ファイル名> <ダウンロードしたファイル名>

実行すると、<変換後ファイル名>.dmgというファイルがダウンロードフォルダに生成されるはずです。

次にMacbook ProにSDカードを接続し、端末.appから以下を実行します。

diskutil list

OSに認識されているストレージが表示されます。
私の環境ではSDカードは/dev/disk2で表示されました。
このデバイス名は次のステップで必要なので覚えておきます。

次に以下を実行してUSBメモリにファイルの書き込みを行います。
※対象を誤るとMacに保存されているデータの消失の可能性があるので注意

diskutil unMountdisk <確認したデバイス名>
dd if=<変換後ファイル名>.dmg of=<確認したデバイス名> bs=1m

しばらく時間がかかるので、勉強でもしながら待つと良いです。
私は知的財産管理技能検定2級を受験予定なので、それをやりながら待機しました。
プロンプトが返ってきたら完了なので、USBメモリをMacbook Proから一旦取り外します。

2. USB-HDDから起動する

このままでもRaspberry Piは起動できるのですが、面倒+ケチなので画面やキーボードを用意していなません。
なので、Raspberry Piにリモート接続してセットアップをします。
そのため、Raspberry PiのSSHやWi-Fiの設定をMacbook上で行いました。
まずは、先程取り外したUSBメモリを再度Macbookに挿入します。
端末.appを起動し、以下のコマンドを実行。

touch /Volumes/boot/ssh
touch /Volumes/boot/wpa_supplicant.conf
vi /Volumes/boot/wpa_supplicant.conf

viが起動するので、以下の内容を書き込んで保存します。

country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant
GROUP=netdevupdate_config=1
network={
    ssid="利用するWi-FiのSSID"
    psk="パスフレーズ"
    scan_ssid=1
}

USBメモリをアンマウントしてMacbookから取り外す。
ここでWi-Fiに接続されている機器のIPを確認しておきます。
※これをやっておかないとRaspberry PiのIPが特定できないので、面倒です。
Macbookの端末.appを起動して、以下のコマンドを実行し、出力を確認しておきます。

arp -a

Raspberry PiにUSBメモリを挿入したら電源を入れます。
OSが起動するまで数分かかるので、少し待ちます。
しばらく待ったら、Macbookの端末.appから以下を実行して
事前に確認しておいたIPの一覧との差分を確認します。
新しく増えたIPがRaspberry PiのIPと推定できます。

arp -a

Raspberry Piに接続するためにsshを使用しようします。
Macbookの端末.appから以下を実行。

ssh pi@<上で調べたRaspberry PiのIPアドレス>

パスワードはraspberry
このままではpasswordが周知で危険ですので、変更を行います。

passwd

任意のパスワードを設定しましょう。
次にrootのパスワードを設定します。

sudo su   # パスワードを聞かれるので、piのパスワードを入力する
passwd

任意のパスワードを設定します。
USBメモリから起動きるのは手軽で良いのですが、
USBメモリの寿命的に良くはないので、USB-HDDから起動をさせるようにします。
USB-HDDをRaspberry Piに接続して以下のコマンドを実行。

parted /dev/sda
mklabel gpt
y
mkpart primary ext4 0% 100%
p
q

次にデータのコピーを行う。

mkfs.ext4 /dev/sda1
mount -t ext4 -o defaults /dev/sda1 /mnt
rsync -aHAX --progress / /mnt

結構時間がかかりますので、また勉強でもしながら待ちましょう。
このままだとデータを移しただけでUSB-HDDからは起動できないため、
起動時に使用するドライブの変更を行います。
起動ドライブはfstabとcmdline.txtにPARTUUIDで指定されているので、
まずはUSB-HDDのPARTUUIDを確認します。

ls -l /dev/disk/by-partuuid/

次にfstabを書き換えて/(ルートディレクトリ)配下をHDDから読み込むようにします。

mount -t ext4 -o defaults /dev/sda1 /mnt
vi /mnt/etc/fstab

viが開くので、/(ルートディレクトリ)に設定されているUUIDを
先程調べたsda1のUUIDに変更して保存する。
次にcmdline.txtを編集する。

vi /boot/cmdline.txt

root=PARTUUID=xxxxxxの部分を先程調べたUUIDに変更して保存する。

ここまで完了したら、Raspberry Piを再起動し、sshで再接続し
以下のコマンドで/(ルートディレクトリ)の容量を確認する。

df -h

容量が使用したUSB-HDDの容量と同等になっていれば成功。

3. セキュリティ設定(最低限)

最低限のセキュリティ設定として以下を行う。
・piユーザの無効化
・rootユーザへのsshログインを禁止
・sshの待受ポートを変更
piユーザを無効化するため、新規のユーザとユーザグループを作成し、
piユーザからsudo権限を削除するため以下を実行。

adduser <任意のユーザ名>
gpasswd -a <追加したユーザ名>
sudo gpasswd -d pi
sudo vi /etc/sudoers

viが起動するので、以下の行をコメントアウトする。

pi ALL=(ALL) NOPASSWD: ALL

piユーザへのログインを禁止する。

usermod -s /bin/false pi

セキュリティのためにsshの設定も変更しておく。

vi /etc/ssh/sshd_config

viが起動するので以下の行を変更する。

Port 10022 ## 行頭の「#」を削除して、22を10022に変更(値は1024〜65535から選択)
PermitRootLogin no ## yes を no

保存したら以下でsshを再起動して設定を反映させる。

/etc/init.d/ssh restart

インストール後にリリースされたパッケージの更新を行う。

apt updateapt upgrade

と、ここでStrechのレポジトリが参照されていることを気づいた。https://download.docker.com/linux/raspbian stretch InRelease
どうやら古いOSイメージだったようなので、OSのバージョンを確認する。

cat /etc/debian_version

表示が9台だったら古いOS、10台だったら新しいOS。

4. OSのバージョンアップ

※注意※
基本的にOSのメジャーアップデートは推奨されていない。
クリーンインストールができるならそちらを実施すべき。

cat /etc/debian_version

10.4になっていれば正常にアップグレードに成功している。

最後に

セキュリティ設定は最低限のものを設定した。
が、インターネット上にサーバを公開するのであれば、
iptablesの設定などを必ず実施すること。
私は、こちらのページを参考に設定した。

参考

後日談

ネット上にRaspberry Piを公開しようと思ってセキュリティ設定を行っていたら、誤ってsshを締め出してしまいました。
(画面がなく復旧ができませんでしたので、再インストール...)
設定が完了するまでは、ローカルIPからのアクセスは許容する設定をiptablesに書いておいたほうがいいかも知れないです。

この記事が気に入ったらサポートをしてみませんか?