环境:
Linux:ubuntu server 11.04
Windows:Windows 2003 AD
ads模式涉及到Windows域网络中的Kerberos身份验证技术,除了需要配置主配置文件smb.conf外,还需要配置用于Kerberos身份认证的配置文件/etc/krb5.conf,用于控制Samba服务器Linux系统账户与Windows域账户交换的/etc/nsswitch.conf文件。还需要使用“net ads join -S”命令把Samba服务器加入到Windows AD域中。

第一步,安装所需的要软件包
apt-get install krb5-user
apt-get install winbind samba

第二步,修改/etc/krb5.conf (krb5-user软件包的配置文件)
在每一节中加入以下语句
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
# 指定Kerberos认证票证有效期
ticket_lifetime = 24000
#DOMAIN.INTERNAL是ad的后缀域名的大写
default_realm = DOMAIN.INTERNAL
# 指定无需DNS解析领域请求包
dns_lookup_realm = false
# 指定允许DNS解析kdc请求包
dns_lookup_kdc = ture
# 允许转发解析请求
forwardable = yes
[realms]
DOMAIN.INTERNAL = {
#domainserver.domain.internal是域控,还可以用IP的形式写,并加入端口号
#例如:kdc = 172.16.0.1:88/admin_server = 172.16.0.1:749
kdc = domainserver.domain.internal
admin_server = domainserver.domain.internal
default_domain = DOMAIN.INTERNAL
}
[domain_realm]
#domain.internal是ad的后缀域名
#设置一个领域搜索范围,并通过这两个语句可以使得领域名与大小写无关。
.domain.internal = DOMAIN.INTERNAL
domain.internal = DOMAIN.INTERNAL
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true # 允许转发请求
krb4_convert = false
}

第三步,修改/etc/samba/smb/conf,samba3的配置文件
[global]
security = ads
#设置允许的IP段
hosts allow = 192.168.1
encrypt passwords = yes
# 指定jeff用户作为来宾访问账户
guest account = jeff
#netbios name是linux的主机名
netbios name = ubuntu
#realm是在krb5.conf中定义的域名
realm = DOMAIN.INTERNAL
#password server就主域控,也可以写成IP地址
password server = domainserver.domain.internal
#workgroup是域的名字,不要后缀
workgroup = DOMAIN
#idmap id用来映射Linux用户到Windows用户SID,而且要确保这个id范围内没有被本地或者NIS用户占用,在winbind服务启动后,也不能在该ID范围内添加用户
idmap uid = 5000-10000000
idmap gid = 5000-10000000
#winbind将使用该分隔符来用户或组名。使用该配置将使得域用户表示为"MYDOMAIN+username",域组被表示为"MYDOMAIN+Domain Users"
winbind separator = +
#指定winbind服务是否能在系统上创建Windows域组或用户。
winbind enum users = yes
winbind enum groups = yes
winbind use default domain = yes
#用来指定为域用户产生主目录。其中%D代表域名,%U代表用户名
template homedir = /home/%D/%U
#控制samba在哪里寻找域用户的主目录。
template shell = /bin/bash
#当ad是win2003时必须要有以下两句
client use spnego = yes
domain master = no

第四步,配置名称解析,修改/etc/nsswitch.conf
Nsswitch.conf配置文件是用来控制在用户访问Samba服务器时与Windows域中DC中的用户账户的切换,使用DC中的用户账户来进行身份验证。Nsswitch.conf配置文件是在/etc目录下
按如下修改
passwd: compat winbind
group: compat winbind
shadow: compat
hosts: files dns wins
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis

第五步,配插PAM(入式验证模块)
编辑/etc/pam.d/common-account配置文件
只保留以下语句:
account sufficient pam_winbind.so
account required pam_unix.so
编辑/etc/pam.d/common-auth配置文件
只保留以下语句:
auth sufficient pam_winbind.so
auth required pam_unix.so nullok_secure use_first_pass
编辑/etc/pam.d/common-password配置文件
修改语句为:
password required pam_unix.so nullok obscure min=4 max=50 md5
编辑/etc/pam.d/common-session配置文件
确保有以下语句:
session required pam_mkhomedir.so umask=0022 skel=/etc/skel
session sufficient pam_winbind.so
session required pam_unix.so

第六步,建一个目录去保存域用户的家目录
目录的名字要与smb.conf中定义的WORKGROUP的值一样
例如:
mkdir /home/DOMAIN

第七步,初始化Kerberos,并把Linux加入Windows AD
kinit domain_admin_account@DOMAIN.INTERNAL
klist
#用户不用加后缀
net ads join -U domainadminuser
使用“wbinfo –u”可以在Samba服务器上查看域中现有的域用户账户,使用“wbinfo –g”命令可以查看域中现有的组账户。如果能列出这些账户出来,证明域加入真正成功了。用“wbinfo –t”命令确认Samba主机帐号在AD中正确注册。如果注册成功会有“checking the trust secret via RPC calls succeeded”的提示。

第九步,设置DNS
在Windows AD 的DNS上增加AD和Linux的正向和反向的主机记录,这一步不能少,少了会出现域用户无法打开Linux共享,提示没有权限的错误

第十步,重启samba服务
service smbd restart
service nmbd restart
/etc/init.d/winbind restart

第十一步,配置SUDO
1、在AD上建立一个叫UnixAdmins的组,并把需要使用sudo管理服务器的用户加入此组中
2、在linux中把UnixAdmins组加入到/etc/sudoers,使用户可以使用sudo
%UnixAdmins ALL = (ALL) ALL

最后一步,设置共享目录
编辑/etc/samba/smb.conf
[homes]
comment = Home Directories
browseable = no
writable = yes
path = /home/%U
valid users = %U
[share]
comment = All user's share directory
path = /usr/share
public = no
guest ok =yes
readonly = yes
[program]
comment = Program Files
path = /etc/program
# 指定该共享目录仅允许域网络中的administrtors组成员和alice用户访问
valid users = @administrator alice
public = no
writable = yes
[share01]
path = /home/TEST
#UnixAdmins:用户组,110110域用户名
valid users = @UnixAdmins 110110
public = no
writable = yes