附录:Active Directory 实验环境
# 准备 Active Directory 实验环境
本附录使用 Samba AD DC 准备可复现的实验域,保留构建、初始化、LDAPS、用户、直属组和嵌套组的核心命令。企业已有 AD 时直接阅读Active Directory 接入与验证。
| 配置项 | 示例值 |
|---|---|
| AD Realm | ADLAB.TEST |
| DNS 域 | adlab.test |
| NetBIOS 域 | ADLAB |
| 域控制器 | ad-dc1.adlab.test |
| 外部访问名 | dev1.test.com |
| LDAPS URL | ldaps://dev1.test.com:21636 |
| Base DN | DC=adlab,DC=test |
| 数据目录 | /data/extlab/ad |
注意
本文搭建的是单节点 Samba AD DC,只适合功能验证。它不代表生产级 Microsoft Active Directory,也没有覆盖双 DC、DNS 高可用、Global Catalog、站点复制、FSMO、备份恢复和域灾备。
笔记
本附录只把 AD 当作 LDAP 身份目录接入 Ambari Plus,没有让 Hadoop 主机加入 AD 域,也没有把 AD 作为 Kerberos KDC。两条安全链路要分开验收。
# 构建 Samba AD DC 镜像
示例主机使用 Docker。先建立一个最小镜像目录:
sudo install -d -m 700 /data/extlab/ad/image
cd /data/extlab/ad/image
2
创建 Dockerfile:
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
samba samba-vfs-modules samba-dsdb-modules winbind \
libnss-winbind python3-samba ldb-tools \
krb5-user ldap-utils ca-certificates openssl tini \
dnsutils iproute2 procps \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["/usr/sbin/samba", "-i", "--no-process-group"]
2
3
4
5
6
7
8
9
10
11
12
13
14
构建镜像:
sudo docker build -t ambari-ad-lab:ubuntu22.04 .
如果生产环境不能访问公共镜像仓库,应提前把基础镜像和软件包纳入内部制品库,不要在执行接入向导时临时下载。
# 准备持久化目录和密码
域数据库不能只放在容器可写层。下面几个目录会映射到容器中的 Samba 配置和数据路径。
sudo install -d -m 700 \
/data/extlab/ad/etc-samba \
/data/extlab/ad/var-lib-samba \
/data/extlab/ad/var-cache-samba \
/data/extlab/ad/tls \
/data/extlab/ad/secrets
sudo -i
umask 077
openssl rand -base64 30 > /data/extlab/ad/secrets/domain-admin.secret
openssl rand -base64 30 > /data/extlab/ad/secrets/bind-user.secret
openssl rand -base64 30 > /data/extlab/ad/secrets/test-user.secret
2
3
4
5
6
7
8
9
10
11
12
建立独立 Docker 网络,让 Docker 自动选择未占用的地址池:
sudo docker network create ambari-ad-lab-net
如果环境必须固定容器网段,应由网络管理员分配地址,并先检查它是否与主机、Kubernetes、Docker 和集群业务网段冲突。
# 初始化 AD 域
域只需要初始化一次。下面的临时容器退出后,域数据仍保存在 /data/extlab/ad。
sudo docker run --rm \
--network ambari-ad-lab-net \
-v /data/extlab/ad/etc-samba:/etc/samba \
-v /data/extlab/ad/var-lib-samba:/var/lib/samba \
-v /data/extlab/ad/var-cache-samba:/var/cache/samba \
-v /data/extlab/ad/secrets:/run/ad-secrets:ro \
ambari-ad-lab:ubuntu22.04 \
bash -lc 'samba-tool domain provision \
--server-role=dc \
--use-rfc2307 \
--dns-backend=SAMBA_INTERNAL \
--realm=ADLAB.TEST \
--domain=ADLAB \
--adminpass="$(</run/ad-secrets/domain-admin.secret)"'
2
3
4
5
6
7
8
9
10
11
12
13
14
警告
samba-tool domain provision 需要接收域管理员初始密码。本示例从 root-only 文件读取,避免把密码写死在教程和脚本中。仍应在隔离主机上执行,并在部署完成后限制进程查看、审计日志和备份文件访问。
# 签发 LDAPS 证书
生成测试 CA:
cd /data/extlab/ad
openssl genrsa -out tls/ca.key 4096
openssl req -x509 -new -sha256 -days 3650 \
-key tls/ca.key \
-out tls/ca.pem \
-subj '/CN=Ambari AD Lab Root CA/O=Ambari Plus Lab'
2
3
4
5
6
7
为外部访问名和域控制器名称签发证书:
openssl genrsa -out tls/server.key 3072
openssl req -new \
-key tls/server.key \
-out tls/server.csr \
-subj '/CN=dev1.test.com/O=Ambari Plus Lab'
cat > tls/server.ext <<'EOF'
basicConstraints=critical,CA:FALSE
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectAltName=DNS:dev1.test.com,DNS:ad-dc1.adlab.test,DNS:ad-dc1
EOF
openssl x509 -req -sha256 -days 825 \
-in tls/server.csr \
-CA tls/ca.pem \
-CAkey tls/ca.key \
-CAcreateserial \
-out tls/server.pem \
-extfile tls/server.ext
chmod 600 tls/ca.key tls/server.key
chmod 644 tls/ca.pem tls/server.pem
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
在 /data/extlab/ad/etc-samba/smb.conf 的 [global] 中确认下面几项存在:
[global]
netbios name = AD-DC1
realm = ADLAB.TEST
workgroup = ADLAB
server role = active directory domain controller
dns forwarder = 127.0.0.11
idmap_ldb:use rfc2307 = yes
tls enabled = yes
tls keyfile = /etc/samba/tls/server.key
tls certfile = /etc/samba/tls/server.pem
tls cafile = /etc/samba/tls/ca.pem
ldap server require strong auth = yes
2
3
4
5
6
7
8
9
10
11
12
13
检查证书:
openssl verify -CAfile tls/ca.pem tls/server.pem
openssl x509 -in tls/server.pem \
-noout -subject -issuer -dates -ext subjectAltName
2
3
# 启动 AD 容器
这里只向主机映射 LDAPS。21636 是实验环境端口;没有冲突时也可以使用标准的 636。
sudo docker run -d \
--name ambari-ad-lab \
--hostname ad-dc1 \
--restart unless-stopped \
--network ambari-ad-lab-net \
-p 21636:636 \
-v /data/extlab/ad/etc-samba:/etc/samba \
-v /data/extlab/ad/var-lib-samba:/var/lib/samba \
-v /data/extlab/ad/var-cache-samba:/var/cache/samba \
-v /data/extlab/ad/tls:/etc/samba/tls:ro \
-v /data/extlab/ad/secrets:/run/ad-secrets:ro \
--health-cmd 'samba-tool domain info 127.0.0.1 >/dev/null 2>&1' \
--health-interval 10s \
--health-timeout 5s \
--health-retries 12 \
ambari-ad-lab:ubuntu22.04
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
检查容器、域和端口:
sudo docker ps --filter name=ambari-ad-lab
sudo docker inspect ambari-ad-lab \
--format '{{.State.Status}} / {{.State.Health.Status}}'
sudo docker exec ambari-ad-lab \
samba-tool domain info 127.0.0.1
sudo ss -lntup | grep ':21636\b'
2
3
4
5
6


容器健康检查、LDAPS 端口和域信息都通过后,再创建平台 Bind 用户和测试目录对象。
# 创建 Bind 用户和测试组
平台应使用专门的只读 Bind 用户,不要长期使用 Domain Administrator。
sudo docker exec ambari-ad-lab bash -lc '
samba-tool user create svc_ambari_bind \
"$(</run/ad-secrets/bind-user.secret)" \
--given-name="Ambari Directory" \
--surname="Bind" \
--description="Read-only Ambari directory bind account"
samba-tool user create alice \
"$(</run/ad-secrets/test-user.secret)" \
--given-name="Alice" \
--surname="Data User" \
--mail-address="[email protected]"
samba-tool group add DataEngineers
samba-tool group add PlatformReaders
samba-tool group addmembers DataEngineers alice
samba-tool group addmembers PlatformReaders DataEngineers
'
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Samba 会根据 given name 和 surname 生成 CN,因此示例中的 Bind DN 为:
CN=Ambari Directory Bind,CN=Users,DC=adlab,DC=test
如果企业 AD 把服务账号放在专用 OU,页面中必须填写真实 DN,不能照抄 CN=Users。
# 验证 LDAPS、Bind 与嵌套组
先检查 TLS 名称和 CA:
openssl s_client \
-connect dev1.test.com:21636 \
-servername dev1.test.com \
-CAfile /data/extlab/ad/tls/ca.pem \
-verify_return_error </dev/null
2
3
4
5
再使用 Bind 用户查询 RootDSE:
export LDAPTLS_CACERT=/data/extlab/ad/tls/ca.pem
ldapsearch -LLL -x \
-H ldaps://dev1.test.com:21636 \
-D 'CN=Ambari Directory Bind,CN=Users,DC=adlab,DC=test' -W \
-s base -b '' \
defaultNamingContext dnsHostName supportedLDAPVersion
2
3
4
5
6
7

证书校验和目录 Bind 是两项独立检查。证书通过并不代表账号有查询权限,Bind 成功也不能替代证书名称校验。
查询用户和嵌套组:
ldapsearch -LLL -x \
-H ldaps://dev1.test.com:21636 \
-D 'CN=Ambari Directory Bind,CN=Users,DC=adlab,DC=test' -W \
-b 'DC=adlab,DC=test' \
'(|(sAMAccountName=alice)(cn=DataEngineers)(cn=PlatformReaders))' \
dn cn sAMAccountName userPrincipalName member
2
3
4
5
6

预期关系如下:
alice -> DataEngineers -> PlatformReaders
笔记
Samba AD DC 不一定支持 ldapwhoami 使用的 Who Am I 扩展操作。遇到 Extended Operation ... not supported 时,不要误判为 Bind 失败;使用带凭据的 RootDSE ldapsearch 验证即可。
# 在 Ambari Plus 中填写什么
进入 权限与审计 → LDAP 目录与权限 → 选择目录来源,选择 接入 Active Directory。

| 页面字段 | 示例值 |
|---|---|
| 域控地址 | ldaps://dev1.test.com:21636,可继续添加备用域控并设置优先级。 |
| Base DN | DC=adlab,DC=test |
| Bind DN | CN=Ambari Directory Bind,CN=Users,DC=adlab,DC=test |
| Bind 密码 | bind-user.secret 中的密码,只在页面输入。 |
| StartTLS | 关闭;这里直接使用 LDAPS。 |
| 受信任 CA | 上传或粘贴 ca.pem 的 PEM 内容。 |
| 用户搜索 Base | CN=Users |
| 用户过滤器 | (&(objectClass=user)(!(objectClass=computer))) |
| 用户名属性 | sAMAccountName |
| 用户组搜索 Base | CN=Users |
| 用户组过滤器 | (objectClass=group) |
| 用户组名称属性 | cn |
| 成员属性 | member |
| 嵌套组 | 开启 |
| AD 组解析模式 | matching-rule-in-chain |
| Referral | ignore |
| 认证方式 | TLS + Simple Bind |
实验环境可以关闭“生产 AD 配置”。生产配置应使用企业 CA、吊销检查和企业规定的通道绑定策略;如果现场启用了 AD 强制签名、Channel Binding 或更严格的 LDAP 策略,要按域策略设置,不能为了通过测试降低 AD 安全基线。
在“管理员准备”步骤填写 AD 中已经存在的管理员用户与管理员组。平台验证对象和成员关系,不保存管理员用户的日常登录密码。接入后按统一组权限页面配置入口、数据服务和平台角色:

# 停用和数据保留
平台停用外部 AD 时,只解除 Ambari Plus 与目录消费者的连接,不应该停止域控制器或删除 AD 对象。
测试环境暂停容器:
sudo docker stop ambari-ad-lab
恢复:
sudo docker start ambari-ad-lab
普通暂停不要删除容器网络、/data/extlab/ad、域数据库、证书和账号。真正退役前应先完成 AD 备份、消费者解绑和目录对象清理,并由 AD 管理员按企业流程执行。