Samba通过ad域进行认证并限制空间大小

本文实现了 samba 服务被访问的时候通过 windows 域服务器进行用户名和密码验证 ; 认证通过的用户可以自动分配 500M 的共享空间 ; 在用户通过 windows 域登陆系统的时候可以自动把这块空间映射成一块硬盘。
环境说明:
文件服务器用的 Centos5.3 ,域控用的 Win2k3 sp2 Domain rainbird.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
Ok,let’s move!
因为是服务器配置,所以本文的操作都是在字符界面下直接编辑文件。当然为了提高工作效率其中一部分配置是可以在图形界面下配的。前提是你必须是 redhat/centos 系统。如果是的话,可以参考我上一篇文章 << linux加入windows域之完美方案 >> 来做 J
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 [email protected]
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. 修改 /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/nologin
template homedir = /home/%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 �Cu 可以列出 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 �Cg 可以返回 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 �Ct 测试的时候提示如下:
[root@filesrv samba]# wbinfo -t
checking the trust secret via RPC calls failed
error code was  (0x0)
Could not check secret
说明你 winbind 服务没起动,重启一下就 OK
当然了有必要说一下, winbind 如果提示启动成功但没有启动的话,有可能是因为你没有加入到域,所以严格按本文的操作步骤来做,你不会错过 J
 
6. 自动创建用户目录
细心的朋友可能发现从开篇一直到现在除了操作方式不一定以外,所做的事情和 << linux加入windows域之完美方案 >> 没有太大的区别。嗯,笔者不置可否,估且这么理解吧。希望有点小细节您注意到了,在 smb.conf 中,有一句 template shell = /sbin/nologin 。是的, samba 服务器,我们只希望他提供 samba 服务,不希望有用户登陆。在上一篇文章中解决用户登陆时主目录不存在的问题,用的是 pam_mkhomedir.so 这个东东。在文件共享这块,笔者意外的发现,这个文件,对于通过 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 = /home/%U // 共享的目录
        valid users = rainbird.net/%U // 认证的用户,前面必须加 rainbird.net
        read only = No
        browseable = No
root preexec = /root/mkhome.sh %U %G // 执行创建目录的操作。
      这段配置中最帅的就是这个 mkhome.sh 的存在。因为这个脚本的执行者是 root, 所以我们脚本的权限设置 700 即可。再往下我们将继续探索它的神奇魔力。写完这段保存一下,重启 smb:service smb restart 。这样,在一台 xp 的机器上,用域用户登陆,然后访问 \\192.168.1.246, 是不是看到了一个以你登陆的域用户名命名的一个文件夹呢?没错,就是它!你现在可以试下删写文件了。怎么有问题?有问题就自己检查一下,为什么吧 J
7. 设置磁盘配额
      因为磁盘配额只能在一块单独的分区上启用,所以笔者专门添加了一块分区挂载到 home 目录下,这点要注意。
编辑 fstab
[root@filesrv1 ~]#vi /etc/fstab
/dev/hdb1               /home               ext3    defaults,usrquota,grpquota
    
选择分区,将 defaults 选项改为: “defaults,usrquota,grpquota” (针对用户和组做磁盘配额)或 “defaults,usrquota" (针对用户做磁盘配额 )或 "defaults,grpquota" (针对组做磁盘配额)
重新挂载文件系统:
[root@filesrv1 ~]#mount �Co remount  /home
创建配额文件
[root@filesrv1 ~]#quotacheck �Ccmug  /home
启动配额
[root@filesrv1 ~]#quotaon -av
配额设置
[root@filesrv1 ~]# edquota -u administrator
Disk quotas for user administrator (uid 16777216):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sdb1    0   500000   512000              10       0       0    
(其中: blocks ,已用磁盘空间; soft ,磁盘空间软限制, hard :磁盘空间硬限制;
        inodes
已写多少个文件; soft :磁盘文件数量软限制; hard :磁盘文件数量硬限制)
查看磁盘配额情况
[root@filesrv1 home]#quota -u administrator
 
分析:使用磁盘限额有一点不爽的地方就是它不是默认给所有的用户设置限额。也就是说,如果你想给哪个用户启用磁盘限额,你必须先建立那个用户,然后再针对那个用户进行限制。可是在域里,我们所有的用户已经建立好了?怎么一个一个的给进行磁盘限额呢?还好 edquota 提供了这么一个特性,就是你可以以一个用户为模板,把配置复制给新用户,这样就简单了,如果要手动给用户分配限额的话,这样就可以搞定: wbinfo �Cu|xargs| edquota -p administrator �Cu 。这样我们就把 administrator 这个用户的配额情况 分发 给了所有用户! 还记得我们的 mkhome.sh 吗?是的,就是它,里面有这第一句 edquota -p administrator -u $user ,这句话的意思就是以 administrator 为模板给用户设置磁盘限额。这样写在脚本里,不但省去了手工执行,新添加用户也不怕了 J
8.
域用户登陆自动挂载自己的共享文件夹
       嘿嘿,能做到这步,已经很不容易了,如果你做到了,那么恭喜你,因为终点就在眼前了。到这一步,你已经成功完成了 samba 通过 ad 域进行验证,并给验证用户分配 500M 的固定空间,现在就让我们一鼓作气,将这个优雅的高难度动作画个完美的句号吧 J
       我们知道 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, 那就自己试一下吧 J ( 或者去 linux quota 查询也可以哟 ~~)
       Samba 的故事到这里就讲完了。再下一步就是 samba 群集了。 Move on ,Let’s go!
 
 
相关链接:
        linux加入windows域之完美方案

本文出自 “rainbird” 博客,转载请与作者联系!

你可能感兴趣的:(windows,samba,ad,磁盘配额,域认证)