Logo
Proxy + LDAP & LDAPS 应用案例

Proxy + LDAP & LDAPS 应用案例 #

背景 #

SphereEx-DBPlusEngine 增加了对 LDAP 登录认证的支持,以下应用案例展示了 LDAP 登录认证的使用流程。

在案例展示过程中,使用 Wireshark 工具进行抓包,以更形象的展示 LDAP 与 LDAPS 协议的区别。

LDAPS 是基于 SSL/TLS 的 LDAP 通信方式。

基础环境 #

名称版本
MySQL5.7 或 8.0
SphereEx-DBPlusEngine1.0
Wireshark3.6
ApacheDS2.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 的切换。