一 、概述

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 域的域名命名为 。

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这个组织单位,导致报错