samab集成AD验证 磁盘配额

这是我工作的实例, 每个步骤我都做过测试. 我碰到的问题, 我都会罗列出来, 有的并未解决, 欢迎各位高手多多指点.1. 测试环境:DC&DNS:Windows Server 2003 sp2 企业版

这是我工作的实例, 每个步骤我都做过测试. 我碰到的问题, 我都会罗列出来, 有的并未解决, 欢迎各位高手多多指点.

1. 测试环境:

DC&DNS:Windows Server 2003 sp2 企业版. 计算机名为:hq-dc-01.resoft.css.com.cn ip :10.168.168.226

客户机:Red Hat Enterprise Linux ES5.4 hostname为sharefile ip: 10.168.165.250

域名:resoft.css.com.cn

2. 试验目的:将Linux 加入到Windows 域, 并实现Windows 域帐户登陆Linux 服务器.

3. 准备工作:

a. 在一台机器上安装Windows Server 2003 ,并升级为DC, 同时集成DNS 服务.

b.Linux的准备工作也很简单, 主要是检查以下几个包是否被安装:

samba-3.0.23c-2

samba-common-3.0.23c-2

samba-client-3.0.23c-2 //samba的相关包

krb5-libs-1.5-17

krb5-workstation-1.5-17

krb5-devel-1.5-17

pam_krb5-2.2.11-1 //kerberos相关的软件包

主要就用到这些包, 由于各Linux 发行版本的不同, 包的版本或许会有差异.

4. 配置步骤:

a. 修改ip 和dns 我就不做介绍了. 但是要注意防火墙(iptables)和SELinux.

你可以把iptables 规则清空, 并禁用SELinux.

清空iptables 规则命令如下:

iptables -F

禁用SELinux 方式如下:

vi /etc/selinux/config

将其中的 SELINUX=enforcing

改成 SELINUX=disable

b. 修改/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]

default_realm = EXAMPLE.COM

dns_lookup_realm = false

dns_lookup_kdc = false

[realms]

EXAMPLE.COM = {

kdc = kerberos.example.com:88

admin_server = kerberos.example.com:749

default_domain = example.com

,

}

[domain_realm]

.example.com = EXAMPLE.COM

example.com = EXAMPLE.COM

[kdc]

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

[appdefaults]

pam = {

debug = false

ticket_lifetime = 36000

renew_lifetime = 36000

forwardable = true

krb4_convert = false

}

其中需要我们修改的地方很少, 以我的例子为例, 修改后的文件如下:

[logging]

default = FILE:/var/log/krb5libs.log

kdc = FILE:/var/log/krb5kdc.log

admin_server = FILE:/var/log/kadmind.log

[libdefaults]

default_realm = RESOFT.CSS.COM.CN //改成你的域名

dns_lookup_realm = false

dns_lookup_kdc = false

[realms]

RESOFT.CSS.COM.CN = { //改成你的域名

kdc = 10.168.168.226:88 //改成你DC 的FQDN 或者是IP , 两者没什么区别 admin_server = 10.168.168.226:749

default_domain = resoft.css.com.cn //改成你的域名,注意和上面的不同.(大小写) }

[domain_realm]

.resoft.css.com.cn = RESOFT.CSS.COM.CN

resoft.css.com.cn = RESOFT.CSS.COM.CN //接着改

[kdc]

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

[appdefaults]

pam = {

debug = false

ticket_lifetime = 36000

renew_lifetime = 36000

forwardable = true

krb4_convert = false

}

,

修改完毕后运行下面的命令查看kerberos 文件是否有误:

kinit

其中administrator 是域管理员账户, RESOFT.CSS.COM.CN 是你的域名.

回车键后, 会提示你输入密码, 如果没有什么错误. 在你输入密码回车后, 会自动返回到Linux 命令提示符下.

在这里要注意的小问题就是Linux 本地的时间要和DC 的时间差问题, 我们都知道, 在DC 上的策略中, 时间差允许的范围是5分钟, 所以, 在运行上述的命令前, 最好先同步下Linux 和DC 的时间:

ntpdate 192.168.255.1

或者直接更改系统时间

date -s 年/月/日 时:分:秒

c. 这一步是最主要的步骤了,就是修改/etc/samba/smb.conf配置文件.samba 的主配置文件选项很多, 在加上各版本中默认的选项都有所差异, 在这里我就不列举典型的smb.conf 文件了, 我只把我的smb.conf 文件帖出来, 以供各位参考:

[global]

workgroup = SHAREFILE //需要加入的域的netbios 名, 注意是域的netbios 名, 要大写

netbios name = Linux //本机器的netbios 名, 有的版本没有这一项会没有这个, 要手动添加

server string = Samba Server //对该服务器的描述

printcap name = /etc/printcap

load printers = yes

cups options = raw

log file = /var/log/samba/m.log

max log size = 50

security = ads //ads验证方式必须有realm 项

realm = RESOFT.CSS.COM.CN //增加这一行, 注意这里是域名.

password server = hq-dc-01.resoft.css.com.cn //这里是DC 的FQDN, 也可以写ip, 但是有时候会出问题, 建议写FQDN

encrypt passwords = yes //加密在网络上传输的用户密码

socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

dns proxy = no

winbind separator = / //用户的域名和用户名之间的间隔, 用什么随你心情 idmap uid = 1000000-2000000

idmap gid = 1000000-2000000 //域用户映射成Linux 本地用户时所有的uid 和gid 范围.

template home = /home/D/U //与home 文件夹中定义的作用相同. 两者定义一个就行

template shell = /bin/bash //用户登陆后所使用的shell

winbind use default domain = yes //用户登陆使用默认的域

winbind enum users = yes

,

winbind enum groups = yes //有人说是自动创建用 getent passwd[group]看到的 用户和组的信息. 具体有什么用, 我也说不清楚

[homes]

comment = Home Directories

browseable = no

writable = yes

create mode = 0777

directory mode = 0777 //创建的文件和目录的默认权限

path = /home/D/U //用户主目录的相关设置

[printers]

comment = All Printers

path = /var/spool/samba

browseable = no

guest ok = no

writable = no

printable = yes

以上红色的部分都是要修改的, 其余的都保持默认就行. 好了,修改完成后, 保存退出. 然后用下面的命令测试 smb.conf 是否有误:

testparm

显示的结果如下

:

在这里注意两个地方就行, 一个是 Loaded services file OK. //说明你的配置文件没有错 还有一个就是:Server role:ROLE_DOMAIN_MEMBER //说明你的服务器已经是域的

" 准" 成员了.

好了, 做了这些测试后, 先把smb 和winbind 两个服务开启成随系统自动启动:

chkconfig smb on

chkconfig winbind on

然后重启samba 服务:

service smb restart //写到这里, 我想起一点好玩的事来, 在fedora 9中(其他版本我不知道),

smb 和nmb 服务是分开的, 也就是说你用这条命令只能重启动smb, 不能重 启nmb, 你还要打service nmb restart才行.....

然后就可以加入域了:

,

net ads join -W RESOFT.CSS.COM.CN -S dc -U administrator

然后会要求你输如管理员的password, 输入后, 正常情况下会提示加入域成功.

在这里我插一句, 有时候用net ads join 会不好使, 这时候就试试net rpc join –S RESOFT.CSS.COM.CN –U administrator 这种方式.

到这里, 我们就已经把samba 服务器加入到域里了, 这时, 在DC 上,computers 这个OU 里就应该可以看到你的samba 服务器了

.

这时, 我们重启winbind 服务:

service winbind restart

重启完成后,我们就可以用下面的几条命令来进行测试了:

wbinfo -t //测试该samba 服务器与域的信任关系

wbinfo -u // 查看域用户的映射信息

wbinfo -g

有时候会出现这样的错误信息, 解决办法如下:

先停掉winbind 和smb 服务:

service smb stop

service winbind stop

然后删除下面两个目录里的.tdb 文件: /etc/samba 和 /var/cache/samba

据我理解, 这些应该是在加入域过程中,产生的一些缓存

文件, 但是有时候这些缓存会造成一些错误信息, 就象我们刚才看到的那样,删除后, 重启服务, 让他重新

生成就行了.

fedora9 会稍有不同, 目录我记不太清楚了,好像是 /var/lib/samba 你可以用命令搜索下: find / -name *.tdb

,

删除完成后, 重新启动 smb服务.

service smb start

在次运行加入域的命令:

net ads join -W 域名 -S DCFQDN -U administrator

如果上面的不行 可以用 net rpc join –S DCFQDN –U administrator

重启动winbind 服务.

service winbind start

然后在用命令查看信息就OK 了

.

到这里呢, 我们的samba 服务器就成功的加入到域里了,但是呢, 却还不能实现域账户在Linux 终端上的登陆. 想要实现这个目的, 其实也很简单,只需要修改下面几个文件就可以了: /etc/nsswitch.conf //修改这个文件, 影响Linux 查找用户, 组, 和他们密码的行为 修改项如下:

passwd: winbind files

shadow: winbind files

group: winbind files

/etc/pam.d/sysconfig-auth //让pam 认证支持以winbind 为源进行用户的查找和匹对. 修改项如下:

auth sufficient /lib/security/pam_winbind.so //增加这一行

auth required /lib/security/$ISA/pam_env.so

auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok

auth required /lib/security/$ISA/pam_deny.so

,

auth sufficient /lib/security/pam_winbind.so

account sufficient /lib/security/pam_winbind.so //增加这一行, 注意这两行的位置 account required /lib/security/$ISA/pam_unix.so

account sufficient /lib/security/$ISA/pam_succeed_if.so uid < 100 quiet

account required /lib/security/$ISA/pam_permit.so

password requisite /lib/security/$ISA/pam_cracklib.so retry=3

password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow password required /lib/security/$ISA/pam_deny.so

session required /lib/security/$ISA/pam_limits.so

session required /lib/security/$ISA/pam_unix.so

修改完毕后, 根据上面smb.conf 文件的配置, 我们就可以实现用户的登陆了,不过还有一点要说明, 就是在用户登陆前,必须手动创建他们的登陆主目录, 并且赋予他们完全控制的权限. 比如, 我想让administrator 用户登陆Linux, 实现步骤如下:

cd /home

mkdir RESOFT

cd RESOFT

mkdir administrator

chown administrator administrator //在home 目录下创建RESOFT 域目录, 并在该目录下创建

要登陆用户administrator 的目录,更改目录权限.

这样在终端上就可以实现域用户账户的登陆了.

还有就是用户登陆Linux 平台后, 权限控制的问题. 默认情况下, 这种方式登陆到Linux 平台的用户只有对自己主目录有完全控制权限, 其余的文件均为只读.

可以通过下面的方法来实现对域用户权限的控制:

1. 更改/etc/nsswitch.conf文件.

passwd: winbind files

shadow: files winbind

group: winbind files

细心的朋友也许已经注意到了这个文件与上面那个文件的不同. 就是shadow 的查找顺序. 为什么这么改, 呵呵,先卖个关子, 接着往下看.

2. 然后先把winbind 服务停掉.

建立与要登陆Linux 的域用户账户的同名Linux 账户.

3. 重启winbind 服务. 用域账户登陆. 这时会发现, 登陆后域用户的登陆点不是在/home/D/U下了, 而是在/home/U下. 为什么呢?

这是因为nsswitch.conf 文件影响的结果. 就是域用户在输入自己的登陆名时,Linux 系统并不认为是域用户, 而认为该用户是一个本地用户, 而shadow 项的设置, 是先去DC 进行密码的查询. 于是就造成了一种假象, 就是域用户用自己的用户名和密码登陆了Linux. 所以其登陆目录为/home/U.

既然,Linux 认为该登陆用户是一个本地用户, 那么我们就可以很方便的对他赋予权限了. 但是, 如果要登陆Linux 的用户非常多, 那么作为管理员, 我们的工作量会非常大, 这也是我下面要提出的用LDAP 想法的原因

,

1. 自动创建用户目录

细心的朋友可能发现从开篇一直到现在除了操作方式不一定以外,所做的事情和<>没有太大的区别。嗯,笔者不置可否,估且这么理解吧。希望有点小细节您注意到了,在smb.conf 中,有一句template shell = /sbin/nologin。是的,samba 服务器,我们只希望他提供samba 服务,不希望有用户登陆。在上一篇文章中解决用户登陆时主目录不存在的问题,用的是pam_mkhomedir.so 这个东东。在文件共享这块,笔者意外的发现,这个文件,对于通过samba 访问过来的请求不会创建主目录!这可如何是好?这就是脚本mkhome.sh 存在的原因。

新建立mkhome.sh 脚本:

#vi /root/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

更改文件权限设置:

# chmod 700 /home/mkhome.sh

这个脚本接受两个参数,一个是用户名,一个是组名。然后给这个用户创建目录,并分配权限,然后再给分配一下用户空间。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 的机器上,用域用户登陆,然后访问2.168.1.246,是不是看到了一个以你登陆的域用户名命名的一个文件夹呢?没错,就是它!你现在可以试下删写文件了。

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 –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 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 –u|xargs|edquota -p administrator –u 。这样我们就把administrator 这个用户的配额情况”分发”给了所有用户!还记得我们的mkhome.sh 吗?是的,就是它,里面有这第一句edquota -p administrator -u $user,这句话的意思就是以administrator 为模板给用户设置磁盘限额。这样写在脚本里,不但省去了手工执行,新添加用户也不怕了☺

8. 域用户登陆自动挂载自己的共享文件夹

嘿嘿,能做到这步,已经很不容易了,如果你做到了,那么恭喜你,因为终点就在眼前了。到这一步,你已经成功完成了samba 通过ad 域进行验证,并给验证用户分配500M 的固定空间,现在就让我们一鼓作气,将这个优雅的高难度动作画个完美的句号吧☺

我们知道windows 有个“映射网络驱动器”的功能。今天用到的东东就是它。其实原理很简单,就是我们写个批处理,这个批处理的功能是获得登陆用户的用户名,然后去连接共享。而用户登陆的时候就自动执行这个批处理。是不是很好玩呢?

,

这个操作在域服务器上进行。在服务器上有个路径C:WINDOWSSYSVOLsysvolrainbird.netscripts,把你想要域用户登陆执行的脚本放在这个文件里就可以了

终结:在操作中几个点要注意

如果没有验证用户及samba 配置文件没有写对可能导致smb 和winbind 服务无法重启 在建共享目录时候一定要注意新建目录的用户权限和组权限。

标签: