【问题标题】:Using Tomcat Context Resource to define JDBC connection: Hiding connection credentials使用 Tomcat 上下文资源定义 JDBC 连接:隐藏连接凭据
【发布时间】:2015-06-21 04:28:45
【问题描述】:

我刚刚完成了我的 Web 应用程序(部署在 Tomcat 上)的设置,以使用 Apache Commons DBCP2 连接到 Postgres。数据库凭据在 context.xml 的 Resource 标记中指定,如下所示:

<Context>
    <Resource name="jdbc/postgres" auth="Container"
        type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
        url="jdbc:postgresql://127.0.0.1:5432/postgres"
        username="my-user-name" password="my-password"
        initialSize="1" maxTotal="20" minIdle="1" maxIdle="5"
        .../>
</Context>

我以通常的方式获得连接:

DataSource ds = (DataSource)(new InitialContext().lookup("java:/comp/env/jdbc/postgres"));
Connection conn = ds.getConnection();

问题是我不能像这样在 xml 文件中明确指定数据库凭据进行生产。

我看到DataSource接口有getConnection(user, password)的方法但是BasicDataSource实现不支持这个操作(thorws UnsupportedOperationException)

如何使 DBCP 配置为生产做好准备?

【问题讨论】:

  • 基于 server.xml 的资源在生产环境中被广泛使用,它被认为足够安全并且可以用于生产。如果您需要在应用程序中提供灵活性,您可能需要将用户名和密码存储在文件中。资源是最安全的方式之一。
  • 解决方案最终是服务器的物理安全,包括访问卡、日志记录等等。
  • @shazin 是正确的,它被广泛使用,您只能依靠应用服务器安全来保护您的数据库。仅仅因为它被广泛使用并不能使它正确或充分。我要指出的是,这种松懈的安全方法已使数据泄露成为行业标准。
  • 这里有一个很好的示例 (jdev.it/encrypting-passwords-in-tomcat),说明如何使用在 context.xml 中加密的密码创建数据源。您不必将明文密码存储在文件中。
  • @ramp - 感谢您的链接。为了将来读者的利益,我将总结一下:建议的解决方案是编写一个自定义 DataSourceFactory,它接受加密的凭据并能够在创建 DataSource 时对其进行解密。这是一个有效的解决方案。但是,它有两个问题:

标签: java tomcat jdbc apache-commons-dbcp


【解决方案1】:

如果您想保护您的数据库凭证(或任何秘密),您需要确保王国的密钥永远不会以有人可以访问它们的方式进行数字存储。如果坏人获得对应用服务器的 root 访问权限,如果数据库凭据存储在明文文件中,他就可以获取您的数据。

这意味着您需要将凭据存储在加密文件中。当然,正在运行的应用程序需要恢复凭据,因此需要加密文件的密码。显然无法存储密码,或者您根本没有提高安全性。

我得出的结论是,您至少需要拥有一条永远不会存储在任何地方的信息(称为密码)。启动服务器的人需要知道并提供密码(通过某种安全通道,例如 HTTPS POST)给应用程序。

当然,正在运行的应用程序需要在内存中拥有明文凭据才能实际访问数据库,因此您仍然容易受到访问服务器并抓取服务器实时内存的攻击。但是这样的攻击比读取文件系统上的文件要困难得多。

我不知道任何现有的开源框架支持 Tomcat 中的这种功能。我已经构建了一个用于我们的应用程序的本土解决方案,所以我知道这是可能的。您将如何设计/实现它的细节可能取决于您希望如何在生产中运行您的系统。

一旦您接受了不同的方法,您可能会发现其他显着的好处。例如,由于我们动态管理数据库凭据,因此我们可以随时更改数据库密码,而无需重新启动应用服务器或中断服务。

【讨论】:

  • 我想这给了我一个完整的答案(虽然不是我所希望的),谢谢
猜你喜欢
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2013-05-01
  • 1970-01-01
  • 2012-07-12
  • 2012-03-02
  • 2021-09-21
相关资源
最近更新 更多