现代企业的业务需求多种多样,因此在生产环境中经常会出现多种操作系统互相协作的现象。微软的Windows操作系统在桌面应用方面拥有绝对的领先优势,因此很多企业部署了Windows活动目录来实现单点登录(SSO);Linux在服务器和网络应用方面有自己的独门利器,因此很多企业的服务器操作系统和网络设备的嵌入式操作系统用的大部分是Linux。这对系统管理员来说就存在这么一个令人饶头的问题:如何实现统一登录认证?

答案就是Samba,它就像粘胶剂一样将Windows和Linux连在一起,共同为用户服务。Samba是怎样当好这个粘胶剂的活儿的呢,下面是验证流程说明:

一、验证流程

当Linux主机中的应用程序向Linux查询用户/组的时候,根据NSS的配置,请求将会被Winbind截获,并通过系统底层重定向至AD域控制器,随后Winbind将返回的结果经过解析后再返回应用程序。

解析的一个重要步骤就是将Windows的RID映射成Linux的UID和GID,这让Linux应用程序以为AD的域用户/组就是Linux操作系统的用户/组,从而实现利用Windows AD做统一验证的功能。

下面将分三部分进行阐述:

  • 部署Windows AD域测试环境;

  • 安装和部署Linux相关组件;

  • 验证;

二、部署Windows AD域测试环境

Windows AD域环境的部署是一个庞大的话题,因此下面只给一个用于测试目的的简单安装流程,进阶的Windows 活动目录信息请参考微软的官方文档。

2.1 目标

  1. 安装一台Windows AD域控制器;

  2. 创建四个域账号:alice、bob、carl和david;

  3. 创建两个域用户组:net-mgmt和sys-mgmt,其中netmgmt组中的用户角色是网络管理员,组成员是alice和bob;sys-mgmt组中的用户角色是系统管理员,组成员是carl和david。

2.2 安装

  1. 通过光盘安装Windows 2003 server;

  2. 分配IP地址并设置机器名为:dc,然后重启服务器;

  3. 在“开始”-“命令行”中输入`dcpromo`,回车将启动域服务器的安装过程,域名为“linuxabc.com”,其他的根据提示进行选择,一般默认即可。在这个过程中将会提示安装DNS服务,因为域是跟DNS紧密结合在一起的,请选择“是”。

  4. 安装结束后重启服务器,设定域管理员密码,新增alice,bob,carl和david四个域帐号,新增net-mgmt和sys-mgmt两个用户组,将alice和bob添加到net-mgmt组,将carl和david添加到sys-mgmt组。

至此,一个简单的Windows AD域测试环境就部署完成了。

三、安装和部署Linux相关组件

3.1 samba/winbind的安装和配置

$ sudo apt-get install samba samba-common samba-doc winbind
$ sudo vim /etc/samba/smb.conf
 [global]
    workgroup = LINUXABC   #域名称,不带“.com”后缀
    server string = %h server
    socket options = TCP_NODELAY
    security = ads
    netbios name = debian
    realm = LINUXABC.COM
    encrypt passwords = true
    obey pam restrictions = yes
    password server = dc.linuxabc.com
    idmap uid = 10000-20000
    idmap gid = 10000-20000
    winbind enum users = yes
    winbind enum groups = yes
    winbind use default domain = yes
    template shell = /bin/bash
    domain master = no

因为在这台服务器上并不提供共享文件和打印服务,所以smb.conf文件剩下的部分可以删除。

3.2 NSS的安装和配置

$ sudo apt-get install libnss-ldap
$ sudo vim /etc/nsswitch.conf
--------8<----------
passwd:		compat winbind
passwd_compat:	winbind
group:		compat winbind
group_compat:	winbind
shadow:		compat
--------8<----------

NSS(name service switch)的作用是允许*nix主机根据配置文件/etc/nsswitch.conf按顺序依次从不同的源去查询诸如主机名、邮箱别名、用户信息等数据。

3.3 PAM的配置

NSS只是调整Winbind的优先顺序,PAM才是决定是否使用Winbind进行验证的决策者。 PAM是大多数Linux发行办的默认安装组件,故省略安装步骤。下面将针对/etc/pam.d/中的文件进行调整:

$ sudo vim /etc/pam.d/common-auth
auth	sufficient	pam_winbind.so
auth	required	pam_unix.so use_first_pass nullok_secure

$ sudo vim /etc/pam.d/common-account
account	sufficient	pam_winbind.so
account	required	pam_unix.so

$ sudo vim /etc/pam.d/common-session
password    sufficient	pam_winbind.so
password    required	pam_unix.so

3.4 kerberos的安装和配置

Winbind将利用kerberos协议与AD域控制器进行通信。

$ sudo apt-get install krb5-user krb5-config
$ sudo vim /etc/krb5.conf
[libdefaults]
    ticket_lifetime = 24000
    dns_lookup_realm = true
    dns_lookup_kdc = true
    default_realm = LINUXABC.COM
[realms]
    DOMAIN.INTERNAL = {
	kdc = dc.linuxabc.com
	admin_server = dc.linuxabc.com
	default_domain = LINUXABC.COM
    }
[domain_realm]
    .domain.internal = LINUXABC.COM
    domain.internal = LINUXABC.COM
  1. LINUXABC.COM是域名,均为大写;

  2. dc.linuxabc.com是域控制器,均为小写。

至此,相关的验证组件已经安装配置完毕。

四、验证

4.1 将Linux服务器加入linuxabc.com域

4.1.1 初始化kerberos

$ sudo kinit administrator@LINUXABC.COM
Password for administrator@LINUXABC.COM:<<域管理员密码>>
$ sudo klist

如果通过域验证的话将显示以下信息:

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@LINUXABC.COM

Valid starting     Expires            Service principal
03/06/10 10:39:38  03/06/10 20:39:38  krbtgt/LINUXABC.COM@LINUXABC.COM


Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached

接下来将debian加入linuxabc.com域。

> net ads join -U administrator@LINUXABC.COM
administrator@LINUXABC.COM's password: <<域管理员密码>>
Using short domain name -- LINUXABC
Joined 'DEBIAN' to realm 'LINUXABC.COM'

一切顺利的话就可以在AD域控制器的“Active Directory域用户和计算机”管理界面中看到debian这台机器。

4.1.2 login验证

前面已经将Linux主机加入到AD域中,成为一个域成员,接下来要测试Linux程序能否利用AD域的用户进行验证。

验证前先重启samba和winbind服务

$ sudo /etc/init.d/samba restart
$ sudo /etc/init.d/winbind restart

接着在debian服务器中打开一个终端窗口,用域账号alice登录。