介绍

豌豆多多

可以通过以下三句话快速的认识一下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 运行openLDAP
docker run -d --name ldap-service --hostname ldap-service -p 389:389 -p 689:689 -v /data/openldap/database:/var/lib/ldap -v /data/openldap/config:/etc/ldap/slapd.d --env LDAP_ORGANISATION="wangfeng.com" --env LDAP_DOMAIN="wangfeng.com" --env LDAP_ADMIN_PASSWORD="wangfeng" --env LDAP_TLS=false --detach osixia/openldap:1.4.0

  • docker 运行 phpldapadmin 管理端
docker run --name phpldapadmin-service -p 6443:443 -p 6680:80 --hostname phpldapadmin-service --link ldap-service:wangfeng.com --env PHPLDAPADMIN_LDAP_HOSTS=wangfeng.com --env PHPLDAPADMIN_HTTPS=false --detach osixia/phpldapadmin:0.9.0
  • 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=wangfeng123
          - CONFIG_PASS=wangfeng123
          - 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=wangfeng123
          - 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=wangfeng123
          - 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
    
    
    • 登录phpldapadmin 管理端

    • image-20201219095023293

    • 创建一个user 子条目(用户组)

    image-20201219095315429

    image-20201219095339499

    • 创建用户 时选择 Generic: User Account

    自助密码服务

  • Ldap 集成GItlab

    ldap集成gitlab注意事项:

    1. 在ldap 创建用户时必须添加Email 用户附加属性,不然无法登陆gitlab

    2. 通过ldap 登录gitlab的用户是默认权限,需要管理员手动分配权限

    3. LDAP用户同步过程:

      • 更新现有用户。
      • 首次登录时创建新用户。
    • 修改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
    
    • 重启gitlab 登录测试
    • image-20201219102021906

    Ldap 集成 Jenkins

    安装LDAP插件

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

    image-20201221112824754

    配置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的密码

    登录

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

    参考文档: 运维咖啡吧

    Ldap 集成 Archery

    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

    Ldap 集成对接 Rancher

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

    image-20201223133948011

     

     

    发表回复

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

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