构建安全的数据访问-部署注意事项(九)
部署注意事项
以安全方式设计和开发的数据访问组件如果不以安全的方式进行部署,仍然容易受到攻击。常见的部署做法是使数据访问代码和数据库驻留在单独的服务器上。这些服务器通常由内部防火墙隔开,这就引进了额外的部署注意事项。开发人员和管理员应该了解下列问题:
•防火墙限制
•连接字符串管理
•登录帐户配置
•登录审核
•网络上的数据私密性和完整性
防火墙限制
如果您通过防火墙连接到 SQL Server,请配置防火墙、客户端和服务器。可通过使用 SQL Server 客户端网络实用程序来配置客户端,并使用服务器网络实用程序配置数据库服务器。在默认情况下,SQL Server 侦听 TCP 端口 1433,但您可以更改此设置。必须在防火墙上打开所选端口。
根据您所选择的 SQL Server 身份验证模式以及应用程序对分布式事务的使用方式,您可能需要在防火墙上打开几个其他端口:
•如果应用程序使用 Windows 身份验证连接到 SQL Server,则必须打开支持 Kerberos 或 NTLM 身份验证所必需的端口。
对于不使用 Active Directory 的网络,TCP 端口 139 通常是 Windows 身份验证所必需的。有关端口要求的详细信息,请参阅 TechNet 文章“TCP and UDP Port Assignments”和“Security Considerations for Administrative Authority”,前者的网址为:http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/tcpip/part4/tcpappc.asp(英文),后者的网址为:http://www.microsoft.com/technet/security/bestprac/bpent/sec2/seconaa.asp(英文)
•如果您的应用程序使用分布式事务(例如,自动化 COM+ 事务),您可能还需要对防火墙进行配置,以便允许 DTC 通信在单独的 DTC 实例之间以及 DTC 和资源管理器(如 SQL Server)之间流动。
连接字符串管理
许多应用程序都将连接字符串存储在代码中,这主要是为了提高性能。但是,性能优势是可以忽略的,而且使用文件系统缓存有助于确保外部文件中的连接字符串能够提供相当的性能。使用外部文件存储连接字符串对于系统管理极其有益。
为了增加安全性,建议使用 DPAPI 来加密连接字符串。如果您的连接字符串包含用户名和密码,这一点尤为重要。然后,确定在何处存储加密的字符串。注册表是安全的存储位置,特别是在您使用 HKEY_CURRENT_USER 时,因为只有在相关用户帐户下运行的进程才能进行访问。为了使部署更加容易,还可以将加密的字符串存储在 Web.config 文件中。这两种方法已在本模块前面的配置管理部分讨论过。
登录帐户配置
一定要让您的应用程序使用最小特权帐户来连接到数据库,这是降低 SQL 注入攻击威胁的主要方法之一。
作为开发人员,您必须与数据库管理员进行协商,以确定应用程序登录需要访问的确切的存储过程和(可能的)表。在理想情况下,您应该只允许应用程序登录对随应用程序一起部署的一组有限的存储过程具有执行权限。
应该对 SQL 或 Windows 帐户、或应用程序连接到数据库所使用的帐户使用强密码。
有关针对数据库中的应用程序帐户的建议授权策略,请参阅本模块前面的授权部分。
登录审核
应该将 SQL Server 配置为记录失败的登录尝试和可能成功的登录尝试。审核失败的登录尝试有助于检测到尝试发现帐户密码的攻击者。
有关如何配置 SQL Server 审核的详细信息,请参阅模块 18 保证数据库服务器的安全。
网络上的数据私密性和完整性
如果您使用 SQL 身份验证连接到 SQL Server,请确保不通过网络暴露登录凭据。可以在数据库服务器上安装一个证书(这会导致 SQL Server 加密凭据),或者使用数据库的 IPSec 加密通道。