samba + OPENldap 搭建檔案共享伺服器
samba + OPENldap 搭建檔案共享伺服器
這裡我使用的是 samba(檔案共享服務) v4.9.1 + OPENldap(後端資料庫軟體) v2.4.44 + smbldap-tools(後端資料庫管理軟體) v0.9.11 + CentOS7。 如果有不同,可能會有部分問題。
注:
- samba 的功能不只有檔案共享,還可以作為一臺Windows域成員,甚至Windows域控制器。千萬不要認為samba只是一個檔案共享服務。
- 由於我們使用了samba的檔案共享功能,與檔案許可權有直接的聯絡,所以samba中的使用的使用者必須是Linux中能查詢到。因為使用了 OPENldap 作為samba 的後端資料庫,所以我們這裡還需要配置Linux能查詢到 OPENldap 中的使用者資訊,也就是需要配置 NSS。關於NSS部分的配置需要在smbldap-tools 初始化ldap資料庫後完成NSS部分的配置,需要注意。
- samba 有使用PAM作為認證模組,和使其自帶的認證程式,在CentOS中編譯時配置的是使用其自帶的認證程式,所以PAM的配置可以省略。
- 如果想要配置OPENldap中的使用者可以登入系統,可以查閱這篇文章:《配置Linux使用LDAP使用者認證》,其中的配置與本文中的配置並不相同,需要注意!!!
初始化配置
yum 源和網路配置省略。
yum -y install samba openldap-servers openldap-clients smbldap-tools nss-pam-ldapd
配置OPENldap服務
這裡只進行簡單的服務配置,資料庫配置這裡會使用 smbldap-tools 進行配置,如果不知道OPENldap 可以去看看這篇文章:《OPENLDAP 服務搭建和後期管理》
這裡將 OPENldap 所有配置清空,重新配置。
# 首先備份檔案,以免無法復原 mkdir /root/back tar -Jcvf /root/back/slapd.config-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /etc/openldap/slapd.d/ tar -Jcvf /root/back/slapd.data-`date '+(%Y.%m.%d_%H:%M:%S)'`.tar.xz /var/lib/ldap/ # 然後再刪除配置檔案 rm -rf /etc/openldap/slapd.d/* rm -rf /var/lib/ldap/* # 複製一個samba的schema檔案 cp /usr/share/doc/samba-4.9.1/LDAP/samba.ldif /etc/openldap/schema/
這裡的配置檔案我是從/usr/share/openldap-servers/slapd.ldif
中複製過來,並修改成如下這個樣子的。主要修改了baseDN(suffix), OPENLDAPTLS,olcRootPW(密碼由 slappasswd 生成,本文中的密碼為: 123456) 和 include
# file: /tmp/slapd.ldif
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema
include: file:///etc/openldap/schema/core.ldif
include: file:///etc/openldap/schema/cosine.ldif
include: file:///etc/openldap/schema/nis.ldif
include: file:///etc/openldap/schema/inetorgperson.ldif
include: file:///etc/openldap/schema/samba.ldif
dn: olcDatabase=frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: frontend
dn: olcDatabase=config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: config
olcAccess: to *
by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by * none
dn: olcDatabase=monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: monitor
olcAccess: to *
by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.base="cn=Manager,dc=black,dc=com" read
by * none
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: hdb
olcSuffix: dc=black,dc=com
olcRootDN: cn=Manager,dc=black,dc=com
olcRootPW: {SSHA}l1vBI/HOMKLEiQZgcm3Co+hFQI68rH1Q
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub,uid
根據配置生成伺服器的配置檔案
slapadd -F "/etc/openldap/slapd.d/" -b "cn=config" -l /tmp/slapd.ldif
# 這裡還需要注意檔案屬主還是root的,需要改回為openldap
chown -R ldap:ldap /etc/openldap/slapd.d/*
# 然後再開啟服務即可
systemctl start slapd
_#################### 100.00% eta none elapsed none fast!
Closing DB...
注:這裡只配置了OPENldap中的服務部分,沒有配置OPENldap 的 資料庫,這裡再次強調以下。
配置 samba
這裡只是為了測試使用samba 與 OPENldap 的使用,就不進行過於複雜的檔案共享配置了,只共享一個使用者的家目錄僅供測試。
# file: /etc/samba/smb.conf
[global]
workgroup = MYGROUP # 指定共享組名稱。
server string = Samba Server Version %v
log file = /var/log/samba/log # 日誌
security = user # 指定安全級別為User
passdb backend = ldapsam:ldap://127.0.0.1 # 指定passdb 的後端資料庫使用ldapsam
ldap suffix = dc=black,dc=com # 指定ldap的 suffix
ldap user suffix = ou=People # 指定使用者的 suffix 段位 ou=People 這裡會與上一個suffix結合。
ldap group suffix = ou=Group # 上同,指定的是使用者組。
ldap admin dn = cn=Manager,dc=black,dc=com # 指定查詢ldap服務使用的管理員使用者
ldap ssl = no # 指定不使用SSL加密。
load printers = no # 指定不載入共享印表機。
[homes]
comment = Home Directories
browseable = no
writable = yes
create mask = 0600
directory mask = 700
smbpasswd -w 123456 # 儲存用於連線 LDAP 服務的使用者密碼,!!!非常重要,否則無法啟動smb服務。
啟動samba服務
systemctl start nmb
systemctl start smb
smbldap-tools 配置
這裡使用 smbldap-tools 來快速完成 samba 服務所需要的資料資訊,同時通過 smblda-tools 來進行使用者段管理。但是smbldap-tools 有一個缺點就是 不會管你本地使用者是否有相同的 UID 或則 GID,可能有衝突,需要注意。
smbldap 會從 /etc/samba/smb.conf 讀取部分資訊,所以需要先配置好samba再配置 smbldap-tools 服務。
smbldap-config # 配置 smbldap-tools 的配置,這裡使用smbldap-conifg 簡易配置。
這裡省略下面的配置過程,不知道的預設即可。
smbldap-populate # 初始化配置 OPENldap 資料庫。
這裡再建立一個使用者用於後面的測試使用。
smbldap-useradd -a -m User1 # 新增使用者User2
# -a: 指定新增的使用者型別為Windows,這樣samba 才能識別到該使用者。
# -m: 指定建立該使用者的家目錄。
smbldap-passwd User1 # 修改該使用者的使用者密碼
這裡省略該使用者的密碼修改過程。
這樣 OPENldap 的資料庫初始化就完成了,這樣就能去查詢OPENldap 中的內容了。如下圖,這個就是smbldap-populate
所建立的內容了。
在圖中我們可以看到 UID = root 和 nobody 的使用者,我並不想讓這些特殊使用者登入到伺服器,所以在下面的配置,我會通過 fliter 將這2個使用者過濾掉。
NSS 配置
這裡的NSS配置主要就是需要配置,NSS 將 LDAP 的請求轉發給 nslcd ,由 nslcd 來查詢 OPENldap 中的使用者資訊。
首先配置 NSS ,只需新增 passwd 段和 group 段的ldap認證即可。
# file: /etc/nsswitch.conf
passwd: files ldap
shadow: files
group: files ldap
hosts: files dns myhostname
bootparams: nisplus [NOTFOUND=return] files
ethers: files
netmasks: files
networks: files
protocols: files
rpc: files
services: files sss
netgroup: nisplus sss
publickey: nisplus
automount: files nisplus sss
aliases: files nisplus
然後配置 nslcd, 注意 nslcd 是以daemon 形式執行的,主要配置後重啟。
# file:/etc/nslcd.conf
uid nslcd
gid ldap
uri ldap://127.0.0.1/ # ldap URL地址
base dc=black,dc=com # base dn 路徑
binddn cn=Manager,dc=black,dc=com # 指定連線的使用者
bindpw 123456 # 指定密碼
ssl no # 指定不要使用SSL 加密連線。
filter passwd (&(objectClass=posixAccount)(uidNumber>=1000)) # 編寫 passwd 的過濾規則。
filter group (&(objectClass=posixGroup)(gidNumber>=500)) # 上同,編寫的是 group
chmod 600 /etc/nslcd.conf # 配置檔案許可權,非常重要,否則無法啟動服務。
systemctl start nslcd # 啟動 nslcd 服務。
我們這裡測試以下 NSS 的配置是否可用
getent passwd User1
User1:*:1001:513:System User:/var/smb/User1:/bin/bash
如上可見,我們配置的 NSS 和 OPENldap 服務 已經生效了,下面我們再來繼續配置samba,使其可用。
samba 許可權配置
如果看的比較仔細的人,就會發現我將使用者的home 目錄位置存放在了/var/smb
位置,主要是為了不與系統中的使用者搞混。並且這樣可以通過SELinux來隔離samba 禁止訪問 /home
路徑下的資源,詳細請看下面操作。
# 上面通過 smbldap-useradd 命令,已經建立了使用者的home 目錄,
# 下面可以直接進行SELinux 的相關配置了。
semanage fcontext -a -t samba_share_t '/var/smb(/.*)?' # 這裡我使用 samba 共享使用的type
# 如果要使samba 可以訪問 /home 則應當開啟 samba_enable_home_dirs 這個 bool 值。
# 但是 我這裡因為使用的是 samba_share_t 這個 type 型別,所以無需開啟 任何 bool 值,保證了/home 下的檔案資訊不會被samba 訪問到。
restorecon -R /var/smb/ # 然後我們在重置 /var/smb 目錄下的SELinux type 型別即可。
# 這話我們就能進行samba 的測試了
smbclient -L //127.0.0.1/ -U User1
這裡我們也就可看到了,User1 使用者已經可以登入並查詢到共享目錄了。
那麼我們這裡直接登入進去,上傳一些檔案做一些測試:
OK,那麼這樣一個samba 的檔案共享就完成了。
本文經「原本」原創認證,作者乾坤盤,訪問yuanben.io查詢【2H0DBHHY】獲取授權資訊