mportant; font-size: 1rem; word-break: break-all; color: rgb(51, 51, 51); line-height: 1.74; max-width: 100%;">

一 、概述

1.1 AD域服务

日常生活中使用的电话薄内记录着亲朋好友的姓名、电话与地址等数据,它就是 telephone directory(电话目录);计算机中的文件系统(file system)内记录着文件的文件名、大小与日期等数 据,它就是 file directory(文件目录)。 如果这些目录内的数据能够由系统加以整理,用户就能够容易且迅速地查找到所需的数据,而 directory service(目录服务)提供的服务,就是要达到此目的。在现实生活中,查号台也是一种目 录;在 Internet 上,百度和谷歌提供的搜索功能也是一种目录服务。 Active Directory 域内的 directory database(目录数据库)被用来存储用户账户、计算机账户、打印 机和共享文件夹等对象,而提供目录服务的组件就是 Active Directory (活动目录)域服务(Active Directory Domain Service,AD DS),它负责目录数据库的存储、添加、删除、修改与查询等操作。 一般适用于一个局域网内。 在 AD 域服务(AD DS)内,AD 就是一个命名空间(Namespace)。利用 AD,我们可以通过对象名 称来找到与这个对象有关的所有信息。 在 TCP/IP 网络环境内利用 Domain Name System(DNS)来解析主机名与 IP 地址的对应关系,也就 是利用 DNS 来解析来得到主机的 IP 地址。除此之外,AD 域服务也与 DNS 紧密结合在一起,它的域命 名空间也是采用 DNS 架构,因此域名采用 DNS 格式来命名,例如可以将 AD 域的域名命名为 moonxy.com。

1.2 LDAP简介

LDAP(Lightweight Directory Access Protocol),轻量目录访问协议,是一种用来查询与更新 Active Directory 的目录服务通信协议。AD 域服务利用 LDAP 命名路径(LDAP naming path)来表示对象在 AD 内的位置,以便用它来访问 AD 内的对象。

LDAP数据的组织方式(如下图所示), 在树根一般定义国家(c=CN)或域名(dc=com),在其下则往往
定义一个或多个组织 (Organization)(o=Acme)或组织单元(Organizational units)
(ou=People)。一个组织单元可能包含诸如所有雇员、大楼内的所有设备等信息。此外,LDAP支持对条目能
够和必须支持哪些属性进行控制,这是有一个特殊的称为对象类别(objectClass)的属性来实现的。该属性
的值决定了该条目必须遵循的一些规则,其规定了该条目能够及至少应该包含哪些属性。例如:
inetOrgPerson对象类需要支持sn(surname)和cn(common name)属性,但也可以包含可选的如邮件,
电话号码等属性。

1.3 LDAP常见的简称

 

简介全称用途
oOrganization组织/公司
ouOrganization Unit组织单元
cCountry国家
dcDomain Component域名
snSuer Name真实名称
cnCommon Name常用名称
dnDistiguished Name唯一标识名
uidUser ID用户标识

1.4 AD域与LDAP的区别

Windows AD(Active Directory)域应该是LDAP的一个应用实例,而不应该是LDAP本身。Windows AD 域的用户、权限管理应该是微软公司使用LDAP存储了一些数据来解决域控这个具体问题,AD域提供了 相关的用户接口,我们可以把AD域当做微软定制的LDAP服务器。Active Directory先实现一个LDAP服 务器,然后自己先用这个LDAP服务器实现了自己的一个具体应用。

二 、目的

2.1统一管理多个办公系统

2.2多个办公系统统一账户密码

2.3解决维护多套办公系统复杂麻烦的问题

三、实现代码

vim /etc/gitlab/gitlab.rb

external_url = 'http://ad的ip'
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS' ###! **remember to close this block with 'EOS' below**
main: # 'main' is the GitLab 'provider ID' of this LDAP server
  label: 'AD域登入'
  host: 'ad的ip'
  port: 389
  uid: 'SamAccountName'
  method: 'plain' # "tls" or "ssl" or "plain"
  bind_dn: ' cn=administrator,cn=users,dc=go,dc=com'
  password: '*******'
  active_directory: true
  allow_username_or_email_login: true
  block_auto_created_users: false
  base: 'dc=go,dc=com'
  user_filter: '' 
 EOS1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.

内容编辑完成之后,需要使用命令配置重置

gitlab-ctl reconfigure1.

重启服务

gitlab-ctl restart1.

测试获取AD域用户列表:

gitlab-rake gitlab:ldap:check1.
[root@localhost ~]# gitlab-rake gitlab:ldap:check
Checking LDAP ...

LDAP: ... Server: ldapmain
LDAP authentication... Success
LDAP users with access to your GitLab server (only showing the first 100 results)
	DN: cn=pcc01,ou=运维,ou=技术中心,ou=南京XX股份有限公司,dc=go,dc=com	 SamAccountName: $GP1000-3S22GK1NS9QQ
	DN: cn=access control assistance operators,cn=builtin,dc=go,dc=com	 SamAccountName: Access Control Assistance Operators
	DN: cn=account operators,cn=builtin,dc=go,dc=com	 SamAccountName: Account Operators
	DN: cn=admin,cn=users,dc=go,dc=com	 SamAccountName: admin
	DN: cn=administrator,cn=users,dc=go,dc=com	 SamAccountName: Administrator
	DN: cn=administrators,cn=builtin,dc=go,dc=com	 SamAccountName: Administrators
	DN: cn=艾X,ou=客服中心,ou=安全部,ou=南京XX股份有限公司,dc=go,dc=com	 SamAccountName: aiX
	DN: cn=allowed rodc password replication group,cn=users,dc=go,dc=com	 SamAccountName: Allowed RODC Password Replication Group
	DN: cn=backup operators,cn=builtin,dc=go,dc=com	 SamAccountName: Backup Operators
	DN: cn=包XX,ou=杭州XX科技有限公司,dc=go,dc=com	 SamAccountName: baoXX
	DN: cn=王XX,ou=深圳市XX信息技术有限公司,dc=go,dc=com	 SamAccountName: wangxx
	DN: cn=毕XX,ou=杭州XX智能科技有限公司,dc=go,dc=com	 SamAccountName: biXX	1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.

Gitlab与AD域集成_gitlab

Gitlab与AD域集成_gitlab_02

四:问题处理

问题: 其他集成的系统使用AD账号都无认证错误的问题,只有Gitlab认证时,提示报错:Invalid credentials 注:

1、检查了一下这个配置文件和里边用的AD信息都正常,没有什么问题,为什么登录时,就是会报错呢,无意之间测试了一个英文账户(cn和SamaccountName)都是英文字母的,发现他能认证成功,这时候我就觉得这个集成没有问题,应该是哪里的么有配置正确。 通过在AD中查看一个中文账户和英文账户的却别,发现两者区别在于cn这个属性上,英文账户的cn属性和SamaccountName属性是一模一样的,但是中文的两个不一样,中文的cn是中文显示名,SamaccountName是登录账号。 于是用了一个中文名字去认证登录,发现通过了,能够正常通过。再返回去查看gitlab.rb配置文件,这时注意到 “uid: ‘cn’”这个配置,此命令式说调用AD中CN属性值作为Gitlab登录账户,当AD中都是英文账户时,这个命令是没有问题的,但是当存在中文账户时,需要改为uid:‘SamAccountName’,这样账户就改为了AD一样的登录账号。

2、还有一个就是bind_dn: 'cn=administrator,cn=users,dc=xxx,dc=com'这个属性没有加cn=users这个组织单位,导致报错