Skip to content

RabbitMQ 认证机制

一、概述

RabbitMQ 提供多种认证机制来验证客户端身份,确保只有授权用户才能访问消息系统。正确配置认证机制是保护 RabbitMQ 集群安全的第一道防线。

认证机制架构

mermaid
graph TB
    A[客户端] --> B[认证后端]
    B --> C{认证方式}
    C --> D[内部数据库]
    C --> E[LDAP]
    C --> F[HTTP API]
    C --> G[JWT]
    C --> H[证书]
    
    D --> I[授权检查]
    E --> I
    F --> I
    G --> I
    H --> I
    
    I --> J[访问资源]

二、核心知识点

2.1 认证后端类型

后端说明适用场景
internal内置数据库默认方式,小型部署
LDAPLDAP 目录服务企业环境,统一认证
HTTPHTTP API 认证自定义认证逻辑
JWTJSON Web Token微服务架构
certificate客户端证书高安全要求场景

2.2 内部认证

用户管理

bash
# 创建用户
rabbitmqctl add_user username password

# 设置用户标签
rabbitmqctl set_user_tags username administrator

# 删除用户
rabbitmqctl delete_user username

# 修改密码
rabbitmqctl change_password username newpassword

# 查看用户列表
rabbitmqctl list_users

用户标签

标签权限
administrator完全管理权限
monitoring监控权限
policymaker策略管理权限
management管理界面访问权限
无标签仅消息操作权限

2.3 LDAP 认证

配置示例

ini
# /etc/rabbitmq/rabbitmq.conf

# 启用 LDAP 插件
auth_backends.1.authn = ldap
auth_backends.1.authz = ldap
auth_backends.2 = internal

# LDAP 服务器配置
auth_ldap.servers.1 = ldap.example.com
auth_ldap.port = 636
auth_ldap.use_ssl = true

# 绑定配置
auth_ldap.user_dn_pattern = cn=${username},ou=users,dc=example,dc=com
auth_ldap.dn_lookup_bind = as_user

# 组查询
auth_ldap.group_lookup_base = ou=groups,dc=example,dc=com
auth_ldap.group_lookup_filter = (member=${user_dn})

2.4 HTTP 认证

配置示例

ini
# /etc/rabbitmq/rabbitmq.conf

# 启用 HTTP 认证
auth_backends.1 = http
auth_backends.2 = internal

# HTTP 认证端点
auth_http.user_path = http://auth-service:8080/auth/user
auth_http.vhost_path = http://auth-service:8080/auth/vhost
auth_http.resource_path = http://auth-service:8080/auth/resource
auth_http.topic_path = http://auth-service:8080/auth/topic

2.5 证书认证

配置示例

ini
# /etc/rabbitmq/rabbitmq.conf

# 启用 TLS
listeners.ssl.default = 5671
ssl_options.cacertfile = /path/to/ca_certificate.pem
ssl_options.certfile = /path/to/server_certificate.pem
ssl_options.keyfile = /path/to/server_key.pem
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = true

# 客户端证书认证
auth_mechanisms.1 = EXTERNAL
ssl_cert_login_from = common_name

三、配置示例

3.1 多认证后端配置

ini
# /etc/rabbitmq/rabbitmq.conf

# 认证后端链
# 先尝试 LDAP,失败则使用内部数据库
auth_backends.1.authn = ldap
auth_backends.1.authz = internal
auth_backends.2 = internal

3.2 PHP 用户管理

php
<?php

class AuthenticationManager
{
    private string $host;
    private int $port;
    private string $user;
    private string $password;
    
    public function __construct(
        string $host = 'localhost',
        int $port = 15672,
        string $user = 'guest',
        string $password = 'guest'
    ) {
        $this->host = $host;
        $this->port = $port;
        $this->user = $user;
        $this->password = $password;
    }
    
    private function request(string $endpoint, string $method = 'GET', array $data = null): array
    {
        $url = "http://{$this->host}:{$this->port}/api/{$endpoint}";
        
        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_USERPWD => "{$this->user}:{$this->password}",
            CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
            CURLOPT_CUSTOMREQUEST => $method,
        ]);
        
        if ($data !== null) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
        }
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        return [
            'status' => $httpCode,
            'data' => json_decode($response, true)
        ];
    }
    
    public function createUser(string $username, string $password, array $tags = []): array
    {
        return $this->request("users/{$username}", 'PUT', [
            'password' => $password,
            'tags' => implode(',', $tags),
        ]);
    }
    
    public function deleteUser(string $username): array
    {
        return $this->request("users/{$username}", 'DELETE');
    }
    
    public function listUsers(): array
    {
        return $this->request('users');
    }
    
    public function getUser(string $username): array
    {
        return $this->request("users/{$username}");
    }
    
    public function changePassword(string $username, string $newPassword): array
    {
        return $this->request("users/{$username}", 'PUT', [
            'password' => $newPassword,
        ]);
    }
    
    public function setUserTags(string $username, array $tags): array
    {
        return $this->request("users/{$username}", 'PUT', [
            'tags' => implode(',', $tags),
        ]);
    }
    
    public function generateUserReport(): string
    {
        $users = $this->listUsers();
        
        $report = "=== RabbitMQ 用户报告 ===\n";
        $report .= "时间: " . date('Y-m-d H:i:s') . "\n\n";
        
        foreach ($users['data'] ?? [] as $user) {
            $report .= "用户: {$user['name']}\n";
            $report .= "  标签: {$user['tags']}\n\n";
        }
        
        return $report;
    }
}

$auth = new AuthenticationManager('localhost', 15672, 'admin', 'Admin@123456');

// 创建用户
$auth->createUser('app_user', 'SecurePassword123', ['monitoring']);

// 生成报告
echo $auth->generateUserReport();

四、最佳实践建议

4.1 密码策略

  1. 强密码: 使用复杂密码
  2. 定期更换: 定期更换密码
  3. 最小权限: 按需分配权限

4.2 认证建议

  1. 多因素认证: 敏感环境启用多因素认证
  2. 审计日志: 记录认证操作
  3. 会话管理: 合理设置会话超时

五、相关链接