Redash 中的密钥
快速导航
背景
Redash 使用两个密钥加密机密信息:Cookie 密钥和应用程序密钥。
Cookie 密钥
Cookie 密钥取自 REDASH_COOKIE_SECRET
环境变量。它用于 Web 服务器的各种加密功能,例如用户身份验证、签名 cookie 和存储用户会话信息。启动应用程序需要它。
如果您尝试在没有它的情况下启动 Redash,Web 服务器将不会初始化,并且您将在日志中找到以下消息
Exception: You must set the REDASH_COOKIE_SECRET environment variable. Visit https://redash.cn/help/open-source/admin-guide/secrets for more information.
要修复此消息:创建一个名为 REDASH_COOKIE_SECRET
的环境变量并为其赋值。
应用程序密钥
应用程序密钥取自 REDASH_SECRET_KEY
环境变量。它用于加密“设置”>“数据源”屏幕和“设置”>“警报目标”屏幕上的所有设置。
启动应用程序需要它。但是,如果您没有显式设置一个,Redash 将改为使用 Cookie 密钥。这对于开发很有帮助。但为了最大程度的安全性,我们建议您为这两个变量设置唯一值。
选择密钥
我们建议您遵循 官方 Flask 指南 来选择密钥。在开发过程中,使用简单的密钥是可以的,但是…
在生产环境中,应该将其更改为一些随机字节。否则,攻击者可以使用公共的“dev”密钥来修改会话 cookie 或任何其他使用密钥的东西。
一个强大的密钥将是随机的且不可能被猜到的。不要在 Redash 的不同实例中重用密钥,也不要将它们提交到版本控制中。
Flask 建议使用 Python 内置的 secrets
模块
$ python -c 'import secrets; print(secrets.token_hex())'
'192b9bdd22ab9ed4d12e236c78afcb9a393ec15f71bbf5dc987d54727823bcbf'
我们的云镜像使用 CLI 工具 pwgen
$ pwgen -1s 64
QinPGTd7Ulec03lar0vkI9ojqmXsuw4VOyirnC5NuvEdJSCwLwesmknNygXITunT
compose.yaml
旁边创建一个 .env
文件并在其中设置您的环境变量。更改密钥
在正常情况下,您在部署 Redash 时配置密钥,以后不会再碰它们。但是,如果密钥被泄露(例如,通过将其提交到版本控制系统),您应该立即更改它。
更改 Cookie 密钥
假设您已经显式设置了 REDASH_SECRET_KEY
,您可以随时安全地更改 REDASH_COOKIE_SECRET
。这将立即重置所有活动的用户会话,但没有其他副作用。
如果您尚未显式设置 REDASH_SECRET_KEY
,则应使用下一节中的说明重新加密机密字段,然后再修改 REDASH_COOKIE_SECRET
。否则,Redash 将无法访问您现有的数据源。
更改应用程序密钥
由于 Redash 在其内部数据库中静态加密机密字段,如果更改 REDASH_SECRET_KEY
,还必须重新加密这些字段。否则,您将无法执行查询、修改数据源,甚至无法访问数据源设置屏幕。
REDASH_SECRET_KEY
。没有它,您的数据源将变得不可用。
重新加密机密字段
Redash CLI 包含 database reencrypt
命令,方便地重新加密 Redash 存储的机密字段。它接受两个位置参数:旧密钥和新密钥。当您运行该命令时,Redash 内部数据库中的机密字段会使用旧密钥解密,然后使用新密钥再次加密。这包括数据源定义和警报目标。
如果您使用 docker-compose 部署了 Redash(例如,从我们的云镜像之一),您可以使用以下命令在您的 docker 主机上调用此 CLI
$ docker-compose run --rm server manage database reencrypt ${old_secret} ${new_secret}