MongoDB Python驱动认证机制详解

MongoDB Python驱动认证机制详解

mongo-python-driver PyMongo - the Official MongoDB Python driver mongo-python-driver 项目地址: https://gitcode.com/gh_mirrors/mo/mongo-python-driver

前言

MongoDB提供了多种认证机制来确保数据库安全,PyMongo作为MongoDB的官方Python驱动,支持所有这些认证方式。本文将全面介绍PyMongo支持的各种认证机制,包括基本配置、使用场景和最佳实践。

认证基础

用户名密码编码

在MongoDB URI中使用用户名和密码时,必须进行百分号编码(percent-encoding),特别是当密码中包含特殊字符时:

from pymongo import MongoClient
import urllib.parse

username = urllib.parse.quote_plus('user')
password = urllib.parse.quote_plus('pass/word')  # 编码斜杠
client = MongoClient(f'mongodb://{username}:{password}@127.0.0.1')

SCRAM认证机制

SCRAM-SHA-256

MongoDB 4.0+默认使用SCRAM-SHA-256认证机制:

# 通过参数配置
client = MongoClient('example.com',
                    username='user',
                    password='password',
                    authSource='admin',
                    authMechanism='SCRAM-SHA-256')

# 通过URI配置
uri = "mongodb://user:password@example.com/?authSource=admin&authMechanism=SCRAM-SHA-256"
client = MongoClient(uri)

SCRAM-SHA-1

MongoDB 3.0+默认使用SCRAM-SHA-1认证机制:

client = MongoClient('example.com',
                    username='user',
                    password='password',
                    authSource='admin',
                    authMechanism='SCRAM-SHA-1')

性能提示:在Python 2.7.8以下版本,建议安装backports.pbkdf2提升性能

默认认证机制

如果不指定认证机制,PyMongo会自动与MongoDB服务器协商使用SCRAM-SHA-1或SCRAM-SHA-256。

认证数据库与默认数据库

可以分别指定认证数据库和默认数据库:

uri = "mongodb://user:password@example.com/my_db?authSource=admin"
client = MongoClient(uri)
db = client.get_database()  # 默认使用my_db

X.509证书认证

MONGODB-X509机制使用TLS/SSL证书进行认证:

client = MongoClient('example.com',
                    authMechanism="MONGODB-X509",
                    tls=True,
                    tlsCertificateKeyFile='/path/to/client.pem',
                    tlsCAFile='/path/to/ca.pem')

注意:X509认证使用$external虚拟数据库,无需指定authSource

Kerberos认证(GSSAPI)

Unix系统

  1. 首先安装python-kerberos或pykerberos模块
  2. 运行kinit获取凭证
  3. 连接MongoDB:
# 注意principal需要URL编码
uri = "mongodb://mongodbuser%40EXAMPLE.COM@mongo-server.example.com/?authMechanism=GSSAPI"
client = MongoClient(uri)

Windows系统(SSPI)

  1. 安装winkerberos模块
  2. 连接时可指定额外参数:
uri = "mongodb://mongodbuser%40EXAMPLE.COM@example.com/?authMechanism=GSSAPI&authMechanismProperties=CANONICALIZE_HOST_NAME:true,SERVICE_REALM:otherrealm"
client = MongoClient(uri)

SASL PLAIN认证

主要用于LDAP认证,建议始终使用TLS/SSL:

# 基本用法
uri = "mongodb://user:password@example.com/?authMechanism=PLAIN"
client = MongoClient(uri)

# 安全用法(推荐)
client = MongoClient(uri,
                    tls=True,
                    tlsCertificateKeyFile='/path/to/client.pem',
                    tlsCAFile='/path/to/ca.pem')

AWS IAM认证(MONGODB-AWS)

基本配置

  1. 安装aws扩展:pip install 'pymongo[aws]'
  2. 使用AWS凭证连接:
uri = "mongodb+srv://<access_key>:<secret_key>@cluster.mongodb.net/?authMechanism=MONGODB-AWS"
client = MongoClient(uri)

临时凭证

uri = "mongodb+srv://<access_key>:<secret_key>@cluster.mongodb.net/?authMechanism=MONGODB-AWS&authMechanismProperties=AWS_SESSION_TOKEN:<token>"
client = MongoClient(uri)

环境变量认证

export AWS_ACCESS_KEY_ID=<key>
export AWS_SECRET_ACCESS_KEY=<secret>
export AWS_SESSION_TOKEN=<token>
uri = "mongodb+srv://cluster.mongodb.net/?authMechanism=MONGODB-AWS"
client = MongoClient(uri)

ECS/EC2实例认证

# 无需提供凭证,自动获取实例元数据
uri = "mongodb+srv://cluster.mongodb.net/?authMechanism=MONGODB-AWS"
client = MongoClient(uri)

OIDC认证(MONGODB-OIDC)

Azure环境

props = {"ENVIRONMENT": "azure", "TOKEN_RESOURCE": "<audience>"}
client = MongoClient(uri,
                   username="<client_id>",
                   authMechanism="MONGODB-OIDC",
                   authMechanismProperties=props)

GCP环境

props = {"ENVIRONMENT": "gcp", "TOKEN_RESOURCE": "<audience>"}
client = MongoClient(uri,
                   authMechanism="MONGODB-OIDC",
                   authMechanismProperties=props)

自定义回调

对于不受直接支持的环境,可以使用OIDCCallback实现自定义认证流程。

总结

PyMongo支持MongoDB提供的所有认证机制,开发者可以根据实际需求和安全要求选择合适的认证方式。对于生产环境,建议:

  1. 始终使用TLS/SSL加密连接
  2. 遵循最小权限原则配置数据库用户
  3. 定期轮换凭证和证书
  4. 监控认证失败日志

通过合理配置认证机制,可以确保MongoDB连接的安全性和可靠性。

mongo-python-driver PyMongo - the Official MongoDB Python driver mongo-python-driver 项目地址: https://gitcode.com/gh_mirrors/mo/mongo-python-driver

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮静滢Annette

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值