测试环境vmware
DC&DNS:Windows Server 2003 rc2 sp2 企业版. 计算机名为:DC myad.com 完整的计算机名为ms-aaaa ip:192.168.20.148
Linux:CentOS 5.1 hostname为localhost.localdomain ip: 192.168.20.170
域名:myad.com
2.试验目的:将Linux加入到Windows域,并实现Windows域帐户登陆Linux服务器.
3.准备工作:
a.在一台机器上安装Windows Server 2003 rc2 ,并升级为DC,同时集成DNS服务.用运行里dcpromo来设置ad活动目录和dns。
b.Linux的准备工作也很简单,主要是检查以下几个包是否被安装:
#rpm -qa|grep samba
samba-3.0.23c-2
#rpm -qa|grep samba
samba-3.0.23c-2
samba-common-3.0.23c-2
samba-client-3.0.23c-2 //samba的相关包
#rpm -qa|grep krb5
krb5-libs-1.5-17
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用系统的setup配置也可以用vi /etc/sysconfig/network-script/ifcfg-eth0和dns用vi /etc/resolv.conf.但是要注意防火墙(iptables)和SELinux.
你可以把iptables规则清空,并禁用SELinux
清空iptables规则命令如下:
#iptables -F
禁用SELinux方式如下:cli下用setup命令配置
禁用SELinux方式如下:cli下用setup命令配置
#vi /etc/selinux/config
将其中的 SELINUX=enforcing
改成 SELINUX=disable
b.修改/etc/krb5.conf文件,该文件是kerberos的配置文件, Kerberos 是大小写敏感的。
b.修改/etc/krb5.conf文件,该文件是kerberos的配置文件, 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 = MYAD.COM//修改windows的dc
ticket_lifetime = 24000
dns_lookup_realm = false
dns_lookup_kdc = false
default_realm = MYAD.COM//修改windows的dc
ticket_lifetime = 24000
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
MYAD.COM = {
kdc = ms-aaaa.myad.com:88
admin_server = ms-aaaa.myad.com:749
default_domain = myad.com
}
MYAD.COM = {
kdc = ms-aaaa.myad.com:88
admin_server = ms-aaaa.myad.com:749
default_domain = myad.com
}
[domain_realm]
.myad.com = MYAD.COM
myad.com = MYAD.COM
.myad.com = MYAD.COM
myad.com = MYAD.COM
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
profile = /var/kerberos/krb5kdc/kdc.conf
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
其中需要我们修改的地方很少,以我的例子为例,修改后的文件如下:
修改完毕后运行下面的命令查看kerberos文件是否有误:
kinit [email protected]
能遇到的几个常见错误:域名错误:
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
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
其中administrator是域管理员账户,MYAD.COM是你的域名.
回车键后,会提示你输入密码,如果没有什么错误.在你输入密码回车后,会自动返回到Linux命令提示符下.
在这里要注意的小问题就是Linux本地的时间要和DC的时间差问题,我们都知道,在DC上的策略中,时间差允许的范围是5分钟,所以,在运行上述的命令前,最好先同步下Linux和DC的时间:
ntpdate 192.168.20.148
c.这一步是最主要的步骤了,就是修改/etc/samba/smb.conf配置文件.samba的主配置文件选项很多,在加上各版本中默认的选项都有所差异,在这里我就不列举典型的smb.conf文件了,我的smb.conf文件帖出来顺便介绍一下smb.conf文件中参数的意思!
其中MyShare指定共享名,一般就是【网上邻居】里面可以看见的文件夹的名字。
comment 是对修改共享的备注。
path 指定共享的路径,可以配合Samba变量使用。例如可以指定path=/data/%m,这样如果一台计算机的NetBIOS名字是grind,它访问MyShare共享时就是进入/data/grind目录,而对于NETBIOS名是glass的计算机,则进入/data/glass目录。
allow hosts和deny hosts 和前面的全局设置的方法一样。
writeable 指定目录默认是否可写,也可以用readonly = no来设置可写。
user 设置所有可能使用该共享资源的用户,也可以用@group代表group组的所有成员,不同的项目之间用空格或逗号隔开。
valid users 能够使用该共享资源的用户和组。
invalid users 不能够使用该共享资源的用户和组。
read list 只能读取该共享资源的用户和组。
write list 能读取和写入该共享资源的用户和组。
admin list 能管理该共享资源(包括读写和权限赋予等)的用户和组。
public 该共享资源是否能被用户账号访问,这个开关有时候也叫guest ok,所以有的配置文件中出现guest ok = yes,其实和public = yes是一样的。
hide dot files 是否像UNIX那样隐藏以“.”号开头的文件。
create mode 新建立的文件的属性,一般是0755。
directory mode 新建立的目录的属性,一般是0755。
sync always 对该共享资源进行写操作后是否进行同步操作。
short preserve case 忽略文件名大小写。
preserve case 保持大小写。
case sensitive 是否区分大小写,一般选no,不然可能引起错误。
mangle case 混合大小写。
default case 默认的文件名是全部大写还是小写。
force user 强制建立文件的属主。如果有一个目录,让guest可以写,那么guest就可以删除,如果使用force user= grind强制建立文件的属主是grind,同时限制create mask = 0755,这样guest就不能删除该目录了。
wide links 是否允许共享外符号连接,比如共享资源里有个连接指向非共享资源里的文件或目录,如果设置wide links = no将使该连接无法使用。
max connections = n 设置同时连接数是n。
delete readonly 能否删除共享资源里面已经被定义为只读的文件。
comment 是对修改共享的备注。
path 指定共享的路径,可以配合Samba变量使用。例如可以指定path=/data/%m,这样如果一台计算机的NetBIOS名字是grind,它访问MyShare共享时就是进入/data/grind目录,而对于NETBIOS名是glass的计算机,则进入/data/glass目录。
allow hosts和deny hosts 和前面的全局设置的方法一样。
writeable 指定目录默认是否可写,也可以用readonly = no来设置可写。
user 设置所有可能使用该共享资源的用户,也可以用@group代表group组的所有成员,不同的项目之间用空格或逗号隔开。
valid users 能够使用该共享资源的用户和组。
invalid users 不能够使用该共享资源的用户和组。
read list 只能读取该共享资源的用户和组。
write list 能读取和写入该共享资源的用户和组。
admin list 能管理该共享资源(包括读写和权限赋予等)的用户和组。
public 该共享资源是否能被用户账号访问,这个开关有时候也叫guest ok,所以有的配置文件中出现guest ok = yes,其实和public = yes是一样的。
hide dot files 是否像UNIX那样隐藏以“.”号开头的文件。
create mode 新建立的文件的属性,一般是0755。
directory mode 新建立的目录的属性,一般是0755。
sync always 对该共享资源进行写操作后是否进行同步操作。
short preserve case 忽略文件名大小写。
preserve case 保持大小写。
case sensitive 是否区分大小写,一般选no,不然可能引起错误。
mangle case 混合大小写。
default case 默认的文件名是全部大写还是小写。
force user 强制建立文件的属主。如果有一个目录,让guest可以写,那么guest就可以删除,如果使用force user= grind强制建立文件的属主是grind,同时限制create mask = 0755,这样guest就不能删除该目录了。
wide links 是否允许共享外符号连接,比如共享资源里有个连接指向非共享资源里的文件或目录,如果设置wide links = no将使该连接无法使用。
max connections = n 设置同时连接数是n。
delete readonly 能否删除共享资源里面已经被定义为只读的文件。
[global]
workgroup = MYAD//这个是你域名MYAD.COM点前面的东东。 //需要加入的域的netbios名,注意是域的netbios名,要大写
netbios name = centos //本机器的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
max log size = 50
security = ads //ads验证方式必须有realm项
realm = MYAD.COM //增加这一行,注意这里是域名.
password server = ms-aaaa.myad.com //这里是DC的FQDN,也可以写ip,但是有时候会出
问题,建议写FQDN
password server = ms-aaaa.myad.com //这里是DC的FQDN,也可以写ip,但是有时候会出
问题,建议写FQDN
encrypt passwords = yes //加密在网络上传输的用户密码
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
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
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 //也可以用ntsysv来开机启动
#chkconfig winbind on//也可以用ntsysv来开机启动。
然后重启samba服务:
# service smb restart //写到这里,我想起一点好玩的事来, 在fedora 9中(其他版本我不知道),
smb和nmb服务是分开的,也就是说你用这条命令只能重启动smb,不能重
启nmb,你还要打service nmb restart才行.....
启nmb,你还要打service nmb restart才行.....
然后就可以加入域了:
net ads join -W MYAD.COM -S dc -U administrator
然后会要求你输如管理员的password,输入后,正常情况下会提示加入域成功.
在这里我插一句,有时候用net ads join 会不好使,这时候就试试net rpc join 这种方式.
到这里,我们就已经把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
据我理解,这些应该是在加入域过程中,产生的一些缓存
文件,但是有时候这些缓存会造成一些错误信息,就象我们刚才看到的那样,删除后,重启服务,让他重新
生成就行了.
文件,但是有时候这些缓存会造成一些错误信息,就象我们刚才看到的那样,删除后,重启服务,让他重新
生成就行了.
fedora10 会稍有不同,目录我记不太清楚了,好像是 /var/lib/samba 你可以用命令搜索下:
find / -name *.tdb
删除完成后,重新启动 smb服务.
service smb start
在次运行加入域的命令:
net ads join -W MYAD.COM -S dc -U administrator
重启动winbind服务.
service winbind start
然后在用命令查看信息就OK了.
到这里呢,我们的samba服务器就成功的加入到域里了,但是呢,却还不能实现域账户在Linux终端上的登陆.想要实现这个目的,其实也很简单,只需要修改下面几个文件就可以了:
/etc/nsswitch.conf //修改这个文件,影响Linux查找用户,组,和他们密码的行为
修改项如下:
passwd: winbind files
shadow: winbind files
group: 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
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
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
session required /lib/security/$ISA/pam_unix.so
修改完毕后,根据上面smb.conf文件的配置,我们就可以实现用户的登陆了,不过还有一点要说明,就是在用户登陆前,必须手动创建他们的登陆主目录,并且赋予他们完全控制的权限.
比如,我想让administrator用户登陆Linux,实现步骤如下:
cd /home
mkdir MYAD
cd MYAD
mkdir administrator
chown administrator administrator //在home目录下创建YANCHUN域目录,并在该目录下创建
要登陆用户administrator的目录,更改目录权限.
要登陆用户administrator的目录,更改目录权限.
这样在终端上就可以实现域用户账户的登陆了.
还有就是用户登陆Linux平台后,权限控制的问题.默认情况下,这种方式登陆到Linux平台的用户只有对自己主目录有完全控制权限,其余的文件均为只读.
可以通过下面的方法来实现对域用户权限的控制:
1.更改/etc/nsswitch.conf文件.
passwd: winbind files
shadow: files winbind
group: 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. net rpc join 和 net ads join 命令在作用上有什么区别.
2. 有时候配置文件没有错,但是在加入域时会提示错误信息,如NT_STATUS开头的一些错误信息,具体是什么原因,还望有高手指教.我在网上搜索相关错误提示的帖子,也没有能找到真正解决问题的方法.
NT_STATUS_ACCESS_DENIED (0xc0000022)
NT_STATUS_NO_TRUST_SAM_ACCOUNT (0xc000018b)
NT_STATUS_INVALID_COMPUTER_NAME
NT_STATUS_NO_TRUST_SAM_ACCOUNT (0xc000018b)
NT_STATUS_INVALID_COMPUTER_NAME
3.有时候会出现unable to find a suitable server .提示找不到合适的服务器,不知道问题出在什么地方.
4.另外,我还有一种想法,能不能在Linux上搭建LDAP服务,然后用他去同步Windows的活动目录数据库,然后激活samba的LDAP数据库认证功能,实现域用户账户访问samba服务器的认证问题.有做过相关试验的朋友请给小弟一点指点.感激不尽.
5.至于自动为登陆Linux平台的域用户创建宿主目录,和自动加入某一Linux本地组,等我熟了SHELL编程在说吧,呵呵~
6.有时候会出现类似于Winbind服务启动起来后,显示该服务已经假死的现象,这时候可以通过查找/var/log/messages或者/etc/log/samba/winbind.log查找相关的错误信息。我碰到过的一个问题是:Winbind Dead but subsys lock的东东,解决办法是关闭SELinux就可以了,针对这个问题在相关的日志错误信息中显示的是:open secrets.tdb error。据我个人理解,应该是SELinux的开启造成了Winbind无法访问/etc/samba/secrets.tdb文件的缘故,只要disable SELinx 重启计算机后,应该就可以正常的启动和停止Winbind服务了。
磁盘配额
在/etc/fstab中加入
LABEL=/ / ext3 defaults,usrquota,grpquota 1 1
启动磁盘配额(重启后仍有效)
touch /aquota.group
touch /aquota.user
chmod 644 /aquota.group
chmod 644 /aquota.user
/sbin/quotacheck –avugm
/sbin/quotaon –avug
设定test用户的配额为 20M(1000用户共用20000M)
setquota -u test 20000 20000 0 0 /
repquota –a
在/etc/fstab中加入
LABEL=/ / ext3 defaults,usrquota,grpquota 1 1
启动磁盘配额(重启后仍有效)
touch /aquota.group
touch /aquota.user
chmod 644 /aquota.group
chmod 644 /aquota.user
/sbin/quotacheck –avugm
/sbin/quotaon –avug
设定test用户的配额为 20M(1000用户共用20000M)
setquota -u test 20000 20000 0 0 /
repquota –a