[wip] Raspberry Piのセキュリティを高めてみた

# はじめに
Raspberry Piをレンタル機材として貸し出すとき、いたずらされても影響が出ないようにしつつも、メンテナンスするときには調整できるようにするにはどうすればいいか考えてみた。

# Linux側 設定 - SSH編
## 前提事項

　セットアップ時、多くはLAN+NAT環境内でセットアップしていると思います。そのため直接Raspberry Piにグローバルアドレスが割り当てられることは無いとはずです。いきなりDMZエリア内に設置とかしてしまうと、何があるかわからないので辞めましょう。

まずは、閉じたネットワークかUSBでデータをコピーする方法などで、データが漏洩しないように気をつけます。

## デフォルトユーザー:piのパスワードを変更する

```shell-session
$ passwd
Changing password for pi.
(current) UNIX password:        ← 今まで使用していたパスワード
Enter new UNIX password:        ← 新しく設定するパスワード
Retype new UNIX password:       ← もう1回、入力
passwd: password updated successfully
```

## SSHにてログイン時のパスワードを使わず鍵認証方式に変更する

### 鍵認証用の鍵ファイルを作る

秘密鍵と公開鍵を作ります。

```shell-session
$ cd ~/.ssh
$ ssh-keygen -t rsa -C pi@hostname
Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):     ← キーファイルを保存する場所。
Enter passphrase (empty for no passphrase):                     ← 鍵認証用のパスワード
Enter same passphrase again:                                    ← 鍵認証用をもう1回。
Your identification has been saved in /home/pi/.ssh/id_rsa.
Your public key has been saved in /home/pi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:ZIsDa1VaRefXXXXXXXXU2HS7w4II2Ulh0AkSDlN6bcc pi@hostname
The key's randomart image is:
+---[RSA 2048]----+
|   ..oo=oE  + =.+|
|    .+.+o.... .+.|
|    o o S. ....+ |
|   .   .     ....|
|    = o+*o.o B o.|
|              o .|
|             . + |
|              . .|
|   o.+.o**= . . .|
+----[SHA256]-----+
$ cat id_rsa.pub >> authorized_keys
```

### 秘密鍵ファイルをログイン元の環境へ送る
生成された`~/.ssh/id_rsa`を安全にローカルPCへファイル転送する

### sshdの設定を書き換える

```diff:/etc/ssh/sshd.config
- #PasswordAuthentication yes
+ PasswordAuthentication no
```

参考：[Passwordless SSH access - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/remote-access/ssh/passwordless.md)


## SSHを有効にするけど、ポート番号は変更する

```diff:/etc/ssh/sshd.config
- Port 22
+ Port 10022
```

SSHの22番、あたりまえなので狙われます。パスワード認証を受け入れなくても、無駄に接続してくることが多いので、SSHの受け待ちポート番号を変更します。10022とか20022とかも、変更後の定番どころかと思います。10000～64000の間の適当な数をポートに割り当てたほうが良いかもしれません。

## rootの直接ログインを禁止する

```diff:/etc/ssh/sshd.config
- #PermitRootLogin prohibit-password
+ PermitRootLogin no
```

## sshdを再起動する

- 何かあってもいいようにログインできているセッションはそのまま切断せずに保持しておく
- `sudo /etc/init.d/sshd restart`
- 下記のログインパターンを試してみる
    1. root
    1. pi & パスワードチャレンジ(秘密鍵なし)
    1. pi & 秘密鍵あり

3のパターンのみログインできればOK。


## ここまで設定したpi、sshの秘密鍵ファイルを捨てて、新しいssh接続用ユーザーを作る。

### ユーザーの作成。

adduserとuseraddを間違えると設定がする量が変わるので、注意が必要

- adduser : ユーザー作成ウィーザードが表示されるので、質問に答えていけばOK
- useradd : ユーザーを追加する。いろいろとオプションを指定して実行する必要あり。

```shell-session
$ sudo adduser yyano
Adding user `user9999' ...
Adding new group `user9999' (1001) ...
Adding new user `user9999' (1001) with group `user9999' ...
Creating home directory `/home/user9999' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for user9999
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]  y
```

### 追加したユーザーがsudoが使えるようにグループに追加する

```shell-session
$ sudo gpasswd -a user9999sudo
```

### 新しく作成したユーザー用の鍵認証用の鍵ファイルを作る

```shell-session
$ sudo su user9999
$ mkdir ~/.ssh
$ ssh-keygen -t rsa -C user9999@hostname
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user9999/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user9999/.ssh/id_rsa.
Your public key has been saved in /home/user9999/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vPY0xZ08cNSWyXXXXiy2+BqoTWIpW4fhdlcoqQDFnl0 user9999@hostname
The key's randomart image is:
+---[RSA 2048]----+
|     ..       ...|
|     ..   E  . .*|
|      . S o +oBo |
|       o * +.... |
|      . % B o.   |
|       B X o ..  |
|    .. o .  . o==|
|     .o..  o *o*o|
|      . . o ..   |
+----[SHA256]-----+
$ cat id_rsa.pub >> authorized_keys
```

### ログインできることを確認。

# Linux側 設定 - iptables編

ディストリによってはiptablesだったりfirewalldだったり。ここではiptablesを設定するパターンで進めていきます。

## iptables関連パッケージを追加する。

```shell-session
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install iptables-persistent
```

iptables-persistent、ipv4版とipv6版を両方とも作りましょう。

```ini:/etc/iptables/rules.v4
# Generated by iptables-save v1.6.0 on Fri Sep 15 22:00:00 2017
*filter
:INPUT ACCEPT [64879:93089593]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [33379:1852635]

-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP

-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p udp --sport 53 -j ACCEPT

-A INPUT -p tcp --dport 10022 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

COMMIT
# Completed on Fri Sep 15 22:00:00 2017
```
省略しますが、`rules.v6`も同じように作ります。
設定ファイルに記述が終わったらiptablesを適用していきます。

```shell-session
$ sudo /etc/init.d/netfilter-persistent restart
```
※ `iptables-persistent`ではなく、`netfilter-persistent`になってました。