介绍

可以通过以下三句话快速的认识一下LDAP:

  1. LDAP:Lightweight Directory Access Protocol,轻量目录访问协议。
  2. LDAP服务是一个为只读(查询、浏览、搜索)访问而优化的非关系型数据库,呈树状结构组织数据。
  3. LDAP主要用做用户信息查询(如邮箱、电话等)或对各种服务访问做后台认证以及用户数据权限管控。

名词解释

  • DC:domain component一般为公司名,例如:dc=163,dc=com
  • OU:organization unit为组织单元,最多可以有四级,每级最长32个字符,可以为中文
  • CN:common name为用户名或者服务器名,最长可以到80个字符,可以为中文
  • DN:distinguished name为一条LDAP记录项的名字,有唯一性,例如:dc:”cn=admin,ou=developer,dc=163,dc=com”

图形示例

上边来了一堆的名词解释,看的云里雾里,还不是很明白,怎么跟自己的组织架构对应起来呢?看看下边的图是不是清晰明了


豌豆多多

部署

docker-compose 部署服务

services:
#openladp 服务
  openldap:
    image: tiredofit/openldap:7.1.14
    container_name: ldap-service
    ports:
      - 389:389
      - 636:636
    volumes:
      - ./backup:/data/backup
      - ./data:/var/lib/openldap
      - ./config:/etc/openldap/slapd.d
      - ./certs:/certs
    environment:
      - HOSTNAME=ldap-service
      - ORGANIZATION=牛逼克拉斯有限公司
      - LOG_LEVEL=256
      - DOMAIN=ldap.example.com
      - ADMIN_PASS=123456
      - CONFIG_PASS=123456
      - DEBUG_MODE=FALSE

      - ENABLE_READONLY_USER=FALSE
      - READONLY_USER_USER=reader
      - READONLY_USER_PASS=reader

      - ENABLE_TLS=FALSE
      - TLS_CRT_FILENAME=cert.pem
      - TLS_KEY_FILENAME=key.pem
      - TLS_ENFORCE=FALSE
      - TLS_CIPHER_SUITE=ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:-DHE-DSS:-RSA:!aNULL:!MD5:!DSS:!SHA
      - TLS_VERIFY_CLIENT=never
      - SSL_HELPER_PREFIX=ldap

      - ENABLE_REPLICATION=FALSE
      - REPLICATION_CONFIG_SYNCPROV=binddn="cn=config" bindmethod=simple credentials="admin" searchbase="cn=config" type=refreshAndPersist retry="5 5 60 +" timeout=1 filter="(!(objectclass=olcGlobal))"
      - REPLICATION_DB_SYNCPROV=binddn="cn=admin,dc=example,dc=org" bindmethod=simple credentials="admin" searchbase="dc=example,dc=org" type=refreshAndPersist interval=00:00:00:10 retry="5 5 60 +" timeout=1
      - REPLICATION_HOSTS=ldap://ldap1.example.com ldap://ldap2.example.com ldap://ldap3.example.com
      - REMOVE_CONFIG_AFTER_SETUP=false

      - ENABLE_BACKUP=TRUE
      - BACKUP_INTERVAL=0400
      - BACKUP_RETENTION=10080
    networks:
      - ldapnetworks
    restart: always

# ldap 管理端
  phpldapadmin:
    image: osixia/phpldapadmin:0.9.0
    container_name: phpldapadmin-service
    ports:
      - 6680:80
    environment:
      - TZ=Asia/Shanghai
      - PHPLDAPADMIN_HTTPS="false"
      - PHPLDAPADMIN_LDAP_HOSTS=ldap-service
    networks:
      - ldapnetworks
    restart: always

#ldap 自动密码服务
  self-service-password:
    image: 'tiredofit/self-service-password:latest'
    container_name: 'self-service-password'
    ports:
      - '80:80'
    environment:
      - LDAP_SERVER=ldap://ldap-service:389
      - LDAP_BINDDN=cn=admin,dc=example,dc=com
      - LDAP_BINDPASS=123456
      - LDAP_BASE_SEARCH=ou=技术部,dc=example,dc=com
      - LDAP_LOGIN_ATTRIBUTE=cn 
      - MAIL_FROM_NAME= Self Service Password
      - MAIL_FROM=admin@example.com
      - SMTP_DEBUG=0
      - SMTP_HOST=smtp.qiye.aliyun.com
      - SMTP_USER=admin@example.com
      - SMTP_PASS=123456
      - SMTP_PORT=465
      - SMTP_SECURE_TYPE=ssl
      - SMTP_AUTH_ON=true
    volumes:
      - ./self-service-password/data:/www/ssp
      - ./self-service-password/logs:/www/logs
    networks:
      - ldapnetworks
    restart: always

networks:
  ldapnetworks:
    external: true

更多部署变量:

OpenLdap: https://registry.hub.docker.com/r/tiredofit/openldap

phpLDAPadmin: https://github.com/osixia/docker-phpLDAPadmin

self-service-password(SSP) : https://registry.hub.docker.com/r/tiredofit/self-service-password

WEB 页面

phpldapadmin 管理端

  • image-20201219095023293

自助密码服务self-service-password

自助密码服务发送邮件是因为反向代理或者其余什么原因获取的url 并不正确,需要手工修改下sendtoken.php,我这里是直接写死的。

./self-service-password/data/pages/sendtoken.php

GItlab 集成对接 LDAP

ldap集成gitlab注意事项:

  1. 在ldap 创建用户时必须添加Email 用户附加属性,不然无法登陆gitlab
  2. 通过ldap 登录gitlab的用户是默认权限,需要管理员手动分配权限
  3. LDAP用户同步过程:
    • 更新现有用户。
    • 首次登录时创建新用户。

1、修改gitlab配置文件

### LDAP Settings
###! Docs: https://docs.gitlab.com/omnibus/settings/ldap.html
###! **Be careful not to break the indentation in the ldap_servers block. It is
###!   in yaml format and the spaces must be retained. Using tabs will not work.**

gitlab_rails['ldap_enabled'] = true  #启用ldap
gitlab_rails['ldap_sync_worker_cron'] = "0 */12 * * *"  #gitlab 同步ldap用户数据

###! **remember to close this block with 'EOS' below**
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
  main: # 'main' is the GitLab 'provider ID' of this LDAP server
    label: 'LDAP'  #登录时显示的选项
    host: '64.115.5.33'   #ldap 主机
    port: 389  #ldap端口
    uid: 'cn'  #用户名的LDAP属性 'sAMAccountName' or 'uid' or 'userPrincipalName'
    bind_dn: 'cn=admin,dc=wangfeng,dc=com' #绑定的用户的完整DN。 
    password: 'wangfeng'  #密码
    encryption: 'plain' #加密方法。  "start_tls" or "simple_tls" or "plain"
    verify_certificates: false #如果加密方法是start_tls或simple_tls,则启用SSL证书验证。默认为true。
    active_directory: false  #此设置指定LDAP服务器是否为Active Directory LDAP服务器。对于非AD服务器,它将跳过AD特定查询。如果您的LDAP服务器不是AD,请将其设置为false。
    allow_username_or_email_login: true #邮箱登录
    lowercase_usernames: true #如果启用了lowercase_usernames,则GitLab会将名称转换为小写。
    block_auto_created_users: false
    base: 'dc=wangfeng,dc=com' #我们可以在其中搜索用户的基础。
    user_filter: ''  #用户过滤
    ## EE only
    group_base: ''
    admin_group: ''
    sync_ssh_keys: false
    attributes: #gitlab 同步属性
      username: ['cn', 'uid', 'userid', 'sAMAccountName']
      email: ['mail', 'email', 'userPrincipalName']
      name:       'cn'
      first_name: 'givenName'
      last_name:  'sn'

#   secondary: # 'secondary' is the GitLab 'provider ID' of second LDAP server
#     label: 'LDAP'
#     host: '_your_ldap_server'
#     port: 389
#     uid: 'sAMAccountName'
#     bind_dn: '_the_full_dn_of_the_user_you_will_bind_with'
#     password: '_the_password_of_the_bind_user'
#     encryption: 'plain' # "start_tls" or "simple_tls" or "plain"
#     verify_certificates: true
#     smartcard_auth: false
#     active_directory: true
#     allow_username_or_email_login: false
#     lowercase_usernames: false
#     block_auto_created_users: false
#     base: ''
#     user_filter: ''
#     ## EE only
#     group_base: ''
#     admin_group: ''
#     sync_ssh_keys: false
###注意最下面这个EOS 注解去掉。
EOS

2、重启gitlab 登录测试

image-20201219102021906

Jenkins 集成对接 Ldap

1、安装LDAP插件

使用LDAP认证需要安装LDAP插件,

image-20201221112824754

2、配置LDAP认证

登录Jenkins --> 系统管理 --> 全局安全配置

image-20201221112936762

访问控制选择“LDAP”,Server输入LDAP服务器地址,有其他配置可以点击“Advanced Server Configuration…”

Server:服务器地址,可以直接填写LDAP服务器的主机名或IP,例如ldap.domain.com(默认端口389),或者ldap.domain.com:1389,如果用了SSL,可以填写ldaps://ldap.domain.com(默认端口636),或者ldaps://ldap.domain.com:1636

image-20201221113037351

root DN:这里的root DN只是指搜索的根,并非LDAP服务器的root dn。由于LDAP数据库的数据组织结构类似一颗大树,而搜索是递归执行的,理论上,我们如果从子节点(而不是根节点)开始搜索,因为缩小了搜索范围那么就可以获得更高的性能。这里的root DN指的就是这个子节点的DN,当然也可以不填,表示从LDAP的根节点开始搜索

User search base:这个配置也是为了缩小LDAP搜索的范围,例如Jenkins系统只允许ou为Admin下的用户才能登陆,那么你这里可以填写ou=Admin,这是一个相对的值,相对于上边的root DN,例如你上边的root DN填写的是dc=domain,dc=com,那么user search base这里填写了ou=Admin,那么登陆用户去LDAP搜索时就只会搜索ou=Admin,dc=domain,dc=com下的用户了

User search filter:这个配置定义登陆的“用户名”对应LDAP中的哪个字段,如果你想用LDAP中的uid作为用户名来登录,那么这里可以配置为uid={0}({0}会自动的替换为用户提交的用户名),如果你想用LDAP中的mail作为用户名来登录,那么这里就需要改为mail={0}。在测试的时候如果提示你user xxx does not exist,而你确定密码输入正确时,就要考虑下输入的用户名是不是这里定义的这个值了

Group search base:参考上边User search base解释

Group search filter:这个配置允许你将过滤器限制为所需的objectClass来提高搜索性能,也就是说可以只搜索用户属性中包含某个objectClass的用户,这就要求你对你的LDAP足够了解,一般我们也不配置

Group membership:没配置,没有详细研究

Manager DN:这个配置在你的LDAP服务器不允许匿名访问的情况下用来做认证(详细的认证过程参考文章LDAP落地实战(二):SVN集成OpenLDAP认证中关于LDAP服务器认证过程的讲解),通常DN为cn=admin,dc=domain,dc=com这样

Manager Password:上边配置dn的密码

Display Name LDAP attribute:配置用户的显示名称,一般为显示名称就配置为uid,如果你想显示其他字段属性也可以这里配置,例如mail

Email Address LDAP attribute:配置用户Email对应的字段属性,一般没有修改过的话都是mail,除非你用其他的字段属性来标识用户邮箱,这里可以配置

下边还有一些配置如:环境变量Environment Properties、servlet容器代理等,很少用就不多解释了。有一个配置Enable cache可能会用得到,当你的LDAP数据量很大或者LDAP服务器性能较差时,可以开启缓存,配置缓存条数和过期时间,那么在过期时间内新请求优先查找本地缓存认证,认证通过则不会去LDAP服务器请求,以减轻LDAP服务器的压力

image-20201221113121213

配置完成后可以点击下方的“Test LDAP sttings”来测试配置的准确性

image-20201221113145120

这里输入的用户名就是你上边配置的User search filter里定义的LDAP中的属性,密码就是LDAP的密码

3、登录

配置完成并测试通过后就可以用LDAP直接登录了,注意:启用了LDAP登录后将无法再用之前的登录方式(例如本地认证)登录

参考文档: 运维咖啡吧

Archery 集成对接 Ldap

1、安装扩展包

#进入archery容器
docker exec -it archery  /bin/bash
yum install openldap-devel
pip install django-auth-ldap

2、修改Archery配置

vi /opt/archery/archery/settings.py

# LDAP
ENABLE_LDAP = True
if ENABLE_LDAP:
    import ldap
    from django_auth_ldap.config import LDAPSearch

    AUTHENTICATION_BACKENDS = (
        'django_auth_ldap.backend.LDAPBackend' ,  # 配置为先使用LDAP认证,如通过认证则不再使用后面的认证方式
        'django.contrib.auth.backends.ModelBackend',  # django系统中手动创建的用户也可使用,优先级靠后。注意这2行的顺序
    )

    AUTH_LDAP_SERVER_URI = "ldap://xxx"
    AUTH_LDAP_BING_DN = 'CN=admin,dc=wangfeng,dc=com'
    AUTH_LDAP_BING_PASSWORD = 'wangfeng'
    AUTH_LDAP_USER_DN_TEMPLATE = "cn=%(user)s,cn=user,dc=wangfeng,dc=com"
    AUTH_LDAP_ALWAYS_UPDATE_USER = True  # 每次登录从ldap同步用户信息
    AUTH_LDAP_USER_ATTR_MAP = {  # key为archery.sql_users字段名,value为ldap中字段名,用户同步信息
        "username": "cn",
        "display": "displayname",
        "email": "mail"
    }

image-20201223114142302

3、重启Archery 登录测试

docker restart archery

image-20201223114307947

4、配置登录用户默认权限image-20201223114406789

Rancher 集成对接 Ldap

简单,配置好连接参数即可。登录时可选择ldap登录或者本地登录。

image-20201223133948011

Jumpserver 集成对接 Ldap

1、LDAP 设置说明

LDAP地址  ldap://serverurl:389  或者  ldaps://serverurl:636(需要勾选ssl)
# 此处是设置LDAP的服务器,推荐使用IP, 防止解析问题

绑定DN  cn=administrator,cn=Users,dc=jumpserver,dc=org
# 这里是设置认证用户的信息, jumpserver会使用这个用户去校验ldap的信息是否正确

密码   # 上面认证用户的密码

用户OU  ou=jumpserver,dc=jumpserver,dc=org
# 这里是设置用来登录jumpserver的组织单元, 比如我要用某个ou的用户来登录jumpserver
# 多OU用法  ou=jumpserver,dc=jumpserver,dc=org | ou=user,dc=jumpserver,dc=org | ou=xxx,dc=jumpserver,dc=org

用户过滤器  (cn=%(user)s)
# 这里是设置筛选ldap用户的哪些属性, 不能有多余的空格

LADP属性映射  {"username": "cn", "name": "sn", "email": "mail"}
username name email 是jumpserver的用户属性(不可更改)
cn       sn   mail  是ldap的用户属性(可自定义)
# 这里的意思是, 把ldap用户的属性映射到jumpserver上

使用SSL
# 勾选后 LDAP地址 需要设置成 ldaps://serverurl:636

启动LDAP认证
# 如果需要使用 LDAP或域用户 登录 jumpserver,则必选

补充

DN 一定要是完整的DN, 不能跳过OU, 可以使用其他工具查询
如:cn=admin,ou=aaa,dc=jumpserver,dc=org,必须要写成cn=admin,ou=aaa,dc=jumpserver,dc=org 不能缩写成cn=admin,dc=jumpserver,dc=org

用户OU 用户OU可以只写顶层OU, 不写子OU
如:ou=aaa,ou=bbb,ou=ccc,dc=jumpserver,dc=org,可以只写ou=ccc,dc=jumpserver,dc=org,根据需求自行修改

用户过滤器  筛选用户的规则, 点击测试连接就是根据这个规则到用户OU里面去检索用户, 可以自定义规则
如:(uid=%(user)s) 或 (sAMAccountName=%(user)s)  等, 这里的属性需要与下面的属性映射设置一致

LADP属性映射  username name email 这三项不可修改删除, 属性映射的字段必须存在, 且登录用户名和邮件不可以重复
如:{"username": "uid", "name": "sn", "email": "mail"} 或 {"username": "sAMAccountName", "name": "cn", "email": "mail"}
"username": "uid" 这里的 uid 必须和上面的 (uid=%(user)s) 这里的 uid 一致
如果上面是(sAMAccountName=%(user)s) 那么下面也应该修改为{"username": "sAMAccountName",
username 是 jumpserver 的用户用户名, name 是 jumpserver 的用户名称, mail 是 jumpserver 用户的邮箱
属性映射的意思是把ldap的什么属性来作为jumpserver的用户用户名, 把ldap的什么属性作为jumpserver的用户名称, 把ldap的什么属性作为jumpserver的用户邮箱

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据