天天看點

部署獨立的Samba并與openldap整合

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>&gt;&gt;</code><code>/etc/hosts</code>  <code>#samba主機記錄</code>

<code>echo</code> <code>"192.168.49.138  ldapsrv01.contoso.com  ldapsrv01"</code> <code>&gt;&gt;</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 &lt;dc=contoso,dc=com&gt; 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

&lt; security = user

&lt; passdb backend = tdbsam

---

&gt; #security = user

&gt; #passdb backend = tdbsam

103a104,108

&gt; security = user

&gt; passdb backend = ldapsam:ldap://ldapsrv01.contoso.com

&gt;         ldap suffix = dc=contoso,dc=com

&gt;         ldap admin dn = cn=admin,dc=contoso,dc=com

&gt;         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

&lt; workgroup = MYGROUP

&gt; workgroup = contoso

77a78

&gt;         netbios name = Samba

109a111,116

&gt;         ldap group suffix = ou=group

&gt;         ldap user suffix = ou=People

&gt;         ldap delete dn = no

&gt;         ldap passwd sync = yes

&gt;         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,如需轉載請自行聯系原作者