Docker Compose 入門:Flask + Redis サンプルを本番でも安心して使えるようにハードニングする

Docker Compose 入門:Flask + Redis サンプルを本番でも安心して使えるようにハードニングしよう Flask

Docker ドキュメントにあるDocker Compose をはじめよう(Flask フレームワーク + Redis でアクセスカウンターを作るサンプル)は、学習用としてとても分かりやすい構成です。

しかしそのまま本番環境で使うと、セキュリティや安定性に課題があります。

そこで今回は、このサンプルを元に「ハードニング(セキュリティ強化)版」を作る方法を解説します。

初心者でもステップごとに理解できるように説明します。

Docker Compose をはじめようの元構成と改善ポイント

ハードニング(Hardening) とは

Dockerにおける ハードニング(Hardening) とは、Dockerコンテナやホスト環境をより安全にし、外部からの攻撃に強くするための一連のセキュリティ対策を指します。

目的は、システムに潜む脆弱性をできるだけ減らし、攻撃者が侵入や悪用できる余地(攻撃対象領域 / Attack Surface)を最小限に抑えることです。

元の構成

  • Flask(Python 製の軽量フレームワーク)
  • Redis(インメモリ KVS、ここではカウンター管理に使用)
  • Docker Compose(複数コンテナをまとめて管理)

オリジナルのサンプルはシンプルですが、以下のような弱点があります。

  • Flask の開発用サーバーをそのまま使っている(本番非推奨)
  • Redis に認証がない(誰でもアクセスできる)
  • root 権限で動作している
  • 不要なキャッシュやファイルを含んだまま

改善(ハードニング)のポイント

今回のハードニング版では次の点を改善します。

  1. Flask 開発サーバーを Gunicorn (WSGI) に変更
    → 本番環境でも安心して使える。
  2. 非 root ユーザーで動作
    → 万が一突破されても被害を最小化。
  3. Redis にパスワード認証を追加
    → 不正アクセスを防止。
  4. read-only ファイルシステムとリソース制限
    → 攻撃・暴走対策。
  5. 不要ファイルを削除(pycache / .git など)
    → イメージを軽量化 & セキュリティ向上。
  6. .env ファイルで秘密情報を外出し
    → パスワードをコードに直接書かない。

元の構成 vs ハードニング構成

元の構成 vs ハードニング構成の比較

ハードニング作業

ディレクトリ構成

アプリコード(Flask + Redis + /health)

Gunicorn(WSGIサーバー)設定ファイル

公式チュートリアル(Flask+Redis)は開発向けに Flask の開発サーバー (flask run) を直接使っていますが、セキュリティ・パフォーマンスを考慮してGunicorn (WSGI サーバー)を経由する。

gunicorn.conf.pyその Gunicorn を制御するための外部設定ファイル

requirements.txt(Pythonプロジェクトの依存関係を固定)

Dockerfile

docker-compose.yml

環境変数

ビルド時にコピーされないファイル・ディレクトリを指定

.dockerignoreで、Docker ビルド時にコピーされないようにするファイル・ディレクトリを指定する。

実行手順

サンプルから.envを作成し編集

ビルド

起動

動作確認

ハードニング状況

Docker Compose をはじめようの元構成からのハードニング状況は、下記の通りです。

  • WSGI 本番サーバー:Gunicorn で稼働
  • 非 root 実行(UID=10001)
  • distroless ランタイム(最小攻撃面)
  • read-only ルートFS + tmpfs(Compose 設定済み)
  • cap-drop=ALL / no-new-privileges(昇格防止)
  • /health 実装 + ヘルスチェック
  • Redis を内部ネットワーク限定expose のみ)

まとめ

  • 公式チュートリアルのままでは本番利用に不安あり
  • Gunicorn・非root・認証・read-only 化などでセキュリティを大幅に向上
  • .env を使って秘密情報を外出しし、安全に管理できる

これで Flask + Redis サンプルを、「学習用」から「実運用に近い安全な形」へと進化できました。

タイトルとURLをコピーしました