Skip to content

OceanBase 客户端认证

核心概念

客户端认证是指OceanBase数据库验证客户端身份的过程,确保只有授权用户才能访问数据库资源。OceanBase支持多种认证方式,包括密码认证、证书认证、外部认证等,以满足不同安全级别和使用场景的需求。

认证方式

1. 密码认证

密码认证是最常用的认证方式,客户端通过提供用户名和密码来证明身份。OceanBase支持多种密码加密算法和认证插件。

1.1 内置认证插件

OceanBase支持以下内置认证插件:

  • mysql_native_password:MySQL原生密码认证插件,使用SHA1加密算法
  • caching_sha2_password:基于SHA256的缓存密码认证插件,安全性更高
  • ob_auth:OceanBase自定义的认证插件,支持更灵活的密码策略

1.2 设置用户认证插件

创建用户时,可以指定认证插件:

sql
CREATE USER 'user_name'@'host' IDENTIFIED BY 'password' USING 'mysql_native_password';

修改用户认证插件:

sql
ALTER USER 'user_name'@'host' IDENTIFIED WITH 'caching_sha2_password' BY 'new_password';

1.3 密码策略配置

OceanBase支持配置密码策略,包括密码复杂度、过期时间、重试次数等:

sql
-- 设置密码复杂度要求
SET GLOBAL validate_password_policy = 'STRONG';

-- 设置密码最小长度
SET GLOBAL validate_password_length = 12;

-- 设置密码过期时间(天)
SET GLOBAL default_password_lifetime = 90;

-- 设置登录失败重试次数
SET GLOBAL max_connect_errors = 10;

2. 证书认证

证书认证是一种基于SSL/TLS的认证方式,使用数字证书来验证客户端身份,提供更高的安全性。

2.1 配置SSL/TLS

2.1.1 生成证书

使用OpenSSL生成SSL证书:

bash
# 生成CA证书
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -days 3650 -out ca.crt

# 生成服务器证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650

# 生成客户端证书
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650
2.1.2 配置OceanBase使用SSL

在OceanBase配置文件中启用SSL:

yaml
ssl:
  enable: true
  ca_cert: /path/to/ca.crt
  server_cert: /path/to/server.crt
  server_key: /path/to/server.key
  cipher: 'AES256-SHA256'
2.1.3 重启集群生效
bash
obd cluster restart <cluster-name>

2.2 创建使用证书认证的用户

sql
CREATE USER 'ssl_user'@'host' IDENTIFIED BY 'password' REQUIRE SSL;

要求客户端必须提供有效证书:

sql
CREATE USER 'cert_user'@'host' IDENTIFIED BY 'password' REQUIRE X509;

要求客户端提供特定证书:

sql
CREATE USER 'specific_cert_user'@'host' IDENTIFIED BY 'password' REQUIRE SUBJECT '/CN=client' AND ISSUER '/CN=CA';

2.3 客户端使用SSL连接

使用MySQL客户端连接时指定SSL选项:

bash
mysql -h127.0.0.1 -P2881 -u ssl_user -ppassword \
--ssl-ca=/path/to/ca.crt \
--ssl-cert=/path/to/client.crt \
--ssl-key=/path/to/client.key

3. 外部认证

OceanBase支持与外部认证系统集成,如LDAP、Kerberos等。

3.1 LDAP认证

3.1.1 配置LDAP认证插件
sql
INSTALL PLUGIN authentication_ldap_simple SONAME 'authentication_ldap_simple.so';
3.1.2 创建LDAP认证用户
sql
CREATE USER 'ldap_user'@'host' IDENTIFIED WITH authentication_ldap_simple AS 'uid=ldap_user,ou=people,dc=example,dc=com';
3.1.3 配置LDAP服务器信息
sql
SET GLOBAL ldap_host = 'ldap://ldap.example.com';
SET GLOBAL ldap_port = 389;
SET GLOBAL ldap_base_dn = 'dc=example,dc=com';

3.2 Kerberos认证

3.2.1 配置Kerberos认证插件
sql
INSTALL PLUGIN authentication_kerberos SONAME 'authentication_kerberos.so';
3.2.2 创建Kerberos认证用户
sql
CREATE USER 'kerberos_user'@'host' IDENTIFIED WITH authentication_kerberos AS 'KERBEROS_PRINCIPAL';
3.2.3 配置Kerberos服务器信息
sql
SET GLOBAL kerberos_realm = 'EXAMPLE.COM';
SET GLOBAL kerberos_kdc = 'kdc.example.com';
SET GLOBAL kerberos_admin_server = 'admin.example.com';

连接管理

1. 连接参数配置

1.1 连接超时设置

sql
-- 设置客户端连接超时时间(秒)
SET GLOBAL connect_timeout = 10;

-- 设置客户端交互超时时间(秒)
SET GLOBAL interactive_timeout = 28800;

-- 设置客户端等待超时时间(秒)
SET GLOBAL wait_timeout = 28800;

1.2 最大连接数设置

sql
-- 设置全局最大连接数
SET GLOBAL max_connections = 10000;

-- 设置租户级最大连接数
ALTER TENANT <tenant_name> SET VARIABLES max_connections = 5000;

2. 连接池配置

对于应用程序,建议使用连接池来管理数据库连接,提高连接利用率和性能。

2.1 应用层连接池

常见的应用层连接池包括:

  • HikariCP:高性能JDBC连接池,适用于Java应用
  • Druid:阿里巴巴开源的JDBC连接池,功能丰富
  • DBCP:Apache Commons DBCP,经典的JDBC连接池
  • C3P0:成熟的JDBC连接池,稳定性好

2.2 连接池配置最佳实践

  • 设置合理的最小连接数(minIdle):根据业务需求和服务器资源确定
  • 设置合理的最大连接数(maxActive):避免连接数过多导致服务器资源耗尽
  • 设置连接超时时间(connectionTimeout):避免长时间等待无效连接
  • 设置空闲连接超时时间(idleTimeout):释放长时间空闲的连接
  • 设置连接验证机制(validationQuery):确保获取的连接是有效的

安全加固

1. 限制连接来源

1.1 使用防火墙限制IP

配置防火墙规则,只允许特定IP地址访问OceanBase端口:

bash
# 使用iptables限制IP
iptables -A INPUT -p tcp --dport 2881 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 2881 -j DROP

# 使用firewalld限制IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="2881" accept'
firewall-cmd --reload

1.2 使用用户主机限制

创建用户时限制允许连接的主机:

sql
-- 允许特定IP连接
CREATE USER 'user'@'192.168.1.100' IDENTIFIED BY 'password';

-- 允许IP段连接
CREATE USER 'user'@'192.168.1.%' IDENTIFIED BY 'password';

-- 允许所有主机连接(不推荐)
CREATE USER 'user'@'%' IDENTIFIED BY 'password';

2. 审计连接行为

启用连接审计,记录所有连接和断开事件:

sql
-- 启用连接审计
SET GLOBAL audit_log_enabled = true;
SET GLOBAL audit_log_policy = 'ALL';

查看审计日志:

sql
SELECT * FROM oceanbase.GV$OB_AUDIT_LOG WHERE action IN ('login', 'logout');

3. 防止暴力破解

配置登录失败锁定机制:

sql
-- 设置登录失败次数阈值
SET GLOBAL max_connect_errors = 5;

-- 设置锁定时间(秒)
SET GLOBAL ob_login_failed_lock_time = 300;

解锁被锁定的用户:

sql
ALTER USER 'user'@'host' ACCOUNT UNLOCK;

常见问题(FAQ)

Q1: 客户端连接失败的常见原因有哪些?

A1: 客户端连接失败的常见原因:

  • 网络问题:防火墙阻止、网络不通、端口错误
  • 认证问题:用户名或密码错误、认证插件不匹配
  • 权限问题:用户没有从该主机连接的权限
  • 资源问题:连接数达到上限、服务器资源不足
  • 配置问题:SSL配置错误、外部认证配置错误

Q2: 如何查看当前活跃连接?

A2: 查看当前活跃连接的方法:

sql
-- 查看所有活跃连接
SELECT * FROM information_schema.processlist;

-- 查看详细连接信息
SELECT * FROM oceanbase.GV$OB_SESSIONS;

Q3: 如何强制断开某个客户端连接?

A3: 强制断开客户端连接:

sql
-- 查看连接ID
SELECT id, user, host FROM information_schema.processlist;

-- 断开指定连接
KILL <connection_id>;

Q4: 如何配置客户端连接的字符集?

A4: 配置客户端连接字符集:

  • 客户端连接时指定字符集:

    bash
    mysql -h127.0.0.1 -P2881 -u user -ppassword --default-character-set=utf8mb4
  • 服务器端设置默认字符集:

    sql
    SET GLOBAL character_set_server = utf8mb4;
    SET GLOBAL collation_server = utf8mb4_unicode_ci;

Q5: 如何提高客户端连接性能?

A5: 提高客户端连接性能的方法:

  • 使用连接池管理连接
  • 调整连接超时参数
  • 增加服务器最大连接数(根据资源情况)
  • 使用本地连接(如果客户端和服务器在同一主机)
  • 优化网络配置,减少网络延迟

Q6: 如何实现客户端连接的负载均衡?

A6: 实现客户端连接负载均衡的方法:

  • 使用OBProxy:OceanBase官方提供的代理,支持连接负载均衡
  • 使用第三方负载均衡器:如F5、Nginx等
  • 应用层实现负载均衡:在应用中配置多个连接地址,实现客户端负载均衡

Q7: 证书认证和密码认证哪个更安全?

A7: 证书认证比密码认证更安全,因为:

  • 证书认证使用非对称加密,安全性更高
  • 证书包含更多身份信息,如主题、颁发者等
  • 证书可以设置有效期,自动过期
  • 证书不容易被暴力破解

Q8: 如何迁移用户认证方式?

A8: 迁移用户认证方式的步骤:

  1. 备份当前用户信息
  2. 在测试环境测试新的认证方式
  3. 在生产环境逐步迁移:
    sql
    -- 先允许两种认证方式
    ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password';
    -- 等所有客户端更新后,强制使用新认证方式
    ALTER USER 'user'@'host' IDENTIFIED WITH caching_sha2_password BY 'new_password';
  4. 监控迁移过程,及时处理问题