Flask-Securityは、Flaskアプリケーションのセキュリティを強化するための拡張ライブラリです。本ガイドでは、生産環境でのセキュリティ設定とパフォーマンスの最適化方法を説明します。
1. 環境準備とインストール
1.1 Flask-Securityのインストール
pipを用いてFlask-Securityをインストールします:
pip install flask-security
ソースコードからインストールする場合は、次のコマンドを実行します:
git clone https://gitcode.com/gh_mirrors/fl/flask-security cd flask-security python setup.py install
1.2 基本的な設定ファイル
`config.py`ファイルを作成し、シークレットキーとデータベース接続を設定します:
import os
class BaseConfig:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'secure-random-string'
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URI') or 'sqlite:///app.db'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECURITY_PASSWORD_HASH = 'pbkdf2_sha512'
SECURITY_PASSWORD_SALT = os.environ.get('SECURITY_SALT') or 'random-salt-here'
2. セキュリティ設定
2.1 パスワードポリシー
パスワードの保護を強化するため、次の設定を追加します:
# config.py SECURITY_PASSWORD_HASH = 'pbkdf2_sha512' SECURITY_PASSWORD_SALT = 'strong-random-salt' # 環境変数を推奨 SECURITY_PASSWORD_LENGTH_MIN = 12 # 最小パスワード長 SECURITY_PASSWORD_COMPLEXITY_CHECKER = 'zxcvbn' # 複雑度チェックを有効にする
zxcvbnをインストールする必要があります:
pip install zxcvbn
2.2 セッション保護
セッションの安全性を確保するため、次の設定を追加します:
# config.py SESSION_COOKIE_SECURE = True # HTTPSでのみCookieを送信 SESSION_COOKIE_HTTPONLY = True # JavaScriptからのCookieアクセスを防止 SESSION_COOKIE_SAMESITE = 'Lax' # クロスサイトリクエストを制限 PERMANENT_SESSION_LIFETIME = 3600 # セッションの有効期限(秒)
2.3 安全機能の有効化
次の設定を追加することで、さまざまな安全機能を有効にします:
# config.py SECURITY_REGISTERABLE = True # ユーザー登録を許可 SECURITY_CONFIRMABLE = True # Eメール認証を義務化 SECURITY_RECOVERABLE = True # パスワードリセットを許可 SECURITY_TRACKABLE = True # ログインアクティビティを追跡 SECURITY_CHANGEABLE = True # パスワード変更を許可
3. 生産環境の最適化
3.1 データベース最適化
大規模アプリケーションの場合、接続プールとインデックス最適化を使用します:
# config.py
SQLALCHEMY_ENGINE_OPTIONS = {
'pool_size': 5,
'max_overflow': 10,
'pool_recycle': 1800, # 30分ごとに接続を再利用
}
ユーザーのModelにインデックスを追加します:
from flask_security import UserMixin, RoleMixin
from datetime import datetime
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True, index=True)
username = db.Column(db.String(255), unique=True, index=True)
# 他のフィールド...
3.2 キャッシュ戦略
Flask-Cachingを用いて頻繁にアクセスされるデータをキャッシュします:
# app.py
from flask_caching import Cache
cache = Cache(app, config={
'CACHE_TYPE': 'redis',
'CACHE_REDIS_URL': os.environ.get('REDIS_CACHE_URL')
})
@app.route('/dashboard')
@cache.cached(timeout=600) # 10分間キャッシュ
@login_required
def show_dashboard():
# ダッシュボードのロジック...
return render_template('dashboard.html')
3.3 リクエスト制限
Flask-Limiterを用いて暴力的攻撃を防止します:
# app.py
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
limiter = Limiter(
app,
key_func=get_remote_address,
default_limits=["100 per day", "30 per hour"]
)
@app.route('/signin', methods=['POST'])
@limiter.limit("5 per minute")
def handle_signin():
# サインインのロジック...
return redirect(url_for('home'))
4. 部署のベストプラクティス
4.1 WSGIサーバーの使用
生産環境では、GunicornやuWSGIを使用します:
# Gunicornでの起動 gunicorn --workers 4 --bind 0.0.0.0:8000 wsgi:app
4.2 HTTPSの設定
Let's Encryptから無料SSL証明書を取得し、Nginxをリバースプロキシとして設定します:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
4.3 監視とログ
次の信号を用いてログを記録します:
# app.py
from flask_security.signals import user_registered, user_authenticated
@user_registered.connect_via(app)
def log_registration(sender, user, **extra):
sender.logger.info(f"ユーザー登録: {user.email}")
@user_authenticated.connect_via(app)
def log_login(sender, user, **extra):
sender.logger.info(f"ログイン: {user.email}")
5. 一般的な問題の解決
5.1 パスワードリセットメールが送信されない
メール設定を確認します:
# config.py
MAIL_SERVER = 'smtp.example.com'
MAIL_PORT = 587
MAIL_USE_TLS = True
MAIL_USERNAME = 'noreply@example.com'
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
SECURITY_EMAIL_SENDER = 'noreply@example.com'
5.2 性能のボトルネックを診断
Flask-Profilerを用いて性能を分析します:
pip install flask-profiler
# app.py from flask_profiler import Profiler Profiler(app).init()
ブラウザで`/flask-profiler`にアクセスして診断を行います。
以上がFlask-Securityを用いた生産環境でのセキュリティ設定と最適化方法です。定期的なセキュリティアップデートを忘れないようにしてください。