3

いくつかの暗号化コンポーネントを含む Flask アプリがあります。具体的には、暗号化されたキーがディスク上にあり、Flask アプリのプロセス中に使用するためにメモリ内で暗号化を解除する必要があります。キーの暗号化を解除するために、ユーザーはアプリケーションの実行時に getpass を使用してパスフレーズを入力するよう求められます。

これはapp.run()、単一のフォアグラウンド Flask WSGI サーバーでうまく機能します。私たちが直面している問題は、uWSGI を使用してデプロイする場合、uWSGI コントローラーが stdin を許可しないことです。

理想的には、SSL を使用して Apache や Nginx を再起動または開始したときと同様のことが起こりたいと考えています。つまり、サービスがフォークする前に、stdin でパスワードの入力を求めるプロンプトが表示されます。

どんな助けでも大歓迎です!

アップデート

私たちはまだ uWSGI を使用したいと考えていますが、gunicorn の pre-fork オプションのために、gunicorn に移行しました。特にUPSTARTのような監視サービスを追加する機能がないため、このソリューションはまだ理想的ではありません. 基本的にread、パスワードを環境変数に設定し、その環境変数を gunicorn アプリに渡す前に実行するスクリプトがあります。

#!/bin/bash

NAME="baz"                                  # Name of the application
APPDIR=/var/apps/baz                        # Application project directory
SOCKFILE=/var/apps/baz/gunicorn.sock        # Using a socket
BIND="127.0.0.1:8000"                       # Using a port
USER="www-data"                             # User to run as
GROUP="www-data"                            # Group to run as
WORKERS=1                                   # How many worker processes

echo "Starting $NAME"

# Collect the passphrase
read -s -p "Enter $NAME passphrase: " PASSPHRASE
echo ""

# Activate the virtual environment
source /var/venvs/baz/bin/activate
export BAZ_SETTINGS="baz.conf.Config"
export BAZ_PASSPHRASE=$PASSPRHASE

# Start Gunicorn
exec gunicorn $NAME:app \
    --user $USER --group $GROUP \
    --bind $BIND \
    --workers $WORKERS \
    --chdir $APPDIR \
    --env BAZ_PASSPHRASE=$PASSPHRASE \
    --daemon

これは多かれ少なかれ、Nginx、Gunicorn、virtualenv、supervisor、および PostgreSQL を使用して Django をセットアップするチュートリアルで使用されているスクリプトです。パスフレーズを読み取り、Flask で使用するために変更されています。

環境変数がどの環境にも存在しないことを確認しましたBAZ_PASSPHRASEが、これはまだ少しぎこちなく感じられるので、特に uWSGI に関してコメントをいただければ幸いです。

4

2 に答える 2

1

追加--honour-stdinするだけで、ファイル記述子 0 から への再マッピングが無効になります/dev/null

呼び出す--daemonizeと端末の制御が失われるため、を使用して入力が読み取られた後、デーモン化を延期する必要があります--daemonize2

于 2013-09-13T04:46:15.740 に答える
0

TL;DR: STDIN の代わりに FIFO を使用して入力を提供する

#!/ビン/sh

FIFO=/tmp/.appfifo
rm -f ${FIFO}
mkfifo ${FIFO}
cat > ${FIFO} # パスワードの解読 | /etc/init.d/アプリ開始

exec gunicorn $NAME:app \
    --user $USER --group $GROUP \
    --bind $BIND \
    --workers $WORKERS \
    --chdir $APPDIR \
    --env ENCRYPTED_CFG=/etc/app.encrypted.cfg
    - デーモン

そしてコードのどこかに

get_password(file(os.getenv('ENCRYPTED_CFG'),'r').read())
于 2014-11-26T08:13:53.810 に答える