Python の http.server モジュールは、短時間のテストや信頼できる相手への転送に静的ファイルを提供できます。これは本番用 Web サーバーではなく、認証、認可、TLS、レート制限、悪意ある通信に耐える堅牢な処理を備えていません。
ネットワーク共有 · レッスン 3
シンプルな HTTP サーバー
Python の HTTP サーバーを使い、管理されたディレクトリを一時的に公開する方法を学びます。
共有ディレクトリを準備する
公開するファイルだけを入れた専用ディレクトリを作ります。起動前に隠しファイル、シンボリックリンク、権限、機密メタデータを確認してください。ホームディレクトリ、リポジトリのルート、認証情報ディレクトリ、システムパスを公開してはいけません。
--directory を使い、共有ルートを明示します。
$ python3 -m http.server 8000 --directory /srv/temporary-share
index ファイルがない場合、通常このモジュールはディレクトリ一覧を生成します。リスナーへ到達できる人は、公開内容を列挙し、ダウンロードできる可能性があります。
--directory /srv/temporary-share を使うのはなぜですか?
待ち受けアドレスを制御する
同じホストからだけ接続する場合は、ループバックへバインドします。
$ python3 -m http.server 8000 --bind 127.0.0.1 --directory /srv/temporary-share
信頼できるネットワーク上で共有するなら、適切なインターフェースアドレスへ意図してバインドし、ファイアウォールポリシーを確認します。制限する bind 指定なしで実行すると、通常は利用可能な全インターフェースで待ち受け、意図したネットワークの外へディレクトリが露出する可能性があります。
127.0.0.1 にバインドしたサーバーへ、通常誰が到達できますか?
アクセスをテストする
サーバーを動かしているホストから既知のファイルを要求し、応答を確認します。
$ curl -f http://127.0.0.1:8000/example.txt
許可されたリモートテストでは、ループバックではなく選択したインターフェースアドレスを使います。目的のファイルにアクセスできることと、ドキュメントルート外のファイルにはアクセスできないことの両方を確認してください。ブラウザーで成功しただけでは、公開範囲や機密性が適切だとは判断できません。
python3 -m http.server 8000 で明示的に選択されるポートはどれですか?
停止して後片付けする
一時サービスは監視できる端末で実行し、転送が終わったら Ctrl-C で停止します。リスナーがなくなったことも確認します。
$ ss -ltn 'sport = :8000'
データ取扱方針に従って一時コピーを削除し、一時的なファイアウォールルールも元に戻します。永続的、認証付き、またはインターネット向けの配信には、アクセス制御と TLS を設定した、保守されているサーバーを使ってください。
一時転送が終わった後に行うべきことはどれですか?
レッスン完了
シンプルな HTTP サーバー を完了しました
これで、公開範囲を限定した一時的な Python HTTP サーバーを実行できます。
専用の確認済みディレクトリだけを公開する。
目的に合う最も限定的なアドレスへバインドする。
意図したアクセスと、意図しない境界の両方をテストする。
終了後にリスナーを停止し、一時アクセスを後片付けする。