在生产环境中,将PostgreSQL连接中的rejectUnauthorized设置为false是否可行?

7
我们最近搬到了Heroku上,尝试将我们的应用程序连接到数据库时,它一直拒绝我们的查询,并显示“自签名证书”。使用rejectUnauthorized解决了这个问题,但现在我想知道,在生产环境中我们是否应该这样做?如果不是,正确的连接方式是什么?
const pgp = require('pg-promise')(/*initOptions*/);
const {ConnectionString} = require('connection-string');

const cnObj = new ConnectionString(process.env.DATABASE_URL);

const cn = {
  host: cnObj.hostname,
  port: cnObj.port,
  database: cnObj.path?.[0],
  user: cnObj.user,
  password: cnObj.password,
  ssl: {
    rejectUnauthorized: false,
  },
};

const db = pgp(cn);

更好地使用“ConnectionString”的修正代码。除此之外,这不是与“pg-promise”有关的问题,严格来说,它是认证配置问题,这个问题已经被多次解决 - 查看相关问题 - vitaly-t
3
如果你只是按照此线程的指示来操作,你会找到真相的。 - vitaly-t
谢谢@vitaly-t。一如既往的救命恩人。 - Matt Weber
1个回答

9
您所面临的风险是有人在您和Heroku服务器之间插入身份冒充攻击。他们可以向您呈现自己的证书并与您协商连接。中间人还可以将来自服务器的挑战传递给您,并使用您的响应代替您登录数据库服务器。
所有这些都假设攻击者控制您和Heroku服务器之间的网络节点之一。
因此,我认为虽然存在一定的风险,但除非您正在处理非常敏感的数据,在这种情况下,偏执狂是美德,否则不必过于担心。

被踩了。如果他们可以冒充服务器,并且Postgres服务器使用基于密码的身份验证方法(我认为Heroku上的Postgres是这样的),攻击者同样可以嗅探密码。在我看来,这是不可接受的。 - Michael
密码在密码验证期间永远不会被发送。但是你说得对,攻击者仍然可以登录。我会修复答案。 - Laurenz Albe
感谢,我又点了赞。据了解,Heroku默认使用MD5身份验证方式(https://www.postgresql.org/docs/current/auth-password.html)。这确实不会通过隧道发送密码,而是发送用户名/密码/盐的MD5表示形式(https://www.pgcon.org/2014/schedule/attachments/330_postgres-for-the-wire.pdf)-请参考此答案以获取有关此问题的意见:https://security.stackexchange.com/questions/41064/is-postgres-password-based-authentication-secure - Michael
不确定是否“完全错误”。也许没有足够强调使用随机盐。进一步思考,中间人攻击者可能会要求客户端进行明文密码身份验证。问题中使用的npm客户端基于https://github.com/brianc/node-postgres构建,该库支持明文身份验证,但是服务器决定是否接受。因此,这是不可接受的。 - Michael
如果中间人攻击对您构成威胁,则这是不可接受的。没有必要用不合理的安全要求来使事情复杂化。 - Laurenz Albe
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接