Samba是在Linux和UNIX系統上實作SMB協定的一個免費軟體,由伺服器及用戶端程式構成。SMB(Server Messages Block,資訊服務塊)是一種在區域網路上共享檔案和列印機的一種通信協定,它為區域網路内的不同計算機之間提供檔案及列印機等資源的共享服務。SMB協定是客戶機/伺服器型協定,客戶機通過該協定可以通路伺服器上的共享檔案系統、列印機及其他資源。通過設定“NetBIOS over TCP/IP”使得Samba不但能與區域網路絡主機分享資源,還能與全世界的電腦分享資源。
我的出發點是想配置samba使用openldap進行認證,我想大部分人聽到這都會說,samba很簡單的,和openldap結合很容易的,但是我卻發現,網上90%以上的文章都是将兩者部署到一台Linux Server上,無論是Unbutu,CentOS還是Fedora,是以當我看到一個将samba和openldap部署在兩台Unbutu上遇到問題的文章(2012年的)竟然無一人回答時,突然覺得有時候人雲亦雲未必是對的,在你對一個事情徹底了解之前你無法也不應該像别人一樣給它貼上一個簡單的标簽,做學問還是要認真的,以上僅是個人見解,下面開始部署獨立的samba,然後在和openldap整合。
openldap的部署在之前有一篇博文記錄,這裡的openldap環境也建立在上次的基礎上,僅僅需要準備一台CentOS 6.5用來部署samba。
1、準備工作
<code>/etc/init</code><code>.d</code><code>/iptables</code> <code>stop</code>
<code>setenforce 0</code>
<code>echo</code> <code>"192.168.49.135 samba.contoso.com samba"</code> <code>>></code><code>/etc/hosts</code> <code>#samba主機記錄</code>
<code>echo</code> <code>"192.168.49.138 ldapsrv01.contoso.com ldapsrv01"</code> <code>>></code><code>/etc/hosts</code> <code>#openldap server記錄</code>
[root@samba ~]# tail -2 /etc/hosts
192.168.49.135 samba.contoso.com samba
192.168.49.138 ldapsrv01.contoso.com ldapsrv01
[root@samba ~]# ping ldapsrv01.contoso.com -c 1
PING ldapsrv01.contoso.com (192.168.49.138) 56(84) bytes of data.
64 bytes from ldapsrv01.contoso.com (192.168.49.138): icmp_seq=1 ttl=64 time=1.73 ms
--- ldapsrv01.contoso.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 1.737/1.737/1.737/0.000 ms
2、啟用system-wide并使用LDAP認證
為了使samba server能夠使用openldap認證,必須要在/etc/nsswith.conf檔案中配置使用ldap,使用下面的指令即可:
<code>authconfig --enableldap --update</code>
[root@samba ~]# egrep -v "#|^$" /etc/nsswitch.conf
passwd: files ldap
shadow: files ldap
group: files ldap
hosts: files dns
bootparams: nisplus [NOTFOUND=return] files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files
netgroup: files ldap
publickey: nisplus
automount: files ldap
aliases: files nisplus
實際上,該條指令的目的就是在/etc/nsswith.conf中的
passwd, shadow, group, netgroup和automount條目增加ldap選項,如果不想使用上面的指令,手工進行添加也是可以的,這個可以參照之前openldap client配置中的方法。
3、安裝samba軟體包
<code>yum </code><code>install</code> <code>samba samba-common</code>
注意:這裡安裝的是samba 3.6.23,然後和openldap 2.4.40進行整合,使用yum安裝的時候不要安裝成samba4的版本了。
[root@samba ~]# yum list all|grep samba
samba.x86_64 3.6.23-36.el6_8 @updates
samba-common.x86_64 3.6.23-36.el6_8 @updates
samba-winbind.x86_64 3.6.23-36.el6_8 @updates
samba-winbind-clients.x86_64 3.6.23-36.el6_8 @updates
pcp-pmda-samba.x86_64 3.10.9-6.el6 base
samba-client.x86_64 3.6.23-36.el6_8 updates
samba-common.i686 3.6.23-36.el6_8 updates
samba-doc.x86_64 3.6.23-36.el6_8 updates
samba-domainjoin-gui.x86_64 3.6.23-36.el6_8 updates
samba-glusterfs.x86_64 3.6.23-36.el6_8 updates
samba-swat.x86_64 3.6.23-36.el6_8 updates
samba-winbind-clients.i686 3.6.23-36.el6_8 updates
samba-winbind-devel.i686 3.6.23-36.el6_8 updates
samba-winbind-devel.x86_64 3.6.23-36.el6_8 updates
samba-winbind-krb5-locator.x86_64 3.6.23-36.el6_8 updates
samba4.x86_64 4.2.10-7.el6_8 updates
samba4-client.x86_64 4.2.10-7.el6_8 updates
samba4-common.x86_64 4.2.10-7.el6_8 updates
samba4-dc.x86_64 4.2.10-7.el6_8 updates
samba4-dc-libs.x86_64 4.2.10-7.el6_8 updates
samba4-devel.x86_64 4.2.10-7.el6_8 updates
samba4-libs.x86_64 4.2.10-7.el6_8 updates
samba4-pidl.x86_64 4.2.10-7.el6_8 updates
samba4-python.x86_64 4.2.10-7.el6_8 updates
samba4-test.x86_64 4.2.10-7.el6_8 updates
samba4-winbind.x86_64 4.2.10-7.el6_8 updates
samba4-winbind-clients.x86_64 4.2.10-7.el6_8 updates
samba4-winbind-krb5-locator.x86_64 4.2.10-7.el6_8 updates
sblim-cmpi-samba.i686 1.0-1.el6 base
sblim-cmpi-samba.x86_64 1.0-1.el6 base
sblim-cmpi-samba-devel.i686 1.0-1.el6 base
sblim-cmpi-samba-devel.x86_64 1.0-1.el6 base
sblim-cmpi-samba-test.x86_64 1.0-1.el6 base
4、拷貝samba schema到openldap server(此步驟需要到openldap server上操作)
說明:因為這些操作需要在配置smb.conf檔案之前操作,是以并未将samba伺服器上的操作和openldap server上的操作分開來,但是如果是需要在openldap server上操作,我都會注明的。
預設情況下,openldap server并不會讀取samba的配置,如果想讓openldap server能了解samba,那麼就需要添加samba的ldap schema,ldap schema就是在/etc/openldap/slapd.d/下面的schema,預設情況下是沒有關于samba的schema,是以我們需要從samba伺服器上拷貝到openldap伺服器端。
[root@samba ~]# rpm -ql samba
....
/usr/share/doc/samba-3.6.23
/usr/share/doc/samba-3.6.23/LDAP
/usr/share/doc/samba-3.6.23/LDAP/README
/usr/share/doc/samba-3.6.23/LDAP/convertSambaAccount
/usr/share/doc/samba-3.6.23/LDAP/get_next_oid
/usr/share/doc/samba-3.6.23/LDAP/ol-schema-migrate.pl
/usr/share/doc/samba-3.6.23/LDAP/samba-nds.schema
/usr/share/doc/samba-3.6.23/LDAP/samba-schema-FDS.ldif
/usr/share/doc/samba-3.6.23/LDAP/samba-schema-netscapeds5.x.README
/usr/share/doc/samba-3.6.23/LDAP/samba-schema.IBMSecureWay
/usr/share/doc/samba-3.6.23/LDAP/samba.ldif
/usr/share/doc/samba-3.6.23/LDAP/samba.schema
/usr/share/doc/samba-3.6.23/LDAP/samba.schema.at.IBM-DS
/usr/share/doc/samba-3.6.23/LDAP/samba.schema.oc.IBM-DS
...
這是samba安裝後生成的關于LDAP檔案(其他的大部分被我省去),裡面有schema字樣的就是samba的ldap schema,當然有些是IBM的特殊檔案(因為IBM有自己的一套ldap),而我們需要的就是samba.ldif這個檔案。
<code>scp</code> <code>/usr/share/doc/samba-3</code><code>.6.23</code><code>/LDAP/samba</code><code>.ldif root@ldapsrv01:</code><code>/etc/openldap/slapd</code><code>.d</code><code>/cn</code><code>\=config</code><code>/cn</code><code>\=schema</code>
<code>chown</code> <code>-R ldap:ldap </code><code>/etc/openldap/slapd</code><code>.d</code>
然後編輯/etc/openldap/slapd.conf檔案,添加一行:
include /etc/openldap/schema/samba.schema
修改之後的slapd.conf檔案中,應該包含如下内容:
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
5、編輯samba.ldif檔案(此步驟需要到openldap server上操作)
在openldap server上,/etc/openldap/slapd.d/cn=config/cn=schema/下的檔案都以一定的方式命名(如下所示),如cn={x}core.ldif等,x的值需要設定為目前目錄下所有檔案的{}中的最大值加1,預設情況下安裝完openldap之後,{}中的最大值是11,也即cn={11}collective.ldif,是以samba.ldif就需要改名為cn={12}samba.ldif。
[root@ldapsrv01 ~]# ll /etc/openldap/slapd.d/cn\=config/cn\=schema
total 76
-rw-------. 1 ldap ldap 1283 Sep 8 12:46 cn={0}corba.ldif
-rw-------. 1 ldap ldap 3625 Sep 8 12:46 cn={10}ppolicy.ldif
-rw-------. 1 ldap ldap 1523 Sep 8 12:46 cn={11}collective.ldif
-rw-------. 1 ldap ldap 15546 Sep 8 12:46 cn={1}core.ldif
-rw-------. 1 ldap ldap 11363 Sep 8 12:46 cn={2}cosine.ldif
-rw-------. 1 ldap ldap 4489 Sep 8 12:46 cn={3}duaconf.ldif
-rw-------. 1 ldap ldap 1693 Sep 8 12:46 cn={4}dyngroup.ldif
-rw-------. 1 ldap ldap 2857 Sep 8 12:46 cn={5}inetorgperson.ldif
-rw-------. 1 ldap ldap 2589 Sep 8 12:46 cn={6}java.ldif
-rw-------. 1 ldap ldap 1519 Sep 8 12:46 cn={7}misc.ldif
-rw-------. 1 ldap ldap 6495 Sep 8 12:46 cn={8}nis.ldif
-rw-------. 1 ldap ldap 1323 Sep 8 12:46 cn={9}openldap.ldif
下面對samba.ldif進行改名(注意在Linux中“=”和“{}”需要轉義)
[root@ldapsrv01 ~]# ll /etc/openldap/slapd.d/cn\=config/cn\=schema/sam*
-rw-r--r-- 1 root root 14440 Sep 13 11:02 /etc/openldap/slapd.d/cn=config/cn=schema/samba.ldif
[root@ldapsrv01 ~]# cd /etc/openldap/slapd.d/cn\=config/cn\=schema
[root@ldapsrv01 cn=schema]# mv samba.ldif cn\=\{12\}samba.ldif
[root@ldapsrv01 cn=schema]# ll
total 92
-rw-r--r-- 1 root root 14440 Sep 13 11:02 cn={12}samba.ldif
然後我們需要編輯一下該檔案
[root@ldapsrv01 cn=schema]# head -3 cn\=\{12\}samba.ldif
dn: cn=samba,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: samba
#編輯前的源檔案
[root@ldapsrv01 cn=schema]# vi cn\=\{12\}samba.ldif
dn: cn={12}samba.ldif
cn: cn={12}samba.ldif
#編輯後的新檔案
最後,重新開機slapd服務
<code>/etc/init</code><code>.d</code><code>/slapd</code> <code>restart</code>
如果要檢查samba schema是否加載,可以使用如下指令:
ldapsearch -x -b "dc=contoso,dc=com"
# extended LDIF
#
# LDAPv3
# base <dc=contoso,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
# contoso.com
dn: dc=contoso,dc=com
objectClass: organization
objectClass: dcObject
dc: contoso
o: contoso
# People, contoso.com
dn: ou=People,dc=contoso,dc=com
objectClass: organizationalUnit
ou: People
# group, contoso.com
dn: ou=group,dc=contoso,dc=com
ou: group
# machines, contoso.com
dn: ou=machines,dc=contoso,dc=com
ou: machines
# sudoers, group, contoso.com
dn: cn=sudoers,ou=group,dc=contoso,dc=com
objectClass: posixGroup
description: sudoers
gidNumber: 10000
cn: sudoers
# charles lv, People, contoso.com
dn: cn=charles lv,ou=People,dc=contoso,dc=com
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
homeDirectory: /home/charleslv
loginShell: /bin/bash
uid: charleslv
cn: charles lv
uidNumber: 10000
userPassword:: e1NTSEF9YW8wUkhDdElFYTh0Yy9RU3Q0QitXdDY4ckJsU2VGQm8=
description: charles lv
sn: lv
givenName: charles
initials: charles lv
# eric li, People, contoso.com
dn: cn=eric li,ou=People,dc=contoso,dc=com
homeDirectory: /home/ericli
uid: ericli
cn: eric li
uidNumber: 10001
userPassword:: e1NTSEF9eE00RFB0VkhmM2FGQnRpRUJUSTdHSnZ3S0kxdUxsSkU=
description: eric li
sn: li
givenName: eric
initials: eric li
# developers, contoso.com
dn: ou=developers,dc=contoso,dc=com
ou: developers
objectClass: top
# app, developers, contoso.com
dn: ou=app,ou=developers,dc=contoso,dc=com
ou: app
# web, developers, contoso.com
dn: ou=web,ou=developers,dc=contoso,dc=com
ou: web
# java, developers, contoso.com
dn: ou=java,ou=developers,dc=contoso,dc=com
ou: java
# bryanz, sudoers, group, contoso.com
dn: cn=bryanz,cn=sudoers,ou=group,dc=contoso,dc=com
givenName: bryan
sn: zhao
uid: bryanz
userPassword:: e01ENX00UXJjT1VtNldhdStWdUJYOGcrSVBnPT0=
uidNumber: 1000
homeDirectory: /home/bryanz
loginShell: /bin/sh
cn: bryanz
# zhangs, People, contoso.com
dn: uid=zhangs,ou=People,dc=contoso,dc=com
givenName: zhang
sn: san
displayName: zhang san
uid: zhangs
homeDirectory: /home/zhangs
cn: zhang san
uidNumber: 47180
userPassword:: e1NTSEF9Nmk2cm1wbXpyK3JzVEwyZk0wanR6d2tKOFNWMk9FdEs=
# SAMBA, contoso.com
dn: sambaDomainName=SAMBA,dc=contoso,dc=com
sambaDomainName: SAMBA
sambaSID: S-1-5-21-3657554500-457428447-597312458
sambaAlgorithmicRidBase: 1000
objectClass: sambaDomain
sambaNextUserRid: 1000
sambaMinPwdLength: 5
sambaPwdHistoryLength: 0
sambaLogonToChgPwd: 0
sambaMaxPwdAge: -1
sambaMinPwdAge: 0
sambaLockoutDuration: 30
sambaLockoutObservationWindow: 30
sambaLockoutThreshold: 0
sambaForceLogoff: -1
sambaRefuseMachinePwdChange: 0
# search result
search: 2
result: 0 Success
# numResponses: 15
# numEntries: 14
藍色部分說明samba的schema已經成功加載并已生效。
6、編輯samba的配置檔案smb.conf
<code>cp</code> <code>/etc/samba/smb</code><code>.conf </code><code>/etc/samba/smb</code><code>.conf.bak$(</code><code>date</code> <code>+%F)</code>
<code>vi</code> <code>/etc/samba/smb</code><code>.conf</code>
[root@samba ~]# diff /etc/samba/smb.conf.bak2016-09-12 /etc/samba/smb.conf
101,102c101,102
< security = user
< passdb backend = tdbsam
---
> #security = user
> #passdb backend = tdbsam
103a104,108
> security = user
> passdb backend = ldapsam:ldap://ldapsrv01.contoso.com
> ldap suffix = dc=contoso,dc=com
> ldap admin dn = cn=admin,dc=contoso,dc=com
> ldap ssl = no
#隻是把原來的security和passdb backend注釋掉,然後添加了ldap的配置。
security = user
passdb backend = ldapsam:ldap://ldapsrv01.contoso.com
ldap suffix = dc=contoso,dc=com
ldap admin dn = cn=admin,dc=contoso,dc=com
ldap ssl = no
注意:ldap admin dn是可選項,如果openldap可以進行匿名通路的話,這裡可以不指定admin dn。但是,如果這裡指定了admin dn,那就需要使用smbpasswd -W指令指定admin dn的密碼并将它寫入到secrets.tdb中。如果之前openldap server上并沒有建立samba域,也會自動建立一個samba域。
[root@samba ~]# smbpasswd -w 123456
Setting stored password for "cn=admin,dc=contoso,dc=com" in secrets.tdb
[root@samba ~]# service smb restart
Shutting down SMB services: [ OK ]
Starting SMB services: [ OK ]
重新開機完smb服務後,執行“net getlocalsid”指令,将于看到類似如下的輸出:
[root@samba ~]# net getlocalsid
SID for domain SAMBA is: S-1-5-21-3657554500-457428447-597312458
如果你是手工建立的samba域,這裡就會傳回samba域的資訊,如果是自動建立,就會傳回類似上面的資訊。這也就說明samba domain已經建立成功。
補充:如果執行net getlocalsid指令,傳回“Failed to issue the StartTLS instruction: Connect error”錯誤代碼,則在/etc/samba/smb.conf中添加“ldap ssl = no”,然後重新開機smb服務即可。
因為之前在部署openldap後,我也部署了LAM,是以可以到LAM上看一下,是否有samba域的相關資訊。
<a href="http://s4.51cto.com/wyfs02/M01/87/34/wKioL1fXtAfxuXtEAAGtXoto5xo273.png-wh_500x0-wm_3-wmp_4-s_3499112537.png" target="_blank"></a>
登入Ldap Account Manager,然後切換到Samba域,可以看到下面已經多了一個SAMBA的域,可以對照一下Domain SID正是上面通過net getlocalsid傳回的值。
<a href="http://s1.51cto.com/wyfs02/M02/87/34/wKioL1fXtAizApsmAAHVU9sWPhk033.png-wh_500x0-wm_3-wmp_4-s_321893916.png" target="_blank"></a>
打開該域的配置,發現很多資訊都是預設或者未配置的,我們也可以在這裡修改或重置某些設定。
======================分割線=======================
下面做samba使用ldap認證的配置
<code>cp</code> <code>/etc/samba/smb</code><code>.conf </code><code>/etc/samba/smb</code><code>.conf.bak</code>
[root@samba ~]# diff /etc/samba/smb.conf.bak /etc/samba/smb.conf
74c74
< workgroup = MYGROUP
> workgroup = contoso
77a78
> netbios name = Samba
109a111,116
> ldap group suffix = ou=group
> ldap user suffix = ou=People
> ldap delete dn = no
> ldap passwd sync = yes
> encrypt passwords = yes
再次修改了smb.conf檔案,主要是修改了workgroup資訊,并添加了ldap中的設定,比如預設添加使用者到哪個ou中,添加組到哪個ou中去等。
1、建立本地使用者
[root@samba ~]# useradd laowang
[root@samba ~]# echo "123456" |passwd --stdin laowang
Changing password for user laowang.
passwd: all authentication tokens updated successfully.
[root@samba ~]# id laowang
uid=500(laowang) gid=500(laowang) groups=500(laowang)
這裡是示範新建立本地使用者,然後通過smbpasswd -a添加到samba域,其實也可以不建立本地使用者,直接使用ldap中現有的使用者,然後使用smbpasswd -a添加,這裡隻是為了證明在使用smbpasswd -a添加後,openldap中能查詢到新添加的使用者。
2、建立samba域使用者
[root@samba ~]# smbpasswd -a laowang
New SMB password:
Retype new SMB password:
Added user laowang.
3、到openldap server上查詢剛剛建立的使用者
[root@ldapsrv01 ~]# ldapsearch -x -LLL -D "cn=admin,dc=contoso,dc=com" -W -b "dc=contoso,dc=com" "(uid=laowang)"
Enter LDAP Password:
dn: uid=laowang,ou=People,dc=contoso,dc=com
uid: laowang
objectClass: sambaSamAccount
objectClass: account
objectClass: shadowAccount
cn: lao wang
gecos: Ge bi lao wang
homeDirectory: /home/laowang
uidNumber: 10003
sambaSID: S-1-5-21-3657554500-457428447-597312458-500
sambaAcctFlags: [XU ]
displayName: laowang
sambaHomeDrive: U:
sambaPrimaryGroupSID: S-1-5-21-3657554500-457428447-597312458-513
sambaNTPassword: 32ED87BDB5FDC5E9CBA88547376818D4
sambaPwdLastSet: 1473757623
shadowLastChange: 17057
userPassword:: e1NTSEF9S0toc3UwbklHSjVaVkFHdThLVU1VN0xpbnRZM1pHMXo=
4、安裝smaba client
<code>yum -y </code><code>install</code> <code>samba-client</code>
5、使用laowang進行測試
[root@samba ~]# smbclient -L 127.0.0.1 -U laowang
Enter laowang's password:
Domain=[CONTOSO] OS=[Unix] Server=[Samba 3.6.23-36.el6_8]
Sharename Type Comment
--------- ---- -------
IPC$ IPC IPC Service (Samba Server Version 3.6.23-36.el6_8)
laowang Disk Home Directories
Server Comment
--------- -------
Workgroup Master
6、添加共享檔案夾
編輯/etc/samba/smb.conf檔案,并在其中添加如下内容:
[public]
comment = Public
path = /tmp
public = yes
writable = yes
printable = no
然後,重新開機smb服務。
7、測試共享檔案
在Linux Client上測試:
public Disk Public
在Windows上測試:
在資料總管中輸入:\\192.168.49.135\public,回車,在彈出視窗中輸入使用者名密碼
<a href="http://s3.51cto.com/wyfs02/M02/87/35/wKioL1fXx5yTcBY3AAEDjtgy9l0904.png-wh_500x0-wm_3-wmp_4-s_1622535287.png" target="_blank"></a>
下面我在public中建立一個名為laowang的檔案夾,再在其中建立一個test.txt文本檔案,寫入“Hello world!”
<a href="http://s3.51cto.com/wyfs02/M02/87/35/wKioL1fXx53i8yw5AAE5Wrz_v70826.png-wh_500x0-wm_3-wmp_4-s_1629223598.png" target="_blank"></a>
回到samba伺服器上檢視/tmp目錄下是否存在這個檔案,
[root@samba ~]# ls /tmp/laowang/
test.txt
[root@samba ~]# cat /tmp/laowang/test.txt
Hello world!
可以看到剛剛寫入的檔案,說明共享成功,至此,samba整合openldap的過程徹底結束。
本文轉自 jerry1111111 51CTO部落格,原文連結:http://blog.51cto.com/jerry12356/1852375,如需轉載請自行聯系原作者