gpt4 book ai didi

java - 使用 Tomcat 上下文资源定义 JDBC 连接 : Hiding connection credentials

转载 作者:行者123 更新时间:2023-11-28 22:19:07 24 4
gpt4 key购买 nike

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

<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 接口(interface)有一个方法用于 getConnection(user, password) 但是 BasicDataSource 实现不支持这个操作(thorws UnsupportedOperationException )

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

最佳答案

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

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

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

当然,正在运行的应用程序需要在内存中以明文形式提供凭据才能实际访问数据库,因此您仍然容易受到攻击,即获取服务器访问权限并删除服务器的实时内存。但是这种攻击比读取文件系统上的文件要难得多。

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

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

关于java - 使用 Tomcat 上下文资源定义 JDBC 连接 : Hiding connection credentials,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29646376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com