外观
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 36502.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.key3. 外部认证
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 --reload1.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: 配置客户端连接字符集:
客户端连接时指定字符集:
bashmysql -h127.0.0.1 -P2881 -u user -ppassword --default-character-set=utf8mb4服务器端设置默认字符集:
sqlSET GLOBAL character_set_server = utf8mb4; SET GLOBAL collation_server = utf8mb4_unicode_ci;
Q5: 如何提高客户端连接性能?
A5: 提高客户端连接性能的方法:
- 使用连接池管理连接
- 调整连接超时参数
- 增加服务器最大连接数(根据资源情况)
- 使用本地连接(如果客户端和服务器在同一主机)
- 优化网络配置,减少网络延迟
Q6: 如何实现客户端连接的负载均衡?
A6: 实现客户端连接负载均衡的方法:
- 使用OBProxy:OceanBase官方提供的代理,支持连接负载均衡
- 使用第三方负载均衡器:如F5、Nginx等
- 应用层实现负载均衡:在应用中配置多个连接地址,实现客户端负载均衡
Q7: 证书认证和密码认证哪个更安全?
A7: 证书认证比密码认证更安全,因为:
- 证书认证使用非对称加密,安全性更高
- 证书包含更多身份信息,如主题、颁发者等
- 证书可以设置有效期,自动过期
- 证书不容易被暴力破解
Q8: 如何迁移用户认证方式?
A8: 迁移用户认证方式的步骤:
- 备份当前用户信息
- 在测试环境测试新的认证方式
- 在生产环境逐步迁移:sql
-- 先允许两种认证方式 ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password'; -- 等所有客户端更新后,强制使用新认证方式 ALTER USER 'user'@'host' IDENTIFIED WITH caching_sha2_password BY 'new_password'; - 监控迁移过程,及时处理问题
