您可以通过多种安全服务和机制(包括验证、授权和访问控制)来保护驻留在 Web 服务器上的资源。本章介绍一些用于控制 Web Server 访问权限的支持机制。
验证是确认身份的过程。授权表示将受限制资源的访问权限授予某个身份,而访问控制机制则强制执行这些限制。许多安全模型(Web 应用程序安全性、htaccess、验证领域等)和服务可以强制执行验证和授权。
可以访问 Administration Server 的用户
这些用户可以访问的应用程序
可以访问您 Web 站点上的文件或目录的用户
您可以控制对整个服务器、部分服务器或您 Web 站点上的文件或目录的访问。您应创建称为访问控制条目 (access control entry, ACE) 的规则分层结构,以允许或拒绝访问。创建的 ACE 的集合称为访问控制列表 (access control list, ACL)。
默认情况下,服务器具有一个 ACL 文件,其中包含多个 ACL。在确定用于传入请求的虚拟服务器后,服务器将检查是否为该虚拟服务器配置了任何 ACL。如果找到适用于当前请求的 ACL,服务器将评估其 ACE 以确定是否允许访问。
是否允许访问将基于以下事项:
当服务器收到对某个页面的请求时,将使用 ACL 文件中的规则来确定是否允许访问。这些规则可以引用发送该请求的计算机的主机名或 IP 地址,还可以引用 LDAP 目录中存储的用户和组。
如果有多个匹配的 ACL,服务器将使用最后一个匹配的 ACL 语句。由于 uri ACL 是最后一个匹配的语句,因此 default ACL 将被忽略。
上图描述了 Web Server 中的访问控制的工作方式。用户代理(客户机)访问 Web Server。Web Server 执行 obj.conf 文件中的 PathCheck 指令。Web Server 向客户机返回 HTTP 401(未授权)错误。客户机提示用户进行验证。如果客户机是浏览器,则会弹出一个登录对话框。用户输入登录信息。Web Server 执行内部的 check-acl 函数。Web Server 验证用户凭证并处理请求。
您可以仅允许特定的用户或组访问您的 Web 服务器。用户/组访问控制要求用户输入用户名和密码,然后才能访问服务器。服务器会将客户机证书中的信息与目录服务器条目进行比较。
Administration Server 只使用基本验证。如果希望在 Administration Server 上进行客户机验证,必须手动编辑 ACL 文件,将方法更改为 SSL。
用户/组验证由 Web Server 通过读取用户组数据库中的条目来执行。目录服务用来实现访问控制的信息可能来自以下资源之一:
内部平面文件类型数据库
外部 LDAP 数据库
当服务器使用基于 LDAP 的外部目录服务时,对于服务器实例它支持以下类型的用户/组验证方法:
默认
基本
SSL
摘要
其他
当服务器使用基于文件的内部目录服务时,对于服务器实例它支持的用户/组验证方法包括:
默认
基本
摘要
用户/组验证要求用户验证其自身,然后才能访问服务器或 Web 站点上的文件和目录。借助验证,用户可使用客户机证书并通过输入用户名和密码来验证其身份。仅 SSL 通信需要客户机证书。
默认验证是首选方法。“默认”设置使用 server.xml 文件中的默认方法;如果 server.xml 中没有设置,则使用“基本”方法。如果选中“默认”,ACL 规则将不会在 ACL 文件中指定方法。选择“默认”后,您便可通过编辑 obj.conf 文件中的一行文本来轻松更改所有 ACL 的方法。
基本验证要求用户输入用户名和密码来访问 Web 服务器或 Web 站点。这是默认设置。您必须在 LDAP 数据库(如 Sun Java System Directory Server)或文件中创建和存储用户和组列表。所使用的目录服务器不能与 Web 服务器安装在相同的服务器根目录下;您也可以使用安装在远程计算机上的目录服务器。
当用户试图访问 Administration Server 或 Web 站点中具有用户/组验证的资源时,Web 浏览器将显示一个对话框,要求用户输入用户名和密码。服务器将收到加密或未加密的信息,这取决于您的服务器是否启用了加密。
如果使用不带 SSL 加密的基本验证,将在网络中以未加密的文本形式发送用户名和密码。网络包可能会被截取,并且用户名和密码可能会被盗用。基本验证在与 SSL 加密、主机/IP 验证或二者组合时最有效。使用摘要验证可以避免此类问题。
使用安全性证书,服务器可以用两种方式确认用户的身份:
使用客户机证书中的信息作为身份的证明
验证 LDAP 目录中发布的客户机证书(附加验证)
当您将服务器设置为使用证书信息来验证客户机时,服务器将:
首先检查证书是否来自一个信任的 CA。如果不是,验证将失败,事务也将结束。
如果证书来自一个信任的证书授权机构 (certificate authority, CA),则使用 certmap.conf 文件将证书映射到某个用户的条目。
如果证书正确进行了映射,则检查为该用户指定的 ACL 规则。即使证书正确进行了映射,ACL 规则也可能会拒绝该用户的访问。
要求对特定资源的访问控制进行客户机验证与要求对服务器的所有连接进行客户机验证不同。如果将服务器设置为要求对所有连接进行客户机验证,则客户机只需要提供由信任的 CA 颁发的有效证书。如果将服务器的访问控制设置为使用 SSL 方法来验证用户和组,则客户机需要:
提供由信任的 CA 颁发的有效证书
证书必须映射到 LDAP 中的有效用户
访问控制列表必须进行正确评估
要求对访问控制进行客户机验证时,需要为 Web 服务器启用 SSL 加密算法。
要成功访问要求进行 SSL 验证的资源,客户机证书必须来自 Web 服务器信任的 CA。如果 Web 服务器的 certmap.conf 文件被配置为将浏览器中的客户机证书与目录服务器中的客户机证书相比较,则需要在目录服务器中发布客户机证书。不过,certmap.conf 文件也可以配置为仅将证书中的选定信息与目录服务器条目进行比较。例如,您可以配置 certmap.conf 文件,使其仅将浏览器证书中的用户 ID 和电子邮件地址与目录服务器条目进行比较。
只有 SSL 验证方法才需要修改 certmap.conf 文件,因为将对照 LDAP 目录对证书进行检查。而要求对服务器的所有连接进行客户机验证则不必如此。如果选择使用客户机证书,则应增加 magnus.conf 中 AcceptTimeout 指令的值。
可以将服务器配置为使用基于 LDAP 或文件的目录服务执行摘要验证。
通过摘要验证,用户可以基于用户名和密码进行验证,而不必以明文形式发送用户名和密码。浏览器使用用户的密码和 Web 服务器提供的某些信息,利用 MD5 算法来创建摘要值。
当服务器使用基于 LDAP 的目录服务来执行摘要验证时,服务器端将使用摘要验证插件来计算该摘要值,并且将该值与客户机提供的摘要值进行比较。如果这些摘要值相匹配,用户将通过验证。要进行这种验证,目录服务器需要访问明文形式的用户密码。Sun Java System Directory Server 具有一个可逆的密码插件,它使用对称的加密算法以加密形式存储数据,这些数据可在稍后被解密成原来的形式。只有 Directory Server 保存了数据的密钥。
对于基于 LDAP 的摘要验证,需要启用服务器附带的可逆密码插件和特定的摘要验证插件。要配置 Web 服务器以处理摘要验证,请设置 dbswitch.conf 中数据库定义的 digestauth 属性。
如果未指定 ACL 方法,当要求进行验证时,服务器将使用摘要验证或基本验证;当不要求进行验证时,服务器将使用基本验证。这是首选方法。
表 7–1 摘要验证的不同情况
ACL 方法 |
验证数据库支持摘要验证 |
验证数据库不支持摘要验证 |
---|---|---|
"default" 未指定 |
摘要和基本 |
基本 |
"basic" |
基本 |
基本 |
"digest" |
摘要 |
错误 |
处理 method = digest 的 ACL 时,服务器将尝试通过以下操作进行验证:
检查 Authorization 请求标头。如果未找到,将生成要求进行摘要验证的 401 响应,并且进程将停止。
检查 Authorization 类型。如果验证类型是摘要验证,服务器将:
检查 nonce。如果无效,将刷新此服务器生成的 nonce 并生成 401 响应,且进程将停止。如果已过期,将生成 stale=true 的 401 响应,且进程将停止。
可以通过更改位于 server_root/https-server_name /config/ 下 magnus.conf 文件中 DigestStaleTimeout 参数的值,来配置 nonce 保持刷新的时间。要设置该值,请将下面一行文本添加到 magnus.conf 中:
其中 seconds 表示 nonce 将保持刷新的秒数。指定的秒数过后,nonce 将到期并要求用户进行新的验证。
检查领域。如果领域不匹配,将生成 401 响应,且进程将停止。
如果验证目录是基于 LDAP 的,则检查 LDAP 目录中的用户是否存在;如果验证目录是基于文件的,则检查文件数据库中的用户是否存在。如果未找到,将生成 401 响应,且进程将停止。
从目录服务器或文件数据库获取请求/摘要值,并检查是否与客户机的请求/摘要值匹配。如果不匹配,将生成 401 响应,且进程将停止。
构造 Authorization-Info 标头并将其插入服务器标头中。
您可以通过将 Administration Server 或 Web 站点上的文件和目录仅限于使用特定计算机的客户机使用,从而限制对它们的访问。您可以指定要允许或拒绝其访问的计算机的主机名或 IP 地址。可以使用通配符模式指定多台计算机或整个网络。使用主机/IP 验证访问文件或目录对用户可能是无缝的。用户可以立即访问文件和目录,而无需输入用户名或密码。
由于可能会有多个用户使用某个特定计算机,因此主机/IP 验证在与用户/组验证组合使用时更有效。如果同时使用这两种验证方法,访问时将要求提供用户名和密码。
主机/IP 验证不要求在服务器上配置 DNS。如果选择使用主机/IP 验证,必须在网络中运行 DNS 并将服务器配置为使用该 DNS。
启用 DNS 会降低服务器的性能,因为服务器将被强制执行 DNS 查找。要减少 DNS 查找对服务器性能的影响,请仅解析访问控制和 CGI 的 IP 地址,而不要解析所有请求的 IP 地址。要实现此目的,请在 obj.conf 文件中将 iponly=1 附加到 AddLog fn="flex-log" name="access" 后面:
AddLog fn="flex-log" name="access" iponly=1
默认情况下,服务器将用户和组验证结果存储在 ACL 用户高速缓存中。您可以使用 magnus.conf 文件中的 ACLCacheLifetime 指令来控制 ACL 用户高速缓存的有效时间。每次引用高速缓存中的条目时,都会计算条目生存期并对照 ACLCacheLifetime 进行检查。如果其生存期大于或等于 ACLCacheLifetime,则不会使用该条目。默认值为 120 秒。将该值设置为 0(零)将关闭高速缓存。如果将其设置为一个较大的值,则每次更改 LDAP 条目时,都可能需要重新启动服务器。例如,如果将该值设置为 120 秒,则在长达两分钟的时间内,服务器可能会与 LDAP 目录不同步。仅当 LDAP 目录不经常更改时才应设置一个较大的值。
使用 magnus.conf 参数 ACLUserCacheSize,可以配置可存储在高速缓存中的最大条目数。此参数的默认值为 200。新条目将添加到列表的开头;当高速缓存达到其最大大小时,将删除此列表末尾的条目以便重新容纳新条目。
您还可以使用 magnus.conf 参数 ACLGroupCacheSize 来设置每个用户条目所能高速缓存的最大组成员数。此参数的默认值为 4。遗憾的是,不会高速缓存非组成员用户,这会导致每个请求都要进行多次 LDAP 目录访问。
有关 ACL 文件指令的更多信息,请参见《NSAPI Developer’s Guide》。
要通过 CLI 设置 ACL 高速缓存属性,请执行以下命令:
wadm> set-acl-cache-prop --user=admin --password-file=admin.pwd --host=serverhost --port=8989 --config=config1 property=value |
请参见 CLI 参考 set-acl-cache-prop(1)。
可以设置的有效属性包括:
enabled-指示服务器是否高速缓存文件内容和元信息。默认值为 true。
max-age-高速缓存文件内容和元信息的最长时间数(以秒为单位)。值的范围从 0.001 至 3600。
max-groups-per-user-对于每个用户而言,服务器将高速缓存其成员信息的最大组数。值的范围从 1 至 1024。
max-age-高速缓存验证信息的最长时间数(以秒为单位)。值的范围从 0.001 至 3600。
服务器通过使用本地存储的访问控制列表 (access control list, ACL) 来支持验证和授权,这些列表用于说明用户对资源所具有的访问权限。例如,ACL 中的条目可以为名为 John 的用户授予特定文件夹 (misc) 的读取权限。
本节介绍如何限制对您 Web 站点上的文件或目录的访问。您可以为所有服务器设置全局访问控制规则,也可以单独为特定服务器进行设置。例如,人力资源部门可以创建 ACL,允许所有通过验证的用户查看他们自己的工资单数据,但是只允许负责工资单的人力资源人员更新数据。
服务器支持的核心 ACL 有三种类型的验证: 基本验证、SSL 验证和摘要验证。
要编辑访问控制设置,请执行以下步骤:
单击配置选项卡并选择相应的配置。
单击安全性 > 访问控制子选项卡。
单击添加 ACL 按钮添加新的 ACL,或单击现有 ACL 以编辑设置。
下节介绍将新 ACL 添加至配置的过程。
单击配置选项卡并选择相应的配置。
单击访问控制 > 访问控制列表子选项卡。
单击新建按钮添加新的 ACL。
配置以下参数:
表 7–2 ACL 参数
使用 CLI
要通过 CLI 添加 ACL,请执行以下命令:
wadm> set-acl --user=admin --password-file=admin.pwd --host=serverhost --port=8989 --vs=config1_vs_1 --config=config1 --aclfile=aclfile1 |
请参见 CLI 参考 set-acl(1)。
本节介绍为选定的配置添加新访问控制条目 (Access Control Entry, ACE) 的过程。
单击配置选项卡并选择相应的配置。
单击访问控制 > 访问控制列表子选项卡。
单击新建按钮。
单击访问控制条目下的新建按钮。
配置以下 ACE 参数:
表 7–3 ACE 参数
服务器支持 .htaccess 动态配置文件。您可以通过用户界面或手动更改配置文件来启用 .htaccess 文件。
您可以将 .htaccess 文件与服务器的标准访问控制结合起来使用。不管 PathCheck 指令的顺序如何,标准访问控制始终在任何 .htaccess 访问控制之前应用。如果用户-组验证为“基本”,则无需同时使用标准访问控制和 .htaccess 访问控制进行用户验证。您可以通过标准服务器访问控制来使用 SSL 客户机验证,也可以通过 .htaccess 文件来要求进行 HTTP“基本”验证。
如果启用 .htaccess 文件,服务器将在提供资源之前检查 .htaccess 文件。服务器在与资源相同的目录及其父目录,直到包含文档根目录的目录中查找 .htaccess 文件。例如,如果主文档目录设置为 /sun/server/docs,并且客户机请求 /sun/server/docs/reports/index.html,则服务器将在 /sun/server/docs/reports/.htaccess 和 /sun/server/docs/.htaccess 中检查 .htaccess 文件。
请注意,服务器的附加文档目录和 CGI 目录功能使管理员可以定义替代的文档根目录。替代的文档根目录的存在会影响 .htaccess 文件的处理。例如,假定服务器的主文档目录设置为 /sun/server/docs,并且 CGI 程序位于 /sun/server/docs/cgi-bin/program.cgi。如果启用 CGI 作为文件类型,则当客户机发出对 CGI 程序的请求时,服务器对 /sun/server/docs/.htaccess 和 /sun/server/docs/cgi-bin/.htaccess 的内容都要进行评估。但是,如果您选择在 /sun/server/docs/cgi-bin 配置 CGI 目录,服务器将只检查 /sun/server/docs/cgi-bin/.htaccess,而不检查 /sun/server/docs/.htaccess。出现这种情况的原因是:将 /sun/server/docs/cgi-bin 指定为 CGI 目录便将其标记为替代的文档根目录。
拒绝服务 (Denial-of-Service, DoS) 攻击是服务器的某些恶意用户发起的一种显式攻击,企图阻止合法用户使用服务。此类攻击可通过以下方式发起:
向服务器发送对特定 Web 资源的连续请求。
Web Server 可通过监视经常访问的 URI 和拒绝请求(如果请求频率非常高)来检测 DoS 攻击。
以下部分介绍了如何在虚拟服务器级别防止 DoS 攻击。
现在,您可以通过配置请求限制并监视每个虚拟服务器的最大连接数来调整服务器,以防止拒绝服务攻击。配置其中某些值可能会影响服务器的性能。
要配置服务器的请求限制,请单击配置 > 虚拟服务器 > 服务器设置 > 请求限制,然后配置下表中所列的参数。
表 7–4 配置请求限制
参数 |
描述 |
---|---|
请求限制 |
为此虚拟服务器启用/禁用请求限制。默认情况下,将会禁用“请求限制”选项。 |
最大连接数 |
此虚拟服务器允许的最大并行连接数。 |
RPS 最大值 |
每秒钟允许的来自客户机的最大请求数。 |
RPS 计算间隔 |
计算每秒请求数 (request per second, RPS) 平均值的时间间隔。默认值为 30 秒。 |
继续条件 |
确定要使阻塞的请求类型再次可用于服务所必须满足的条件。 静音-被拒绝的请求数必须降低为零(在后续间隔中),才可继续服务。 阈值-被拒绝的请求比率必须降低到 RPS 阈值之下,才可继续服务。 默认值为阈值。 |
错误代码 |
要用于阻塞的请求的 HTTP 状态代码。默认代码为“HTTP 503-服务不可用”。 |
监视属性 |
要监视的可选请求属性。 |
使用 CLI
要通过 CLI 限制对服务器的请求,请执行以下命令:
wadm> enable-request-limits --user=admin --password-file=admin.pwd --host=serverhost --port=8989 --config=config1 --vs=config1_vs_1 |
请参见 CLI 参考 enable-request-limits(1)。
您可以限制最大并行连接数。如果在处理的请求数至少为指定请求数时收到一个匹配的请求,将拒绝该请求。请注意,拒绝请求仅适用于该特定时间。一旦并行请求数小于此限制,便会立即处理新请求。