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

2024-04-22

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文件通常会提交到存储库。

因此,有些人将密码注入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)中,任何项目用户都可以以明文形式查看环境密码。

理想情况下,我想将数据库密码存储在秘密保险库中(我正在使用 Google Secret Manager),并以某种方式将密码从保险库提供给database.js启动时的文件。但我不明白如何实现?是否有可能访问秘密保险库database.js?或者,我还可以如何将数据库密码安全地注入 Strapi 中?

Thanks!


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)
    }

  },
 ....
 ....

简单来说,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,
      }
    }
  }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Strapi 中安全地设置数据库密码? 的相关文章

随机推荐