Raspberry Piでwebサーバを公開するにはセキュリティ設定が必要不可欠です。もし設定しなければすぐに攻撃にさらされ乗っ取られたり攻撃の踏み台にされてしまうことでしょう。NASAでは勝手に設置されたRaspberry Piを踏み台にされて情報を盗まれていたなんていうこともあったのですから、しっかり設定したいところです。ここはセキュリティ上の都合で説明しませんみたいなことを言っている方も多いので、ある程度テンプレートとしてこれぐらい設定すれば最低限大丈夫というぐらいになるように記事を書いていきます。もちろんプラスでご自身で必要な設定にしてください。
今回は以前の記事で説明したような初期設定は済ませているという前提で話を進めていきます。以前の記事はこちらです。
すごく初心者向けに書いていますが、時間設定や言語設定など最低限のことはしています。気になる方は一応目を通してください。
さて始めていきます。
目次
ユーザの追加、削除
アカウントの削除と追加を行っていきます。理由としては、piというユーザーとパスワードを使い続けることを考えてみるとわかります。webサーバがRaspberry Piで運用されていることを知っていれば…そのユーザ名とパスワードが簡単に推測できるので、SSHログインなんかをされて簡単に乗っ取られてしまうかもしれないからですね。なのでユーザを作り直しpiを消してしまいましょう。
以下のコマンドでユーザを追加します。USERNAMEは好きな名前に読み替えてください。今後のSShログインで必要になります。パスワードなどの入力が求められると思うので指示通りに設定してください。
$ sudo adduser USERNAME
$ sudo usermod -G sudo USERNAME
これで、いったん再起動を行ってpiユーザを削除します。もし再起動しないとこのセッションが残ってしまって削除ができないので再起動をしたら、先ほど作成したユーザでログインしましょう。ではいったん再起動です。
$ sudo reboot
ログインしたら以下のコマンドでpiアカウントを消します。
sudo userdel pi
これでユーザの追加と削除が完了です。今後は新規作成したユーザでログインしていくことになります。
SSHの各種設定
この項ではSSHの設定を行っていきます。少しでもセキュリティのレベルを上げましょう。といいながら、今回は鍵方式にはしません。鍵方式にしたい方は別途調べて設定を行ってください。
ポートの変更を行います。理由としてはネットワークの技術において、SSHのデフォルトの22番ポートというのはwell-knownポートと呼ばれ一種の共通規格になっています。なので何もポート番号を変更しないで22番ポートにアクセスされるとそこにはSSHの応答があるのでそこを狙って攻撃を仕掛けられる場合が多いのです。特にパスワード方式だと、「ブルートフォースアタック(総当たり攻撃)」というものが行われたりもするのでここを変えておくのは必須になります。
あとはもしもSSHに不正ログインがあったとしても、少しでも被害を減らすためにroot権限でのログインを禁止する設定を行います。
では以下のコマンドを実行します。
$ sudo nano /etc/ssh/sshd_config
これを開いたら、一番下に以下の文を追加してください。Port以降の1234としているのは好きな番号に変えてください。well-knownポートなどに被るのはいけないので4桁の番号で決めるとよいでしょう。ポート番号について詳しく知りたい場合は別途調べてください。ここでは省略します。
PermitRootLogin no
Port 1234 //好きな番号に変えてください
これを追記したらSSHのサービスを再起動します。
sudo service ssh restart
これでポート番号が変更されて、rootログインができなくなっています。
ファイアウォールの設定(iptables)
ここが一番難しい場所になります。ファイアウォールの設定です。ファイアウォールをご存じでない方のためにごくごく簡単に説明すると、必要な通信は通して不要な通信は通さないという設定を行います。これを文字ベースでやるから難しく感じるわけです。セキュリティの設定でここの設定は非公開とかいう場合も多いみたいですが、ここではテンプレートのような形で必要であればさらに追記というスタイルでいきます。とりあえずコピペしておけば最低限は大丈夫かと。
では以下のコマンドを入力してください。
sudo apt-get install iptables iptables-persistent
次に設定を変更します。
sudo nano /etc/iptables/rules.v4
エディタで開いたら、一番下に必要なことを追記します。今回はテンプレートでこんな感じにしておきます。SSHポート番号は適切に読み替えて入力してください。
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
-A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport (SSHのポート番号) -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT
-A INPUT -m hashlimit --hashlimit-name badtable --hashlimit-mode srcip --hashlimit-htable-expire 120000 --hashlimit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT
-A FORWARD -j REJECT
中身についてはここで説明したらややこしいことになるので、何ができるかだけごく簡単に。許可している通信は以下の3つのポートに限ります(ループバックはカウントしません。)
- 80
- 443
- SSHのポート
今回はwebサーバを立てるということで、この3つに限定しています。これ以外は基本必要ないことはご存じかと思います。あとはご自身の環境に合わせて設定してください。
他にも多少は攻撃への対策も入れていますが、省略します。
自分の場合はもう少し設定していますが、ここには書きませんし絶対公表しません。ですが、この設定でも十分実用的だと思います。ただし、この設定の安全を保証するものでもありませんので、あくまで参考にということで各自設定をお願いします。
あとはこの設定を反映するために以下のコマンドを実行します。
sudo /usr/sbin/iptables-apply /etc/iptables/rules.v4
一応ここに書いておきますが、iptableのhashlimitによってはじかれたものは以下の場所に記録されています。
/var/log/kern.log
まあここら辺のログ出力の設定も気になる方はご自身で調べて設定いただくほうがよろしいかと思います。
これでiptablesの設定は終わりです。
まとめ
iptablesが難関です。テンプレート通りでない設定をする必要がある場合は頑張って調べてみてください。ネットワークの知識も必要になりますし、しっかり理解すると相当勉強になると思います。ネットワークはシンプルに面白いので、興味がある方は勉強していじってみると楽しいと思います。
セキュリティの設定をWordPressをインストールするために見ていただいた方は次の記事へどうぞ。以下リンクを置いておきます。
あとは雑談です。
最先端技術に関連するとても難しい余談ですが、Googleとが研究しているP4も実用化されたら面白そうですね。研究でネットワークでの計算器とかファイアウォールの実装をやってみましたが、相当柔軟にできますしネットワークの内外とか簡単に判断できるのが非常に面白い技術だと感じましたね。プログラムで書けるし、データプレーンをいじることができる。未来がやってきたらもっと安全に簡単にサーバを公開できる日がやってくるのかもしれませんね。P4に興味ある人は調べてみてくださいねって書こうかと思ったのですが、大半が英語の記事なのと、中身の実装とかに関しては日本語のサイトでは書いてないところばかりなので調べてもほとんどわからないと思います。論文には実装方法とか書いてるので論文を読むのが一番ですね。でもネットワークをプログラムでいじれるのは面白いですよやっぱり。
相当脱線してしまいましたが、Raspberry Pi本体のセキュリティ設定は以上となります。
次はいよいよWordPressのインストールに必要な各種webサーバアプリケーションプログラムとWordPressのインストールです。あくまで公開するまでがこのブログで扱う範囲限界かなと思ってもいるので、WordPressの簡単なプラグインの説明などはするかどうか悩んでいます。なので気が向いたら公開します。WordPressは専門外なので、他の方のほうがずっと詳しいでしょうからね笑。次の記事↓