为python-requests提供的GSSAPI身份验证处理程序
项目描述
Requests是一个面向人类的HTTP库,用Python编写。此库添加了可选的GSSAPI身份验证支持,并支持双向身份验证。
它为旧的python-requests-kerberos库提供了完全向后兼容的包装:只需将import requests_kerberos替换为import requests_gssapi。HTTPSPNEGOAuth组件提供了更强大的接口,但这当然不能保证兼容性。下面的文档是针对新接口编写的。
基本GET用法
>>> import requests
>>> from requests_gssapi import HTTPSPNEGOAuth
>>> r = requests.get("http://example.org", auth=HTTPSPNEGOAuth())
...
应支持整个requests.api。
设置
为了使用这个库,凭证缓存(ccache)中必须已经存在一个Kerberos Ticket-Granting Ticket(TGT)。是否可用的TGT可以通过运行klist命令轻松确定。如果没有可用的TGT,则必须首先获取它(例如,通过运行kinit命令,或将$KRB5CCNAME指向包含有效TGT的凭证缓存)。
简而言之,库将处理Kerberos身份验证的“协商”,但确保凭证可用和有效是用户的责任。
身份验证失败
客户端身份验证失败将通过返回401响应通知调用者。401响应也可能是过期凭证(包括TGT)的结果。
相互认证
相互认证是GSSAPI的一个不太恰当的名称的功能,它不会为requests_gssapi的大多数可能用途提供任何额外的安全优势。实际上,在大多数机制实现中(包括krb5),它要求在身份验证握手期间客户端和服务器之间进行另一轮往返。许多客户端和服务器没有正确处理超过一轮的认证握手。如果您遇到MutualAuthenticationError,这可能是原因。
只要您在信任其安全保证的TLS链接上运行,相互认证就没有任何好处。如果您根本不信任该链接,相互认证也不会有帮助(因为它不是防篡改的,GSSAPI也不是在身份验证后使用的。两者之间有一个中间地带,它有助于一小部分(例如,在加密但未验证的通道上的被动对手),但对于Negotiate(我们在这里做的事情),通常没有帮助。
关于相互认证实际上保证什么的更技术性解释,我建议您查阅rfc2743(GSSAPIv2)、rfc4120(krb5在GSSAPI中)、rfc4178(SPNEGO)和rfc4559(HTTP Negotiate)。
禁用
默认情况下,不需要显式禁用相互认证。但是,为了与较旧版本的request_gssapi或requests_kerberos兼容,您可以明确请求不尝试它。
>>> import requests
>>> from requests_gssapi import HTTPSPNEGOAuth, DISABLED
>>> gssapi_auth = HTTPSPNEGOAuth(mutual_authentication=DISABLED)
>>> r = requests.get("https://example.org", auth=gssapi_auth)
...
必需
这曾经是默认设置,但现在已经不再是这样。如果请求,HTTPSPNEGOAuth将要求服务器进行相互认证,如果服务器发出无法认证的非错误响应,将引发requests_gssapi.errors.MutualAuthenticationError。 (参见上面所述内容。)如果服务器发出无法认证的错误,它将返回给用户,但其内容和标头将被剥离。如果响应内容比错误时的相互认证需求更重要(例如,对于某些WinRM调用),则可以通过设置sanitize_mutual_error_response=False来抑制剥离行为。
>>> import requests
>>> from requests_gssapi import HTTPSPNEGOAuth, REQUIRED
>>> gssapi_auth = HTTPSPNEGOAuth(mutual_authentication=REQUIRED, sanitize_mutual_error_response=False)
>>> r = requests.get("https://windows.example.org/wsman", auth=gssapi_auth)
...
可选
这将导致requests_gssapi尝试相互认证,如果服务器表明它支持它,如果认证失败,则会导致失败,但如果服务器根本不支持它,则不会。这可能不是您想要的:链接篡改将导致硬失败,或者默默地导致它根本不会发生。这是为了兼容性而保留的。
>>> import requests
>>> from requests_gssapi import HTTPSPNEGOAuth, OPTIONAL
>>> gssapi_auth = HTTPSPNEGOAuth(mutual_authentication=OPTIONAL)
>>> r = requests.get("https://example.org", auth=gssapi_auth)
...
机会性认证
HTTPSPNEGOAuth可以强制提前启动GSSAPI交换并在初始请求(以及所有后续请求)上显示令牌。默认情况下,身份验证仅在从源服务器收到包含Negotiate挑战的401 Unauthorized响应后才会发生。这可能导致使用持久连接的主机的相互认证失败(例如,Windows/WinRM),因为初始身份验证握手后不会发送GSSAPI挑战。可以通过设置opportunistic_auth=True来更改此行为。
>>> import requests
>>> from requests_gssapi import HTTPSPNEGOAuth
>>> gssapi_auth = HTTPSPNEGOAuth(opportunistic_auth=True)
>>> r = requests.get("https://windows.example.org/wsman", auth=gssapi_auth)
...
Expect-Continue
由于httplib不支持Expect-Continue标头,具有主体的请求将失败并返回401 Unauthorized,必须与GSSAPI交换重复。
请求重传的额外开销
具有非重复主体的请求将失败
某些服务器在客户端仍在发送请求时,已经发送了适当的错误响应。并非所有反向代理都能正确处理这种情况,而是会失败。
因此,在这种情况下,您必须启用机会性认证。
主机名覆盖
如果与主机通信,其DNS名称与其主机名不匹配(例如,位于内容交换器或负载均衡器后面),则可以通过传递自定义名称(字符串或gssapi.Name)来覆盖用于GSSAPI交换的主机名。
>>> import requests
>>> from requests_gssapi import HTTPSPNEGOAuth
>>> gssapi_auth = HTTPSPNEGOAuth(target_name="internalhost.local")
>>> r = requests.get("https://externalhost.example.org/", auth=gssapi_auth)
...
显式主体
HTTPSPNEGOAuth通常使用默认主体(即,您上次运行kinit或kswitch的用户,或适用的SSO凭据)。但是,如果需要,可以使用显式凭据。
>>> import gssapi
>>> import requests
>>> from requests_gssapi import HTTPSPNEGOAuth
>>> name = gssapi.Name("user@REALM", gssapi.NameType.user)
>>> creds = gssapi.Credentials(name=name, usage="initiate")
>>> gssapi_auth = HTTPSPNEGOAuth(creds=creds)
>>> r = requests.get("http://example.org", auth=gssapi_auth)
...
显式机制
HTTPSPNEGOAuth通常让SPNEGO决定使用哪种协商机制。但是,如果需要,可以使用显式机制。将直接将mech参数传递给gssapi,而不受干扰。它预期是一个gssapi.mechs.Mechanism实例。
>>> import gssapi
>>> import requests
>>> from requests_gssapi import HTTPSPNEGOAuth
>>> try:
... krb5 = gssapi.mechs.Mechanism.from_sasl_name("GS2-KRB5")
... except AttributeError:
... krb5 = gssapi.OID.from_int_seq("1.2.840.113554.1.2.2")
>>> gssapi_auth = HTTPSPNEGOAuth(mech=krb5)
>>> r = requests.get("http://example.org", auth=gssapi_auth)
...
委派
requests_gssapi支持凭据委派(GSS_C_DELEG_FLAG)。要启用将凭据委派给请求委派的服务器,请将delegate=True传递给HTTPSPNEGOAuth
>>> import requests
>>> from requests_gssapi import HTTPSPNEGOAuth
>>> r = requests.get("http://example.org", auth=HTTPSPNEGOAuth(delegate=True))
...
请注意,仅允许将委派权限授予您信任的服务器,因为它们将能够使用委派的凭据冒充您。
日志记录
此库大量使用Python的日志记录功能。
日志消息记录在requests_gssapi和requests_gssapi.gssapi命名记录器中。
如果您遇到困难,建议您配置日志记录。底层GSSAPI库的问题将变得明显。此外,提供了大量的调试信息,如果您将日志级别提高到调试,这可能有助于故障排除。
项目详细信息
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
构建分发
requests-gssapi-1.3.0.tar.gz的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4d52bf8c2aa2a829130efcca85c14943fdd0aa75455aab985b2b8726159c20ca |
|
MD5 | 883703b1d07182ffc2fa8b2b1a2984cf |
|
BLAKE2b-256 | cf653fcdb60ef9130ea857422651dd4a90e44a6991f7cb832d45872e492649bd |