认证机制(SCRAM、x.509、LDAP等)
MongoDB提供了多种认证机制来确保数据库的安全性,包括SCRAM、x.509证书和LDAP等。不同的认证方式适用于不同的场景,从简单的用户名密码验证到复杂的基于证书或目录服务的身份管理。下面将详细介绍这些机制的工作原理、配置方法以及实际应用示例。
SCRAM认证
SCRAM(Salted Challenge Response Authentication Mechanism)是MongoDB默认的认证机制,通过用户名和密码进行身份验证。SCRAM通过加盐和多次哈希处理密码,有效防止重放攻击和密码泄露。
SCRAM-SHA-1与SCRAM-SHA-256
MongoDB支持两种SCRAM算法:
SCRAM-SHA-1
(默认启用)SCRAM-SHA-256
(需要显式启用)
在配置文件中启用SCRAM-SHA-256:
security:
authorization: enabled
scramIterationCount: 10000
setParameter:
authenticationMechanisms: "SCRAM-SHA-256,SCRAM-SHA-1"
创建SCRAM用户
通过Mongo Shell创建SCRAM用户:
use admin
db.createUser({
user: "scramUser",
pwd: passwordPrompt(), // 交互式输入密码
roles: [ { role: "readWrite", db: "test" } ],
mechanisms: [ "SCRAM-SHA-256" ] // 指定认证机制
})
前端连接示例
使用Node.js连接SCRAM认证的MongoDB:
const { MongoClient } = require('mongodb');
async function connect() {
const uri = "mongodb://scramUser:password@localhost:27017/test?authMechanism=SCRAM-SHA-256";
const client = new MongoClient(uri);
try {
await client.connect();
console.log("Connected with SCRAM-SHA-256");
} finally {
await client.close();
}
}
connect().catch(console.error);
x.509证书认证
x.509证书认证使用TLS/SSL证书进行身份验证,适合需要高安全性的生产环境。每个客户端必须提供有效的证书才能连接数据库。
证书准备
需要准备以下文件:
- CA证书(ca.pem)
- 服务器证书(server.pem)
- 客户端证书(client.pem)
生成证书的OpenSSL命令示例:
# 生成CA证书
openssl req -x509 -newkey rsa:4096 -days 365 -nodes -keyout ca-key.pem -out ca.pem
# 生成服务器证书
openssl req -newkey rsa:4096 -nodes -keyout server-key.pem -out server-req.pem
openssl x509 -req -in server-req.pem -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem
# 合并服务器证书和私钥
cat server-cert.pem server-key.pem > server.pem
MongoDB配置
在mongod.conf中启用x.509认证:
net:
tls:
mode: requireTLS
certificateKeyFile: /path/to/server.pem
CAFile: /path/to/ca.pem
security:
authorization: enabled
clusterAuthMode: x509
创建x.509用户
基于证书的DN(Distinguished Name)创建用户:
use $external
db.createUser({
user: "CN=client,OU=users,O=example",
roles: [ { role: "readWrite", db: "test" } ]
})
前端连接示例
Node.js使用x.509认证连接:
const fs = require('fs');
const { MongoClient } = require('mongodb');
async function connect() {
const uri = "mongodb://localhost:27017/test?authMechanism=MONGODB-X509&tls=true";
const client = new MongoClient(uri, {
tls: true,
tlsCertificateKeyFile: '/path/to/client.pem',
tlsCAFile: '/path/to/ca.pem'
});
try {
await client.connect();
console.log("Connected with x.509");
} finally {
await client.close();
}
}
connect().catch(console.error);
LDAP认证
LDAP(Lightweight Directory Access Protocol)允许MongoDB集成企业目录服务进行集中身份管理,适合已有LDAP基础设施的组织。
LDAP配置准备
需要以下信息:
- LDAP服务器地址
- 绑定DN和密码
- 用户搜索基础DN
- 用户映射规则
MongoDB企业版配置
在mongod.conf中配置LDAP:
security:
authorization: enabled
ldap:
servers: "ldap.example.com"
transportSecurity: tls
bind:
queryUser: "cn=admin,dc=example,dc=com"
queryPassword: "password"
userToDNMapping: '[{ match: "(.+)", ldapQuery: "ou=users,dc=example,dc=com??sub?(uid={0})" }]'
authz:
queryTemplate: "{USER}?memberOf?base"
创建LDAP映射角色
在MongoDB中创建角色映射LDAP组:
use admin
db.createRole({
role: "ldapReadWrite",
privileges: [
{ resource: { db: "test", collection: "" }, actions: ["find", "insert", "update"] }
],
roles: []
})
db.runCommand({
createUser: "CN=ldapuser,OU=users,DC=example,DC=com",
roles: [ { role: "ldapReadWrite", db: "admin" } ],
writeConcern: { w: "majority" }
})
前端连接示例
Node.js连接LDAP认证的MongoDB:
const { MongoClient } = require('mongodb');
async function connect() {
const uri = "mongodb://ldapuser@localhost:27017/test?authMechanism=PLAIN&authSource=$external";
const client = new MongoClient(uri);
try {
await client.connect();
console.log("Connected via LDAP");
} finally {
await client.close();
}
}
connect().catch(console.error);
Kerberos认证
MongoDB企业版支持Kerberos认证,适用于已部署Kerberos的企业环境。
Kerberos配置
需要配置:
- Keytab文件
- 服务主体名称(SPN)
- Kerberos realm
mongod.conf配置示例:
security:
authorization: enabled
kerberos:
keytab: /path/to/mongod.keytab
servicePrincipal: "mongodb/mongod.example.com@EXAMPLE.COM"
创建Kerberos用户
在Kerberos KDC中创建主体后映射到MongoDB:
use $external
db.createUser({
user: "mongodbuser@EXAMPLE.COM",
roles: [ { role: "readWrite", db: "test" } ]
})
前端连接示例
Node.js使用Kerberos认证:
const { MongoClient } = require('mongodb');
async function connect() {
const uri = "mongodb://mongodbuser%40EXAMPLE.COM@localhost:27017/test?authMechanism=GSSAPI&authSource=$external";
const client = new MongoClient(uri);
try {
await client.connect();
console.log("Connected via Kerberos");
} finally {
await client.close();
}
}
connect().catch(console.error);
多认证机制组合
MongoDB支持同时配置多种认证机制,根据客户端需求选择合适的认证方式。
组合配置示例
mongod.conf配置:
security:
authorization: enabled
setParameter:
authenticationMechanisms: "SCRAM-SHA-256,MONGODB-X509,PLAIN,GSSAPI"
连接字符串示例
根据认证机制指定不同的连接参数:
// SCRAM连接
const scramUri = "mongodb://user:pass@host:27017/db?authMechanism=SCRAM-SHA-256";
// x.509连接
const x509Uri = "mongodb://host:27017/db?authMechanism=MONGODB-X509&tls=true";
// LDAP连接
const ldapUri = "mongodb://ldapuser@host:27017/db?authMechanism=PLAIN&authSource=$external";
// Kerberos连接
const kerberosUri = "mongodb://user%40REALM@host:27017/db?authMechanism=GSSAPI&authSource=$external";
认证机制性能考量
不同认证机制对性能有不同影响:
- SCRAM:中等计算开销(哈希计算)
- x.509:TLS握手开销,但会话恢复可优化
- LDAP:依赖网络延迟,建议本地缓存
- Kerberos:需要KDC交互,Ticket缓存可改善
监控认证性能的命令:
db.runCommand({ serverStatus: 1 }).security.authentication
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:负载测试