将samba作为域成员服务器加入到AD域需要配置4个功能:samba、kerberos、winbind和nss。
1.下载并安装Windows server 2008
2.环境介绍
windows 2008 IP:10.10.54.51
Centos 6.4 IP:10.10.54.59
3.配置WIN 2008
1)修改DNS为计算机的IP:10.10.54.51
2)运行dcpromo===>使用高级模式安装===>在新林中新建域===>目录林根级域:xiao.com===>域名称:XIAO===>DNS服务器===>密码:@wang123
3)重启
4.软件安装
在windows、Mac OS和linux系统上都有kerberos的相关软件包。在windows AD域环境中,使用kerberos做身份认证的服务器叫KDC(Key Distribution Center)。
[root@xiao59 ~]yum install -y samba.x86_64 samba-client.x86_64 samba-common.x86_64 samba-winbind.x86_64 samba-winbind-clients.x86_64
[root@xiao59 ~]yum install -y krb5-devel.x86_64 krb5-libs.x86_64 krb5-workstation.x86_64 krb5-server.x86_64 pam_krb5.x86_64 samba4-winbind-krb5-locator.x86_64
[root@xiao59 ~]yum intall squid.x86_64
5.配置samba服务器
[root@xiao59 ~]# vim /etc/samba/smb.conf
============================================
[global]
##工作组或域名称
workgroup = XIAO
#主机的简易说明
server string = Samba Server Version %v
netbios name = MYSERVER
security = ads
#要加入的域的名称
realm = XIAO.COM
username map = /etc/samba/smbusers
##共享目录
[centos]
comment = centos share
path = /share/centos
public = yes
write list = boss
browseable = yes
============================================
注意:当samba服务器加入到windows AD域时使用ads模式,也是将验证工作交给windows域控制器负责。使用这个模式需要在samba服务器上安装Kerberos。在这个模式中samba是作为一个域成员,并不是AD域控制器.
6.配置kerberos
Kerberos是一种计算机网络授权协议,用来在非安全网路中,对个人通信以安全的手段进行身份认证。它也指由麻省理工实现此协议,并发布的一套免费软件。它采用客户端/服务器结构(即,C/S结构),并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。
在windows、Mac OS和linux系统上都有kerberos的相关软件包。在windows AD域环境中,使用kerberos做身份认证的服务器叫KDC(Key Distribution Center)。
[root@xiao59 ~]# 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 = XIAO.COM
dns_lookup_realm = false
dns_lookup_kdc = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
[realms]
XIAO.COM = {
kdc = 10.10.54.51:80
# admin_server = kerberos.example.com
default_domain = XIAO.COM
}
[domain_realm]
.xiao.com = XIAO.COM
xiao.com = XIAO.COM
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
=================================
7.检测配置kerberos是否正确
[root@xiao59 ~]# kinit [email protected]
Password for [email protected]:
8.配置winbind
解析:winbind是samba的一个组件,实现了微软的RPC调用、可插式验证模块和名字服务切换,通过这些功能可以使NT域用户能在linux主机上以linux用户身份进行操作。
在linux主机上可以查看NT域用户及组信息,就好象这些信息是UNIX本地的一样。当linux主机向操作系统查询任何用户或组名时,该查询都会被发往指定的域控制器,即KDC。
linux主机上的用户可以把NT域用户及组名当作“本地”账号来用,还可以把文件的属主改成NT域用户,甚至可以用一个域用户的身份登录到linux主机并运行一个X-Window会话。
通过在smb.conf中配置相应的参数来配置winbind。
root@xiao59 ~]# vim /etc/samba/smb.conf
============================================
[global]
##工作组或域名称
workgroup = XIAO
#主机的简易说明
server string = Samba Server Version %v
netbios name = MYSERVER
##域服务器,可以用ip也可以用域名
password server = 10.10.54.51
##采用活动目录认证方式
security = ads
#要加入的域的名称,活动目录服务器域名
realm = XIAO.COM
idmap uid = 10000-20000
idmap gid = 10000-20000
idmap backend = tdb
template shell = /sbin/nologin
template homedir = /home/%U
winbind use default domain = true
winbind offline logon = true
winbind enum groups = yes
winbind enum users = yes
winbind separator = /
winbind rpc only = yes
##共享目录
[centos]
comment = centos share
path = /share/centos
public = yes
write list = boss
browseable = yes
==========================================================
9.指定samba和winbind服务启动时用的选项参数,可以直接在启动脚本里设置
vim /etc/sysconfig/samba
======================
# Options to smbd
SMBDOPTIONS="-D"
# Options to nmbd
NMBDOPTIONS="-D"
# Options for winbindd
WINBINDOPTIONS="-D"
========================
10.把samba服务器加入windows域
1)[root@xiao59 ~]# net ads join -U [email protected]
##error1:
Failed to join domain: failed to connect to AD: Operations error
解决方法:
[root@xiao59 ~]# vim /etc/resolv.conf
===========================
nameserver 10.10.54.51
===========================
2)[root@xiao59 ~]# net ads join -U [email protected]
Enter [email protected]'s password:
Using short domain name -- XIAO
Joined 'MYSERVER' to dns domain 'xiao.com'
No DNS domain configured for myserver. Unable to perform DNS Update.
DNS update failed!
解决方法:
[root@xiao59 ~]# vim /etc/hosts
===================================
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.10.54.51 win.xiao.com win
===================================
hosts 文件第一列为IP地址,第二列为真实的FQDN(全名),后面的列均为别名。
由于net ads join时候会调用本机的hostname。所以它会找/etc/sysconfig/network要全名
同时,它会通过/etc/hosts去找IP地址,所以注意填写要正确。
[root@xiao59 ~]# rm -rf /var/lib/samba/private/secrets.tdb
[root@xiao59 ~]# rm -rf /var/lib/samba/gencache.tdb
[root@xiao59 ~]# rm -rf /var/lib/samba/smb_krb5/
3)[root@xiao59 ~]# net ads join -U administrator
Enter administrator's password:
Using short domain name -- XIAO
Joined 'WIN' to dns domain 'xiao.com'
11.最后获取windows用户名和组列表
[root@xiao59 ~]# /etc/init.d/smb start
Starting SMB services:
[root@xiao59 ~]# /etc/init.d/winbind start
Starting Winbind services: [ OK ]
12.配置NSS
解析:Name Service Switch(NSS)名字服务转换是很多linux/UINX操作系统所具有的功能。使用它可以从不同的资源中解析系统信息,如主机名、邮件别名和用户信息等。
在解析linux用户名和组时,使用NSS应用编程接口的winbind就象一个系统信息源。而另一方面,它通过使用MSRPC调用获得NT服务器的信息,并使用上述接口提供一套新的账号信息表。只要在运行winbind的linux主机上查阅一次用户和组信息,就可以象在本地一样查看NT域及其受托域在内的所有用户和组信息。
NSS的配置文件是/etc/nsswitch.conf。
[root@xiao59 ~]# vim /etc/nsswitch.conf
===========================
passwd: files winbind
shadow: files winbind
group: files winbind
=============================
如上配置后,当一个linux应用程序产生一个查询请求时,会在该文件中查找与所请求的服务类型相匹配的行。然后按照配置顺序,先装入/lib/libnss_file.so,使用这个模块处理请求,再装入/lib/libnss_winbind.so,再使用这个模块处理请求,处理完后把结果返回给应用程序。
12.从winbind守护进程查询信息
[root@xiao59 ~]# wbinfo -t
checking the trust secret for domain XIAO via RPC calls succeeded
[root@xiao59 ~]# wbinfo -u
[root@xiao59 ~]# wbinfo -g
samba已经成功的加入到windows server的AD域中了
如果要从域中删除samba,执行以下命令
net ads leave -U administrator
##注意:
上面配置参数让 Kerberos 进程知道处理活动目录服务器,对 /etc/krb5.conf 做适当的修改,修改时需要注意的是 Kerberos是大小写敏感的。
扩展:
1.samba配置文件解析如下:
------------------------------------------------------------
[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 = public
#对共享目录的描述
path = /windows
#指定要共享的目录
public = yes
#是否允许匿名访问。和“gest ok”参数一样的效果。
writable = yes
#是否可写可修改。和“writeable”参数效果一样。和“read only”意思相反。
------------------------------------------------------------
2.配置winbind
smb.conf配置文件的[global]区域,通过在smb.conf中配置相应的参数来配置winbind
=============================
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。
====================================================
3.常见错误解析
在加入域之前不用启动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 [email protected] 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 [email protected] 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。
配置NSS发生的错误:
# 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
配置过程中发生的错误:
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即可。