mod_auth_gssapi, Apache的GSSAPI协商模块

分享于 

19分钟阅读

GitHub

  繁體 雙語
GSSAPI Negotiate module for Apache
  • 源代码名称:mod_auth_gssapi
  • 源代码网址:http://www.github.com/modauthgssapi/mod_auth_gssapi
  • mod_auth_gssapi源代码文档
  • mod_auth_gssapi源代码下载
  • Git URL:
    git://www.github.com/modauthgssapi/mod_auth_gssapi.git
    Git Clone代码到本地:
    git clone http://www.github.com/modauthgssapi/mod_auth_gssapi
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/modauthgssapi/mod_auth_gssapi
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    mod_auth_gssapi

    介绍

    这里 MODULE 已经被构建为老化mod_auth_kerb的替代品。 它的目标是只使用GSSAPI调用,尽可能不了解实际使用的机制。

    依赖项

    mit发行版或者任何支持凭证存储扩展插件的GSSAPI实现是实现完整功能的一个现代化版本。 在没有这些扩展的情况下提供了缩减功能。

    
    MIT krb5 (>=1.11)
    
    
    Apache httpd (>=2.4.11)
    
    
    
    

    测试

    要运行测试,还需要:

    • Kerberos 5 Key-Distribution-Center ( Debian上的krb5-kdc 包,Fedora上的krb5-server )
    • Fedora上的软件包 mod_sessionkrb5-workstationpython-requests-kerberospython-gssapi
    • 在fedora和 krb5> = 1.15上有些测试需要 krb5-pkinit 软件包。
    • nss_wrapper,Fedora包
    • socket_wrapper,Fedora包

    安装

    
    autoreconf -fi
    
    
    ./configure
    
    
    make
    
    
    make install
    
    
    
    

    配置

    Apache认证模块通常配置为每个位置,见 mod_authn_core文档以获取通用指令

    基本配置

    最简单的配置方案只指定一个指令,即密钥表的位置。

    示例
    
    <Location/private>
    
    
     AuthType GSSAPI
    
    
     AuthName"GSSAPI Single Sign On Login"
    
    
     GssapiCredStore keytab:/etc/httpd.keytab
    
    
     Require valid-user
    
    
    </Location>
    
    
    
    

    你的Apache服务器需要对配置的密钥表进行读访问。 如果Kerberos实现不支持凭证存储扩展,你也可以在 Apache init脚本中设置KRB5_KTNAME环境变量,并完全跳过GssapiCredStore选项。

    环境变量

    ( 注意:这些不是进程 环境变量,而是 Apache 环境变量,如Apache文档中的 )。

    gssapi-no-negotiate

    这里环境变量用于禁止设置协商标头。 不发送这些标头对于在不正确处理它们的浏览器周围工作非常有用。

    示例

    例如要禁止 Windows 浏览器上的协商,可以设置:

    
    BrowserMatch Windows gssapi-no-negotiate
    
    
    
    

    配置指令

    字母的指令列表

    GssapiAcceptorName
    GssapiAllowedMech
    GssapiBasicAuth
    GssapiBasicAuthMech
    GssapiConnectionBound
    GssapiCredStore
    GssapiDelegCcacheDir
    GssapiDelegCcacheEnvVar
    GssapiDelegCcachePerms
    GssapiDelegCcacheUnique
    GssapiImpersonate
    GssapiLocalName
    GssapiNameAttributes
    GssapiNegotiateOnce
    GssapiPublishErrors
    GssapiRequiredNameAttributes
    GssapiSessionKey
    GssapiSignalPersistentAuth
    GssapiSSLonly
    GssapiUseS4U2Proxy
    GssapiUseSessions

    GssapiSSLonly

    如果未通过TLS建立连接,则强制身份验证尝试失败

    示例
     
    GssapiSSLonly On
    
    
    
     

    GssapiLocalName

    尝试使用 gss_localname() 调用将客户端主体映射到本地 NAME。 为了不在缺省领域( 例如来自受信任领域的用户) 中对主体进行适当的映射,需要在/etc/krb5.conf 文件中配置配置。 请参阅 krb5.conf(5 )的[realms] 部分中的'auth_to_local'选项

    当使用这里选项时,解析的NAME 在REMOTE_USER变量中设置,但是在GSS_NAME变量中也提供完整的客户端主体 NAME。

    示例
    
    GssapiLocalName on
    
    
    
    

    GssapiConnectionBound

    使用需要多个循环访问完成身份验证( 像 NTLMSSP )的时,必须绑定到连接以保持状态之间的状态。 使用这里选项,在连接中启用不完全上下文,并在下一个请求上检索。

    示例
    
    GssapiConnectionBound On
    
    
    
    

    GssapiSignalPersistentAuth

    对于使用持久身份验证头的客户端,根据GssapiConnectionBound设置发送邮件头。

    示例
    
    GssapiSignalPersistentAuth On
    
    
    
    

    GssapiUseSessions

    为了避免对每个请求都进行不断和昂贵的身份验证尝试,mod_auth_gssapi提供了一种基于cookie的会话方法。 GSSAPI使用 mod_sessions MODULE 来处理 Cookies,因此需要激活和配置 MODULE。 GSSAPI使用安全的( 已经加密+ mac ) 负载来维护会话cookie中的状态。 会话cookie生存期取决于在身份验证时建立的GSSAPI会话的生存期。 说明:正确设置SessionCookieName选项很重要。 有关更多信息,请参阅 mod_sessions 文档。

    示例
    
    GssapiUseSessions On
    
    
    Session On
    
    
    SessionCookieName gssapi_session path=/private;httponly;secure;
    
    
    
    

    GssapiSessionKey

    启动GssapiUseSessions时会自动生成会话数据,这意味着会话数据会在启动时不可以读。 为了避免这个问题,管理员可以选择在配置中安装永久密钥,以便在重启或者多台共享相同密钥的服务器之后可以访问会话数据。

    提供了两种读取持久密钥的方案,'密钥'和'文件'。

    • ''从配置指令中读取键。 密钥必须是一个base64编码的长度为 32字节的原始密钥。

    • '文件system文件系统中的文件用于存储密钥。 如果该文件不存在,则在第一次执行期间用随机生成的键创建。

    示例
    
    GssapiSessionKey key:VGhpcyBpcyBhIDMyIGJ5dGUgbG9uZyBzZWNyZXQhISE=
    
    
    GssapiSessionKey file:/var/lib/httpd/secrets/session.key
    
    
    
    

    GssapiCredStore

    GssapiCredStore选项允许指定多个凭据相关选项,如密钥表位置,client_keytab位置,ccache位置等。

    示例
    
    GssapiCredStore keytab:/etc/httpd.keytab
    
    
    GssapiCredStore ccache:FILE:/var/run/httpd/krb5ccache
    
    
    
    

    GssapiDelegCcacheDir

    如果需要凭证授权,可以将凭证导出到 private 进程可以访问的目录中。 委托凭证将存储在名为client的文件中,请求环境变量( 默认情况下为 KRB5CCNAME ) 将被设置为指向该文件。

    示例
    
    GssapiDelegCcacheDir/var/run/httpd/clientcaches
    
    
    
    

    用户 foo@EXAMPLE.COM 委托它的凭据将导致服务器创建名为/var/run/httpd/clientcaches/foo@EXAMPLE.COM的ccache文件

    GssapiDelegCcacheUnique

    启用使用唯一的ccache名称进行委派。 ccache文件将放在GssapiDelegCcacheDir中,使用主体和一个六位惟一后缀命名。

    注意:如果使用会话,消费程序必须删除它,否则,如果会话被使用的话,它将丢弃 文件系统。 在contrib目录中可以找到一个清理器。

    示例
    
    GssapiDelegCcacheUnique On
    
    
    
    

    GssapiDelegCcacheEnvVar

    设置将接收凭证缓存 NAME的请求环境变量的NAME。 如果未指定,默认为 KRB5CCNAME

    示例
    
    GssapiDelegCcacheEnvVar AJP_KRB5CCNAME
    
    
    
    

    GssapiUseS4U2Proxy

    允许使用 s4u2Proxy Kerberos扩展也称为约束委托。这里选项允许在Apache中运行的应用程序通过使用提供的票证来代表用户运行其他服务器。 这里选项需要设置 GssapiDelegCcacheDir。 将使用用户票证填充 ccache,该用户票证稍后被应用程序用作证据票证。

    注意:如果使用基本身份验证,则这里标志无效,因为在设置了GssapiDelegCcacheDir时,仍然委托用户的凭据。

    示例
    
    GssapiUseS4U2Proxy On
    
    
    GssapiCredStore keytab:/etc/httpd.keytab
    
    
    GssapiCredStore client_keytab:/etc/httpd.keytab
    
    
    GssapiCredStore ccache:FILE:/var/run/httpd/krb5ccache
    
    
    GssapiDelegCcacheDir/var/run/httpd/clientcaches
    
    
    
    

    注意:客户机密钥表是允许GSSAPI通过它的自身的密钥表启动的必要。 如果不提供外部机制,外部机制需要与密钥表一起使用,并在已经配置的ccache文件中存储一个 ccache。

    GssapiBasicAuth

    允许与协商一起使用基本认证。 如果浏览器无法使用协商,它将反转到基本,用户名和密码将用于在 MODULE 中获取凭据。 如果成功获取凭据,则会根据服务器密钥表对它的进行验证。

    • 使用:GssapiBasicAuth启用
    • 默认: GssapiBasicAuth关闭
    示例
    
    <Location/gssapi>
    
    
     AuthType GSSAPI
    
    
     AuthName"Login"
    
    
     GssapiBasicAuth On
    
    
     GssapiCredStore keytab:/etc/httpd/http.keytab
    
    
     Require valid-user
    
    
    </Location>
    
    
    
    

    GssapiAllowedMech

    允许的机制列表。这有助于限制当多个机制的凭据可用时可以使用的机制。 默认情况下没有设置机制,这意味着允许所有本地可用机制。 识别的机制名称为: krb5,iakerb,ntlmssp

    示例
    
    GssapiAllowedMech krb5
    
    
    GssapiAllowedMech ntlmssp
    
    
    
    

    GssapiBasicAuthMech

    尝试基本身份验证的机制的列表。 这有助于限制可以用于尝试口令验证的机制。 默认情况下不设置机制,这意味着允许所有本地可以用机制,除非设置 GssapiAllowedMech,否则使用。 GssapiBasicAuthMech始终优先于 GssapiAllowedMech。 识别的机制名称为: krb5,iakerb,ntlmssp

    示例
    
    GssapiBasicAuthMech krb5
    
    
    
    

    GssapiNameAttributes

    启用 MODULE 从客户端 NAME ( 与已经建立的上下文关联的授权数据) 中获取 NAME 属性并将它的公开为 环境变量。

    值格式:ENV_VAR_NAME ATTRIBUTE_NAME

    可以多次指定这里选项,每个属性要公开一次。 Special"json"expose environment environment格式字符串中所有属性,当查询 NAME 函数无法检索属性,并返回字符串"找到 0个属性"时,如果没有设置属性,则返回。

    注意 : 在cookie存储的会话数据中不会保存这些变量,因此当使用时,它们仅在第一个经过验证的请求中可用。

    注意:建议只使用大写字母和下划线,而不需要使用环境变量名称。

    示例
    
    GssapiNameAttributes json
    
    
    GssapiNameAttributes RADIUS_NAME urn:ietf:params:gss:radius-attribute_1
    
    
    
    

    GssapiRequiredNameAttributes

    这里选项允许指定客户端必须拥有的一个或者多个 NAME 属性,以便授权访问该位置。 所需的NAME 属性由name=value对( 如上面提到的名称为 ATTRIBUTE_NAME ) 指定,并且值为空终止字符串。 或者,如果 NAME 属性生成二进制值或者期望包含空格字符,则可以由': ='和base64-encoded字符串指定。

    可以使用表达式将每个name=value对与"还有"或者"或者或或者"逻辑运算符相分隔来指定 NAME 属性( 从单个 NAME 属性类型中包括多个值)的组合。 运算符优先级受括号语句的影响。

    
    foo=bar
    
    
    foo:=YmFy
    
    
    foo=bar or foo=baz
    
    
    foo=bar and foo=baz and bar=baz
    
    
    (foo=bar and foo=baz) or bar:=YmFy
    
    
    
    

    如果与客户端关联的NAME 属性不满足给定的表达式,或者没有 NAME 属性,则返回 403响应。

    示例
    
    GssapiRequiredNameAttributes"auth-indicators=high"
    
    
    GssapiRequiredNameAttributes"auth-indicators=high or other-attr=foo"
    
    
    GssapiRequiredNameAttributes"((auth-indicators=low and auth-indicators=med) or auth-indicators=high)"
    
    
    
    

    GssapiNegotiateOnce

    如果启用这里选项,协商标头将不会被拒绝,如果已经尝试协商但失败。

    通常,当客户端无法使用协商身份验证时,将返回一个 HTTP 401响应,其中包含一个www认证: 协商头,表示客户端可以重试使用不同凭据或者不同的机制进行协商。

    如果只允许一个 单点登录(Single Sign-On) 机制,或者启用 GssapiBasicAuth,则考虑启用 GssapiNegotiateOnce。

    注意:如果初始协商尝试失败,某些浏览器将回退到其他协商机制,提示用户登录凭据,重新尝试协商。 这种情况可以能导致用户失败,例如如果rx身份验证失败,不允许使用它的他机制。 出现这种情况时,一些浏览器不会回退到基本的授权机制。 启用GssapiNegotiateOnce以避免这种情况。

    • 使用:GssapiNegotiateOnce启用
    • 默认: GssapiNegotiateOnce关闭

    GssapiImpersonate

    即使未用于给定位置或者 LocationMatch,也可以使用这里选项为已经验证的用户获取服务票证。

    从内部 R> 用户标识符检索用户的主体,它通常保存来自认证结果的用户名。

    确保服务器主体设置为允许从任意用户获取可以转发票证,例如使用选项+ok_to_auth_as_delegate来使用受约束的委托。

    • 使用:GssapiImpersonate启用
    • 默认: GssapiImpersonate关闭

    GssapiDelegCcachePerms

    这里选项用于设置存储在GssapiDelegCcacheDir位置的委托的ccache文件的替代所有权和权限。 它是一个可以接受以下三个设置的多值配置指令:

    • 模式
    • uid
    • 如果设置不存在,则不会修改相对文件属性。默认的所有者和/或者模式将保留。
    模式
    
    This option allows to set the file mode, the format used is a numeric mode
    
    
    with the same semantics of the chmod unix command for mapping numbers to
    
    
    permissions.
    
    
    
    
    uid
    
    A user id number or name, an attempt to change the user owner of the file
    
    
    to the uid number specified will be made. If a user name has been
    
    
    specified, it will be resolved at startup time and the user's id number
    
    
    stored internally for all subsequent operations.
    
    
    
    
    gid
    
    A group id number or name, an attempt to change the group owner of the
    
    
    file to the gid number specified will be made. If a group name has been
    
    
    specified, it will be resolved at startup time and the group's id number
    
    
    stored internally for all subsequent operations.
    
    
    
    
    示例
    
    GssapiDelegCcachePerms mode:0660 gid:webuiworkers
    
    
    
    

    GssapiPublishErrors

    这里选项用于将错误作为 环境变量 发布,供httpd进程使用。

    在MAG_ERROR变量中提供了一般错误类型,可以具有以下值: ",","内部错误","身份验证不允许",在名为MAG_ERROR_TEXT的变量中可以能有一个免费表单错误消息。

    当错误类型为"GSS错误"时,变量GSS_ERROR_MAJ和GSS_ERROR_MIN包含由that返回的数值错误,并且MAG_ERROR_TEXT将包含一个更多的上下文。

    • 使用:GssapiPublishErrors启用
    • 默认: GssapiPublishErrors关闭

    GssapiAcceptorName

    这里选项用于强制服务器只接受特定名称。

    这允许在密钥表中提供多个密钥时,选择使用特定的凭据。

    {HOSTNAME}的特殊值将使代码使用httpd请求中的NAME apache选择要使用的正确 NAME。 如果允许多个名称和多个键在同一个apache实例上使用,这可能很有用。

    注意:默认情况下不设置任何 NAME,也不允许使用密钥表或者机制特定的接受方凭据中的任何 NAME。

    注意:像'ignore_acceptor_hostname'一样设置在 krb5.conf 中的全局iframe选项可能会影响名称的限制。

    注意:GSS_C_NT_HOSTBASED_SERVICE格式用于名称( 请参阅示例)。

    示例
    
    GssapiAcceptorName HTTP@www.example.com
    
    
    
    

    相关文章