MongoDB Python驱动认证机制详解
前言
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系统
- 首先安装python-kerberos或pykerberos模块
- 运行kinit获取凭证
- 连接MongoDB:
# 注意principal需要URL编码
uri = "mongodb://mongodbuser%40EXAMPLE.COM@mongo-server.example.com/?authMechanism=GSSAPI"
client = MongoClient(uri)
Windows系统(SSPI)
- 安装winkerberos模块
- 连接时可指定额外参数:
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)
基本配置
- 安装aws扩展:
pip install 'pymongo[aws]'
- 使用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提供的所有认证机制,开发者可以根据实际需求和安全要求选择合适的认证方式。对于生产环境,建议:
- 始终使用TLS/SSL加密连接
- 遵循最小权限原则配置数据库用户
- 定期轮换凭证和证书
- 监控认证失败日志
通过合理配置认证机制,可以确保MongoDB连接的安全性和可靠性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考