LDAP Watchdog 是一款实时监控 LDAP 目录中记录变更的工具。它提供了一种跟踪和可视化用户及组条目修改、添加和删除的机制,使用户能够将预期变更与实际变更关联起来,并识别潜在的安全事件。该工具专为 OpenLDAP 和 Linux 设计,但也可能适用于其他 LDAP 实现。它使用 Python 编写,仅需 ldap3 库。
本软件由 Joshua Rogers 编写。
如果您对以下任意一点感兴趣,那么 LDAP Watchdog 非常适合您:
除了监控 LDAP 目录中的修改、添加和删除外,还可以配置忽略特定属性,甚至可以根据属性的旧值/新值来精细化忽略某些属性。
监控到的变更可以转发到 Slack Webhook,或输出到终端(也可同时进行)。支持可选的颜色输出。
该项目曾命名为 LDAP-Stalker(因为监控 LDAP 目录的变更是跟踪公司内部变更的绝佳方式:在公告发布前了解晋升信息、新员工、离职员工等),关于该项目的详细信息和历史博客文章可在此处找到。
注意:在以下示例中,可以通过设置 LDAP_WATCHDOG_IGNORED_ATTRIBUTES=entryCSN,modifyTimestamp 完全忽略 entryCSN 和 modifyTimestamp。


实时监控: LDAP Watchdog 持续监控 LDAP 目录中用户和组条目的变更。
变更比较: 该工具比较连续两次 LDAP 搜索之间的差异,突出显示添加、修改和删除操作。
控制用户验证: LDAP Watchdog 支持控制用户机制,如果未发现控制用户的变更,则会触发错误。
灵活的 LDAP 过滤: 用户可以通过 LDAP_WATCHDOG_SEARCH_FILTER 环境变量自定义 LDAP 过滤,从而专注于特定的对象类或属性。
Slack 集成: 在 Slack 上接收 LDAP 条目添加、修改或删除的实时通知。
可定制的输出: 控制台输出提供清晰且带颜色的提示,便于查看添加、修改和删除操作。
忽略的条目和属性: 用户可以指定在比较过程中忽略的 UUID 和属性。
条件忽略属性: 条件过滤允许用户根据变更类型(添加、修改、删除)忽略特定属性。
ldap3 包。如果使用 Slack Webhook,还需要 requests 包。pip install LDAP-Monitor
如需包含 Slack Webhook 支持:
pip install LDAP-Monitor[slack]
docker pull megamansec/ldap-monitor
或者从 GitHub Container Registry 拉取:
docker pull ghcr.io/megamansec/ldap-monitoring-watchdog
git clone https://github.com/MegaManSec/LDAP-Monitoring-Watchdog.git
cd LDAP-Monitoring-Watchdog
pip install ".[slack]"
export LDAP_WATCHDOG_SERVER='ldaps://ldaps.intra.lan'
export LDAP_WATCHDOG_BASE_DN='dc=mouse,dc=com'
export LDAP_WATCHDOG_USERNAME='Emily'
export LDAP_WATCHDOG_PASSWORD='qwerty123'
ldap-watchdog
或者使用 python -m:
python -m ldap_watchdog
docker run -d \
-e LDAP_WATCHDOG_SERVER='ldaps://ldaps.intra.lan' \
-e LDAP_WATCHDOG_BASE_DN='dc=mouse,dc=com' \
-e LDAP_WATCHDOG_USERNAME='Emily' \
-e LDAP_WATCHDOG_PASSWORD='qwerty123' \
-e SLACK_WEBHOOK_URL='https://hooks.slack.com/services/[...]' \
-e LDAP_WATCHDOG_IGNORED_ATTRIBUTES='modifyTimestamp,phoneNumber,officeLocation,gecos' \
megamansec/ldap-monitor
提供了一个基于 Debian 的安装脚本 install.sh。以 root 身份运行时,该脚本将:
/opt/ldap-watchdog。/etc/ldap-watchdog.env。/etc/systemd/system/ldap-watchdog.service),在后台运行 ldap-watchdog。/var/log/ldap-watchdog.log 和 /var/log/ldap-watchdog-error.log。/etc/logrotate.d/ldap-watchdog 中设置日志轮转。您可以向 install.sh 传递一个可选参数来设置 SLACK_WEBHOOK_URL:
sudo ./install.sh "https://hooks.slack.com/services/[...]"
安装后,编辑 /etc/ldap-watchdog.env 以配置 LDAP 连接设置,然后重启服务:
sudo systemctl restart ldap-watchdog
所有配置均通过环境变量完成。支持以下变量:
| 环境变量 | 描述 | 默认值 |
|---|---|---|
LDAP_WATCHDOG_CONTROL_UUID | 控制用户的 UUID,如果未找到该用户的变更则触发错误。如果设置,该用户在每次检索 LDAP 目录时都应有一些类型的变更。 | "" |
LDAP_WATCHDOG_CONTROL_USER_ATTRIBUTE | 要检查控制用户变更的特定属性。如果设置,该属性 在控制 UUID 用户上发生过变更。 |
| 环境变量 | 描述 | 默认值 |
|---|---|---|
SLACK_WEBHOOK_URL | 用于通知的 Slack Webhook URL。需要安装 slack 扩展()。 |
LDAP_WATCHDOG_CONDITIONAL_IGNORED_ATTRIBUTES 变量接受一个 JSON 字符串,其中键是属性名称,值是要忽略的值列表:
export LDAP_WATCHDOG_CONDITIONAL_IGNORED_ATTRIBUTES='{
"objectClass": ["posixAccount"],
"memberOf": ["cn=mailing-list-user,ou=Accessgroups,dc=mouse,dc=com", "cn=interns,ou=Accessgroups,dc=mouse,dc=com"],
"organizationalStatus": ["researcher"]
}'
export LDAP_WATCHDOG_CONTROL_UUID='a71c6e4c-8881-4a03-95bf-4fc25d5e6359'
export LDAP_WATCHDOG_SERVER='ldaps://ldaps.intra.lan'
export LDAP_WATCHDOG_BASE_DN='dc=mouse,dc=com'
export LDAP_WATCHDOG_USERNAME='Emily'
export LDAP_WATCHDOG_PASSWORD='qwerty123'
export LDAP_WATCHDOG_USE_SSL='true'
export LDAP_WATCHDOG_REFRESH_RATE='60'
export LDAP_WATCHDOG_DISABLE_COLOR_OUTPUT='false'
export LDAP_WATCHDOG_IGNORED_UUIDS='e191c564-6e6d-42c1-ae51-bda0509fe846,8655e0d9-ecdc-46ce-ba42-1fa3dfbf5faa'
export LDAP_WATCHDOG_IGNORED_ATTRIBUTES='modifyTimestamp,phoneNumber,officeLocation,gecos'
export LDAP_WATCHDOG_CONDITIONAL_IGNORED_ATTRIBUTES='{"objectClass":["posixAccount"],"memberOf":["cn=mailing-list-user,ou=Accessgroups,dc=mouse,dc=com","cn=interns,ou=Accessgroups,dc=mouse,dc=com"],"organizationalStatus":["researcher"]}'
export SLACK_WEBHOOK_URL='https://hooks.slack.com/services/[...]'
ldap-watchdog
本项目采用 GPL3.0 许可协议。
| 环境变量 | 描述 | 默认值 |
|---|
LDAP_WATCHDOG_SERVER | LDAP 服务器 URL(例如 ldaps://ldaps.intra.lan) | "" |
LDAP_WATCHDOG_BASE_DN | LDAP 搜索的基础分辨名(Base DN) | "" |
LDAP_WATCHDOG_USERNAME | LDAP 认证用户名。留空则为匿名绑定。 | "" |
LDAP_WATCHDOG_PASSWORD | LDAP 认证密码。留空则为匿名绑定。 | "" |
LDAP_WATCHDOG_USE_SSL | 设置为 true 使用 SSL,否则为 false | true |
LDAP_WATCHDOG_SEARCH_FILTER | 用户和组条目的 LDAP 过滤条件 | (&(|(objectClass=inetOrgPerson)(objectClass=groupOfNames))) |
LDAP_WATCHDOG_SEARCH_ATTRIBUTE | 要检索的属性列表,逗号分隔。默认使用 *,+ 以包含操作属性。 | *,+ |
LDAP_WATCHDOG_REFRESH_RATE | 连续 LDAP 搜索之间的时间间隔(秒) | 60 |
LDAP_WATCHDOG_DISABLE_COLOR_OUTPUT | 设置为 true 以禁用颜色终端输出 | false |
"" |
pip install LDAP-Monitor[slack]None |
LDAP_WATCHDOG_SLACK_BULLETPOINT | 在 Slack 和控制台输出中使用的项目符号字符 | \u2022 |
| 环境变量 | 描述 | 默认值 |
|---|
LDAP_WATCHDOG_IGNORED_UUIDS | 比较过程中要忽略的 UUID 列表,逗号分隔 | "" |
LDAP_WATCHDOG_IGNORED_ATTRIBUTES | 比较过程中要忽略的属性列表,逗号分隔 | "" |
LDAP_WATCHDOG_CONDITIONAL_IGNORED_ATTRIBUTES | 要条件忽略的属性的 JSON 字符串(见下方) | {} |