- 论坛徽章:
- 0
|
小弟搞了几天samab集成AD验证+磁盘配额,在网上找了很多前辈的文章和帖子,觉得写的个有千秋。做起来也遇到了不少问题。
小弟不才,把各位前辈的文章总结了一下,中间夹杂了一下我自己在实施过程中遇到的问题。希望大家不要拍砖。同时也是为这个论坛做点自己的贡献。毕竟在这里吸取了许多养分。
进入正题:
1.测试环境:
DC&DNS:Windows Server 2003 sp2 企业版. 计算机名为:hq-dc-01.test.com ip:10.168.168.226
客户机:Red Hat Enterprise Linux ES5.4 hostname为sharefile ip: 10.168.165.250
域名:test.com
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 = TEST.COM //改成你的域名
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
TEST.COM = { //改成你的域名
kdc = 10.168.168.226:88 //改成你DC的FQDN或者是IP,两者没什么区别
admin_server = 10.168.168.226:749
default_domain = test.com //改成你的域名,注意和上面的不同.(大小写)
}
[domain_realm]
.test.com = TEST.COM
test.com = TEST.COM //接着改
[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@TEST.COM
其中administrator是域管理员账户, TEST.COM 是你的域名.
回车键后,会提示你输入密码,如果没有什么错误.在你输入密码回车后,会自动返回到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 = TEST.COM //增加这一行,注意这里是域名.
password server = hq-dc-01.test.com //这里是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 TEST.COM -S dc -U administrator
然后会要求你输如管理员的password,输入后,正常情况下会提示加入域成功.
在这里我插一句,有时候用net ads join 会不好使,这时候就试试net rpc join –S TEST.COM –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.自动创建用户目录
细心的朋友可能发现从开篇一直到现在除了操作方式不一定以外,所做的事情和<<linux加入windows域之完美方案>>没有太大的区别。嗯,笔者不置可否,估且这么理解吧。希望有点小细节您注意到了,在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的机器上,用域用户登陆,然后访问\\192.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为模板给用户设置磁盘限额。这样写在脚本里,不但省去了手工执行,新添加用户也不怕了J
8.域用户登陆自动挂载自己的共享文件夹
嘿嘿,能做到这步,已经很不容易了,如果你做到了,那么恭喜你,因为终点就在眼前了。到这一步,你已经成功完成了samba通过ad域进行验证,并给验证用户分配500M的固定空间,现在就让我们一鼓作气,将这个优雅的高难度动作画个完美的句号吧J
我们知道windows有个“映射网络驱动器”的功能。今天用到的东东就是它。其实原理很简单,就是我们写个批处理,这个批处理的功能是获得登陆用户的用户名,然后去连接共享。而用户登陆的时候就自动执行这个批处理。是不是很好玩呢?
这个操作在域服务器上进行。在服务器上有个路径C:\WINDOWS\SYSVOL\sysvol\rainbird.net\scripts,把你想要域用户登陆执行的脚本放在这个文件里就可以了
终结:在操作中几个点要注意
如果没有验证用户及samba配置文件没有写对可能导致smb和winbind服务重启,请认真检查配置文件
在建共享目录时候一定要注意新建目录的用户权限和组权限。 |
|