跳转到主要内容

使用requests库进行HTTPS CredSSP身份验证。

项目描述

requests-credssp

Test workflow codecov PyPI version License

关于这个库

此软件包允许使用requests库进行HTTPS CredSSP身份验证。CredSSP是微软的身份验证,允许将您的凭据委派给服务器,从而为您提供双跳身份验证。

功能

此库支持以下CredSSP功能

  • 协议版本2到6
  • 使用NTLM或Kerberos进行初始身份验证
  • 使用wrapunwrap函数支持消息加密

要求

以下Python库是必需的;

默认情况下,此库可以使用NTLM消息与Windows主机进行身份验证,如果需要Kerberos身份验证,请阅读以下内容。

安装

要安装requests-credssp,只需运行

pip install requests-credssp

# to install the optional Kerberos functionality, run (see below)
pip install requests-credssp[kerberos]

Linux上的Kerberos

要在非Windows主机上添加对Kerberos身份验证的支持,必须安装Kerberos系统头文件和python-gssapi库。要安装Kerberos系统头文件,您可以安装以下软件包;

# Via Yum (Centos RHEL)
yum -y install python-devel krb5-devel krb5-libs krb5-workstation

# Via Dnf (Fedora)
dnf -y install python-devel krb5-devel krb5-libs krb5-workstation

# Via Apt (Ubuntu)
apt-get -y install python-dev libkrb5-dev krb5-user

# Via Portage (Gentoo)
emerge -av app-crypt/mit-krb5
emerge -av dev-python/setuptools

# Via pkg (FreeBSD)
sudo pkg install security/krb5

# Via OpenCSW (Solaris)
pkgadd -d http://get.opencsw.org/now
/opt/csw/bin/pkgutil -U
/opt/csw/bin/pkgutil -y -i libkrb5_3

# Via Pacman (Arch Linux)
pacman -S krb5

安装完成后,可以使用以下命令安装Python Kerberos库;

pip install requests-credssp[kerberos]

安装完成后,应该配置/etc/krb5.conf文件,以便它可以与Kerberos KDC通信。

为了添加对python-gssapi的适当SPNEGO支持,还需要安装gss-ntlmssp,它将NTLM添加为支持的GSSAPI机制,这对于与Windows进行适当的SPNEGO互操作性是必需的。此软件包可以按以下方式安装;

# Via Yum (Centos RHEL) - requires epel-release
yum -y install epel-release
yum -y install gssntlmssp

# Via Dnf (Fedora)
dnf -y install gssntlmssp

# Via Apt (Ubuntu)
apt-get -y install gss-ntlmssp

# Via Pacman (Arch Linux)
pacman -S gss-ntlmssp

附加信息

CredSSP协议相当复杂,并且使用了许多其他协议或标准才能正常工作。不幸的是,这意味着一些较旧的宿主或设置可能不兼容或需要一些解决方案才能工作。目前,在初始化CredSSP类时,您可以配置以下设置;

  • auth_mechanism:最初要使用的身份验证机制,默认为auto
  • disable_tlsv1_2:是否禁用TLSv1.2支持,并使用较旧的协议,如TLSv1.0,默认为False
  • minimum_version:客户端所需的最小CredSSP服务器版本,默认为2

身份验证机制

CredSSP协议的一部分是使用SPNEGO协议对用户的凭据进行身份验证。SPNEGO协议也称为Negotiate,能够协商客户端和服务器之间的通用协议,目前可以是NTLMKerberos。Kerberos协议设置比较复杂,但只要可能,就应该使用它,因为NTLM使用的是较旧的标准,从安全角度来看被认为是已损坏的。

由于历史决策以及Kerberos并非始终默认可用,requests-credssp的基础安装将仅与NTLM一起工作。当安装并配置了Kerberos软件包时,requests-credssp将自动尝试使用Kerberos(如果可能),如果失败,则回退到NTLM,就像在SPNEGO中一样。如果您想强制使用KerberosNTLM而不是依赖SPNEGO机制,您可以在创建HttpCredSSPAuth时设置auth_mechanism=<auth_mech>,如下所示;

import requests
from requests_credssp import HttpCredSSPAuth

# use SPNEGO (default if omitted)
credssp_auth = HttpCredSSPAuth('domain\\user', 'password',
                               auth_mechanism='auto')

# only allow Kerberos
credssp_auth = HttpCredSSPAuth('user@REALM.COM', 'password',
                               auth_mechanism='kerberos')


# only allow NTLM
credssp_auth = HttpCredSSPAuth('domain\\user', 'password',
                               auth_mechanism='ntlm')


r = requests.get("https://server:5986/wsman", auth=credssp_auth)

TLS协议版本

由于CredSSP使用TLS加密客户端和服务器之间传输的令牌,因此它容易受到SSL不同实现的影响。默认情况下,requests-credssp将与提供TLSv1.2的服务器一起工作,但较旧的Windows宿主不支持此较新版本的协议将

TLSv1.2是在Windows Server 2012和Windows 8中添加的,较旧的宿主需要安装可选更新才能使用。如果无法安装此更新或您愿意接受使用较旧TLS协议的风险,则可以将requests-credssp设置为禁用TLSv1.2,并按如下方式使用较旧的协议;

import requests
from requests_credssp import HttpCredSSPAuth

credssp_auth = HttpCredSSPAuth('domain\\user', 'password', disable_tlsv1_2=True)
r = requests.get("https://server:5986/wsman", auth=credssp_auth)

CredSSP协议版本

最近,微软发布了针对CredSSP的安全更新,以缓解CVE 2018-0886漏洞。该更新添加了2个新的CredSSP协议版本,即56,这改变了客户端和服务器相互验证的方式。虽然这些更改对使用此库的人来说是透明的,但设置此客户端将进行验证的最小版本可能是谨慎的。这意味着任何未修补此漏洞的旧服务器都将被拒绝。

要设置仅允许修补了CVE 2018-0886的服务器使用的最小协议版本,在创建HttpCredSSPAuth时设置minimum_version=5,如下所示;

import requests
from requests_credssp import HttpCredSSPAuth

credssp_auth = HttpCredSSPAuth('domain\\user', 'password', minimum_version=5)
r = requests.get("https://server:5986/wsman", auth=credssp_auth)

消息加密

您可以使用此库加密和解密发送到服务器以及从服务器接收的消息。消息加密是在认证阶段协商的TLS通道上完成的。下面是加密和解密消息的示例,请注意,这只是一个基本示例,不是可运行的脚本,实际实现取决于读取消息的协议。

import requests
from requests_credssp import HttpCredSSPAuth

# build the auth request and sent an empty message to authenticate
hostname = "server"
session = requests.Session()
session.auth = HttpCredSSPAuth('domain\\user', 'password')

request = requests.Request('POST', "https://%s:5986/wsman" % server, data=None)
prepared_request = self.session.prepare_request(request)
response = session.send(prepared_request)

context = session.auth.contexts[hostname]
# encrypt the message using the wrap command
message = b'hi server'
encrypted_message = context.wrap(message)

# send the encrypted message and get the encrypted response
request = requests.Request('POST', 'https://server:5986/wsman', data=encrypted_message)
prepared_request = self.session.prepare_request(request)
response = session.send(prepared_request)

# decrypt the encrypted response from the server
encrypted_response = response.content
decrypted_response = context.unwrap(encrypted_response)

日志记录

此库使用标准的Python日志功能。日志消息记录到requests_credssprequests_credssp.credssp命名记录器。

如果您收到任何错误或希望调试CredSSP进程,应启用DEBUG级别的日志。这些日志显示细粒度信息,例如协商的协议和加密算法以及认证过程中使用的每个CredSSP令牌。

队列

  • 添加对不同凭证类型(如智能卡和重定向凭证)的支持

项目详情


下载文件

下载适合您平台的自定义文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源分发

requests-credssp-2.0.0.tar.gz (13.3 kB 查看哈希值)

上传时间

构建分发

requests_credssp-2.0.0-py2.py3-none-any.whl (10.1 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者

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