Windows 10 で Raspberry Pi 4 のセットアップ方法まとめ

Raspberry Pi 4B を2回目のセットアップすることになったが、1 回目の手順を何も覚えていないので自分の覚書という意味も含め書く。複数記事を参照して、自分流に要らないところを削って簡潔にまとめてるのでパクリじゃないです！タイトルにもありますが、Windows 向けのやり方です。

# 目標
- Raspberry Pi に電源ケーブル以外を 1 度も接続しない
- SSH で接続する
- セキュリティ対策
- スワップ領域を失くしたりログ書き込みを減らしたり

# 必要なもの
- 無線 LAN の環境
- Raspberry Pi
- Windows または Mac のPC
- 8GB 以上の micro SD カード (4GB でもいいの？？)

また、必要に応じて以下も用意しましょう。

- PC と micro SD カードを接続するアダプタ

# 環境
今回 Raspberry Pi にセットアップする環境

- Raspberry Pi 4B
- Raspbian 4.19 (2020-02-13)
- 32 GB micro SD カード

そしてセットアップに使用する PC は Windows 10 です。

# 下準備
SSH のクライアントとして Tera Term を使います。Windows には標準で SSH クライアントが入ってるのですが、Windows では鍵生成が面倒なので Tera Term をオススメします。下記リンクよりダウンロードし、お使いの PC にインストールしましょう。

- [Tera Term (窓の杜)](https://forest.watch.impress.co.jp/library/software/utf8teraterm/)

# 手順
それでは早速、やっていくぅ！

## micro SD に OS を書き込む
まず、micro SD カードに OS イメージを書き込む必要があります。

公式から Raspberry Pi Imager というイメージ書き込みソフトが配布されているので、ありがたく利用しましょう。

- [Raspberry Pi Imager の解説](https://raspida.com/release-raspberry-pi-imager)
- [Raspberry Pi Imager ダウンロードページ](https://www.raspberrypi.org/downloads/)
![Raspberry Pi Imager ダウンロードページスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450479/a4e256fa-67bc-3887-19dc-272ec7f41ba4.png)

上記のスクリーンショットの青枠部分から、お使いの PC の OS の物をダウンロードしましょう。ダウンロードしている間に micro SD カードを PC に挿入しておきます。
ダウンロードが完了したらファイルを実行し Raspberry Pi Imager をインストールしてください。

それでは、インストールした Raspberry Pi Imager を起動していい感じにやっていきましょう。起動したら表示される画面に 3 つぐらいボタンが出ています。OS と SD カードを選択したら「Write」がクリックでようになります。

![Raspberry Pi Imager](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450479/7a1b491a-ee18-8d54-8db2-3d7c71b3eb8d.png)
![Raspberry Pi Imager OS 選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450479/5e5aaa23-3bc2-0882-d7b8-23c2fd676420.png)

OS は、スクリーンショットの赤枠で囲んだ「Raspbian」を選択します。Raspbian にも複数バージョンあり、Full 版や GUI なしの Lite 版は上から 2 番目の「Raspbian (ohter)」の中にありますが、今回は通常の Raspbian を使います。

SD カードは、希望の物を選択してください。

「Write」をクリックすると OS イメージの書き込みが始まりますが、ネットワーク経由でイメージファイルをダウンロードしてから書き込むので少し時間がかかります。この間にコーヒーでも飲んで一段落しましょう。

## 無線 LAN の設定
書き込みが終わっても、micro SD カードは Raspberry Pi に挿しません。Raspberry Pi を起動したら自動で無線 LAN に接続されるように設定します。

micro SD カードのディレクトリに移動して、`wpa_supplicant.conf` ファイルを作成します。`ssid` には接続したい無線 LAN アクセスポイントの SSID を、`psk` にはアクセスポイントのパスワードを入力します。

```php:wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="接続する無線 LAN のSSID"
    psk="パスワード (キーフレーズ)"
}
```

<details><summary>UNIX 系 OS (Mac など) の場合や、UNIX 系の端末を使用できる場合</summary><div>
UNIX 系 OS では、`wpa_passphrase` コマンドでパスワードを暗号化できます。

```shell
$ apt install wpa_passphrase  # wpa_passphrase コマンドをインストールすれば何でもいいです

$ wpa_passphrase ssid password  # ssid, password は接続したいアクセスポイントのものを入力する
network={
        ssid="ssid"
        #psk="password"
        psk="暗号化されたパスワード"
}
```

取得した暗号化されたパスワードを、`wpa_supplicant.conf` の `psk` に入力します。
</div></details>

## SSH の有効化
PC から無線 LAN 経由で Raspberry Pi にログインするために、SSH を有効化します。

SSH を有効化するには中身が空の `ssh` ファイルを作成します。micro SD カードのディレクトリに移動して、`type nul > ssh` を入力すれば OK です。

```console:Windows
PS E:\> type nul > ssh
```
ちなみに SSH とは、ネットワーク経由でホストにログインして操作する技術です。

## Raspberry Pi を初起動
ここまで来て初めて Raspberry Pi を起動します。Raspberry Pi に micro SD カード、電源の順に接続します。
電源を接続したら勝手に起動するので、2, 3 分程待ちましょう。

2, 3 分経ったら、Raspberry Pi に SSH 接続してみましょう。Raspberry Pi のデフォルトのユーザーは `pi` で、パスワードは `raspberry` です。ホスト名は `raspberrypi.local` です。

Tera Term を起動して、ホスト名を入力します。
![7e11d976bc7d1361e599f8a38cd9874c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450479/ff7fc159-e03f-c62a-4591-244cca6c71e6.png)

OK をクリックすると「警告」的なのが出ますが無視して続行、ユーザー名とパスワードを入力し、ログインします。
![70d5bb847ac028be3da3d85271612cf7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450479/7b9ec608-156b-df00-90dc-0a0ff7f3c709.png)

OK をクリックするとなにやら英語の文が表示された後、以下のように表示されたら Raspberry Pi への SSH 接続は OK です！

```console:SSH
pi@raspberrypi:~ $ 
```

## 起動時の自動ログインをオフにする
Raspberry Pi は通常、GUI モードで起動して pi ユーザーに勝手にログインしてしまいます。このまま次の手順で都合が悪いので、pi ユーザーへの自動ログインをオフにします。

```console:SSH
$ sudo raspi-config
```
で設定画面が出るので、十字キーとエンターキーを入力し、`3 Boot Options` → `B1 Desktop/CLI` → `B1 Console` を選択してください。Esc で設定画面から抜けられます。

```console:SSH
$ sudo reboot
```
で再起動し、2, 3分後に再度 SSH で接続してみましょう。SSH 接続の練習です。

## 新規ユーザーの作成と pi ユーザーの削除
SSH 接続したら以下のような警告メッセージが表示されます。

```console:SSH
SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
```
これは、「あんた pi ユーザーで SSH 接続してるけど、パスワードがデフォルトのままやから、不正アクセスの危険が危ないで！あかん、今すぐ変えりや！」って教えてくれてます。

ということで、新しいユーザーを作成して pi ユーザーをさっさと削除しましょう。

### root パスワードを設定
root (管理者権限) にパスワードを設定します。

```console:SSH
$ sudo passwd root
New password:  # 新しいパスワードを入力
Retype new password:  # 新しいパスワードを再入力
passwd: password updated successfully
```

### ユーザーを追加
自分用のユーザーを新しく作成します。

```console:SSH
$ sudo adduser ○○  # "○○" に作成したいユーザー名
Adding user `○○' ...
Adding new group `○○' (1001) ...
Adding new user `○○' (1001) with group `○○' ...
Creating home directory `/home/○○' ...
Copying files from `/etc/skel' ...
New password:  # ユーザーに設定したいパスワードを入力
Retype new password:  # パスワードを再入力
passwd: password updated successfully
Changing the user information for ○○  # ユーザー情報を追加するよ
Enter the new value, or press ENTER for the default  # 情報を入力するか、Enter で飛ばしてね。全部飛ばしても OK
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n]  # 5 項目に問題無ければ "y" を入力
```

### 新ユーザーへの権限付与
先程作成した新しいユーザーに権限を付与します。

```console:SSH
$ groups pi  # pi ユーザーの権限を確認
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev spi i2c gpio

# 新ユーザーを pi ユーザーと同等のグループに追加
$ sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio ○○

$ groups ○○  # 新ユーザーの権限を確認
○○ : ○○ adm dialout cdrom sudo audio video plugdev games users input netdev pi spi i2c gpio
```

また、パスワード無しで `sudo` できるようにします。

```console:SSH
$ sudo visudo
```
これでエディタが開くので、`〇〇  ALL=(ALL) NOPASSWD: ALL` を追記します (〇〇は新ユーザー)。
エディタは Ctrl+O で保存、Ctrl+X で閉じられます。

### 新ユーザーでのログイン確認
新ユーザーでログインできるか確かめてみましょう。

`exit` と入力してログアウトし、Tera Term をもう一度起動して、認証画面で新しいユーザーの情報を入力します。

ログインできなかった場合は、上記の手順をちゃんと行っているか、パスワードの入力を間違っていないか、などを落ち着いて確認しましょう。
これからは毎度この新ユーザーでログインします。

### pi ユーザーを削除する
あの忌々しい警告メッセージはもう見たくないので、pi ユーザーを削除します。

```console:SSH
$ sudo userdel -r pi  # pi ユーザーを削除
userdel: group pi not removed because it has other members.
userdel: pi mail spool (/var/mail/pi) not found

$ id -a pi  # 削除されたか確認
id: ‘pi’: no such user 
```

## SSH で鍵認証のみ許可する
現在は SSH 接続をする時にパスワードを入力していますが、パスワードが破られると危険です。SSH では公開鍵と秘密鍵というものを使って認証することにより安全性が増すと言われています。ということで、鍵認証が使えるように設定していきます。

公開鍵認証についてはよくわからないので解説しません。以下の記事が参考になります。

- [SSHの公開鍵認証における良くある誤解の話](https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432)

### 公開鍵/秘密鍵 を生成する
Tera Term の機能で簡単に生成できるので、使わない手はありません。
その前に、鍵を入れておくフォルダを作ります。ユーザーフォルダ直下に `.ssh` フォルダが無ければ作成しておきましょう。

```console
C:\Users\〇〇> mkdir ./.ssh
```

Tera Term を起動したら認証画面などが表示されますが、「キャンセル」を押して真っ黒の画面にして、ツールバーから「設定」→「SSH鍵生成」をクリックします。
![Desktop Screenshot 2020.04.07 - 16.05.51.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450479/bc399b0e-f76d-9eeb-3d9b-0e162353645b.png)

鍵の種類は「RSA」、ビット数は「2048」のままで「生成」をクリックします。「鍵のパスフレーズ」が入力できるようになりますが、入力してもしなくてもいいです。
最後に「公開鍵を保存」をクリックして、先程作成した `C:\Users\〇〇\.ssh` フォルダに保存します。秘密鍵も同じです。既に他の鍵が入っている場合は何か一意の名前をつけて保存しておきましょう。何も入っていない場合はそのままの名前でいいです。この先の解説はデフォルトの名前で保存したとして書いています。

公開鍵は、SSH 接続でホスト、サーバー側に配置する鍵です。誰に見られても構いません。「id_rsa.pub」です。
一方で、秘密鍵はクライアントとなる自分の PC に配置します。ネットワークで転送したり誰かに見られたりすると危険です。「id_rsa」です。

### 公開鍵を転送する
生成した公開鍵を Raspberry Pi に転送して、公開鍵を使用できるようにしましょう。

公開鍵の転送には Tera Term の SCP 機能を使います。Tera Term で Raspberry Pi にSSH 接続した後、ツールバーの「ファイル」→「SSH SCP」をクリックします。
![Desktop Screenshot 2020.04.07 - 16.19.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450479/f2264489-361d-3932-359c-d5344807db33.png)
![037e533d8a9aa1bf3c02b4de08391f2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450479/ef736516-8d7f-2ce3-a43e-310c25220b3f.png)

赤色で囲んだ「…」ボタンをクリックし、先程保存した公開鍵「id_rsa.pub」を選択し、青色で囲んだ「Send」ボタンをクリックすると、ファイルが Raspberry Pi に転送されます。

### 公開鍵を設定する
再び Raspberry Pi の画面に戻ります。

先程転送した公開鍵は Raspberry Pi のホームディレクトリに入っているはずなので、確認します。

```console:SSH
$ dir
id_rsa.pub
```
「id_rsa.pub」があれば OK です。無ければ、転送し直しましょう。

次に、転送した公開鍵を「authorized_keys」というファイルに追加して、使用可能な状態にします。具体的には「ssh フォルダを作成する」「公開鍵を書き込む」「authorized_keys のパーミッションを変更する」「公開鍵を削除する」というステップを踏みます

```console:SSH
# ホームディレクトリに .ssh フォルダを作成
$ mkdir ~/.ssh

# 公開鍵を authorized_keys に追加する
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

# フォルダのパーミッションを 700 に変更
$ chmod 700 ~/.ssh

# authorized_keys のパーミッションを600に変更
$ chmod 600 ~/.ssh/authorized_keys

# 公開鍵を削除する
$ rm ~/id_rsa.pub

# SSH を再起動
$ sudo /etc/init.d/ssh restart
```

### 公開鍵認証でのログイン確認
公開鍵認証を設定したら、それでログインできるかを確かめます。SSH 接続は一旦切断して、再度 Tera Term を起動します。SSH 認証の画面でユーザー名を入力した後、下の「認証方式」から「RSA/DSA/ECDSA/ED25519認証を使う」にチェックを選択し、秘密鍵には先程保存した秘密鍵を選択します。
![37e533d8a9aa1bf3c02b4de08391f2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450479/bc72f418-d54d-0695-be02-8658434bae77.png)

これでログインできたら成功です。再起動などを試しても鍵ではログインできなかった場合、絶対にこの次には進まないでください。設定に間違いが無いかを再度確認しましょう。

### 公開鍵認証による接続のみ許可する
公開鍵認証が使えるようになったので、SSH の際はパスワード認証を拒否する設定にします。ついでに他にもいくつか設定を修正します。

```console:SSH
$ sudo nano /etc/ssh/sshd_config
```

- `#PasswordAuthentication yes` を `PasswordAuthentication no` SSD でのパスワードを拒否
- `#PermitEmptyPasswords no` を `PermitEmptyPasswords no` 空パスワードを無効
- `#PermitRootLogin prohibit-password` を `PermitRootLogin no` root ログインを無効
-  `#Port 22` の 22 を 49152 ～ 65535 の中から好きな数字に変更 (例: `Port 56789`)

いずれも先頭のハッシュタグに気をつけましょう。
Ctrl+O で保存、Ctrl+X で終了です。

最後に `sudo /etc/init.d/ssh restart` で SSH を再起動し、設定を反映します。

## ファイアウォールを設定する
サーバー用途の事も考え、ファイアウォールを設定しておきます。ufw を使います。

```console:SSH
$ sudo apt-get install ufw -y

$ sudo ufw default deny  # 全拒否
$ sudo ufw allow (SSH のポート番号)  # SSH を許可
$ sudo ufw allow vnc  # VNC を許可
$ sudo ufw enable  # ufw を有効化
```
ちなみに `sudo ufw enable` を実行すると `Command may disrupt existing ssh connections. Proceed with operation (y|n)? y` と聞かれます。ファイアウォールを設定すると SSH に影響が出る可能性があると言っているのですが、SSH を許可する時に入力したポート番号が間違って無ければ続けて OK です。

## 日本語化、タイムゾーン設定
慣れ親しんだ日本語で、そして普段使っている日本の時刻で使いたいので設定します。

```console:SSH
$ sudo raspi-config
```

言語設定は `4 Localization Options` → `I1 Change Locale` → 十字キー上下で `ja-JP UTF-8 UTF-8` でスペースキーを押下しアスタリスクが表示されれば OK。Enter を押したらデフォルトを選択する画面になるので、`ja-JP UTF-8 UTF-8` 選択状態で Enter を押したら日本語化完了。
タイムゾーンは`4 Localization Options` → `I2 Change Timezone` → `Asia` → `Tokyo` で OK。

## スワップを無効化する
RAM が足りなくなった時に micro SD 上にスワップが作られますが、micro SD の書き込み頻度が上がると壊れやすくなるので無効化します。

```console:SSH
$ sudo systemctl stop dphys-swapfile
$ sudo systemctl disable dphys-swapfile

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          1.9Gi        71Mi       1.5Gi       8.0Mi       297Mi       1.7Gi
Swap:            0B          0B          0B
```

`free -h` で `Swap` のところに 0 が並んでたら無効化成功です。再起動しても 0 のままだったらスワップの自動起動も無効にできています。

## 不要なログ書き込みを削る
ログ書き込みも同じように micro SD への書き込み頻度が上がるので、絞っていきます。

```console:SSH
$ sudo nano /etc/rsyslog.conf

$ sudo systemctl restart rsyslog  # ログを再起動
```
`mail` と `debug` から始まるやつは取り敢えずコメントアウトしました。編集し終わったらログサービスを再起動しておきましょう。

## 起動時の自動ログインを元に戻す
最初の方にオフした起動時の自動ログインをオンに戻します。

```console:SSH
$ sudo raspi-config
```
`3 Boot Options` → `B1 Desktop/CLI` → `B4 Desktop Autologin` を選択。Raspberry Pi の再起動も忘れずに。

# 最後に
これで終わりです。お疲れさまでした。

# 参考記事
- [RaspberryPiの初回セットアップ手順](https://qiita.com/ljourm/items/ee01c2b3d48c9958b9b3)
- [ラズパイでやらなければいけない４つのセキュリティ対策！](https://qiita.com/nokonoko_1203/items/94a888444d5019f23a11)