如何在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。

因此,有些人将密码注入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 secret Manager(,并在启动时以某种方式将密码从保管库提供给database.js文件。但我不明白该如何实现?甚至有可能从database.js访问一个秘密金库吗?或者,我如何安全地将我的数据库密码注入Strapi?

谢谢!

Strapi V4的解决方案-在尝试了这么多解决方案后,我终于找到了一个。我们必须在index.js>quot;异步寄存器";作用我也试过bootstrap.js,但没用。

//index.js
....
....
async register({ strapi }) {
try {
console.log("Fetching database secrets....");
const secretData = await getSecret();
console.log("Database secrets fetched successfully !!!");
strapi.config.set("database.connection.connection.host", secretData.host);
strapi.config.set("database.connection.connection.database", secretData.dbname);
strapi.config.set("database.connection.connection.user", secretData.username);
strapi.config.set("database.connection.connection.password", secretData.password);
strapi.config.set("database.connection.connection.port", secretData.port);
} catch (err) {
console.log("error is secret fetch call.", err)
}
},
....
....

简单来说就是database.js尝试与其他默认配置连接。

//database.js
module.exports = ({ env }) => {
return {
connection: {
client: 'postgres',
connection: {
//postgres connection is set in index.js, no need to set it here again.
schema: env('DATABASE_SCHEMA', 'public'), // Not required
ssl: {
rejectUnauthorized: env.bool('DATABASE_SSL_SELF', false), // For self-signed certificates
},
useNullAsDefault: true,
}
}
}
};
  • @raxetul注释是最简单的方法。谷歌秘密可以作为环境变量从代码中访问。根据谷歌-";是常见的,但应尽可能避免";这里
  • 要在初始数据库配置之前通过异步代码检索机密,您应该使用Strapi引导函数

每次启动服务器时都会调用引导函数。您可以使用它在服务器生命周期的这个时刻添加特定的逻辑。

  • 无论您选择什么-记住,任何可以更改代码的人都可以访问密码,无论您存储的密码多么安全;流氓;开发者可以添加类似console.log(env('HIGHLY_ENCRYPTED_PASSWORD'))的行并读取输出

使用dotenv和dotenv默认包。

对于默认值和非关键值,使用";。env.defaults";文件并将此文件提交到VCS中这将为其他开发人员提供一个一键式环境设置

如果您的团队成员想要覆盖值,他们应该使用gitignered"。env";文件这将防止错误提交

在服务器中,从外部定义环境变量,并在不将其嵌入代码的情况下使用它们这将为您的现场生产环境提供安全保障

在这些包的文档中,您可以使用这些文件或环境变量中的任何值,如

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

最新更新