カテゴリ: Flask 更新日: 2025/12/12

Flaskのデプロイ時に必要なセキュリティ設定まとめ!初心者向け解説ガイド

Flaskアプリのデプロイ時に必要なセキュリティ設定まとめ
Flaskアプリのデプロイ時に必要なセキュリティ設定まとめ

先生と生徒の会話形式で理解しよう

生徒

「Flaskで作ったアプリを公開したいんですが、セキュリティって何か気をつけた方がいいですか?」

先生

「とても大切なポイントですね。インターネットにアプリを公開すると、世界中の人がアクセスできるので、悪意のある人から守るための準備が必要です。」

生徒

「えっ、そんなに危険なんですか…!何をすれば安全になるんですか?」

先生

「心配しすぎなくても大丈夫。基本的なセキュリティ設定をきちんと行えば、安全にFlaskアプリを公開できます。今日はその手順を初心者向けに解説していきましょう!」

1. Flaskアプリの「セキュリティ設定」とは?

1. Flaskアプリの「セキュリティ設定」とは?
1. Flaskアプリの「セキュリティ設定」とは?

Flask(フラスク)は、Pythonで作る小さくて軽いWebアプリ開発フレームワークです。作ったアプリをネット上に「デプロイ(公開)」する前に、いくつかのセキュリティ対策が必要です。

セキュリティ設定とは、アプリを悪意のあるアクセスや攻撃から守るための対策のことです。例えば、パスワードがバレないようにしたり、危険な操作ができないようにすることです。

2. デバッグモードをオフにしよう

2. デバッグモードをオフにしよう
2. デバッグモードをオフにしよう

Flaskを開発するときは、間違いを見つけやすくする「デバッグモード(debug mode)」が便利ですが、本番ではとても危険です。

デバッグモードのままだと、エラーが起きたときにアプリの内部情報が見えてしまい、悪用される可能性があります。


app.run(debug=False)

debug=Falseにすることで、安全な状態に切り替えられます。また、環境変数でも設定可能です。


export FLASK_ENV=production

3. シークレットキーを必ず設定する

3. シークレットキーを必ず設定する
3. シークレットキーを必ず設定する

Flaskでは、ログイン情報やフォームの中身を安全に管理するために、「シークレットキー(secret key)」という合言葉のようなものが必要です。


app.secret_key = 'ここに長くて複雑な文字列を設定'

これは、鍵のような役割をしていて、無いとセッション情報が改ざんされるリスクがあります。

自分で考えるのが難しい場合は、Pythonで自動的に生成することもできます。


import secrets
print(secrets.token_hex(32))

4. HTTPSで通信を暗号化しよう

4. HTTPSで通信を暗号化しよう
4. HTTPSで通信を暗号化しよう

デフォルトのHTTPでは、通信内容が誰にでも見えてしまう可能性があります。そこで、HTTPSという暗号化された通信を使う必要があります。

HTTPSを使うためには、SSL証明書という「安全ですよ」と証明するデジタルなカギを設定します。

多くの人は、Let’s Encrypt(レッツ・エンクリプト)という無料サービスでSSL証明書を取得します。


sudo certbot --nginx

このコマンドで、自動的にSSL設定ができます(nginxを使っている場合)。

5. Cookieのセキュリティ設定

5. Cookieのセキュリティ設定
5. Cookieのセキュリティ設定

Flaskでは、ログイン状態などの情報を「Cookie(クッキー)」という仕組みでブラウザに保存します。このCookieが改ざんされないように、次の設定をしましょう。


app.config['SESSION_COOKIE_SECURE'] = True
app.config['SESSION_COOKIE_HTTPONLY'] = True
app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'
  • SESSION_COOKIE_SECURE:HTTPSのときだけCookieを送信する
  • HTTPONLY:JavaScriptからCookieを読み取れなくする
  • SAMESITE:外部サイトからの不正リクエストを防ぐ

6. 入力値のチェック(バリデーション)を必ず行う

6. 入力値のチェック(バリデーション)を必ず行う
6. 入力値のチェック(バリデーション)を必ず行う

フォームやURLで受け取った値をそのまま使うと、「XSS(クロスサイトスクリプティング)」や「SQLインジェクション」などの攻撃を受けやすくなります。

例えば、ユーザーが次のような悪意あるコードを入力したとします:


<script>alert("攻撃");</script>

このようなコードがそのままページに表示されると、危険です。Flaskではescape()関数や、Jinjaテンプレートが自動で防いでくれます。


from markupsafe import escape
username = escape(request.args.get("username"))

また、Flask-WTFというライブラリを使えば、もっと安全に入力チェックができます。

7. 不要な機能は公開しない

7. 不要な機能は公開しない
7. 不要な機能は公開しない

Flaskアプリを開発中に使っていた「テスト用のルート(URL)」や「管理画面」などをそのまま公開してしまうと、外部から不正に操作される危険があります。

使わないルートやファイルは、公開前に必ず削除または無効にしておきましょう。

8. エラーページをカスタマイズする

8. エラーページをカスタマイズする
8. エラーページをカスタマイズする

Flaskのエラー画面は、初期設定だと詳細な情報が表示されます。これを見た攻撃者がシステムの内部構造を知ってしまうことがあります。

そのため、404エラー(ページが見つからない)や500エラー(サーバー内部のエラー)などのページは、自分で用意しておくと安全です。


@app.errorhandler(404)
def not_found(e):
    return render_template("404.html"), 404

9. アップロードファイルの対策を忘れずに

9. アップロードファイルの対策を忘れずに
9. アップロードファイルの対策を忘れずに

Flaskで画像やファイルのアップロード機能を作る場合、不正なファイルをアップされてしまうリスクがあります。

拡張子やファイルサイズのチェックを行い、保存場所も工夫する必要があります。


ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'}
def allowed_file(filename):
    return '.' in filename and \
           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

10. Webサーバー側のセキュリティも忘れずに

10. Webサーバー側のセキュリティも忘れずに
10. Webサーバー側のセキュリティも忘れずに

Flaskアプリは、nginxやApacheなどのWebサーバーを通して動作することが多いです。これらの設定も安全にしておく必要があります。

例えば、アクセス制限やファイルの読み取り制限などをnginxで設定します。


location ~ /\.ht {
    deny all;
}

この設定は、「.ht」から始まるファイル(設定ファイルなど)を外部から見られないようにします。

まとめ

まとめ
まとめ

Flaskで作ったアプリケーションを安全に公開するためには、ひとつひとつの設定がとても大切になります。とくに、ひらめきだけで作ったコードをそのままインターネットに置いてしまうと、思わぬところから攻撃を受けてしまうことがあります。そこで、今回の記事では、デバッグモードの危険性やシークレットキーの重要性、HTTPSを使った暗号化通信の必要性、Cookieの細かな設定、入力値の検証、不要な機能の非公開化、カスタムエラーページの作成、アップロードファイルの安全対策、そしてサーバー側の保護など、初心者でも押さえやすい安全対策を丁寧に整理しました。これらの知識は、Flaskだけではなく、どんなWebアプリケーションを作るときにも役立つ普遍的な考え方になります。インターネットへ公開するということは、世界中のだれからもアクセスされる可能性があるということなので、準備をしっかり整えて安心して運用していくことが大切です。安全性を高めるための設定は、一見むずかしそうに思えますが、ひとつひとつの意味を理解すれば、自然と組み合わせて使いこなせるようになります。とくに、デバッグモードを本番で使ってはいけない理由や、シークレットキーがどのようにアプリを守っているのかを知っておくと、内部構造への理解も自然に深まり、実際の開発の中で判断ができるようになります。さらに、HTTPSがもたらす暗号化のしくみ、Cookieの扱いを間違えたときの危険性、入力値の検証の重要性などは、実務でもよく話題に上がる要素です。初めて学ぶときは専門用語が多く感じますが、流れで理解できるようになると、まるでパズルのように各設定の意味がつながってきます。

安全な設定の具体例

たとえば、HTTPSを利用するためにはサーバー側で証明書を設定する必要があり、Cookieを安全に扱うためには、細かな設定を正しく記述する必要があります。また、入力値の検証は攻撃からアプリを守る一番身近な盾となるため、必ず知っておきたい重要な知識です。下記は、本番環境を想定した最低限の構成例のひとつです。


from flask import Flask, render_template, request
from markupsafe import escape

app = Flask(__name__)
app.secret_key = "自動生成した複雑なキーを設定"
app.config["SESSION_COOKIE_SECURE"] = True
app.config["SESSION_COOKIE_HTTPONLY"] = True
app.config["SESSION_COOKIE_SAMESITE"] = "Lax"

@app.route("/safe", methods=["GET"])
def safe_page():
    username = escape(request.args.get("username", ""))
    return render_template("safe.html", username=username)

if __name__ == "__main__":
    app.run(debug=False)

このように、複数の設定を組み合わせることで、Flaskアプリは驚くほど安全に動作するようになります。ひとつひとつの設定は小さなパーツのように見えますが、それぞれが大事な役割を持っており、組み合わせて使うことで強固な防御壁を作り上げます。セキュリティという言葉に身構えてしまいがちですが、実際には、少しずつ理解していくことで確実に応用できる知識になります。今回紹介した項目は、今後さらに大きなアプリを作るときにも使える基本となるので、繰り返し手を動かしながら身につけていくのがおすすめです。安全なアプリを公開するための準備は、開発者自身が安心してデプロイできる環境をつくるという意味でも大変価値があります。更新や改善を重ねる中で設定を見直すことも増えるので、基礎をしっかり固めておくと、判断に迷う場面が減っていきます。攻撃への耐性は、少しの意識と工夫で驚くほど変わるものなので、今回学んだ知識をぜひそのまま活用してみてください。

先生と生徒の振り返り会話

生徒

「きょうの記事で、Flaskを公開するときって意外とやることが多いんだなって感じました。特にデバッグモードの危険性は知らなかったので驚きました。」

先生

「そうなんです。開発中は便利でも、本番にそのまま使ってしまうと危険がたくさん潜んでいるので注意が必要ですね。でも、今回の内容を理解できれば、かなり安全なアプリが作れるようになりますよ。」

生徒

「シークレットキーの役割やHTTPSの大切さも、しくみが分かってすっきりしました。Cookieの設定も、ふだん当たり前に使っていたので、裏側でこんな工夫があるんだなと勉強になりました。」

先生

「安全なアプリを作るには、小さな設定を積み重ねることがとても大事です。今回の内容をしっかり覚えておけば、これからもっと大きなアプリを作るときにも必ず役に立ちますよ。」

生徒

「はい!次にデプロイするときは、今回学んだ設定を全部チェックするようにします!」

カテゴリの一覧へ
新着記事
New1
Flask
Flaskでデータベースエラーを処理する方法!初心者にもわかる例外の使い方
New2
Flask
FlaskでリダイレクトやURL生成を行う方法!便利な関数の使い方を解説
New3
Flask
FlaskでPOSTリクエストを受け取る方法!初心者でもわかるJSONデータの受け取り方
New4
Flask
Flask‑Mailの使い方!アプリからメールを送信する基本方法を解説
人気記事
No.1
Java&Spring記事人気No1
Django
Django環境構築の全手順を完全解説!初心者でも迷わないPython・Djangoセットアップガイド
No.2
Java&Spring記事人気No2
Django
DjangoとFlaskの違いを完全比較!初心者でもわかるPythonフレームワーク入門
No.3
Java&Spring記事人気No3
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.4
Java&Spring記事人気No4
Python
Pythonでリストをコピーする方法!copy()・スライス・list()の使い方を比較
No.5
Java&Spring記事人気No5
Flask
FlaskアプリをNginx + Gunicornで本番運用する方法!初心者でもわかるデプロイ構成の基本
No.6
Java&Spring記事人気No6
Python
PythonでHello Worldを表示するには?初心者向けに最初の1行を実行してみよう
No.7
Java&Spring記事人気No7
Python
Pythonのmatch文(パターンマッチング)とは?switch文の代替としての使い方をやさしく解説
No.8
Java&Spring記事人気No8
Flask
Flaskとは何か?初心者向けにできること・特徴・インストール手順までやさしく解説