阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 认证机制(SCRAM、x.509、LDAP等)

认证机制(SCRAM、x.509、LDAP等)

作者:陈川 阅读数:3642人阅读 分类: MongoDB

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证书进行身份验证,适合需要高安全性的生产环境。每个客户端必须提供有效的证书才能连接数据库。

证书准备

需要准备以下文件:

  1. CA证书(ca.pem)
  2. 服务器证书(server.pem)
  3. 客户端证书(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配置准备

需要以下信息:

  1. LDAP服务器地址
  2. 绑定DN和密码
  3. 用户搜索基础DN
  4. 用户映射规则

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配置

需要配置:

  1. Keytab文件
  2. 服务主体名称(SPN)
  3. 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

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌