Sentry 集成 LDAP

738 阅读1分钟

一、背景

由于公司需要统一的身份认证,针对 sentry,我们则需要安装 ldap

二、安装

1. 增加 ldap 插件

$ echo "sentry-ldap-auth" >> sentry/requirements.txt

重启 docker-compose,发现缺少 gcc 等一系列依赖,此时需构建自己的 docker 镜像

2. 重构镜像

FROM getsentry/sentry:nightly
RUN apt-get update && \
    apt-get install -y --no-install-recommends gcc libsasl2-dev python-dev libldap2-dev libssl-dev && \
    rm -r /var/lib/apt/lists/*
ENTRYPOINT ["/entrypoint.sh"]

这里提供一个我已经上传的镜像 wzmogu/sentry:ldap

3. 修改基础镜像

// .env

...
SENTRY_IMAGE=wzmogu/sentry:ldap
...

4. 添加 ldap 配置信息

sentry/sentry.conf.py

#########################
# LDAP auth #
#########################

# 有三处关键点,决定到 ldap 登录后释放会报无组织的错误,未验证

import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfUniqueNamesType

# ldap 服 务 器
AUTH_LDAP_SERVER_URI = 'ldap://xxx.xxx.com:389'

# 用 户 名
AUTH_LDAP_BIND_DN = 'cn=manager,dc=xxx,dc=com'

# 密 码
AUTH_LDAP_BIND_PASSWORD = 'xxxx'

# 用 户 检 索 目 录
AUTH_LDAP_USER_SEARCH = LDAPSearch('dc=xxx,dc=com', ldap.SCOPE_SUBTREE, '(cn=%(user)s)')

# 组 织 检 索 目 录
AUTH_LDAP_GROUP_SEARCH = LDAPSearch('dc=xxx,dc=com', ldap.SCOPE_SUBTREE, '(objectClass=groupOfUniqueNames)')

AUTH_LDAP_GROUP_TYPE= GroupOfUniqueNamesType()
AUTH_LDAP_REQUIRE_GROUP = None
AUTH_LDAP_DENY_GROUP = None

AUTH_LDAP_USER_ATTR_MAP = { 'username': 'cn', 'name': 'sn', 'email': 'mail' }

AUTH_LDAP_FIND_GROUP_PERMS = False
AUTH_LDAP_CACHE_GROUPS = True
AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600

AUTH_LDAP_DEFAULT_SENTRY_ORGANIZATION = u'Sentry'
AUTH_LDAP_SENTRY_ORGANIZATION_ROLE_TYPE = 'member' # 关键,默认角色为member

AUTH_LDAP_SENTRY_ORGANIZATION_GLOBAL_ACCESS = True
AUTH_LDAP_SENTRY_SUBSCRIBE_BY_DEFAULT = False  # 关键,关闭默认角色

AUTH_LDAP_SENTRY_USERNAME_FIELD = 'cn'
SENTRY_MANAGED_USER_FIELDS = ('email', 'first_name', 'last_name', 'password', )

AUTH_LDAP_DEFAULT_EMAIL_DOMAIN = 'xxx.com'
AUTHENTICATION_BACKENDS = AUTHENTICATION_BACKENDS + (
    'sentry_ldap_auth.backend.SentryLdapBackend',
)

# optional, for debugging
import logging
logger = logging.getLogger('django_auth_ldap')
logger.addHandler(logging.StreamHandler())
logger.setLevel('DEBUG')

LOGGING['overridable'] = ['sentry', 'django_auth_ldap']
LOGGING['loggers']['django_auth_ldap'] = {
    'handlers': ['console'],
    'level': 'DEBUG'
}

重启 docker-compose 即可

5. 验证

接入 ldap 后,sentry 平台上看不到任何变化,所以直接使用 ldap 帐号登录平台,登录成功即可