將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便可。