node.js - 如何在 Strapi 中安全地设置数据库密码?

标签 node.js security google-app-engine strapi

Strapi 框架(据我所知)要求在启动时提供数据库密码。通常,密码在 database.js 中指定。文件,像这样:

module.exports = ({ env }) => ({
  defaultConnection: 'default',
  connections: {
    default: {
      connector: 'bookshelf',
      settings: {
        client: 'postgres',
        host: '/cloudsql/myDatabaseInstanceName',
        database: 'databaseName',
        username: 'databaseUsername',
        password: 'databasePassword',
      },
    },
  },
});
这当然不是很安全,因为 database.js文件通常提交给 repo。
因此,有些人将密码注入(inject)database.js。文件,而不是将其存储为环境变量:
module.exports = ({ env }) => ({
  defaultConnection: 'default',
  connections: {
    default: {
      connector: 'bookshelf',
      settings: {
        client: 'postgres',
        host: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`,
        database: env('DATABASE_NAME'),
        username: env('DATABASE_USERNAME'),
        password: env('DATABASE_PASSWORD'),
      },
    },
  },
});
但是,这也不是很安全。在许多运行时环境(包括我正在使用的 Google App Engine)中,任何项目用户都可以以纯文本形式查看环境密码。
理想情况下,我想将数据库密码存储在一个 secret 保险库中(我正在使用 Google Secret Manager),并以某种方式将保险库中的密码提供给 database.js启动时的文件。但我不明白如何实现?是否可以从 database.js 访问 secret 保险库? ?或者,我还能如何将我的数据库密码安全地注入(inject) Strapi?
谢谢!

最佳答案

使用dotenvdotenv-defaults包。
对于默认值和非关键值,请使用“.env.defaults”文件并将此文件提交到您的 VCS。 这将为其他开发人员提供一键式环境设置。
如果您的团队成员想要覆盖值,他们应该在本地开发环境中使用 gitignored ".env"文件。 这将防止错误的提交。
在您的服务器中,在外部定义环境变量并使用它们而不将它们嵌入到您的代码中。 这将为您的现场制作环境提供安全性。
与这些包的文档一样,您可以使用这些文件或环境变量中的任何值,如下所示

....,
password: process.env.MY_PASSWORD,
....

关于node.js - 如何在 Strapi 中安全地设置数据库密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67521100/

相关文章:

linux - www 文件夹内的 .ssh/authorized_keys 文件

java - 使用 Appengine 进行被动 FTP

javascript - 来自多个 "active"客户端的 AppEngine 应用程序的可扩展轮询?

javascript - 如何在我的简单 Express 应用中使用 Node.js 集群?

javascript - 未捕获( promise 中)SyntaxError : Unexpected end of input in React when fetching the API

java - 有没有办法使用私钥从签名数据中获取纯文本?

google-app-engine - 如何在 Google App Engine 中查询具有 GeoPt 属性的 "nearby"实体?

javascript - 如何将 Node JS 请求的结果主体显示到浏览器?

node.js - 在NodeJS端使用SocketIo读取数据?

java - 通过自行编写的应用程序访问自己的银行帐户