![[z/OS]](../images/ngzos.gif)
SAF 伪指令
这些配置参数控制 IBM® HTTP Server 的系统授权工具 (SAF) 功能部件。请使用 SAF 伪指令为 IBM HTTP Server 提供用户认证。
- AuthSAFAuthoritative 伪指令
- AuthSAFExpiration 伪指令
- AuthSAFExpiredRedirect 伪指令
- AuthSAFReEnter 伪指令
- SAFAPPLID 伪指令
- SAFRunAs 伪指令
- SAFRunAsEarly 伪指令
AuthSAFAuthoritative 伪指令
在先前发行版中,AuthSAFAuthoritative 伪指令设置是否将授权传递至较低级别的模块。由于在本发行版中对 Apache HTTP Server API 进行了更改,所以不再需要也不再接受 AuthSAFAuthoritative。
伪指令 | 描述 |
---|---|
语法 | AuthSAFAuthoritative on | off |
缺省值 | on |
上下文 | 目录和 .htaccess |
模块 | mod_authnz_saf |
值 | on | off |
在先前发行版中,AuthSAFAuthoritative 伪指令设置是否将授权传递至较低级别的模块。由于在本发行版中对 Apache HTTP Server API 进行了更改,所以不再需要也不再接受 AuthSAFAuthoritative。
如果在先前发行版中使用了此伪指令,那么应该将其从配置中移除。
AuthSAFExpiration 伪指令
AuthSAFExpiration 伪指令设置浏览器提示中显示的值。服务器在 HTTP 响应头中发送为 AuthName 伪指令指定的值以及此短语,然后浏览器在密码提示窗口中向用户显示这些内容。此短语与为 AuthName 伪指令指定的值具有相同的字符限制。因此,要在密码提示窗口中显示特殊字符,服务器必须将特殊字符从 EBCDIC CharsetSourceEnc 代码页转换为 ASCII CharsetDefault 代码页。例如,如果要显示带变音符号的小写“a”,并且 httpd.conf 文件包含德语 EBCDIC 代码页“CharsetSourceEnc IBM-1141”和 ASCII 代码页“CharsetDefault ISO08859-1”,那么必须使用十六进制值“43”(它将转换为正确的 ASCII 字符)编码该短语。
伪指令 | 描述 |
---|---|
语法 | AuthSAFExpiration short_phrase |
缺省值 | off |
上下文 | 目录和 .htaccess |
模块 | mod_authnz_saf |
值 | off 或者 short_phrase |
将 AuthSAFExpiration 伪指令设置为短语可以允许 IBM HTTP Server 在用户的 SAF 密码过期时提示用户更新该密码。如果用户输入有效标识和 SAF 密码,但该密码已过期,那么服务器将返回需要认证应答并显示特别提示,以允许用户更新过期密码。该提示包含领域(来自 AuthName 伪指令的值),后跟来自 AuthSAFExpiration 伪指令的 short_phrase 值。
<Location /js>
AuthType basic
AuthName "zwasa051_SAF"
AuthBasicProvider saf
Require valid-user
Require saf-group SYS1 WASUSER
AuthSAFExpiration "EXPIRED! oldpw/newpw/newpw"
</Location>
如果用户尝试访问 URL 以 /js 开头的文件,那么服务器将提示用户输入 SAF 标识和密码。浏览器将显示一个包含该领域的提示。领域是来自 AuthName 伪指令的值,在本示例中为 zwasa051_SAF。
如果用户提供了有效的标识和密码,但该密码已过期,那么服务器将以值 zwasa051_SAF EXPIRED! oldpw/newpw/newpw 重复显示提示。不管提示是什么,用户都必须重新输入已过期的密码,后加斜杠,并输入新密码,后加另一斜杠,然后再次输入新密码。
如果密码成功更新,那么服务器将发送另一需要认证应答,并显示完全不同的特别提示。为了强制浏览器理解应该对哪个密码进行高速缓存,最后这个交互操作是必需的。此次的提示将包含领域,后加提示 Re-enter new password。在本示例中,它将是 zwasa051_SAF Re-enter new password。
AuthSAFExpiredRedirect 伪指令
AuthSAFExpiredRedirect 伪指令指定您在 z/OS® 上使用 mod_authnz_saf 进行认证并且密码已到期时,应该将请求重定向到的 URL。
这是使用 AuthSAFExpiration 的替代方法。
伪指令 | 描述 |
---|---|
语法 | AuthSAFExpiredRedirect url |
缺省值 | off |
上下文 | 目录和 .htaccess |
模块 | mod_authnz_saf |
值 | off 或 url |
AuthSAFReEnter 伪指令
AuthSAFReEnter 伪指令设置在成功更改密码之后向领域追加的值。有关编码特殊字符的信息,请参阅 BAuthSAFExpiration 伪指令。
伪指令 | 描述 |
---|---|
语法 | AuthSAFReEnter short_phrase |
缺省值 | Re-enter new password |
上下文 | 目录和 .htaccess |
模块 | mod_authnz_saf |
值 | off 或者 short_phrase |
将 AuthSAFReEnter 伪指令显式设置为“Re-enter new password”之外的短语可以允许管理员在过期密码已成功更新之后显示替代消息。如果 AuthSAFExpiration 已设置为 off,那么此伪指令没有任何效果。
<Location /js>
AuthType basic
AuthName "zwasa051_SAF"
AuthBasicProvider saf
Require saf-user SYSADM USER152 BABAR
AuthSAFExpiration "EXPIRED! oldpw/newpw/newpw"
AuthSAFReEnter "Enter new password one more time"
</Location>
在本示例中,在过期密码成功更新之后,服务器将发送另一需要认证应答,并显示来自 AuthSAFReEnter 伪指令的值。为了强制浏览器理解应该对哪个密码进行高速缓存,最后这个交互操作是必需的。此次的提示将包含领域,后加一个特殊短语。在本示例中,它将是 zwasa051_SAF Enter new password one more time。
SAFAPPLID 伪指令
在使用了“SAFRunAs”的配置中,此伪指令覆盖传递到操作系统 pthread_security_applid_np() 子例程的应用程序标识 (APPLID) 参数。
伪指令 | 描述 |
---|---|
语法 | SAFAPPLID application-id |
缺省值 | 无(某些操作系统配置会隐式地将其视为“OMVSAPPL”) |
上下文 | 目录和 .htaccess |
模块 | mod_authnz_saf |
值 | application-id |
如果使用了 SAFRunAs 伪指令,那么在“APPL”类处于活动状态的某些安全性产品配置下,安全性产品将验证已认证的用户是否有权访问“OMVSAPPL”类。如果配置了 SAFAPPLID,那么将改为使用指定的应用程序标识。
SAFRunAs 伪指令
SAFRunAs 伪指令可以设置将用来处理请求的 SAF 用户标识。
伪指令 | 描述 |
---|---|
语法 | SAFRunAs value |
缺省值 | off |
上下文 | 目录和 .htaccess |
模块 | mod_authnz_saf |
值 | off | %%CLIENT%% | %%CERTIF%% | %%CERTIF_REQ%% | %%CERTIF%% /prefix |
surrogate-username /prefix | <surrogate ID>
|
IBM HTTP Server 可以使用 TCP 套接字或 UNIX 套接字与 FastCGI 应用程序通信。但是,将 SAFRunAs 用于 FastCGI 请求时,必须将 TCP 套接字用于与应用程序的通信。为 FastCGI 应用程序创建的 UNIX 套接字仅可通过 Web 服务器用户标识访问。使用 SAFRunAs 伪指令控制的备用用户标识不具有访问 UNIX 套接字的许可权,因此请求将失败。
要将 FastCGI 配置为使用 TCP 套接字,请使用带有 -port 选项的 FastCGIServer 伪指令或使用 FastCGIExternalServer 伪指令来对 mod_fastcgi 模块定义 FastCGI 应用程序。未配置 FastCGIServer 或 FastCGIExternalServer 的动态 FastCGI 服务器不能与 SAFRunAs 配合使用。
如果没有为 FastCGI 请求启用 SAFRunAs,那么 TCP 套接字不是必需的。

<Location /context-root-A/>
SAFRunAS %%CLIENT%%
</Location>
以远程用户身份运行针对包含 /context-root-A/* 参数的路径的请求。# Process *.phtml with the "php-script" handler.
AddHandler php-script .phtml
# Define the "php-script" handler as an existing CGI.
Action php-script /cgi-bin/php-cgi
Action 伪指令使用 /context-root-A/hello.phtml 的命令行参数将针对 /context-root-A/hello.phtml 文件的请求变为针对包含 /cgi-bin/php-cgi 参数的路径的请求。<Location /cgi-bin/php-cgi>
SAFRunAS %%CLIENT%%
</Location>
如果您需要多个 SAFRunAs 设置,那么完全忽略 Action 伪指令,或者创建多个具有不同的第二个参数的 Action 伪指令。
gotchaSAFRunAsEarly 伪指令
SAFRunAsEarly 伪指令允许 SAFRunAs 在访问任何目录之前运行。
伪指令 | 描述 |
---|---|
语法 | SAFRunAsEarly on | off |
缺省值 | off |
上下文 | 位置 |
模块 | mod_authnz_saf |
值 | on | off |
[Tue Aug 11 14:03:16 2015] [error] [client x.x.x.x] (111)EDC5111I Permission denied. (errno2=0x5B4B0002):
access to /saf/privileged/index.html deniedIf SAFRunAsEarly is set to on with SAFRunAs set to %%CLIENT%%, IHS will switch
user before any directory/file access are attempted.
如果 SAFRunAsEarly 设置为 on 并且 SAFRunAs 设置为 %%CLIENT%%,那么 IHS 将在尝试访问任何目录/文件之前切换用户。
必须在 <Location> 上下文或全局上下文中使用 SAFRunAsEarly。不能在 <Directory> 上下文中使用。
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authnz_saf_module modules/mod_authnz_saf.so
LoadModule authz_default_module modules/mod_authz_default.so
...
<Location /saf_protected>
AuthType basic
AuthName x1
AuthBasicProvider saf
# Code "Require valid-user" if you want any valid
# SAF user to be able to access the resource.
Require valid-user
#
# Alternately, you can provide a list of specific SAF users
# who may access the resource.
# Require saf-user USER84 USER85
#
# Alternatively, you can provide a list of specific SAF groups
# whose members may access the resource.
# Require saf-group WASGRP1 WASGRP2
</Location>
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authnz_saf_module modules/mod_authnz_saf.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_default_module modules/mod_authz_default.so
...
<Location /saf_password>
AuthType basic
AuthName "SAF auth with hfs groupfile"
AuthBasicProvider saf
AuthGroupFile /www/config/foo.grp
# Code "Require file-group" and a list of groups if you want
# a user in any of the groups in the specified group file to be able
# to access the resource.
# Note: Any authorization module, with its standard configuration, can be used here.
Require group admin1 admin2
</Location>
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authnz_saf_module modules/mod_authnz_saf.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_default_module modules/mod_authz_default.so
...
<Location /either_group>
AuthType basic
AuthName "SAF auth with SAF groups and hfs groupfile"
AuthBasicProvider saf
AuthGroupFile /www/groupfiles/foo.grp
Require saf-group WASGRP
Require saf-group ADMINS
</Location>
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authnz_saf_module modules/mod_authnz_saf.so
LoadModule authz_default_module modules/mod_authz_default.so
...
<Location /runas_admin_bin>
AuthName "SAF RunAs client"
AuthType basic
Require valid-user
AuthBasicProvider saf
SAFRunAs %%CLIENT%%
</Location>
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authnz_saf_module modules/mod_authnz_saf.so
LoadModule authz_default_module modules/mod_authz_default.so
...
<Location /custom_password_change>
AuthType basic
AuthName "Support expired PW"
Require valid-user
AuthBasicProvider saf
AuthSAFEXpiration "EXPIRED PW: oldpw/newpw/newpw"
AuthSAFReEnter "New PW again:"
</Location>
如果要求用户提供客户机证书后才能访问资源,请使用 mod_ibm_ssl 伪指令。此配置不需要 mod_authnz_saf 伪指令。有关其他信息,请参阅 SSLClientAuth 和 SSLClientAuthRequire 伪指令的文档。
LoadModule authnz_saf_module modules/mod_authnz_saf.so
LoadModule ibm_ssl_module modules/mod_ibm_ssl.so
...
<Location /certificate_required>
SAFRunAs %%CERTIF_REQ%%
</Location>
<Location /certificate_or_basic>
AuthName "SAF RunAs certif"
AuthType basic
Require saf-user USER84 USER103
AuthBasicProvider saf
SAFRunAs %%CERTIF%%
</Location>
<Location /runas_public>
SAFRunAs PUBLIC
# This can be combined with SAF or non-SAF authentication/authorization
</Location>