将samba做为域成员服务器加入到AD域须要配置4个功能:samba、kerberos、winbind和nss。
linux
1.下载并安装Windows server 2008ios
2.环境介绍shell
windows 2008 IP:10.10.54.51编程
Centos 6.4 IP:10.10.54.59vim
3.配置WIN 2008windows
1)修改DNS为计算机的IP:10.10.54.51后端
2)运行dcpromo===>使用高级模式安装===>在新林中新建域===>目录林根级域:xiao.com===>域名称:XIAO===>DNS服务器===>密码:@wang123centos
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 administrator@XIAO.COM
Password for administrator@XIAO.COM:
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 administrator@XIAO.COM
##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 administrator@XIAO.COM
Enter administrator@XIAO.COM'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 administrator@QR.COM failed: Cannot find KDC for req sted realm
Failed to join domain: failed to connect to AD: Cannot find KDC for req sted 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。
配置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便可。