RaspberryPI を最初から設定してWEBサーバとして使う その１ ~OSインストール、SSH、セキュリティ設定~

# はじめに
　家で古いRaspberryPiが発掘されたので、何も考えてないけどとりあえずWEBサーバでもたててみる。確認してみたら、2よりも前、ナンバリングがないバージョンのB+だった模様。発売日は2014年7月だそうだ。発売後すぐ買った気がする。
　SDカードのせいなのか本体のせいなのか分からないが、初期のラズパイはある日突然データが吹っ飛んだりOSが起動しなくなったりしやすい印象がある。もしもの時のために、また備忘録としてやり方をまとめておこう。ちなみに新しいやつは持ってないので、データが飛びやすいかどうかは知らない。

# WEBサーバの構成（一部予定）
|構成品目|パッケージ等|バージョン|
|:---:|:---:|:---:|
|ハードウェア|Raspberry Pi Model B+|１|
|OS|Raspbian Buster Lite|February 2020 (20/05/15時点)|
|httpdサービス|Apache|2.4|
|サーバサイドアプリケーション|PHP|7.3?|
|DBサービス|PostgreSQL （予定）|11?|

# 設定作業
とりあえず、ラズパイの基本的な設定についてのドキュメントはすでにあちこちにあるので、ある程度のことは分かっている体で。ここで細かく書かれていないことは、ググれば出てくるはず。
## OSの準備（ラズパイ触る前にPCでやる）
まずはラズパイの脳であるmicroSDカードを準備する。ちなみに、これは準備した後に判明した話なのだが、相性の問題でもあるのか、8GB～32GBまで8枚準備したうちの2枚しかラズパイがうまく起動しなかった。読んだのは2枚ともSAMSUNG製のClass10の32GBのバルク品。東芝製（8GB、Class6）とか読まなかったのに、なぜよりによってそれを……。

さて、Raspbianをインストールするための準備として、まずはNoobsをSDカードへ入れる。直接Raspbianをインストールしてもよいのだが、Noobsを入れるとインストール時に他のOSとかも選択できて楽しい。

ファイルのダウンロードは「[Download NOOBS for Raspberry Pi](https://www.raspberrypi.org/downloads/noobs/)」から。インターネットに接続できる環境なら、NOOBS Liteでよい。そもそも、接続環境がないとNoobsからインストールできるOSが減ってしまうので、楽しみ減だ。まあ今回は他のOSインストールしたりしないんだけども。

ダウンロードしたら解凍して、出てきたファイルをすべてSDカードのルートに書き込む。初めてラズパイに使用する時や、中身をまっさらにしたい時は、「[SDメモリカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter/index.html)」などでSDカードをフォーマットしてからコピー。
なお、Noobsの場合はWindowsからそのままデータをコピーすれば起動するけれど、もしRaspbianを直接インストールして起動させるなら、「[Win32 Disk Imager](https://ja.osdn.net/projects/sfnet_win32diskimager/releases/)」などのイメージ書き込みソフトを使わないとダメ。
Win32 Disk Imagerは稼働しているSDカードのバックアップを取るのにも使えたりするので、設定終わったら一度イメージをバックアップしておくと、何かあった時に安心かも。

## OSインストール
作成したmicroSDをラズパイにセット、HDMIのディスプレイとUSBキーボード、USBマウスを繋いで電源用のmicroUSBケーブルを繋ぐ。電源ボタンとかないので、自動的に起動する。
上の項目に書いた通り、どうも読めるSDカードと読めないSDカードがあるっぽい。電源繋いでしばらく待ってもウンともスンとも言わない場合は諦めて違うSDカードで試してみよう。

ラズパイのマークが出てきたら、キーボードの「Shift」を押す。タイミング分からなきゃ手前からぽちぽち連打。
Noobsが起動したら「Raspbian Buster Lite」を選択して、特にオプションとか何もいじらず、上部の「インストール(i)」をクリック。OSは一番上のやつじゃないよ。一番上のやつはデスクトップ等込みのフルバージョン。今回はWEBサーバ用なので、余計なGUIとか入れない。
マウス使う方がやりやすいと思うが、カーソルがどこにあるか分かりにくいのが難点。マウスをしばらくグルグル動かしているとそのうち白いカーソルが出てくるはず。

あとはしばらく待てばインストールされる。

## SSHのリモート接続設定
インストール完了後、勝手にRaspbianが起動する。
自分の場合はRaspberry Piをサーバラックに置いているため、正直このまま作業し続けるのがしんどい。画面の文字が小さくて見にくくてしゃーない。
なので、何をおいてもまずは他のPCからSSH接続できる状態にもっていく。

最初のログインはどうしても直接繋いだキーボードからやらざるを得ない（そらそうだ）。
初期のユーザアカウントは、ユーザ名が「**<font color="Red">pi</font>**」で、パスワードは「**<font color="Red">raspberry</font>**」。当然、世の中に広く知られまくっていて大変危険なので、後ほど忘れずにユーザを潰すことにする。パスワードを変えるより、ユーザを使えなくする方が安全。

ログインしたら、まずはSSHの設定を変更しておく必要がある。このあたりは普通のLINUX系OSと一緒。
設定ファイルは普通のユーザの権限では変更できないので、コマンドをsudoで打つか、予め`su`してスーパーユーザとしてコマンドを実行することになる。自分は後者でやるタイプ。

```console:コマンド入力
$ sudo su
# vi /etc/ssh/sshd_config
```
sshのコンフィグファイル`sshd_config`が開かれる。
中程にある`#PasswordAuthentication yes`のコメントアウト（***#***）を外し、外部からsshdのパスワード認証でログインできるようにする。
ちなみに現在作業している環境では56行目に記述されていた。`vi`でコンフィグファイルを開いたあと、`:56`と打つと、一発で該当の行へ移動できる。

初期状態ではsshのサービスが自動起動されない設定となっている。

```console:コマンド入力
# systemctl is-enabled ssh
disabled
```
つまり、この段階ではまだサービスが起動していない。よって、サービスを起動する。コマンドはstartが正しいが、restartでも問題ない。サービス名はsshdではなく`ssh`。

```console:コマンド入力
# systemctl restart ssh
```
ついでにラズパイが再起動しても問題ないように自動起動を設定しておく。

```console:コマンド入力
# systemctl enable ssh
Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ssh
Created symlink /etc/systemd/system/sshd.service → /lib/systemd/system/ssh.service.
Created symlink /etc/systemd/system/multi-user.target.wants/ssh.service → /lib/systemd/system/ssh.service.
```
サービスが起動しているか、自動起動設定が有効になっているか確認。

```console:コマンド入力
# systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-05-15 12:07:34 BST; 3h 8min ago
     Docs: man:sshd(8)
           man:sshd_config(5)
以下略
```
Active: の行が **<font color="Lime">active (running)</font>** となっていれば、sshが問題なく起動している。
また、Loaded: の行でssh.service; の次が disabled; ではなく **enabled;** になっていれば、自動起動の設定もOK。再起動しても引き続きsshで接続することができる。

## IPアドレスの設定
当たり前だが、IPアドレスが分からないと外部から接続することができない。
頑張って Raspberry Pi からやることも勿論できるのだが、自分はDHCPサーバ側で設定を入れている。そうすると、例えばラズパイのSDカードを入れ替えて別なOSで起動したとしても、同じIPアドレスを利用することができる。便利。

うちの環境では（というか大抵の人の環境では）、DHCPサーバはインターネットに接続するルータが務めている。よって、PCからルータにアクセスして、DHCPの設定でラズパイのMACアドレスとIPアドレスを紐付け。やり方はルータごとに違うので、確認する必要がある。
注意点として、固定で利用するIPアドレスはDHCPでリースする範囲（アドレスプール）から外しておくこと。固定で利用するIPがアドレスプール内にある場合、DHCPサーバが別の機器に該当IPを割り当ててしまって正常にラズパイとの通信ができなくなる可能性が出てくるため。

## PCからSSHで接続する
IPアドレスが分かれば、この段階でリモートPCからSSH接続が可能になる。
Tera TermなどのSSHクライアントを利用して、PCからラズパイへSSH接続する。
アカウント名とパスワードは、先ほど変更していなければそのまま。
ログインしたら、先ほどと同じく`sodo su`しちゃう。

## 最低限のセキュリティ設定をしておく
必要なセキュリティについては環境によるけれど、最低限のものは大体誰でも同じなので、忘れないうちにやっておく。
### 1. パッケージ等のアップデート
　　まず最初にアップデートをかけよう。
　　ファームウェアを更新するコマンドとして「[rpi-update](https://github.com/Hexxeh/rpi-update)」がある。ただし、安定版になっていない最新版が入るので、**公式では非推奨**。とりあえずこの段階でなら壊れても大したダメージにはならないのでやってみるのもアリ。ただし、今後どういう不具合が出てくるかは分からないので、あくまでも人柱としてやることになる。

<details><summary>***<font color="Orange">rpi-update の実行（やりたい人は展開してね）</font>***</summary><div>

```console:コマンド入力
# rpi-update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** Performing self-update
 *** Relaunching after update
以下略
Would you like to proceed? (y/N)
```
本当に更新するかと聞かれるので、やるなら「***y***」を入力。
警告文のあとにもう１回同じことを聞かれるので、本気でやるなら「***y***」を入力。
更新が始まる。
エラー等が出ないで正常に完了したら、rpi-update は完了。
「A reboot is needed to activate the new firmware」とか言われたりするので、ラズパイを再起動しよう。
再起動したら、`vcgencmd version`コマンドで現在のバージョンを確認してみる。

```console:コマンド入力
# vcgencmd version
May 11 2020 19:01:22
Copyright (c) 2012 Broadcom
version 21bfdeee3a6ea823e2113b983390acd1eec8edfb (clean) (release) (start)
```
　<font color="Orange">ここまで「rpi-update の実行」</font>
</div></details>

ここからは正規のアップデート手順。OSをインストールした時に最新版をダウンロードしている人は、あんまり更新ないかも。
ともかく、パッケージ情報を更新してみる。このコマンドでは、実際にパッケージが更新されることはない。

```console:コマンド入力
# apt-get update
```
最初なので、`dist-upgrade`をしてしまおう。不要パッケージの削除などでパッケージ構成が変わる可能性があるが、まだ何もしてないので問題ない。逆に、運用途中の場合は挙動が変わる可能性があるので、極力`upgrade`だけにしたい。

```console:コマンド入力
# apt-get dist-upgrade
# apt-get upgrade
```
更新があると「続行しますか？[Y/n]」と聞かれるので、「***Y***」を入力。小文字でもOK。

更新するパッケージの量にもよるが、更新には結構時間がかかることもある。オレンジジュースを飲んだり艦これやったりして、ゆったり待とう。

### 2. SSHの設定を変更
さきほど、PCからSSHで接続するために少しコンフィグをいじったが、最低限の変更しかしなかったので、今度はセキュリティ設定を変更しておく。

```console:コマンド入力
# vi /etc/ssh/sshd_config
```
- **Port変更**
　SSH接続する際のポート番号を変更することができる。デフォルトでは22ポートで、攻撃者はまずこのポートにアタックしてくる。変更することで、攻撃を回避できる。コンフィグファイルの最初の方にある`#Port 22`のコメントアウト（***#***）を外し、22の代わりに適当な数字を入れ込む。例えば`Port 12345`としたら12345ポートでSSHへアクセスすることになる。
- **PermitRootLogin変更**
　デフォルトでは`without-password`となっており、ルートユーザでも公開鍵認証ならば直接ログインできる設定になっている。必要があるのなら仕方ないが、できれば`#PermitRootLogin prohibit-password`のコメントアウト（***#***）を外して編集し、`permitrootlogin no`としたい。なお、何故かコンフィグファイル記述はwithout-passwordではないようだ。
- **AuthorizedKeysFile変更**
　パスワードではなく公開鍵認証でログインしたい場合は、`#AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2`のコメントアウト（***#***）を外して編集し、`AuthorizedKeysFile     .ssh/authorized_keys`とする。authorized_keys2の設定は無くしてしまってよい。なお、この設定を入れたからと言って***パスワード認証が無効になるわけではない***。パスワード認証をさせたくない場合は、最初に編集した`PasswordAuthentication yes`をコメントアウトするか、noに戻しておこう。

これらの変更ができたら、sshサービスを再起動する。

```console:コマンド入力
# systemctl restart ssh
```

### 3. rootユーザへのパスワード設定
デフォルトではrootにはパスワードが設定されていないので、これを設定。

```console:コマンド入力
# passwd
```
設定完了後、いったんsu状態から`exit`して、設定したパスワードでログインできるか試してみるとよい。
できなかったら再度`sudo su`してパスワードを設定する。

### 4.ユーザの乗り換え
デフォルトのユーザ「pi」は広く知られすぎているので、自分のユーザを作成し、piユーザは利用不可能にする。

- **新しいユーザの作成**<br>
人によって諸々の流儀があるかと思われるが。

```console:コマンド入力
# useradd -u 1001 -G sudo watashi-no-namae
# passwd watashi-no-namae
```
userid はpiユーザが1000になっている。指定したければ指定する。また、グループとして「sudo」を追加している。セカンダリグループなので、大文字の「G」であることに注意。このグループに所属していると、`sudo`コマンドを使えるようになる。
ユーザ作成後は、パスワードを設定する。

ログイン後、いったんSSH接続を切断する。
新しく作成した`watashi-no-namae`ユーザでログインし直す。
piユーザでの接続を切断しておかないと、ユーザの削除ができない。

- **piユーザの削除**<br>
piユーザを抹消する。ここではホームディレクトリごと削除する。

```console:コマンド入力
# userdel -r pi
# id pi
id: `pi': no such user
```
`id`コマンドで`no such user`と言われたら、削除は完了している。

初期ユーザを削除するのが怖いというのであれば、ユーザをロックして利用できなくすることもできる。

```console:コマンド入力
# passwd -l pi
# passwd -S pi
pi L 02/13/2020 0 99999 7 -1
```
`passwd -l`でユーザをロックできる。戻すときは`-u`。確認のオプションは大文字で`-S`となる。ユーザ名のすぐ左が「L」になっていれば、ロックされていることになり、「P」になっている場合は、ロックが解除されている。

これで、最低限のセキュリティ設定まではOK。ひとまず安心していじくり回せる状態にはなった。
セキュリティ設定をもっとやろうとすると、firewalldとか諸々できることはあるのだが、とりあえず長くなりすぎたのでここまで。