Aug*_*mer 6 security google-app-engine node.js 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',
},
},
},
});
Run Code Online (Sandbox Code Playgroud)
这当然不是很安全,因为database.js
文件通常会提交到存储库。
因此,有些人将密码注入到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'),
},
},
},
});
Run Code Online (Sandbox Code Playgroud)
然而,这也不是很安全。在许多运行时环境(包括我正在使用的 Google App Engine)中,任何项目用户都可以以明文形式查看环境密码。
理想情况下,我想将数据库密码存储在秘密保险库中(我正在使用 Google Secret Manager),并以某种方式database.js
在启动时将密码从保险库提供给文件。但我不明白如何实现?甚至可以从 访问秘密保险库吗database.js
?或者,我还可以如何将数据库密码安全地注入 Strapi 中?
谢谢!
Strapi V4 的解决方案 - 在尝试了很多解决方案之后,我终于找到了一个。我们必须在index.js>“异步注册”函数中执行此操作。我也在 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)
}
},
....
....
Run Code Online (Sandbox Code Playgroud)
简单地说,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,
}
}
}
};
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2344 次 |
最近记录: |