使用Tomcat上下文资源定义JDBC连接:隐藏连接凭据



我刚刚完成了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配置生产?

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

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

我得出的结论是,你需要至少有一条永远不会存储在任何地方的信息(称之为密码短语)。无论谁启动服务器,都需要知道并向应用程序提供密码短语(通过一些安全通道,如HTTPS POST)。

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

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

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

最新更新