跳转到主要内容

Python-requests的Kerberos身份验证处理器

项目描述

requests Kerberos/GSSAPI认证库

https://github.com/requests/requests-kerberos/actions/workflows/ci.yml/badge.svg

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中将显式的principalpassword作为参数使用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 通常使用默认主体(即,您最后一次运行 kinitkswitch 的用户,或适用的情况下 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 可以与显式主体和密码一起使用,而不是使用凭证缓存中存储的凭据。可以使用 principalpassword 参数分别指定显式用户名和密码

>>> 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_kerberosrequests_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_winrmunwrap_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 (24.4 kB 查看散列)

上传时间

构建分发

requests_kerberos-0.15.0-py2.py3-none-any.whl (12.2 kB 查看散列)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面