yamldap
A lightweight LDAP server that serves directory data from YAML files
A lightweight LDAP server that serves directory data from YAML files, designed for local development and testing.
Features
- 🚀 Quick Setup - Define your LDAP directory in a simple YAML file
- 🔐 Authentication - Support for multiple password formats (plain, SHA, SSHA, bcrypt)
- 🔍 LDAP Operations - Bind, search, and compare operations
- 🛠️ Development Friendly - Perfect for testing LDAP integrations locally
- 🐳 Docker Support - Run in containers with provided Dockerfile
- ⚡ Lightweight - Minimal resource usage, fast startup
Installation
From Crates.io
From Binary Releases
Download pre-built binaries from the GitHub Releases page for:
- Linux (x86_64, aarch64)
- macOS (x86_64, aarch64)
- Windows (x86_64)
From Source
Using Docker
Pull from GitHub Container Registry:
# Pull the latest version (multi-platform: linux/amd64, linux/arm64)
# Or pull a specific version
# Run with your YAML directory file
Or build locally:
Using Docker Compose
Using pre-built images from registry:
Or build and run locally:
Quick Start
- Create a YAML file defining your directory:
directory:
base_dn: "dc=example,dc=com"
entries:
- dn: "dc=example,dc=com"
objectClass:
dc: "example"
- dn: "ou=users,dc=example,dc=com"
objectClass:
ou: "users"
- dn: "uid=john,ou=users,dc=example,dc=com"
objectClass:
uid: "john"
cn: "John Doe"
sn: "Doe"
mail: "john@example.com"
userPassword: "secret123"
- Start the server:
# On a non-privileged port
# Or with Docker from registry
# Or with anonymous bind enabled
- Test with LDAP tools:
# Search all entries
# Authenticate and search
Command Line Options
yamldap [OPTIONS]
Options:
-f, --file <FILE> Path to YAML directory file
-p, --port <PORT> Port to listen on [default: 389]
--bind-address <ADDR> Address to bind to [default: 0.0.0.0]
--allow-anonymous Allow anonymous bind operations
-v, --verbose Enable verbose logging
--log-level <LEVEL> Set log level: debug, info, warn, error [default: info]
-h, --help Print help
YAML Directory Format
Basic Structure
directory:
base_dn: "dc=example,dc=com" # Required: Base DN for the directory
entries: # List of directory entries
- dn: "..." # Distinguished Name
objectClass: # Object classes
attribute: value # Attributes and values
Password Formats
# Plain text (for testing only!)
userPassword: "plaintext"
# SHA hash
userPassword: "{SHA}W6ph5Mm5Pz8GgiULbPgzG37mj9g="
# Salted SHA
userPassword: "{SSHA}DkMTwBl+a/3DfY+MTDTrcd5kMT8dpDkE"
# Bcrypt
userPassword: "$2b$10$..."
Complete Example
See examples/sample_directory.yaml for a full example with users, groups, and organizational units.
Testing Scripts
Python Test Script
Shell Test Script
Integration Examples
Python
=
=
Node.js
const ldap = require;
const client = ldap.;
client.;
Java/Spring
public LdapContextSource
Development
Running Tests
# Run all tests
# Run with coverage report
# Check test coverage percentage
# Run benchmarks
Building
# Build release version
# Build Docker image (3.99MB scratch image)
Code Quality
# Format code
# Run linter
# Run all CI checks
Testing & Coverage
The project includes comprehensive unit tests with ~63% code coverage:
- 148 unit tests covering all major components
- Integration tests for LDAP operations
- Performance benchmarks with Criterion
- Test coverage reporting via cargo-tarpaulin
Run make help to see all available Make targets.
Limitations
- Read-only operations (no add/modify/delete support yet)
- Basic LDAP v3 protocol support
- Limited search filter syntax
- No referral or alias support
- No TLS/SSL support yet
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is dual-licensed under MIT OR Apache-2.0