連載第十四回目です。
セキュリティ設定について何もわからん状態なので色々と漁っていました。
PythonやFlaskなどの個別のモノに対してのセキュリティ設定の書籍は中々多くないので、Linuxなどの基礎的なセキュリティ設定について学習する方がいいと思われます。
その学習には下記のようにシステムの構成図を書いて、どこがセキュリティを設定しきれていないか確認しながら進むといいでしょう。
抜け道で言うと、プロに聞くのが最短ですね。
この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
その他については上記ページをお読みください。
すべての基本
バージョンアップしよう。
基本的に、脆弱性はバージョンアップすると減る。
CentOS7のセキュリティ設定
参考記事:接続時のセキュリティの設定(CentOS 7)(さくらVPS設定マニュアル)
1. さくらVPSのデフォルトではファイアウォールが起動されていないことがある。
ファイアウォールの起動コマンドは下記の通り。
systemctl start firewalld
さくらVPS独特のパケットフィルタという厄介な設定もあるので注意。
2. ファイアウォール中にサービスの利用を許可するコマンドを使わないと、自作のサービスが動かない
ファイアウォールの許可を追加するコマンドは以下の通り。
firewall-cmd --permanent --zone=public --add-service=許可するサービス名
許可を追加しても、ファイアウォールをリロードしないと設定は反映されません。
参考記事:サーバ作成直後に設定しておくべき初期セキュリティ設定(さくらのVPS)
本来の参考記事はさくらVPSでDjangoアプリを公開する手順の備忘録(note:夕月悠里さん)ですが、公式がベースになっているので記載。
- ROOTユーザーは使わない
- SSH接続用の公開鍵暗号方式を使う
- HTTPS(SSL)使おうぜ
HTTPSに必要な独自ドメインは無料で取れるサービスもあるし、HTTPSでないと安全でないサイトと表示されるのでやりましょう。
→ 記事参照:Let’s EncryptでVPS上のWebサイトをSSL(HTTPS)接続にしよう
あくまで基本やけど、個人開発で全部をカバーできている所は多くない気がする。
Nginxのセキュリティ設定
表示
1. レスポンスにNginxのバージョンを表示させない。
Nginx設定ファイル(/etc/nginx/conf.d/default.conf)に下記を追加。
http { server_tokens off; }
バージョン情報=脆弱性情報ですからねえ・・・。
FTPのセキュリティ設定
ファイル送信にはSFTPかSCPを使おう。
Pythonのセキュリティ設定
Python2はやめてPython3を使おう。
かつ、メジャーバージョンでもできるだけ新しいバージョンを使おう。
そのためには、Nginx Unitさんは早く、公式でPython3.6.8以外の対応をできるようにすべき。Dockerでどうにかなるらしい(未確認)が面倒。
GunicornやuWSGIは、バージョンを気にしなくてOKなのが楽。ただしWindows上では試験的に使えないのは面倒。WSL2等で特別に設定すればできるが面倒。
Flaskのセキュリティ設定
参考記事:Flaskのセキュリティ対策(simon’s noteさん)
特に注意すべきは下記3点。1番が一番抜けやすい気がする。
- 自分で変数を埋め込んだHTMLを用意する場合にはescapeを使う
- コンテンツセキュリティポリシー(CSP)
- X-Content-Type-Options
Flaskバージョンアップ
Flask2が出たのでそちらを使った方がいいかもしれない。
Flaskのセキュリティ設定に関するバグ(?)
1. データベースとの通信に使うapp.SECRET_KEYの乱数生成文字列の設定に要注意
CentOS7+Python3だとデフォルトはascii。
asciiで対応できない文字列(例:日本語等)を入れると、エラーは表示されないが、ログイン時のクッキー操作等に異常が出る。
記事13で行った、文字コードのデフォルト設定をUTF-8にすると解決する。
phpMyAdminのセキュリティ設定
最低限、アクセス可能IPを制限する必要がある。
ディレクトリ名をphpMyAdminにしない。
おわりに
色々調べてみましたが、セキュリティ設定は難しい。。
不足している観点があればURLだけでもコメントいただけると幸いです。
この記事は、VPSで作るPythonでのWebアプリ運用環境の連載記事です。
次回以降は上記記事からご覧ください。