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 服务器。

Samba通过AD域进行认证并限制空间大小_第1张图片


这里样你可以用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,是不是看到了一个以你登陆的域用户名命名的一个文件夹呢?没错,就是它!你现在可以试下删写文件了。

Samba通过AD域进行认证并限制空间大小_第2张图片


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,把你想要域用户登陆执行的脚本放在这个文件里就可以了。

Samba通过AD域进行认证并限制空间大小_第3张图片


Share.cmd里面的内容是:

@echo off

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

net use P: \\192.168.1.246\%USERNAME%


这个文件的权限要设置成everyone读取。不然后域用户登陆的时候会报错的哟。接着打开“active directory 用户和计算机”找到users,多选你要分配空间的用户,如图,选择“属性”。

Samba通过AD域进行认证并限制空间大小_第4张图片


找到“配置文件”,选中“登录脚本”,在后面的框里输入“share.cmd”

Samba通过AD域进行认证并限制空间大小_第5张图片


这样,被选中的用户下次再登陆的时候就被“强制”执行这样脚本。当然这个策略不知道要多长时间才能分发下去。如果你现在就想让它生效,那么执行下列命令:

gpupdate /force


域用户登陆以后在我的电脑就会看到这块共享盘

Samba通过AD域进行认证并限制空间大小_第6张图片


就是FileSrv那个了。双击打开,就像操作本地硬盘一样方便。

Samba通过AD域进行认证并限制空间大小_第7张图片


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