Python-requests的Kerberos身份验证处理器
项目描述
requests Kerberos/GSSAPI认证库
Requests是一个面向人类的Python HTTP库。此库增加了可选的Kerberos/GSSAPI认证支持,并支持双向认证。基本GET用法
>>> import requests
>>> from requests_kerberos import HTTPKerberosAuth
>>> r = requests.get("http://example.org", auth=HTTPKerberosAuth())
...
应支持整个requests.api。
安装
在安装此模块之前,需要安装底层的Kerberos C库和Python开发头文件。以下是一些Linux发行版如何安装的示例
# For Debian based distros
apt-get install gcc python3-dev libkrb5-dev
# For EL based distros
dnf install gcc python3-devel krb5-devel
软件包的名称可能因发行版而异,因此请将其作为一般指南。MacOS和Windows用户通常不需要这些开发库,因为那些平台上的底层Kerberos Python模块作为轮子提供,并且C库已经预先安装。
虽然可以在HTTPKerberosAuth中将显式的principal和password作为参数使用Kerberos认证,但建议使用现有的凭据缓存来存储凭据。凭据缓存可以存储Kerberos票据授予票据(TGT),然后在没有提供password给HTTPKerberosAuth的情况下用于认证。凭据缓存可以使用kinit命令存储TGT,可以使用klist查看缓存的 内容。可以使用环境变量KRB5CCNAME来指定自定义凭据缓存的位置。
认证失败
客户端认证失败将通过返回401响应来通知调用者。401响应也可能来自过期的票据授予票据。
双向认证
必需
默认情况下,HTTPKerberosAuth将从服务器要求双向认证,如果服务器发出无法认证的非错误响应,则将引发requests_kerberos.errors.MutualAuthenticationError。如果服务器发出无法认证的错误,则将其返回给用户,但内容头部被删除。如果响应内容比错误的双向认证需求更重要(例如,对于某些WinRM调用),则可以通过设置sanitize_mutual_error_response=False来抑制删除行为
>>> import requests
>>> from requests_kerberos import HTTPKerberosAuth, REQUIRED
>>> kerberos_auth = HTTPKerberosAuth(mutual_authentication=REQUIRED, sanitize_mutual_error_response=False)
>>> r = requests.get("https://windows.example.org/wsman", auth=kerberos_auth)
...
可选
如果您不希望要求双向认证,您可以在构建HTTPKerberosAuth对象时设置您的首选项
>>> import requests
>>> from requests_kerberos import HTTPKerberosAuth, OPTIONAL
>>> kerberos_auth = HTTPKerberosAuth(mutual_authentication=OPTIONAL)
>>> r = requests.get("http://example.org", auth=kerberos_auth)
...
这将导致requests_kerberos在服务器声明支持双向认证时尝试双向认证,如果认证失败,则会失败,但如果服务器根本不支持它,则不会失败。
禁用
虽然我们不推荐这样做,但如果您希望始终不尝试双向认证,您也可以这样做。
>>> import requests
>>> from requests_kerberos import HTTPKerberosAuth, DISABLED
>>> kerberos_auth = HTTPKerberosAuth(mutual_authentication=DISABLED)
>>> r = requests.get("http://example.org", auth=kerberos_auth)
...
预防性认证
HTTPKerberosAuth可以强制进行Kerberos GSS交换的预防性初始化并在初始请求(以及所有后续请求)上显示Kerberos票据。默认情况下,认证仅在收到来自源服务器的包含Kerberos或Negotiate挑战的401响应后发生。这可能导致使用持久连接(例如,Windows/WinRM)的主机双向认证失败,因为初始认证握手后不会发送Kerberos挑战。可以通过设置force_preemptive=True来更改此行为
>>> import requests
>>> from requests_kerberos import HTTPKerberosAuth, REQUIRED
>>> kerberos_auth = HTTPKerberosAuth(mutual_authentication=REQUIRED, force_preemptive=True)
>>> r = requests.get("https://windows.example.org/wsman", auth=kerberos_auth)
...
主机名覆盖
如果与DNS名称与其kerberos主机名不匹配的主机通信(例如,位于内容交换器或负载均衡器后面),则可以通过设置hostname_override参数来覆盖用于Kerberos GSS交换的主机名。
>>> import requests
>>> from requests_kerberos import HTTPKerberosAuth, REQUIRED
>>> kerberos_auth = HTTPKerberosAuth(hostname_override="internalhost.local")
>>> r = requests.get("https://externalhost.example.org/", auth=kerberos_auth)
...
显式主体
HTTPKerberosAuth 通常使用默认主体(即,您最后一次运行 kinit 或 kswitch 的用户,或适用的情况下 SSO 凭据)。然而,可以指定显式主体,这将导致 Kerberos 为命名用户查找匹配的凭证缓存。此功能取决于操作系统对收集型凭证缓存的支持。可以使用 principal 参数指定显式主体
>>> import requests
>>> from requests_kerberos import HTTPKerberosAuth, REQUIRED
>>> kerberos_auth = HTTPKerberosAuth(principal="user@REALM")
>>> r = requests.get("http://example.org", auth=kerberos_auth)
...
密码身份验证
HTTPKerberosAuth 可以与显式主体和密码一起使用,而不是使用凭证缓存中存储的凭据。可以使用 principal 和 password 参数分别指定显式用户名和密码
>>> import requests
>>> from requests_kerberos import HTTPKerberosAuth, REQUIRED
>>> kerberos_auth = HTTPKerberosAuth(
... principal="user@REALM",
... password="SecretPassword",
...)
>>> r = requests.get("http://example.org", auth=kerberos_auth)
指定自定义主体和密码时,底层 Kerberos 库将请求 KDC 的 TGT,然后使用该 TGT 获取用于身份验证的服务票据。
委托
requests_kerberos 支持凭据委托(GSS_C_DELEG_FLAG)。要启用将凭据委托给请求委托的服务器,请将 delegate=True 传递给 HTTPKerberosAuth
>>> import requests
>>> from requests_kerberos import HTTPKerberosAuth
>>> r = requests.get("http://example.org", auth=HTTPKerberosAuth(delegate=True))
...
请小心只允许委托给您信任的服务器,因为它们将能够使用委托的凭据冒充您。
日志记录
此库广泛使用了 Python 的日志功能。
日志消息记录到 requests_kerberos 和 requests_kerberos.kerberos_ 命名记录器。
如果您遇到困难,我们建议您配置日志。底层 kerberos 库的问题将变得明显。此外,提供了大量调试信息,如果您将日志级别提高到调试级别,这些信息可能有助于故障排除。
通道绑定
从 v0.12.0 开始,此库在通过 TLS 连接连接时自动尝试将身份验证令牌与通道绑定数据绑定。通道绑定也称为来自 Microsoft 的身份验证扩展保护(EPA)。对于不支持 CB 的服务器,应该忽略此功能。在非常罕见的情况下,如果此操作仍然失败,则可以通过设置 send_cbt=False 来禁用。
历史
0.15.0: 2024-06-04
将通道绑定数据按主机设置
添加了对使用 password 关键字参数的显式密码的支持
0.14.0: 2021-12-05
添加了对通过 HTTP 端点进行代理身份验证的支持。
由于底层 requests/urllib3 库的限制,不支持代理 HTTPS 端点。
修复了散列字节到字符串的转换问题。
0.13.0: 2021-11-03
将 Kerberos 依赖项更改为 pyspnego 以使底层 Kerberos 库现代化。
删除了 wrap_winrm 和 unwrap_winrm 函数
停止支持 Python 2 并将最低 Python 版本提高到 3.6。
将 context 属性重命名为 _context 以指示它仅用于内部使用。
修复了 Negotiate 标头正则表达式模式,以避免 DoS 受影响模式
0.12.0: 2017-12-20
添加了对通道绑定令牌的支持(假设 pykerberos 支持版本 >= 1.2.1)
默认启用 CBT,但对于可能存在兼容性问题的旧服务器,可以通过设置 send_cbt=False 来禁用。
添加了对 Kerberos 消息加密的支持(假设 pykerberos 支持版本 >= 1.2.1)
其他 CI/测试修复
0.11.0: 2016-11-02
在 Windows 上将依赖关系从 kerberos-sspi/pywin32 切换到 WinKerberos。这为 Windows 用户带来了自定义主体支持。
0.10.0: 2016-05-18
使能够在不剥离其内容和标头的情况下接收错误。
解决了由于在 Windows 上将 principal 关键字参数传递给 kerberos-sspi 而导致的错误。
0.9.0: 2016-05-06
支持主体、主机名和领域覆盖。
添加了对双向身份验证的支持。
0.8.0: 2016-01-07
支持Kerberos委派。
修复了在Windows安装上声明kerberos-sspi时的问题。
0.7.0: 2015-05-04
通过添加kerberos-sspi作为备选后端,增加了Windows原生身份验证支持。
防止服务器在授权尝试返回401时发生无限递归。
在成功响应期间减少日志记录。
0.6.1: 2014-11-14
修复HTTPKerberosAuth不将非文件视为文件的问题。
防止GSSErrors发生时发生无限递归。
0.6: 2014-11-04
处理双向身份验证(参见拉取请求36)
所有用户应立即升级。此问题已报告给oss-security,我们正在等待合适的CVE标识符。
更新:我们获得了CVE-2014-8650
以轮的形式分发。
0.5: 2014-05-14
使用新可选参数service允许HTTPKerberosAuth使用非HTTP服务主体。
修复在编译器模块不可用的分发中setup.py中的错误。
将测试依赖项添加到setup.py中,以便python setup.py test可以工作。
0.4: 2013-10-26
更新README中的次要更新
将要求更新为依赖于1.1.0以上的requests
0.3: 2013-06-02
与非标准端口运行的服务器协同工作
0.2: 2013-03-26
未记录
0.1:从未发布
初始发布
项目详情
requests_kerberos-0.15.0.tar.gz的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 437512e424413d8113181d696e56694ffa4259eb9a5fc4e803926963864eaf4e |
|
MD5 | d150b2929f700aece8ee268352df724b |
|
BLAKE2b-256 | 6378bedf4c6788a4502f8c8b6485a9a00b3006aaed34ebbccecc1b2265a3bc9f |
requests_kerberos-0.15.0-py2.py3-none-any.whl的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | ba9b0980b8489c93bfb13854fd118834e576d6700bfea3745cb2e62278cd16a6 |
|
MD5 | 12d53fb4770bad2397346d31cb6af5b2 |
|
BLAKE2b-256 | dd3becf902be8375f30f0d7829a8bc56795cd7b0f2599280cf73f988a2999322 |