ラズパイを闇のハックに対する防衛術でセキュアな自宅サーバーにする

闇のハックに対する防衛術を本稿では伝授します。

# 本稿でできること
- SSH接続
- 公開鍵・秘密鍵をつかった接続
- ファイアーウォールの設定
- Dos攻撃、ブルートフォース攻撃対策
- 無料DNSを使う
- 外部ネットワークから宅内にあるラズパイへアクセス
など

# 大まかな手順
1. [ラズパイに新しいユーザーの追加](#ラズパイに新しいユーザーの追加)
2. [SSH接続有効化](#ssh接続有効化)
3. [公開鍵・秘密鍵の生成](#公開鍵秘密鍵の生成)
4. [SSH設定ファイルの変更](#ssh設定ファイルの変更)
5. [ファイアーウォールの設定](#ファイアーウォールの設定)
6. [その他セキュリティ設定](#その他セキュリティ設定)
7. [ポートフォワーディングの設定](#ポートフォワーディングの設定)
8. [内部ネットワークで設定通りのSSH接続ができるか確認](#内部ネットワークで設定通りのssh接続ができるか確認)
9. [無料DNSに登録](#無料dnsに登録)
10. [外部ネットワークから設定通りのSSH接続ができるか確認](#外部ネットワークから設定通りのssh接続ができるか確認)

# ラズパイに新しいユーザーの追加
デフォルトの状態だとpiユーザーが存在し、このままだとpiユーザーを標的としてラズパイサーバーに侵入される可能性があるため、新しく別のユーザーを追加してpiユーザーを削除します。
また、新しく追加したユーザーにsudo権限を与えます。

```
$ sudo adduser [username]
$ sudo usermod -G sudo [username] 
$ sudo userdel -r pi
```

userdelに-rをつけることで、ホームディレクトリ(/home)も削除してくれます。

# SSH接続有効化

```$ sudo raspi-config```で設定画面を開き、「Interfacing Options」 -> 「P2 SSH」を選択するとSSHを有効にするか聞かれるので、「はい」を選択してください。変更は再起動をすると適用されます。

> 詳しい説明
[Raspberry Pi3のLAN外からのSSH接続設定方法](https://qiita.com/3no3_tw/items/4b5975a9f3087edf4e20#ssh%E6%8E%A5%E7%B6%9A%E8%A8%AD%E5%AE%9A)

SSHの話ではないですが、ついでに後で必要となるディレクトリを作成しておきます。
``` /home/[username]```配下に```mkdir .ssh```で公開鍵を置くためのディレクトリを作成します。すでに存在している場合はスルーしてください。

# 公開鍵・秘密鍵の生成

今度はクライアント側(ラズパイに接続したいマシン)で作業をします。サーバー側での鍵生成は控えてください。

```
ssh-keygen -t rsa -f [file_name]
```

```-f [file_name]```はなくても良いですが、ない場合はid_rsa(秘密鍵)とid_rsa.pub(公開鍵)がデフォルトのファイル名として生成されます。生成されたファイルは```~/.ssh```配下に置いてください。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/[username]/.ssh/id_rsa): 
```

と出てきますがそのままエンターで問題ありません。

次にパスフレーズの入力を求められるので入力しましょう。何も入力せずにエンターを押すことも可能ですが、今回はセキュリティをガチガチに固めることが目的なので入力します。

公開鍵・秘密鍵についてはこちらを参照してください。
> 絵があって分かりやすい記事です
[【秘密鍵/公開鍵】コピペで出来る！鍵認証の設定方法](https://qiita.com/nnahito/items/dbe6fbfe347cd66ae7e6)
windowsをお使いの方はこちらを参照
[秘密鍵・公開鍵を作成する（Win）](https://qiita.com/reflet/items/5c6ba6e29fe8436c3185)

生成した公開鍵は秘密鍵・公開鍵ともにパーミッションを600にしてください。

```/.ssh``` のパーミッションは700に、秘密鍵・公開鍵のファイルは600に変更します。

```
chmod 700 ~/.ssh
```

```
chmod 600 id_rsa id_rsa.pub
```

> パーミッションの詳細
[ファイル権限の読み方](https://ykonishi.tokyo/how-to-read-file-authorization/)
[chmod? chown? よくわからんって人のための、ファイル権限系まとめ](https://qiita.com/t-a-run/items/239ed690ece7a011804a#chown%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)

公開鍵は、ラズパイに送信します。

```
scp [送信するファイル] [ユーザー名]@[ラズパイのホストアドレス]:[送信先のディレクトリ]
```

送信するファイルがid_rsa.pub、ユーザー名chloe、ホストxxx.xxx.xxx.xxx、送信先のディレクトリ~/.ssh/とすると以下のようになります。


```
scp id_rsa.pub chloe@xxx.xxx.xxx.xxx:~/.ssh/
```

ちなみに、送信先を先を指定しなかった場合は、chloeユーザーのホームディレクトに送信されます。

# SSH設定ファイルの変更

ここで設定をするファイルは```/etc/ssh/sshd_config```です。

ポート番号を設定し、rootでのログインを不可にします。また、ここで秘密鍵・公開鍵を使った接続設定を行います。

設定は以下を参考にしてください。

```/etc/ssh/sshd_config
Port 40230
PermitRootLogin no
RSAAuthentication    yes
PubkeyAuthentication yes
AuthorizedKeysFile   %h/.ssh/id_rsa.pub
PasswordAuthentication no
```

設定はsshサーバーを再起動させて有効化します。

```
sudo systemctl restart ssh
```

もしくは

```
sudo /etc/init.d/ssh restart
```

で再起動が可能です。

なお、ポート番号については好きに決めてもらって良いのですが、基本的には0～65535の中で番号を決めてください。また、ポート番号にもいろいろ決まりがあるので、下の参考を見てもらえればと思います。

> ポート番号の詳しい情報
[ポート番号を軽く調べてみた](https://ykonishi.tokyo/survey-port-number/)
[TCP/IPポート番号一覧](http://www.vwnet.jp/mura/portnumbers/tcpip-port.asp)

# ポートフォワーディングの設定
ルーターの設定画面を開くとポートフォワーディングの設定ができるはずです。

/etc/ssh/sshd_configに追記したポート番号をここで登録します。

# ファイアーウォールの設定

ファイアーウォールの設定では、iptablesというパケットフィルターを使います。iptablesは一般的なLinuxに標準搭載されているパケットフィルターですが、ラズパイには残念ながら搭載されていません。設定はやや難しく理解にも一苦労するのですが、商用にも匹敵するほどの高機能なので積極的に利用することをおすすめします。

> iptablesの解説
[【丁寧解説】Linuxファイアウォール iptablesの使い方](https://eng-entrance.com/linux-firewall)

まずはiptablesをインストールします。インストール後は新しいカーネルモジュールをロードするために再起動をしてください。

```
$ sudo apt-get install iptables iptables-persistent
```

このコマンドでiptablesの現在の設定が出てきますが、インストール直後はまだ何も設定されてないはずです。

```
$ sudo iptables -L
```

次にこのコマンドで、フィルタリングのルールなどを書き込むためのテキストファイルを作成します。

```
$ sudo /sbin/iptables-save > /etc/iptables/rules.v4
```

準備ができたところで```/etc/iptables/rules.v4```にルールを追加していきます。

このような感じで追加していきます。

```
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 40230 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
```
## 追加ルールの簡単な説明

すべてのルールの頭に付いている```-A```はルールの追加を表しています。ちなみに```-D```はルールの削除を表します。

ローカルループバックの接続を許可をし、かつ127.0.0.1～127.0.0.254のアドレスはローカルプールバックとして許可します。

```
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
```

すでに許可された接続と、新しくかつ許可された接続を許可します。

```
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
```

すべての送信トラフィックを許可します。

```
-A OUTPUT -j ACCEPT
```

新しい40230ポートへのtcp接続を許可します。

```
-A INPUT -p tcp -m state --state NEW --dport 40230 -j ACCEPT
```

1分に5回までの応答制限を設定します。これはDoS攻撃やブルートフォース攻撃などの、多くのアクセスを必要とする攻撃に有効な対策です。また、iptables によって拒否されたコールを記録します。記録をつける際、iptables denied:が識別子になります。logは```dmesg```コマンドで見ることができます。

```
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
```

設定の適応はこのコマンドで

```
sudo /usr/sbin/iptables-apply /etc/iptables/rules.v4
```

> log-levelについてはこちら
[iptables](http://itref.fc2web.com/unix/linux/iptables.html)

その他の受信は全て拒否します。

```
-A INPUT -j REJECT
-A FORWARD -j REJECT
```


> [Raspberry Piを攻撃から守るための手順](http://makezine.jp/blog/2017/09/secure-your-raspberry-pi-against-attackers.html)
[コピペから脱出！iptablesの仕組みを理解して環境に合わせた設定をしよう](http://oxynotes.com/?p=6361)

# その他セキュリティ設定

リソースの利用に一定の制限をかけて、Fork爆弾などの攻撃対策を行います。

```
# ユーザーが一人で利用できるプロセス数を1024個に制限する
ulimit -u 1024 
# CPU時間を最大30秒にする
ulimit -t 30
```

これで大量のプロセスがコンピュータを埋め尽くす心配が軽減されます。

> 参考
https://ykonishi.tokyo/fork-bomb-counterplan/

# 内部ネットワークで設定通りのSSH接続ができるか確認

ここまで来たら、内部ネットワークでラズパイにssh接続できるはずです。

```
ssh -i .ssh/id_rsa -p 40230 chloe@xxx.xxx.xxx.xxx
```

とコマンドをたたくと秘密鍵・公開鍵を使ったSSH接続ができるはずです。

# 無料DNSに登録
ここからは、外部ネットワークからラズパイに接続したい人向けです。

今回は[ieServer.net](http://ieserver.net/)のDNSを使用します。ieSeverではDDNSを導入しているため、非固定ipの方でも安心して利用できます。

登録は簡単で、httpsかhttp接続かを選択してユーザー名、パスワード、メールアドレスを登録します。このときにドメインを一緒に登録します。

# 外部ネットワークから設定通りのSSH接続ができるか確認

```
ssh -i .ssh/id_rsa -p 40230 chloe@[登録したドメイン]
```

これで接続できたらセキュアな自宅サーバ構築が完了です。

# その他
logwatchというログ監視ツールを使うことで、定期的にログをメール送信できるのでこちらのセキュリティ対策もおすすめです。
> [サーバーから毎日自動でログファイルを送信する](https://qiita.com/nisyuu/items/03951c246faee636d0ab)

# 最後に

なお、ここまででやってきたことはあくまで対策で、敵の攻撃を無効化するものではありませんし、ネットワークに存在している以上攻撃されることは防ぎようもありません。重要なのはフィルターを難重にもしてリスクを抑えることです。パスワードの設定も、qwertyやpasswordのような簡単な文字列から少しでも難解な文字列にすることでリスクは抑えられます。

セキュリティの対策は多少面倒ではありますが、問題が起きた時のことを考えるとやって損はなく、むしろ得です。ちょっとでも対策を施すことをおすすめします。

以上、闇のハックに対する防衛術でした。