我正在为我的 servlet 使用 jboss 服务器,并将 postgresql 作为数据库服务器,监听本地主机上的端口 5432。我的 jboss 服务器绑定到一个公共 IP。我想知道,由于我的 postgesql 只绑定到本地主机,是否有任何攻击的机会。
即使拥有数据库的用户名和密码,任何人都能够看到所有表数据吗?
我正在为我的 servlet 使用 jboss 服务器,并将 postgresql 作为数据库服务器,监听本地主机上的端口 5432。我的 jboss 服务器绑定到一个公共 IP。我想知道,由于我的 postgesql 只绑定到本地主机,是否有任何攻击的机会。
即使拥有数据库的用户名和密码,任何人都能够看到所有表数据吗?
根据 Erwins 的回答从保护 PostgreSQL 开始是一个好的开始。但是,还有其他方法可以攻击和获取数据访问权限。即使您作为攻击者追查数据,也不会假设数据库可以直接从 Internet 访问。
但是由于应用程序服务器(在本例中为 JBoss)及其配置或应用程序代码(sql 注入)中的缺陷,数据可能会被间接访问。
JBoss 大约一年前有一个严重的安全漏洞,允许您获得 root 访问权限 - 因此可以完全访问本地主机上的任何 PostgreSQL 服务器。 http://www.darknet.org.uk/2011/02/jboss-autopwn-jsp-hacking-tool-for-jboss-as-server/
更新:
是的,Ashwin,使用准备好的语句或存储过程/函数是将 sql 注入攻击风险降至最低的好方法。OWASP 有一个用于防止 SQL 注入的检查列表。 https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Defense_Option_1:_Prepared_Statements_.28Parameterized_Queries.29
存储过程/函数的优势之一是权限的精细控制。例如,您可以授予应用程序用户访问权限,使其只能运行特定的过程/功能,而拒绝访问基础表和其他对象。过程/函数是由过程/函数所有者的许可运行的(用户也具有限制性权限,只能对特定表进行操作)。可以使用 SECURITY DEFINER 控制此设置,如本示例函数中所示。
这个函数可以由myappuser执行,但是myappuser不能直接访问myschema.mytable。也就是说 myappuser 只能运行你在函数中指定的代码。该函数作为 myinsertupdateuser 运行,假定它对 myschema.mytable 表具有插入权限。
只允许本地连接,因此没有人可以登录您的数据库集群,因为他们无法访问您的本地操作系统。可以将端口转发到本地主机,但这需要首先进行本地访问。因此,“来自互联网”的任何人都无法访问您的数据库。
您可以(并且应该)
pg_hba.conf
另外调整设置(并重新加载 Postgres 服务器)以确保。这是一种 PostgreSQL 防火墙。手册中的详细信息