
LDAP Watchdog: Uma ferramenta de monitoramento LDAP em tempo real compatível com Linux para detectar alterações no diretório, fornecendo visibilidade sobre adições, modificações e exclusões para administradores e pesquisadores de segurança.
O LDAP Watchdog é uma ferramenta projetada para monitorar mudanças de registros em um diretório LDAP em tempo real. Ele fornece um mecanismo para rastrear e visualizar modificações, adições e remoções em entradas de usuários e grupos, permitindo que os usuários correlacionem mudanças esperadas com mudanças reais e identifiquem possíveis incidentes de segurança. Foi criado pensando em OpenLDAP e Linux, no entanto pode funcionar em outras implementações de LDAP. É escrito em Python e requer apenas a biblioteca ldap3.
Este software foi escrito por Joshua Rogers.
Se você está interessado em algum dos seguintes, então o LDAP Watchdog é para você:
Além de monitorar modificações, adições e remoções em um diretório LDAP, ele pode ser configurado para ignorar atributos específicos, ou até mesmo ajustado para ignorar atributos granulares dependendo de seus valores antigos/novos.
As mudanças monitoradas podem ser encaminhadas para um webhook do Slack ou exibidas no terminal (ou ambos). A saída colorida opcional também é suportada.
Anteriormente chamado de LDAP-Stalker (porque monitorar mudanças em um diretório LDAP é uma excelente maneira de espiar mudanças em uma empresa: aprender sobre promoções antes de serem anunciadas, novas contratações, desligamentos, etc.), um post de blog sobre os detalhes e a história deste projeto pode ser encontrado aqui.
Nota: nos exemplos abaixo, entryCSN e modifyTimestamp podem ser completamente ignorados definindo LDAP_WATCHDOG_IGNORED_ATTRIBUTES=entryCSN,modifyTimestamp.


Monitoramento em Tempo Real: O LDAP Watchdog monitora continuamente um diretório LDAP em busca de mudanças em entradas de usuários e grupos.
Comparação de Mudanças: A ferramenta compara mudanças entre buscas LDAP consecutivas, destacando adições, modificações e exclusões.
Verificação de Usuário de Controle: O LDAP Watchdog suporta um mecanismo de usuário de controle, disparando um erro se as mudanças do usuário de controle não forem encontradas.
Filtragem LDAP Flexível: Os usuários podem personalizar a filtragem LDAP usando a variável de ambiente LDAP_WATCHDOG_SEARCH_FILTER para focar em classes de objeto ou atributos específicos.
Integração com Slack: Receba notificações em tempo real no Slack para entradas LDAP adicionadas, modificadas ou excluídas.
Saída Personalizável: A saída do console fornece indicações claras e coloridas de adições, modificações e exclusões para fácil visualização.
Entradas e Atributos Ignorados: Os usuários podem especificar UUIDs e atributos a serem ignorados durante o processo de comparação.
Atributos Ignorados Condicionais: A filtragem condicional permite que os usuários ignorem atributos específicos com base no tipo de mudança (adições, modificações, exclusões).
ldap3. Se estiver usando um webhook do Slack, o pacote requests também é necessário.pip install LDAP-Monitor
Para incluir suporte a webhook do Slack:
pip install LDAP-Monitor[slack]
docker pull megamansec/ldap-monitor
Ou do 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
Ou usando 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
Um script de instalação baseado em Debian, install.sh, é fornecido. Quando executado como root, este script:
/opt/ldap-watchdog./etc/ldap-watchdog.env para configuração./etc/systemd/system/ldap-watchdog.service) que executa o ldap-watchdog em segundo plano./var/log/ldap-watchdog.log e /var/log/ldap-watchdog-error.log./etc/logrotate.d/ldap-watchdog.Você pode opcionalmente passar um único argumento para install.sh para definir a SLACK_WEBHOOK_URL:
sudo ./install.sh "https://hooks.slack.com/services/[...]"
Após a instalação, edite /etc/ldap-watchdog.env para configurar as definições de conexão LDAP e reinicie o serviço:
sudo systemctl restart ldap-watchdog
Toda a configuração é feita através de variáveis de ambiente. As seguintes variáveis são suportadas:
| Variável de Ambiente | Descrição | Padrão |
|---|---|---|
LDAP_WATCHDOG_CONTROL_UUID |
| Variável de Ambiente | Descrição | Padrão |
|---|---|---|
SLACK_WEBHOOK_URL |
A variável LDAP_WATCHDOG_CONDITIONAL_IGNORED_ATTRIBUTES aceita uma string JSON onde as chaves são nomes de atributos e os valores são listas de valores a serem ignorados:
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
Este projeto é licenciado sob a GPL3.0.
| Variável de Ambiente | Descrição | Padrão |
|---|
LDAP_WATCHDOG_SERVER | URL do servidor LDAP (ex.: ldaps://ldaps.intra.lan) | "" |
LDAP_WATCHDOG_BASE_DN | Nome Distinto Base para buscas LDAP | "" |
LDAP_WATCHDOG_USERNAME | Nome de usuário LDAP para autenticação. Deixe vazio para bind anônimo. | "" |
LDAP_WATCHDOG_PASSWORD | Senha LDAP para autenticação. Deixe vazio para bind anônimo. | "" |
LDAP_WATCHDOG_USE_SSL | Defina como true para usar SSL, false caso contrário | true |
LDAP_WATCHDOG_SEARCH_FILTER | Filtro LDAP para entradas de usuários e grupos | (&(|(objectClass=inetOrgPerson)(objectClass=groupOfNames))) |
LDAP_WATCHDOG_SEARCH_ATTRIBUTE | Lista separada por vírgulas de atributos a recuperar. Por padrão, usa *,+ para incluir atributos operacionais. | *,+ |
LDAP_WATCHDOG_REFRESH_RATE | Intervalo de tempo em segundos entre buscas LDAP consecutivas | 60 |
LDAP_WATCHDOG_DISABLE_COLOR_OUTPUT | Defina como true para desabilitar a saída colorida no terminal | false |
| UUID de um usuário de controle cujas mudanças disparam um erro se não forem encontradas. Se definido, esse usuário deve sempre ter algum tipo de mudança quando o diretório LDAP for recuperado. |
"" |
LDAP_WATCHDOG_CONTROL_USER_ATTRIBUTE | Atributo específico para verificar mudanças no usuário de controle. Se definido, esse atributo deve ter sido alterado para o UUID de controle. | "" |
URL do webhook do Slack para notificações. Requer o extra slack (pip install LDAP-Monitor[slack]). |
None |
LDAP_WATCHDOG_SLACK_BULLETPOINT | Caractere de ponto usado na saída do Slack e do console | \u2022 |
| Variável de Ambiente | Descrição | Padrão |
|---|
LDAP_WATCHDOG_IGNORED_UUIDS | Lista separada por vírgulas de UUIDs a ignorar durante a comparação | "" |
LDAP_WATCHDOG_IGNORED_ATTRIBUTES | Lista separada por vírgulas de atributos a ignorar durante a comparação | "" |
LDAP_WATCHDOG_CONDITIONAL_IGNORED_ATTRIBUTES | String JSON de atributos para ignorar condicionalmente (veja abaixo) | {} |