LDAP Authentication | DefectDojo Documentation

LDAP Authentication (Open Source)

This feature is experimental, and is not implemented in DefectDojo Pro.

DefectDojo does not support LDAP authentication out of the box. However, since DefectDojo is built on Django, LDAP can be added by building your own Docker images and modifying a small number of configuration files.

Files to Modify

Dockerfile Modifications

In both Dockerfile.django-alpine and Dockerfile.nginx-alpine, add the following to the apk add layer:

openldap-dev 
cyrus-sasl-dev 

In Dockerfile.django-debian, add the following to the apt-get install layer:

libldap2-dev 
libsasl2-dev 
ldap-utils 

requirements.txt

Check pypi.org for the latest versions at the time of implementation, then add:

python-ldap==3.4.5
django-auth-ldap==5.2.0

local_settings.py

Find the settings file (see /dojo/settings/settings.py for instructions on using local_settings.py) and make the following additions.

At the top of the file:

import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType
import environ

Add LDAP variables to the env dict:

# LDAP
env = environ.FileAwareEnv(
    DD_LDAP_SERVER_URI=(str, 'ldap://ldap.example.com'),
    DD_LDAP_BIND_DN=(str, ''),
    DD_LDAP_BIND_PASSWORD=(str, ''),
)

Then add the LDAP settings beneath the env dict:

AUTH_LDAP_SERVER_URI = env('DD_LDAP_SERVER_URI')
AUTH_LDAP_BIND_DN = env('DD_LDAP_BIND_DN')
AUTH_LDAP_BIND_PASSWORD = env('DD_LDAP_BIND_PASSWORD')

AUTH_LDAP_USER_SEARCH = LDAPSearch(
    "ou=Groups,dc=example,dc=com", ldap.SCOPE_SUBTREE, "(uid=%(user)s)"
)

AUTH_LDAP_USER_ATTR_MAP = {
    "first_name": "givenName",
    "last_name": "sn",
    "email": "mail",
}

Customise all search variables to match your organisation’s LDAP configuration.

Optional: Group Controls

AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
    "dc=example,dc=com",
    ldap.SCOPE_SUBTREE,
    "(objectClass=groupOfNames)",
)
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType(name_attr="cn")

AUTH_LDAP_REQUIRE_GROUP = "cn=DD_USER_ACTIVE,ou=Groups,dc=example,dc=com"

AUTH_LDAP_USER_FLAGS_BY_GROUP = {
    "is_active": "cn=DD_USER_ACTIVE,ou=Groups,dc=example,dc=com",
    "is_staff": "cn=DD_USER_STAFF,ou=Groups,dc=example,dc=com",
    "is_superuser": "cn=DD_USER_ADMIN,ou=Groups,dc=example,dc=com",
}

Finally, add django_auth_ldap.backend.LDAPBackend to AUTHENTICATION_BACKENDS:

AUTHENTICATION_BACKENDS = (
    'django_auth_ldap.backend.LDAPBackend',
    'django.contrib.auth.backends.RemoteUserBackend',
    'django.contrib.auth.backends.ModelBackend',
)

Full documentation: Django Authentication with LDAP

docker-compose.yml

To pass LDAP credentials to the container via environment variables, add these to the uwsgi service environment section:

DD_LDAP_SERVER_URI: "${DD_LDAP_SERVER_URI:-ldap://ldap.example.com}"
DD_LDAP_BIND_DN: "${DD_LDAP_BIND_DN:-}"
DD_LDAP_BIND_PASSWORD: "${DD_LDAP_BIND_PASSWORD:-}"

Alternatively, set these values directly in local_settings.py.