3

我有一个包含一些加密组件的 Flask 应用程序。具体来说,磁盘上有一个已加密的密钥,并且必须在内存中未加密才能在 Flask 应用程序进程中使用。为了解密密钥,当应用程序运行时,系统会提示用户使用 getpass 输入密码。

这适用于app.run()单个前台 Flask WSGI 服务器。我们遇到的问题是,当使用 uWSGI 进行部署时,uWSGI 控制器不允许标准输入。

理想情况下,我们希望发生的情况类似于使用 SSL 重新启动或启动 Apache 或 Nginx - 在服务分叉之前,它会在标准输入上提示输入密码。

任何帮助,将不胜感激!

更新

尽管我们仍然更喜欢使用 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:使用 FIFO 而不是 STDIN 来提供输入

#!/bin/sh

FIFO=/tmp/.appfifo
rm -f ${FIFO}
mkfifo ${FIFO}
cat > ${FIFO} # 解密密码 | /etc/init.d/app 启动

执行 gunicorn $NAME:app \
    --user $USER --group $GROUP \
    --绑定$绑定\
    --工人$工人\
    --chdir $APPDIR \
    --env ENCRYPTED_CFG=/etc/app.encrypted.cfg
    --守护进程

在代码的某个地方

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