首页 > 代码库 > 将samba加入到windows域《转载》

将samba加入到windows域《转载》

将samba加入到windows域
那什么是域呢?  一台Windows计算机,它要么隶属于工作组,要么隶属于域。所以说到域,我们就不得不提一下工作组,工作组是MS的概念,一般的普遍称谓是对等网。
工作组(Work Group)就是将不同的电脑按功能分别列入不同的组中,以方便管理。比如在一个网络内,可能有成百上千台工作电脑,如果这些电脑不进行分组,都列在“网上邻居”内,可想而知会有多么乱。
与工作组有所不同,域(domain)是一个相对严格的组织,至少需要一台安装了windwos NT/2000/2003 Server版本的计算机充当DC(Domain Controller,域控制器),来实现集中式的管理。加入到域的计算机在登录时使用DC上的帐户(即域用户)和密码来登录,不使用本地帐户登录。如果使用本地帐户登录,就不能访问域中的共享资源。
若考虑到容错的话,至少需要两台DC。对于NT4(2000就是NT5的内核)域就需要一台PDC(Primary Domain Controller,主域控制器),和一台至多台BDC(Backup Domain Controller,备份域控制器)。在windows NT4内核时建立的域使用SAM(Security Accounts Manager,安全帐户管理器)来保存用户帐号和密码等安全信息。SAM是WIN系统帐户管理的核心,负责SAM数据库的控制和维护。SAM数据库位于注册表[HKEY_LOCAL_MACHINE\SAM\SAM]下,受到ACL保护,SAM数据库在磁盘上就保存在%systemroot%\system32\config目录下的sam文件中,在这个目录下还包括一个security文件,是安全数据库的内容,两者有不少关系。也就是说NT4域帐户和windows本地系统帐户是放在一起管理的。
从windows2000开始,MS引入了AD(Active Directory,活动目录),就不再使用SAM来管理域用户等信息了。但本地帐户还有由SAM来管理。AD提供了一系列集中组织管理和访问网络资源的目录服务功能。可以创建、删除、修改、移动和设置存储在目录中的对象的权限。这些对象包括组织单位、用户、联系人、组、计算机、打印机和共享的文件对象。
浏览器服务  浏览器服务维护着一个列表,其中列出了计算机所在的域或工作组的名称,以及运行浏览器服务的计算机所服务的网段上每台计算机所使用的协议。此列表提供给用“网上邻居”或 NET VIEW 命令查看网络资源的客户端。在每个网段上,主浏览器是从网段上运行浏览器服务的计算机组中选出。  主浏览器负责收集主机或服务器通告,这些通告由主浏览器网段上的每台服务器每 12 分钟以数据报的形式发送一次。主浏览器指示每个网段的潜在浏览器成为备份浏览器。给定网段上的备份浏览器会向位于同一网段中的客户机提供浏览列表。  注意:在 Windows NT域结构中,始终选择主域控制器 (PDC) 作为域主浏览器。只有 PDC才可以作为域主浏览器。如果没有 PDC,则没有可用的域主浏览器,且不能从所在工作组以外的其他工作组获取浏览列表。
WINS(Windows Internet Name Service,windows互联网名称服务)  WINS服务器必须是一台NT server计算机,使用TCP/IP协议,并且具有一个静态的IP地址。  WINS提供一个分布式数据库,它的作用是在路由网络的环境中对IP地址和NetBIOS名的映射进行注册与查询。 这可能是解决NetBIOS名与IP地址之间转换的比较合适的一种方法,对于比较复杂的网络如互联网更是如此。  WINS工作原理:  1,在一个WINS的环境中,每次WINS客户开启计算机并初始化TCP/IP后,它都会将它的NetBIOS名和IP地址的对应关系映射到WINS服务器的数据库中。 
2,当一个WINS客户想和另外一台主机通讯时,它会直接和WINS server联系,查询计算机名和IP地址的关系。 
3,如果WINS服务器在自己的数据库中查到了被查计算机名和IP地址的映射关系,它就将目的计算机的IP 地址返回要求查询的WINS客户。  你也许会感到疑惑:这跟DNS有什么区别?两种不同的服务实际上在完成同一个任务,只是他们依靠不同的协议,以不同的方式工作而已。  目前,DNS取代了WINS。由于微软对NetBIOS做了修改,允许它使用TCP/IP堆栈完成其工作(TCP/IP协议上的NetBIOS),大多数DNS服务器都能够处理NetBIOS的请求。这就是WINS服务器变得越来越少的原因。  总之,DNS把TCP/IP主机名称映射为IP地址,WINS把NetBIOS主机名称映射为IP地址。
Netbois(网络基本输入/输出系统)是1983年IBM开发的一套网络标准,微软在这基础上继续开发。微软的客户机/服务器网络系统都是基于NetBIOS的。应用程序通过标准的NetBIOS API调用,实现NetBIOS命令和数据在各种协议中传输。  网络上的每一台计算机都对应一个NetBIOS名,而且不能重名。在建立NetBIOS会话或发送广播时需要这个名字。当通过NetBIOS会话使用该名字时,发送方必须能够将NetBIOS名转化为一个IP地址(这个过程由WINS或DNS来完成)。由于IP地址和名字都需要,在进行成功的通信之前,所有的名字转换方法都必须能够给出正确的IP地址。netbios是一个不可路由的协议。适用于广播式网络,没有透明网桥是不能跨越网段的。
以上是windows网络相关概念的说明,因为要将linux下的samba加入windows域,就有必要了解这些概念。在samba的配置文件中就涉及到了浏览器服务、wins服务和NetBIOS。  local master参数默认值是yes,即samba服务器所在的网段内的主浏览器是samba服务器本身。  wins support参数默认值是no。不用wins,因为被DNS取代了。
windows网络中有三种服务器类型,即  1,Domain Controller(域控制器)  作为域控制器时又分为三种域控制角色,即Primary Domain Controller(PDC)、Backup Domain Controller(BDC)和ADS Domain Controller。PDC和BDC是NT4内核(windows 2000以前的版本)网络系统环境中的域控制器角色,到了windows2000被AD域控制器取代,但PDC和BDC的概念还在使用。  2,Domain Member Server(域成员服务器)  就是作为普通计算机加入到域,角色就变成了域成员服务器。  3,Standalone Server(独立服务器)  就是普通计算机,不加入到域。  
就是说计算机可以做域控制器的角色,也可以做域成员服务器的角色,还可以做独立服务器。linux下的samba服务器可以作为域成员加入到windows网络环境中。
以上是windows网络中的一些概念。接下来是samba加入windows AD域的相关配置,将samba作为域成员服务器加入到AD域需要配置4个功能:samba、kerberos、winbind和nss。
首先配置samba
samba配置文件如下:
# vim /etc/samba/smb.conf
------------------------------------------------------------
  [global]
         workgroup = QR
         #指定域名或工作组名,就是“.com”之前的名字,例如qr.com。这里就填“qr”,不区分大小写。
          server string = Samba Server Version %v
         #对samba服务器的描述。
          netbios name = smb2
         #就是在“网上邻居”里看到的名字,通常是计算机名字中的第一部分。
          interfaces = lo eth0
         #samba所使用的网络接口
          hosts allow = 127. 192.168.126.
         #指定谁可以访问samba,可以是IP地址或网段
bind interfaces only = yes
         #只响应interfaces参数指定的网卡传来的请求。这可以过滤掉ipv6地址的请求。
          log level = 3
         #值的范围是0-9,数越大,日志信息越详细
          syslog = 3
         #日志级别,0是LOG_ERR,1是LOG_WARNING,2是LOG_NOTICE,3是LOG_INFO,大于4的是LOG_DEBUG
         log file = /var/log/samba/%m.log
         #指定日志文件存放位置
          max log size = 50
         #日志的最大字节数,单位是KB。超过这个值轮转日志。
          security = ADS
         #指定samba的安全模式,现有五种安全模式:\
         #(1)security = share 客户端登录samba服务器,不需要输入用户名和密码就可以浏览samba\
         #服务器的资源,适用于公共的共享资源,安全性差,需要配合其他权限设置,保证samba服务器的安全性。
          #(2)security = user 客户端登录samba服务器时,需要提交合法帐号和密码,经过samba服务\
         #器验证才可以访问共享资源,服务器默认为此级别模式。
          #(3)security = server 客户端需要将用户名和密码,提交到指定的一台samba服务器上进行验\
         #证,如果验证出现错误,客户端会用user级别访问。
          #(4)security = domain 这个模式只能是在当samba服务器加入windows NT域中时才能使用,\
         #它会将验证工作交给windows域控制器负责。
          #(5)security = ads 当samba服务器加入到windows AD域时使用该模式,也是将验证工作交给\
         #windows域控制器负责。使用这个模式需要在samba服务器上安装Kerberos。注意,在这个模式中,\
         #samba是作为一个域成员,并不是AD域控制器。ads验证方式必须配合realm参数,如\
         #realm = QR.COM。
          realm = QR.COM
         #指要加入的域的名称
          username map = /etc/samba/smbusers
         #在这可以指定一个文件记录来自windows系统的用户名与linux系统的用户名的对应关系。在user和\
         #share安全模式中,先进行用户名映射,然后再进行验证,因为验证是在linux系统中进行。而作为\
         #域成员服务器(domain和ads模式)时,先进行验证,再映射用户名,因为验证是在域控制器中进行。\
         #文件中一行一条记录,每条记录中“=”(等号)左边是一个linux用户名,右边是一个windows的用户名\
         #列表,该列表可以是由空格分隔的多个用户名;也可以是一个组,如@group,表示group组内的所有\
         #成员;还可以是“*”,表示任何用户名。每条记录最长可达到1023个字符。
          ldap ssl = off
         #这个参数定义当连接到ldap服务器时,samba是否可以使用SSL。有三个值:Off,表示不使用SSL;\
         #Start_tls,表示当连接到ldap时使用LDAPv3 StartTLS扩展操作;On,表示使用SSL。默认值\
         #是Start_tls,因为本文章是加入AD域,没用上ldap,所以还是关闭它。    
  [share]
  #网上邻居看到的共享目录名字是share。
         comment = p lic
         #对共享目录的描述
          path = /windows
         #指定要共享的目录
         p lic = yes
         #是否允许匿名访问。和“gst ok”参数一样的效果。
          writable = yes
         #是否可写可修改。和“writeable”参数效果一样。和“read only”意思相反。
------------------------------------------------------------
配置kerberos
Kerberos是一种计算机网络授权协议,用来在非安全网路中,对个人通信以安全的手段进行身份认证。它也指由麻省理工实现此协议,并发布的一套免费软件。它采用客户端/服务器结构(即,C/S结构),并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。
在windows、Mac OS和linux系统上都有kerberos的相关软件包。在windows AD域环境中,使用kerberos做身份认证的服务器叫KDC(Key Distribution Center)。
RHEL5.3中使用的是kerberos版本5,用rpm -qa|grep krb5查看系统中是否安装了相关包。
# vim /etc/krb5.conf
-----------------------------------------------------------
[logging]
   default = FILE:/var/log/krb5libs.log
   kdc = FILE:/var/log/krb5kdc.log
   admin_server = FILE:/var/log/kadmind.log
[libdefaults]
   default_realm = QR.COM
   dns_lookup_realm = false
   dns_lookup_kdc = false
   ticket_lifetime = 24h
   forwardable = yes
[realms]
   QR.COM = {
      kdc = adctrl.qr.com:88
      admin_server = adctrl.qr.com:749
      default_domain = qr.com
   }
[domain_realm]
   .qr.com = qr.com
   qr.com = qr.com
[appdefaults]
   pam = {
      debug = false
      ticket_lifetime = 36000
      renew_lifetime = 36000
      forwardable = tr
      krb4_convert = false
   }
-----------------------------------------------------------
以上红色字体为要修改的内容。注意,带下划线的两个值必须要一致,而且字母必须是大写。
详细配置见man 5 krb5.conf
检测配置kerberos是否正确
# kinit administrator
kinit(v5): Cannot find KDC for reqsted realm while getting initial credentials
如果[libdefaults]中“default_realm = QR.COM”或[realms]中“QR.COM = {”其中有一个域名为小写,则会报上面的错误。
如果执行这个命令后,没有任何输出,返回linux命令行提示符,则说明配置kerberos没有问题
配置winbind
winbind是samba的一个组件,实现了微软的RPC调用、可插式验证模块和名字服务切换,通过这些功能可以使NT域用户能在linux主机上以linux用户身份进行操作 
在linux主机上可以查看NT域用户及组信息,就好象这些信息是UNIX本地的一样。当linux主机向操作系统查询任何用户或组名时,该查询都会被发往指定的域控制器,即KDC。
linux主机上的用户可以把NT域用户及组名当作“本地”账号来用,还可以把文件的属主改成NT域用户,甚至可以用一个域用户的身份登录到linux主机并运行一个X-Window会话。
通过在smb.conf中配置相应的参数来配置winbind。将一下参数添加到smb.conf配置文件的[global]区域中。
          idmap uid = 10000-20000
         idmap gid = 10000-20000
         #指定将域用户映射成linux本地用户的UID和GID范围。实际上linux系统内部运行是只识别uid和gid。
          winbind separator = /
         #指定域用户名中域名和用户名之间的分隔符。windows域用户和组使用DOMAIN\users和DOMAIN\groups这样的形式\
         #表示。
          idmap backend = tdb
         #为winbind提供一个插件接口,使用不同的后端存储SID/uid/gid映射表。强烈推荐你在这里指定一个像idmap_tdb\
         #和idmap_ldap这样可写的后端。idmap_rid和idmap_ad都是不可写的,因此,将它们设置为默认后端将产生意想\
         #不到的后果。要使用rid和ad后端,请通过idmap config参数指定。可选值包括tdb(idmap_tdb(8))、\
         #ldap(idmap_ldap(8))、rid(idmap_rid(8))和ad(idmap_ad(8))。默认值为tdb。
          winbind enum users = yes
         winbind enum groups = yes
         #winbind通过系统调用可以从windows计算机上获取用户和组的列表(user/group枚举)。如果该值\
         #为no,getpwent系统调用将不返回任何数据。
          winbind use default domain = yes
         #此参数在单域环境中非常有用。默认windows域用户的完整用户名是“域名\用户名”的形式,例如\
         #“DOMAIN\administrator”。将该值设置为yes,就不用加前缀了,即使用administrator就可以了。但不能\
         #与linux本地账户冲突。默认值为no。
          winbind rpc only = yes
         #当设置该值为yes,将强制winbind使用RPC替换LDAP检索来自域控制器的信息。默认值为no。
# vim /etc/sysconfig/samba
# Options to smbd
SMBDOPTIONS="-D"
# Options to nmbd
NMBDOPTIONS="-D"
# Options for winbindd
WINBINDOPTIONS="-D"
这里指定samba和winbind服务启动时用的选项参数,可以直接在启动脚本里设置。
然后将samba加入域
执行一下命令,在加入域之前不用启动samba服务和winbind服务。
# net ads join -U administrator
administrator‘s password:
[2011/01/22 14:13:15, 0] utils/net_ads.c:ads_startup_int(286)
ads_connect: No logon servers
Failed to join domain: No logon servers
输入完命令,按回车后,大概等20秒才出现密码提示。输入完域管理员密码后,又等了大概十几秒才出现上面的错误提示。原因是在samba服务器上没有正确指定DNS服务器。解决方法:
# vim /etc/resolv.conf
---------------------------------------
nameserver 192.168.126.130
# 192.168.126.130是DNS服务器,也是windows2003 AD域控制器
---------------------------------------
# rm -rf /etc/samba/secrets.tdb
# rm -rf /var/cache/samba/gencache.tdb
然后删除这两个文件。
再来一次
# net ads join -U administrator
administrator‘s password:
Using short domain name -- QR
Failed to set servicePrincipalNames. Please ensure that
the DNS domain of this server matches the AD domain,
Or rejoin with using Domain Admin credentials.
Deleted account for ‘SMB2‘ in realm ‘QR.COM‘
Failed to join domain: Type or val exists
这是因为/etc/hosts 文件写的有问题。
# cat /etc/hosts
127.0.0.1               localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6
192.168.126.201         smb2.qr.com
hosts 文件第一列为IP地址,第二列为真实的FQDN(全名),后面的列均为别名。
由于net ads join时候会调用本机的hostname。所以它会找/etc/sysconfig/network要全名
同时,它会通过/etc/hosts去找IP地址,所以注意填写要正确。
以后出现上诉错误,基本上都是你的hostname -f 问题或者是 /etc/hosts问题
解决方法:  192.168.126.201         smb2.qr.com smb2
# rm -rf /etc/samba/secrets.tdb
# rm -rf /var/cache/samba/gencache.tdb
然后删除这两个文件。如果有/var/cache/samba/smb_krb5/目录的话,也将其删除。
/etc/samba/secrets.tdb
/var/cache/samba/gencache.tdb
和/var/cache/samba/smb_krb5/
samba加入到windows域过程中创建的文件和目录。如果加域失败后,建议将这些文件和目录删除后再重新加域。
# net ads join -U administrator
Enter administrator‘s password:
[2010/06/11 11:45:20, 0]  libads/kerberos.c:332(ads_kinit_password)
   kerberos_kinit_password administrator@QR.COM failed: Cannot find KDC for reqsted realm
Failed to join domain: failed to connect to AD: Cannot find KDC for reqsted realm
KDC是密钥分发中心(Key Distribution Center)。加域时要到这个KDC上去做kerberos认证,所以得先配置krb5.conf。 
# net ads join -U administrator
Enter administrator‘s password:
Using short domain name -- QR
Joined ‘smb2‘ to realm ‘qr.com‘
[2010/06/11 11:45:20, 0]  libads/kerberos.c:332(ads_kinit_password)
   kerberos_kinit_password SMB2@QR.COM failed: Looping detected inside krb5_get_in_tkt
DNS update failed!
有“Joined ‘smb2‘ to realm ‘qr.com‘”可知,已经加入到域了,这时候在反复执行加域的命令,就会出现上面的错误。如果你觉得有问题,可以先从域中删除,然后再重新加入到域。
# net ads join -U administrator
Enter administrator‘s password:
faild to join domain ; failed to lookup dc info for domain ‘administrator‘ over rpc: logon failure
如果出现上面的错误,有可能是samba中的netbios设置的和计算机名的第一部分不一致。例如,samba服务器的计算机名是smb.qr.com,那么其netbios就是smb。smb.conf中就得设置netbios name = smb。
最后获取windows用户名和组列表
# /etc/init.d/smb start
# /etc/init.d/winbind start
配置NSS
Name Service Switch(NSS)名字服务转换是很多linux/UINX操作系统所具有的功能。使用它可以从不同的资源中解析系统信息,如主机名、邮件别名和用户信息等。
在解析linux用户名和组时,使用NSS应用编程接口的winbind就象一个系统信息源。而另一方面,它通过使用MSRPC调用获得NT服务器的信息,并使用上述接口提供一套新的账号信息表。只要在运行winbind的linux主机上查阅一次用户和组信息,就可以象在本地一样查看NT域及其受托域在内的所有用户和组信息。
NSS的配置文件是/etc/nsswitch.conf。
# vim /etc/nsswitch.conf
------------------------------------------------------------
passwd:     files winbind
group:      files winbind
------------------------------------------------------------
如上配置后,当一个linux应用程序产生一个查询请求时,会在该文件中查找与所请求的服务类型相匹配的行。然后按照配置顺序,先装入/lib/libnss_file.so,使用这个模块处理请求,再装入/lib/libnss_winbind.so,再使用这个模块处理请求,处理完后把结果返回给应用程序。
从winbind守护进程查询信息
# wbinfo -t
checking the trust secret via RPC calls failed
error code was  (0x0)
Could not check secret
这个错误说明winbind服务没有启动
# /etc/init.d/winbind start
启动 Winbind 服务:                                        [确定]
# ps aux|grep winbind
root     12320  0.0  0.3 131384  3924 ?        Ss   15:45   0:00 winbindd
root     12322  0.3  0.4 131376  4316 ?        S    15:45   0:00 winbindd
root     12328  0.0  0.0  61144   736 pts/0    R+   15:45   0:00 grep winbind
# wbinfo -t
checking the trust secret via RPC calls s?
# wbinfo -u
QR/administrator
QR/gst
QR/support_388945a0
QR/krbtgt
# wbinfo -g
QR/domain computers
QR/domain controllers
QR/schema admins
QR/enterprise admins
QR/domain admins
QR/domain users
QR/domain gsts
QR/group policy creator owners
QR/dnsupdateproxy
至此,samba已经成功的加入到windows2003的AD域中了。
如果要从域中删除samba,执行以下命令
# net ads leave -U administrator
administrator‘s password:
Deleted account for ‘SMB2‘ in realm ‘QR.COM‘
配置过程中发生的错误:
1,启动samba后,/var/log/messages日志里报错(或者执行smbd -Fi -d 2)
bind failed on port 139 socket_addr = 0.0.0.0.
Error = Address already in use
smbd_open_once_socket: open_socket_in: Address already in use
# netstat -anpl|grep mbd
tcp     0      0 :::445                      :::*                        LISTEN    2754/smbd
tcp     0      0 :::139                      :::*                        LISTEN    2754/smbd
 p     0      0 192.168.1.83:137            0.0.0.0:*                             2757/nmbd 
p     0      0 0.0.0.0:137                 0.0.0.0:*                             2757/nmbd
p     0      0 192.168.1.83:138            0.0.0.0:*                             2757/nmbd
p     0      0 0.0.0.0:138                 0.0.0.0:*                             2757/nmbd
445和139这两端口是在ipv6地址上监听的,并没有在ipv4地址上监听。
解决方法1:
# echo 1 > /proc/sys/net/ipv6/bindv6only
# echo "net.ipv6.bindv6only = 1" >> /etc/sysctl.conf
将/proc/sys/net/ipv6/bindv6only设置为0时,smbd将只监听ipv6上的端口。将/proc/sys/net/ipv6/bindv6only设置为1时,smbd将同时监听ipv6和ipv4上的端口。
解决方法2:
编辑smb.conf文件,设置bind interfaces only = yes(默认是no)。
2,在/var/log/messages日志里发现如下信息:
winbindd[1672]: [2000/00/22 00:00:00,  2] winbindd/winbindd.c:878(remove_client)
winbindd[1672]:  final write to client failed: broken pipe
这个是samba的一个bug,可以忽略,不影响正常工作。如果你看到了这个信息,说明你把日志级别调到了3以上,这个级别是开发人员使用的,正常情况下设置为1即可。
《转自:http://blog.163.com/qr__compaq/blog/static/1381986482011325215643/》

将samba加入到windows域《转载》