Samba通過AD域進行認證並限制空間大小

Samba通過AD域進行認證並限制空間大小


    本文實現了samba服務被訪問的時候通過windows域服務器進行用戶名和密碼驗證;認證通過的用戶可以自動分配500M的共享空間;在用戶通過windows域登陸系統的時候可以自動把這塊空間映射成一塊硬盤。


 一、環境說明:

    文件服務器用的Centos5.3,域控用的Win2k3 sp2Domainrainbird.net

      Centos5.3:

      Name:Filesrv

      IP:192.168.1.245

      Dns:192.168.1.241

      Samba:3.0.33-3.7.el5

        Win2k3:

      Name:ad1

      Ip:192.168.1.241

      Dns:192.168.1.241


 二、實驗步驟:

1.samba服務器軟件需求 

       krb5-workstation-1.2.7-19 
       pam_krb5-1.70-1 
       krb5-devel-1.2.7-19 
       krb5-libs-1.2.7-19 
       samba-3.0.5-2 
       [root@filesrv CentOS]# rpm -qa|grep krb5

       krb5-auth-dialog-0.7-1

       krb5-libs-1.6.1-25.el5

       krb5-devel-1.6.1-25.el5

       pam_krb5-2.2.14-1

       krb5-workstation-1.6.1-25.el5

       [root@filesrv CentOS]# rpm -qa|grep samba

       samba-swat-3.0.28-0.el5.8

       samba-common-3.0.28-0.el5.8

       samba-client-3.0.28-0.el5.8

       samba-3.0.28-0.el5.8 

如果centos在安裝的時候沒有取消默認選中的”Base”,krb5的包是默認全部安裝

如果沒有選擇安裝samba可以這樣安裝

[root@filesrv CentOS]# rpm -ivh xinetd-2.3.14-10.el5.i386.rpm

[root@filesrv CentOS]# rpm -ivh --aid samba*.rpm  


2.配置kerberos(關鍵
下面配置參數讓 Kerberos 進程知道處理活動目錄服務器,對 /etc/krb5.conf 做適當的修改,修改時需要注意的是Kerberos 是大小寫敏感的。 這是我的krb5.conf配置文件: 

[logging] 

default = FILE:/var/log/krb5libs.log 
kdc = FILE:/var/log/krb5kdc.log 
admin_server = FILE:/var/log/kadmind.log 

[libdefaults] 
ticket_lifetime = 24000 
default_realm = 
RAINBIRD.NET    //默認域名,注意是大寫
dns_lookup_realm = false 
dns_lookup_kdc = false 

[realms] 
RAINBIRD.NET = { 
kdc = 192.168.1.241:88    //域服務器ip
# admin_server = kerberos.example.com:749 
default_domain = RAINBIRD.NET 


[domain_realm] 
. rainbird.net = RAINBIRD.NET
rainbird.net = RAINBIRD.NET
 

[kdc] 
profile = /var/kerberos/krb5kdc/kdc.conf 

[appdefaults] 
pam = { 
debug = false 
ticket_lifetime = 36000 
renew_lifetime = 36000 
forwardable = true 
krb4_convert = false 


3.
測試kerberos
kinit administrator@RAINBIRD.NET    
//這裏必須是大寫 
kinit 
命令將測試服務器間的通信,administrator爲域內存在的用戶, RAINBIRD.NET 是你的活動目錄的域名,必須大寫。正確操作的提示:

[root@filesrv~]# kinit [email protected]

Password for [email protected]: (正確輸入密碼後直接返回)

[root@filesrv~]#

可能遇到的幾個常見錯誤:

域名錯誤: 
kinit(v5): Cannot find KDC for requested realm while getting initial credentials. 
密碼錯誤,驗證失敗:
kinit(v5): Preauthentication failed while getting initial credentials.

用戶不存在:

kinit(v5): Client not found in Kerberos database while getting initial credentia.

時間不一致:

kinit(v5): Clock skew too great while getting initial credentials.


4.配置winbind

修改/etc/nsswitch.conf

passwd: files winbind

shadow: files winbind

group: files winbind


5.配置samba 

修改/etc/samba/smb.conf

workgroup = RAINBIRD

server string = Filesrv

password server = AD1.RAINBIRD.NET    //域服務器,可以用ip也可以用域名

realm = RAINBIRD.NET    //活動目錄服務器域名

security = ads    //採用活動目錄認證方式

idmap uid = 16777216-33554431

idmap gid = 16777216-33554431

template shell = /sbin/nologintemplate

homedir = /mnt/localhome/%U

winbind use default domain = true

winbind offline logon = true

winbind enum groups = yes

winbind enum users = yes

winbind separator = / 


紅色部分是要修改的,藍色部分是要新增的。建議直接把已經存在的註釋掉,把這裏列出來的東西,直接放進去,這樣在一塊方便查找。
我們現在把samba服務器加入windows域。

[root@filesrv1 samba]# net ads join -U [email protected]

[email protected]'s password:

Using short domain name -- RAINBIRD

Joined 'FILESRV1' to realm 'RAINBIRD.NET'
正常的話提示是”Joined” 

 

加入失敗可能的原因:      

兩臺機器的時間不一致!

重新啓動服務 
service smb restart

service winbind restart

設定服務開機自動啓動

chkconfig smb on

chkconfig winbind on

 

咱們去Windows 2003 服務器上檢查一下:打開活動目錄用戶和計算機,查看其中的條目,如果成功的話,就可以看到你的Linux 服務器。


這裏樣你可以用wbinfo做一些測試驗證Samba主機已成功加入AD域

[root@filesrv samba]# wbinfo -t

checking the trust secret via RPC calls succeeded

說明主機信任已成功建立


使用wbinfo –u 可以列出AD中註冊的帳號信息

[root@filesrv samba]# wbinfo -u

administrator

guest

support_388945a0

krbtgt

rainbird

rainbow

a

a1

a2

root

a3

a4

a5

a6

a7

a8

a9

a10


使用Wbinfo –g可以返回AD中的組信息

[root@filesrv samba]# wbinfo -g

domain computers

domain controllers

schema admins

enterprise admins

domain admins

domain users

domain guests

group policy creator owners

dnsupdateproxy


可能的錯誤:

如果你wbinfo –t 測試的時候提示如下:

[root@filesrv samba]# wbinfo -t

checking the trust secret via RPC calls failed

error code was  (0x0)

Could not check secret

說明你winbind服務沒起動,重啓一下就OK

當然了有必要說一下,winbind如果提示啓動成功但沒有啓動的話,有可能是因爲你沒有加入到域,所以嚴格按本文的操作步驟來做,你不會錯過


 6.自動創建用戶目錄

smb.conf中,有一句template shell = /sbin/nologin。是的,samba服務器,我們只希望他提供samba服務,不希望有用戶登陸。在上一篇文章中解決用戶登陸時主目錄不存在的問題,用的是pam_mkhomedir.so這個東東。在文件共享這塊,對於通過samba訪問過來的請求不會創建主目錄!這可如何是好?這就是腳本mkhome.sh存在的原因。特別注意,請將mkhome.sh腳本放在一個所有用戶都能訪問的目錄下,並且設置文件權限爲755,否則可能出現域用戶登錄Samba服務器時無法執行該腳本的情況!

以下是mkhome.sh腳本內容

#!/bin/bash

user=$1

group=$2

home=/home/$1

if [ ! -d $home ] ; then

mkdir -p $home

chown $user $home

chgrp $group $home

chmod 700 $home

edquota -p administrator -u $user

fi


這個腳本接受兩個參數,一個是用戶名,一個是組名。然後給這個用戶創建目錄,並分配權限,然後再給分配一下用戶空間。Ok,回頭看一下smb.conf文件。

[homes]

comment = Home Directories

path = /mnt/localhome/%U    //共享的目錄

valid users = rainbird.net/%U    //認證的用戶,前面必須加rainbird.net

read only = No

browseable = No

root preexec = /mnt/localhome/mkhome.sh %U %G    //執行創建目錄的操作,注意腳本所在目錄及文件的執行權限


這段配置中最帥的就是這個mkhome.sh的存在。因爲這個腳本的執行者是root,所以我們腳本的權限設置700即可。再往下我們將繼續探索它的神奇魔力。寫完這段保存一下,重啓smb:service smb restart。這樣在一臺xp的機器上用域用戶登陸,然後訪問\\192.168.1.246,是不是看到了一個以你登陸的域用戶名命名的一個文件夾呢?沒錯,就是它!你現在可以試下刪寫文件了。


7.設置磁盤配額      

因爲磁盤配額只能在一塊單獨的分區上啓用,所以筆者專門添加了一塊分區掛載到home目錄下,這點要注意。

編輯fstab

[root@filesrv1 ~]#vi /etc/fstab
/dev/hdb1               /home               ext3    defaults,usrquota,grpquota

選擇分區,將default選項改爲:"defaults,usrquota,grpquota"(針對用戶和組做磁盤配額)或"defaults,usrquota"(針對用戶做磁盤配額)"defaults,grpquota"(針對組做磁盤配額)

重新掛載文件系統

[root@filesrv1 ~]#mount -o remount /home

創建配額文件

[root@filesrv1 ~]#quotacheck –cmug /home

啓動配額

[root@filesrv1 ~]#quotaon -av

配額設置

[root@filesrv1 ~]# edquota -u administrator

Disk quotas for user administrator (uid 16777216):

  Filesystem                   blocks       soft       hard     inodes     soft     hard

 /dev/sdb1                           20           0           0           3         0        0


其中

blocks:已用磁盤空間

        soft,磁盤空間軟限制;hard:磁盤空間硬限制
inodes:已寫多少個文件

        soft:磁盤文件數量軟限制;hard:磁盤文件數量硬限制


查看磁盤配額情況
[root@filesrv1 home]#quota -u administrator


如果想服務器啓動後自動啓動磁盤配額,可以修改/etc/rc.d/rc.local文件,增加一行

quotaon /dev/sdb1

 

分析:使用磁盤限額有一點不爽的地方就是它不是默認給所有的用戶設置限額。也就是說,如果你想給哪個用戶啓用磁盤限額,你必須先建立那個用戶,然後再針對那個用戶進行限制。可是在域裏,我們所有的用戶已經建立好了,怎麼一個一個的給進行磁盤限額呢?還好edquota提供了一個特性,就是可以做一個用戶模板把配置複製給新用戶,這樣就簡單了。如果要手動給用戶分配限額的話這樣就可以搞掂:

wbinfo -u|xargs|edquota -p administrator -u

這樣就把administrator這個用戶的配額情況“分發”給了所有用戶!

還記得我們的mkhome.sh嗎?裏面有這第一句:

edquota -p administrator -u $user

這句話的意思就是以administrator爲模板給用戶設置磁盤限額。這樣寫在腳本里不但省去了手工執行,新添加用戶也不怕了。


8.域用戶登陸自動掛載自己的共享文件夾

能做到這步那麼恭喜你,因爲終點就在眼前了。到這一步,你已經成功完成了samba通過ad域進行驗證,並給驗證用戶分配500M的固定空間,現在就讓我們一鼓作氣,將這個優雅的高難度動作畫個完美的句號吧。


我們知道windows有個“映射網絡驅動器”的功能,今天用到的東東就是它。其實原理很簡單,就是我們寫個批處理,這個批處理的功能是獲得登陸用戶的用戶名,然後去連接共享。而用戶登陸的時候就自動執行這個批處理。


這個操作在域服務器上進行。在服務器上有個路徑C:\WINDOWS\SYSVOL\sysvol\rainbird.net\scripts,把你想要域用戶登陸執行的腳本放在這個文件裏就可以了。


Share.cmd裏面的內容是:

@echo off

if exist P: net use P: /del /y

net use P: \\192.168.1.246\%USERNAME%


這個文件的權限要設置成everyone讀取。不然後域用戶登陸的時候會報錯的喲。接着打開“active directory 用戶和計算機”找到users,多選你要分配空間的用戶,如圖,選擇“屬性”。


找到“配置文件”,選中“登錄腳本”,在後面的框裏輸入“share.cmd”


這樣,被選中的用戶下次再登陸的時候就被“強制”執行這樣腳本。當然這個策略不知道要多長時間才能分發下去。如果你現在就想讓它生效,那麼執行下列命令:

gpupdate /force


域用戶登陸以後在我的電腦就會看到這塊共享盤


就是FileSrv那個了。雙擊打開,就像操作本地硬盤一樣方便。


可以添加修改文件。至於空間是不是限定了500M那就自己試一下吧,或者去linuxquota查詢也可以。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章