使用 Tomcat 上下文资源定义 JDBC 连接:隐藏连接凭据
Using Tomcat Context Resource to define JDBC connection: Hiding connection credentials
我刚刚完成设置我的 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
接口有一个方法 getConnection(user, password)
但 BasicDataSource
实现不支持这个操作(thorws UnsupportedOperationException)
如何使 DBCP 配置为生产做好准备?
如果你想保护你的数据库凭据(或任何秘密,就此而言),你需要确保王国的密钥永远不会以任何人可以访问的方式进行数字存储。如果坏人获得对应用服务器的根访问权限,如果数据库凭据存储在明文文件中,他就可以获取您的数据。
这意味着您要么需要将凭据存储在加密文件中。当然,运行ning 应用程序需要恢复凭据,因此需要加密文件的密码。显然密码无法存储或者你根本没有提高安全性。
我得出的结论是,您至少需要有一条永远不会存储在任何地方的信息(称之为密码)。启动服务器的任何人都需要知道并向应用程序提供密码(通过一些安全通道,例如 HTTPS POST)。
当然,运行ning 应用程序需要在内存中以明文形式提供凭据才能实际访问数据库,因此您仍然容易受到攻击,即获取服务器访问权限并抓取服务器的实时内存。但是这样的攻击比读取文件系统上的文件要难得多。
我不知道 Tomcat 中有任何现有的开源框架支持这种功能。我已经构建了一个用于我们应用程序的本土解决方案,所以我知道这是可行的。您如何 design/implement 这可能取决于您希望如何 运行 您的系统投入生产。
一旦您接受了不同的方法,您可能会发现其他显着的好处。例如,因为我们动态管理数据库凭据,所以我们可以随时更改数据库密码,而无需重新启动应用程序服务器或中断服务。
我刚刚完成设置我的 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
接口有一个方法 getConnection(user, password)
但 BasicDataSource
实现不支持这个操作(thorws UnsupportedOperationException)
如何使 DBCP 配置为生产做好准备?
如果你想保护你的数据库凭据(或任何秘密,就此而言),你需要确保王国的密钥永远不会以任何人可以访问的方式进行数字存储。如果坏人获得对应用服务器的根访问权限,如果数据库凭据存储在明文文件中,他就可以获取您的数据。
这意味着您要么需要将凭据存储在加密文件中。当然,运行ning 应用程序需要恢复凭据,因此需要加密文件的密码。显然密码无法存储或者你根本没有提高安全性。
我得出的结论是,您至少需要有一条永远不会存储在任何地方的信息(称之为密码)。启动服务器的任何人都需要知道并向应用程序提供密码(通过一些安全通道,例如 HTTPS POST)。
当然,运行ning 应用程序需要在内存中以明文形式提供凭据才能实际访问数据库,因此您仍然容易受到攻击,即获取服务器访问权限并抓取服务器的实时内存。但是这样的攻击比读取文件系统上的文件要难得多。
我不知道 Tomcat 中有任何现有的开源框架支持这种功能。我已经构建了一个用于我们应用程序的本土解决方案,所以我知道这是可行的。您如何 design/implement 这可能取决于您希望如何 运行 您的系统投入生产。
一旦您接受了不同的方法,您可能会发现其他显着的好处。例如,因为我们动态管理数据库凭据,所以我们可以随时更改数据库密码,而无需重新启动应用程序服务器或中断服务。