我刚刚完成设置我的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>
我以通常的方式获取Connection:
DataSource ds = (DataSource)(new InitialContext().lookup("java:/comp/env/jdbc/postgres"));
Connection conn = ds.getConnection();
问题在于,我无法使用xml文件中明确指定的数据库凭据进行生产。
我看到DataSource
接口有getConnection(user, password)
的方法,但BasicDataSource
实现不支持此操作(thorws UnsupportedOperationException)
如何让DBCP配置生产就绪?
答案 0 :(得分:1)
如果您想保护您的数据库凭据(或任何秘密,就此而言),您需要确保王国的密钥永远不会以某人可以访问它们的方式进行数字存储。如果坏人获得对应用服务器的root访问权限,如果数据库凭据存储在明文文件中,他就可以访问您的数据。
这意味着您需要将凭据存储在加密文件中。当然,正在运行的应用程序需要恢复凭据,因此需要密码到加密文件。显然密码短语无法存储,或者根本没有增加安全性。
我得出的结论是,你需要至少有一条从未存储过的信息(称之为密码)。启动服务器的任何人都需要知道并向应用程序提供密码(通过某些安全通道,例如HTTPS POST)。
当然,正在运行的应用程序需要在内存中以明文形式提供凭据才能实际访问数据库,因此您仍然容易受到攻击,该攻击可以访问服务器并擦除服务器的实时内存。但是这样的攻击比读取文件系统上的文件要困难得多。
我不知道在Tomcat中支持这种功能的任何现有开源框架。我已经构建了一个我们用于应用程序的本地解决方案,所以我知道它可以做到。您将如何设计/实现此细节可能取决于您希望如何在生产中运行系统。
一旦您采用不同的方法,您可能会发现其他重要的好处。例如,因为我们动态管理数据库凭据,所以我们可以随时更改数据库密码,而无需重新启动应用服务器或中断服务。