Proxy + LDAP & LDAPS 应用案例 #
背景 #
SphereEx-DBPlusEngine 增加了对 LDAP 登录认证的支持,以下应用案例展示了 LDAP 登录认证的使用流程。
在案例展示过程中,使用 Wireshark 工具进行抓包,以更形象的展示 LDAP 与 LDAPS 协议的区别。
LDAPS 是基于 SSL/TLS 的 LDAP 通信方式。
基础环境 #
名称 | 版本 |
---|---|
MySQL | 5.7 或 8.0 |
SphereEx-DBPlusEngine | 1.0 |
Wireshark | 3.6 |
ApacheDS | 2.0.0 |
- config-sharding-databases.yaml
schemaName: sharding_db
dataSources:
ds_0:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 10
minPoolSize: 1
ds_1:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 10
minPoolSize: 1
rules:
- !SHARDING
tables:
t_order:
actualDataNodes: ds_${0..1}.t_order
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
defaultDatabaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: database_inline
defaultTableStrategy:
none:
shardingAlgorithms:
database_inline:
type: INLINE
props:
algorithm-expression: ds_${user_id % 2}
keyGenerators:
snowflake:
type: SNOWFLAKE
LDAP 服务器配置 #
采用 ApacheDS™ 的 Docker 镜像:tremolosecurity/apacheds。
a. 拉取镜像
docker pull tremolosecurity/apacheds:latest
b. 生成 SSL 证书
说明页:https://directory.apache.org/apacheds/basic-ug/3.3-enabling-ssl.html
按照页面中的方法,使用 keytool 生成证书。
这里以 Common name 为 localhost 为例,生成两个文件:
.
├── localhost.ks
└── localhost.cer
由于使用的容器对文件名有特殊要求,这里将 localhost.ks 重命名为 apacheds.jks。
.
├── apacheds.jks
└── localhost.cer
说明: 证书文件可以保存在任意路径,如:
- /Users/${yourname}/apacheds/apacheds.jks
- /Users/${yourname}/apacheds/localhost.cer
c. 启动容器
docker run --detach --rm --name apacheds \
-p 10389:10389 \
-p 10636:10636 \
-v /Users/${yourname}/apacheds:/etc/apacheds \
-e APACHEDS_ROOT_PASSWORD=secret \
-e APACHEDS_TLS_KS_PWD=secret \
tremolosecurity/apacheds:latest
说明:
- 该容器映射出两个端口,其中 10389 用作 ldap 非加密连接,10636 用作 ldaps 加密连接。
- ApacheDS 服务中包含一个默认用户 uid=admin,ou=system,通过 APACHEDS_ROOT_PASSWORD 参数指定了其密码为 secret。
启动操作后,查看日志是否正常:
docker logs -f apacheds
d. ldapsearch 测试
ldapsearch 命令可以便捷的对 LDAP 服务发起访问,验证 LDAP 服务是否正常:
docker exec -it apacheds ldapsearch -x -H ldap://localhost:10389 -b ou=system -D "uid=admin,ou=system" -w secret
至此,LDAP 服务器配置完成。
JDK 导入证书 #
由于 LDAP 服务端使用的是自签名证书,在客户端访问前需要先导入 JRE 的 keystore 中。 注意,导入过程需要输入该证书的密钥:secret。
keytool -import -alias localhost -keystore $JAVA_HOME/jre/lib/security/cacerts -file /Users/${yourname}/apacheds/localhost.cer
Proxy-LDAP 测试 #
a. server.yaml
authority:
users:
- user: root@%
- user: admin
- user: sharding
authenticators:
auth_ldap:
type: LDAP
props:
ldap_server_url: ldap://localhost:10389
ldap_dn_template: uid={0},ou=system
defaultAuthenticator: auth_ldap
b. 启动 Proxy。
c. 启动 Wireshark,开始抓取 10389 端口的数据包。
d. MySQL 客户端登录测试
注意指定 –enable-cleartext-plugin 参数
# 由于 LDAP 服务器中只有一个 admin 用户,这里使用 admin 进行登录。
# 如果尝试其他用户,得到结果是登录失败。
mysql -h 127.0.0.1 -P 3307 -A -u admin -p --enable-cleartext-plugin
输入密码 secret 后登录成功:
e. 查看抓包数据
从抓取的 TCP 数据包中,我们可以轻松的找到一条包含用户 DN 和密码的报文:
f. 小结
从 server.yaml 配置可以看出,在已有 LDAP 服务器的前提下,使用 LDAP 进行登录认证并不复杂,只需要简单配置即可。
另一方面,由于 LDAP 协议是未经加密的,在公开网络中使用 LDAP 认证有密码泄露的风险。
Proxy-LDAPS 测试 #
a. server.yaml
与 LDAP 案例的区别仅仅是更换了 LDAP 服务器的 URL。
authority:
users:
- user: root@%
- user: admin
- user: sharding
authenticators:
auth_ldap:
type: LDAP
props:
ldap_server_url: ldaps://localhost:10636
ldap_dn_template: uid={0},ou=system
defaultAuthenticator: auth_ldap
b. 启动 Proxy
c. 启动 Wireshark,开始抓取 10636 端口的数据包
d. MySQL 客户端登录测试
注意指定 –enable-cleartext-plugin 参数
# 由于 LDAP 服务器中只有一个 admin 用户,这里使用 admin 进行登录。
# 如果尝试其他用户,得到结果是登录失败。
mysql -h 127.0.0.1 -P 3307 -A -u admin -p --enable-cleartext-plugin
输入密码 secret 后登录成功:
e. 查看抓包数据 从数据包可以看到,Proxy 与 LDAP 服务器之间建立了 TLS 通信,已无法通过抓包获取通信的内容:
f. 小结
通过 SSL/TLS 加密,可以有效的保护用户登录信息。而 SphereEx-DBPlusEngine 对 LDAPS 的支持非常友好,仅需导入证书和替换 URL 就可以完成 LDAP 到 LDAPS 的切换。