RのWeb制作

Webサービス制作のための技術情報を。データ分析(Python、機械学習コンペ他)や自作野球ゲームMeisyoのこと中心。

Web制作 Python SQL

(VPSでつくる) セキュリティ設定

投稿日:2021年5月23日 更新日:

連載第十四回目です。

セキュリティ設定について何もわからん状態なので色々と漁っていました。
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:夕月悠里さん)ですが、公式がベースになっているので記載。

  1. ROOTユーザーは使わない
  2. SSH接続用の公開鍵暗号方式を使う
  3. HTTPS(SSL)使おうぜ
  4. 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番が一番抜けやすい気がする。

  1. 自分で変数を埋め込んだHTMLを用意する場合にはescapeを使う
  2. コンテンツセキュリティポリシー(CSP)
  3. 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アプリ運用環境の連載記事です。
次回以降は上記記事からご覧ください。

-Web制作, Python, SQL

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

TensorFlowまで到達

ちょいちょい数式に詰まりながらも、DeeplearningのフレームワークTensorFlowの学習まで漕ぎ着けました。 一番困ったのは「説明無しで数式使うよ!」 マジやめてください・・・まあ勉強する …

for内で選手個人データをSQLで呼び出すより、辞書型を利用した方が読み込みは早い

for内でSQLを呼び出すと遅い…。 自作野球ゲームMeisyoでは、明示的にデータを呼び出すためにfor内でSQLを利用していました。 CDs = {} # Cardデータ(選手id, 選手データ) …

no image

PHPのコーディング規則、PSRのまとめ

「PHPのコーディング規則、PSRを学ぶ」(1)~(5)の集大成が完成しました。 PHPコーディング規則、PSRを学ぶで閲覧可能です。 正確を期していますが、誤りがあったらコメントをお願いします。m( …

pythonのnumpyで遊ぶ

異常に奥が深いnumpyで遊びましょう!! import numpy as np 配列の形状変換 a = np.arange(int(np.floor(np.random.rand()*1000))) …

【教材紹介】Python ゼロからはじめるプログラミング

概要 「プログラミング、興味はあるけどどう始めたらいいのかわからない。」というあなた!まずは、丁寧な説明と図、問題集までついたこの1冊(無料PDFあり)で入門してみませんか? 内容を確認しましたが、こ …