SAMBA

samba是一个神奇的东西,本来在我看来这是一个文件共享服务,到官网去一查,查出了大麻烦

Samba是用于Linux和Unix的标准Windows互操作性程序套件。
 
Samba是根据GNU通用公共许可证许可的自由软件,Samba项目是Software Freedom Conservancy的成员。
 
自1992年以来,Samba便为使用SMB / CIFS协议的所有客户端(包括所有版本的DOS和Windows,OS / 2,Linux等)提供安全,稳定和快速的文件和打印服务。
 
Samba是将Linux / Unix服务器和桌面无缝集成到Active Directory环境中的重要组件。它既可以充当域控制器,也可以充当常规域成员

看到这里还没有什么,再来看看用户手册

User Documentation

呵呵,全是和AD DC相关的,我那个去,本着\color{rgb(255,0,0)}{没事找事} 的原则,我照着做了一遍,这才知道平时使用samba来共享一下文件是多么的幸福...

===================================

  • 先来说说文件共享

  • Centos 提供的rpm包

Red Hat Enterprise Linux / CentOS / Scientific Linux Version 7 and 8
Sambarpm软件包仅支持将Samba作为域成员和NT4 PDC或BDC。 Red Hat不提供用于将Samba作为AD DC运行的软件包。可以使用其它方式来安装:

  • 编译安装Samba. For details, see Build Samba from Source.
  • 从可信来源使用带有AD支持的第三方软件包。

  • 安装

yum insall samba
Setting up Samba as a Standalone Server

先看一个官方的配置文件。

[global]
        map to guest = Bad User

        log file = /var/log/samba/%m
        log level = 1

[guest]
        # This share allows anonymous (guest) access
        # without authentication!
        path = /srv/samba/guest/
        read only = no
        guest ok = yes

[demo]
        # This share requires authentication to access
        path = /srv/samba/demo/
        read only = no

创建目录
# mkdir -p /srv/samba/guest/
# mkdir -p /srv/samba/demo/
启动服务
systemctl start nmb.service
systemctl start smb.service
这时你就会发现共享可以访问了,

samba1.png

只是demo打不开,而且guest文件夹中也没有写权限

我们不是在上面写了read only = no吗?
这就是共享文件系统中都有的问题: \color{rgb(255,0,0)}{最终的权限=共享设置的权限 and 文件系统本身的权限}

[root@localhost ~]# ll -d /srv/samba/guest/
drwxr-xr-x. 2 root root 6 Oct 21 00:08 /srv/samba/guest/
[root@localhost ~]# chmod o+w /srv/samba/guest/
[root@localhost ~]# ll -d /srv/samba/guest/
drwxr-xrwx. 2 root root 6 Oct 21 00:08 /srv/samba/guest/

这样就OK了,guest 文件就有了写入的权限了(简单粗暴,生产中不要这么做)
为什么demo文件夹不能访问?
这是配置中没有 guest ok = yes

是不是觉得好简单,呵呵,怎么可能有这么简单的东西
以上搞定了一个共享,有了信心,下面好好来说说,打击一下

========================================

samba的基本架构

  • nmb
    NetBIOS名称服务器为客户端提供基于IP的NetBIOS命名服务
    开启该服务后,和windows通信可以基于netbios名进行,只要开启了nmb服务在windows的网络中就能发现这个服务器
  • smb
    UNIX的Windows AD和SMB / CIFS文件服务器
  • winbind-----加域后提供名称解析服务
    名称服务守护进程,用于从NT服务器解析名称
    当加域后,可用于从Windows NT服务器解析用户和组信息。该服务还可以通过关联的PAM模块提供身份验证服务。应当注意,由于域控制器已经执行了访问控制,因此帐户模块仅执行getpwnam()来验证系统是否可以为用户获取uid。
/etc/nsswitch.conf
passwd:         files winbind
"用户名的解析,先/etc/passwd文件,后使用winbind"
group:          files winbind
"组名的解析,先passwd文件,后使用winbind"
hosts:          files dns wins
"主机名的解析,/etc/hosts  --> dns  --> wins服务器"
  • smb.conf 配置文件
    整个Samba套件的配置文件

  • 用户

samba的用户,有两点要求

  • \color{rgb(200,0,255)}{用户必须是本地的系统用户}
  • \color{rgb(200,0,200)}{用户须加入到samba的用户中,才可以使用}
    \color{rgb(0,200,200)}{注意:加入samba用户数据库后,用户的samba密码是可以由samba独立管理 的}
    那这里你就要说了,上面不是没有将用户加入到samba中吗?怎么能访问呢?

这是由于系统的默认配置
Default: guest account = nobody 默认将guest访问,映射到系统nobody用户的访问
和我们设定的
map to guest = Bad User 使用无效密码的用户登录将被拒绝,除非用户名不存在,在这种情况下,它将被视为访客登录并映射到 guest account
共同作用的结果

所以上面的设定,是非常不安全的,除了自己玩玩,不建议使用,至少不能给写权限,但要是每次访问都要输入密码,这又会在工作中造成困难,特别是多个共享,又有不同的权限时,很多的用户都是记不住密码的,这时域就是一个好选择了

  • 用户加入到samba用户

[root@localhost ~]# rpm -ql samba-common-tools |less
/usr/bin/pdbedit
/usr/bin/smbpasswd
/usr/bin/testparm # 配置文件语法测试工具
...

pdbedit:

pdbedit:添加用户帐户,删除用户帐户,修改用户帐户,列出用户帐户,导入用户帐户。
-a: 添加一个用户到samba用户数据库中,一般要同 -u 一起使用,例如:
   pdbedit -a -u tom
  new password:
  retype new password
  加入时,会询问加入用户在samba中的密码
-x|--delete:
  从数据库中删除帐户。它需要使用-u指定的用户名。
  Example: pdbedit -x -u bob
-L: 查看用户,可以和-v一同使用查看更多信息
  pdbedit -L [-v]
-D: 可以指定,用户家目录映射到windows系统中的驱动器号。
  如将tom的家目录 /home/tom 映射到我的电脑中的 H:
  pdbedit -u tom -D "H:"
-S|--script script:
  添加或修改用户帐户时可以使用。它将指定用户的登录脚本路径。
  Example:-S "\\\\BERSERKER\\netlogon\\sorce.bat"
-p|--profile profile:
  它将指定用户的配置文件目录。
  Example:-p "\\\\BERSERKER\\netlogon"

[root@localhost ~]# pdbedit -L -u tom
tom:1003:
[root@localhost ~]# pdbedit -u tom -D "H:"
Unix username:        tom
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-2884529151-173602647-2571866911-1000
Primary Group SID:    S-1-5-21-2884529151-173602647-2571866911-513
Full Name:            
Home Directory:       \\localhost\tom
HomeDir Drive:        H:
Logon Script:         
Profile Path:         \\localhost\tom\profile
Domain:               LOCALHOST
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          Wed, 06 Feb 2036 23:06:39 CST
Kickoff time:         Wed, 06 Feb 2036 23:06:39 CST
Password last set:    Mon, 21 Oct 2019 18:27:28 CST
Password can change:  Mon, 21 Oct 2019 18:27:28 CST
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

smbpasswd --- 修改用户的SMB密码

smbpasswd [username]
  类似于系统中passwd的smb密码工具

\color{rgb(0,0,200)}{用户这块有这两个命令基本就可以进行一些简单的授权了}


  • 配置

这是一个大的话题。
smbd -b | grep "CONFIGFILE"
命令可得到smb.conf配置文件的路径
smb.conf(5) 官方参考,也就是man smb.conf
这个文档很好,内容也非常多,一次看完要把人搞疯,还好我们一般用到的并不多
我们来看一个小一点的,Centos rpm安装包,安装后提供了/etc/samba/smb.conf.example参考说明文件
...........
是不是很长,如果是官方的smb.conf就更要疯掉了,这个示例虽然不全,但基本够日常使用了。

这个文件中:
  • 使用“#”开头和“;”开头的都是注释
  • 整个配置文件分为两个部分
    • [global]
      全局配置部分
      这中间包括了nmb,smb,winbind的相关设置
      包括samba工作模式,是独立服务器、域成员、域控、打印服务器等等
    • [Share Definitions]
      共享设置部分
  • 可以使用内置变量
变量 说明
%U 会话用户名(客户端所需的用户名,不一定与他们获得的用户名相同)。
%G %U的主要组名称。
%h 运行Samba的Internet主机名。hostname
%m 客户端计算机的NetBIOS名称(非常有用)。
%L 服务器的NetBIOS名称。
%M 客户端计算机的Internet名称。hostname
%d 当前服务器进程的进程ID。
%I 客户端计算机的IP地址。
%J 客户端计算机的IP地址,用下划线代替冒号/点。
%i 客户端连接到的本地IP地址
%j 客户端连接到的本地IP地址,用下划线代替冒号/点。
%T 当前日期和时间。
%t 当前日期和时间,以不带冒号分割的最小格式显示。(YYYYYmmdd_HHMMSS)
%D 当前用户的域或工作组的名称。
%w Winbind分隔符。
%$(envvar) 环境变量envar的值。
%S 当前服务的名称(如果有)。当前服务名替换为%S。这在[homes]部分很有用。
%P 当前服务的根目录(如果有)。
%u 当前服务的用户名(如果有)。
%g %u的主要组名称。
%H %u给出的用户的主目录。
%N NIS主目录服务器的名称。这是从您的NIS auto.map条目获得的。如果尚未使用--with-automount选项编译Samba,则此值将与%L相同
%p 服务主目录的路径,该路径是从NIS auto.map条目获得的。 NIS auto.map条目分为%N:%p。
%a 远程计算机的体系结构。它目前可以识别Samba(Samba),Linux CIFS文件系统(CIFSFS),OS / 2,(OS2),Mac OS X(OSX),Windows for Workgroups(WfWg),Windows 9x / ME(Win95),Windows NT( WinNT),Windows 2000(Win2K),Windows XP(WinXP),Windows XP 64位(WinXP64),Windows 2003(包括2003R2)(Win2K3)和Windows Vista(Vista)。其他任何东西都将被称为未知。
%R 协议协商后选定的协议级别。它可以是CORE,COREPLUS,LANMAN1,LANMAN2,NT1,SMB2_02,SMB2_10,SMB2_22,SMB2_24,SMB3_00,SMB3_02,SMB3_10,SMB3_11或SMB2_FF之一。

下面一个一个的说:

  • 日志
    log file = /var/log/samba/log.%m
    max log size = 50
  • 认证
    • security =

      • AUTO(Default)
      • USER #因为这是最常见的设置,用于独立文件服务器或DC。guest将失效
      • DOMAIN #在这种模式下,Samba将充当Windows 域的成员
      • ADS #在这种模式下,Samba将充当ADS域中的域成员。
    • map to guest = Never

      • Never (Default) # 拒绝无效密码的用户登录请求。
      • Bad User # 使用无效密码的用户登录将被拒绝,除非用户名不存在,
             在这种情况下,它将被视为访客登录并映射到访客帐户。
    • guest account = nobody(Default) # 默认访客帐户映射到nobody用户

  • netbios
    workgroup = WORKGROUP # 工作组,客户端查询时服务器将显示在哪个工作组中。
    netbios name = MYCentos # NetBIOS名称,最大长度为15个字符。
  • 本地数据库(存储用户信息以及可能的组信息。)
    passdb backend = tdbsam
    • smbpasswd - 纯文本passdb后端。不要使用
    • tdbsam - 使用TDB数据库存储后端。(Default)
    • ldapsam - 基于LDAP的passdb后端。

  • 共享部分
    • [home] # 共享名,但它会被 %S 所重写(替代)
    • comment = Home Directories # 注解信息
    • valid users = %S, %D%w%S # 设置有效的用户
    • browseable = No #设置没有权限的人 能不能浏览
    • read only = No # 只读
    • guest ok = yes # 允许来宾访问,
    • write list = USER1, USER2, @USER... # read only=no,列表的用户、组都将有写权限
    • read list = # 与write list 相反
    • directory mask = 0755 (Default) # 默认只有文件属主能修改删除
    • hosts allow = # none (Default) # 主机白名单,例如:
      • hosts allow = 150.203. EXCEPT 150.203.6.66 # 允许150.203.0.0网段,除了150.203.6.66
      • hosts allow = 150.203.15.0/255.255.255.0 # 网段
      • hosts allow = lapland, arvidsjaur # 几个主机
      • hosts allow = @foonet # 允许NIS网络组“ foonet”中的主机
      • hosts allow = 150.203.5. myhost.mynet.edu.au
    • hosts deny = # none (Default) # 主机黑名单

OK,有了这些配置,也就可以配置一个独立的samba文件服务器了

=============================
看了这么多的配置,是不是很头疼,来,来,来,说点高兴的 sambaGUI
https://www.samba.org/samba/GUI/
这个页面提供了许多samba相关的图形程序

http://www.webmin.com/tgz.html
这个是一个功能非常多的系统管理界面
Webmin是用于Unix的系统管理的基于Web的界面,使用任何的Web浏览器,您都可以设置用户帐户,Apache,DNS,文件共享等等。 Webmin解除了手动编辑Unix配置文件(如/etc/passwd)的需要,使您可以从控制台或远程管理系统,是不是很强大,给两张图给有需要的参考

webmin1.png

samba2.png

=============================

是不是一下就觉得世界变得美好了,呵呵...

=============================

  • printers 打印机的共享

首先要安装CUPS来管理和驱动打印机

yum install cups
vim /etc/cups/cupsd.conf
-------------------------------------
Listen localhost:631
改为自己要监听的地址,如:
Listen 192.168.2.10:631

<Location />                                                                                                          
  Order Deny, ALlow
  Deny From All                                                                                        
  Allow From 192.168.2.*                                                                                              
</Location> 
<Location /admin>                                                                                                     
  Order Deny, ALlow
  Deny From All                                                                                        
  Allow From 192.168.2.99                                                                                                    
</Location>
启动服务
systemctl start cups.service

添加打印机

http://ip:631

编辑:smb.conf

[global]
        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw
        map to guest = bad user      #匿名登录
[printers]
        comment = All Printers
        path = /var/tmp
        printable = Yes
        create mask = 0600
        browseable = No
        read only = yes
        guest ok =yes

测试

=============================

注意:整个过程中都要考虑selinux、firewalld的权限问题

=============================

  • 编译安装,使用AD DC

  • 编译安装 需要的包

Red Hat Enterprise Linux 7 / CentOS 7 / Scientific Linux 7
Install the following packages to build Samba as an Active Directory (AD) domain controller (DC) on a minimal Red Hat Enterprise Linux 7, CentOS 7, or Scientific Linux 7 installation:

yum install attr bind-utils docbook-style-xsl gcc gdb krb5-workstation \
       libsemanage-python libxslt perl perl-ExtUtils-MakeMaker \
       perl-Parse-Yapp perl-Test-Base pkgconfig policycoreutils-python \
       python2-crypto gnutls-devel libattr-devel keyutils-libs-devel \
       libacl-devel libaio-devel libblkid-devel libxml2-devel openldap-devel \
       pam-devel popt-devel python-devel readline-devel zlib-devel systemd-devel \
       lmdb-devel jansson-devel gpgme-devel pygpgme libarchive-devel

为您的系统安装Python 3.x开发包(例如python3-devel,python36-devel或python3-dev)

yum install python36-devel python36-dns lmdb-devel

过程都是跟着## User Documentation的说明在做:

  1. Setting up Samba as an Active Directory Domain Controller
  • Samba作为AD DC支持:
    • 集成的LDAP服务器作为AD后端。
    • Heimdal Kerberos密钥分发中心(KDC)。
  • 安装前的准备工作:
    • 为您的AD DC选择一个的主机名。
    • 选择一个DNS,(为您的AD林选择一个DNS域。该名称还将用作AD Kerberos领域。)
    • 在DC上使用静态IP地址。
    • 禁用诸如resolvconf之类的工具,这些工具会自动更新/etc/resolv.conf DNS解析器配置文件。
    • 确认没有Samba进程正在运行。
      ps ax | egrep "samba|smbd|nmbd|winbindd"
    • 确认DC上的/ etc / hosts文件正确将标准域名(FQDN)和简短的主机名解析为DC的LAN IP地址。例如:
      127.0.0.1 localhost localhost.localdomain
      10.99.0.1 DC1.samdom.example.com DC1
    • 如果之前安装过samba
      • 删除 smb.conf 文件
        smbd -b | grep "CONFIGFILE"
         CONFIGFILE: /usr/local/samba/etc/samba/smb.conf
      • 从下面文件夹中,删除 *.tdb*.ldb 文件
        smbd -b | egrep "LOCKDIR|STATEDIR|CACHEDIR|PRIVATE_DIR"
         LOCKDIR: /usr/local/samba/var/lock/
         STATEDIR: /usr/local/samba/var/locks/
         CACHEDIR: /usr/local/samba/var/cache/
         PRIVATE_DIR: /usr/local/samba/private/
    • 删除 /etc/krb5.conf 文件
      rm /etc/krb5.conf

从干净的环境来开始,有助于防止混淆,并确保任何以前的Samba安装中的文件都不会与新的域DC安装混在一起。

  • 开始安装:
$ wget https://download.samba.org/pub/samba/stable/samba-x.y.z.tar.gz
$ tar -zxf samba-x.y.z.tar.gz
$ cd samba-x.y.z/
$ ./configure
$ make
$ sudo make install 
----
建议使用 ./configure --help 来查看一下 --enable/--disable and --with/--without options的参数
自己加上systemd相关的,可以生成systemd的服务脚本,安装在/usr/local/samba/lib/systemd/system/下,
cp 到/etc/systemd/system/下就可使用

不要忘记了PATH
export PATH=/usr/local/samba/bin/:/usr/local/samba/sbin/:$PATH
接着:
samba-tool domain provision --use-rfc2307 --interactive
这个有很多的参数,可以直接安官方的做

`# samba-tool domain provision --use-rfc2307 --interactive
Realm [SAMDOM.EXAMPLE.COM]: SAMDOM.EXAMPLE.COM
Domain [SAMDOM]: SAMDOM
Server Role (dc, member, standalone) [dc]: dc
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: SAMBA_INTERNAL
DNS forwarder IP address (write 'none' to disable forwarding) [10.99.0.1]: 8.8.8.8
Administrator password: Passw0rd
Retype password: Passw0rd
Looking up IPv4 addresses
Looking up IPv6 addresses
No IPv6 address will be assigned
Setting up share.ldb
Setting up secrets.ldb
Setting up the registry
Setting up the privileges database
Setting up idmap db
Setting up SAM db
Setting up sam.ldb partitions and settings
Setting up sam.ldb rootDSE
Pre-loading the Samba 4 and AD schema
Adding DomainDN: DC=samdom,DC=example,DC=com
Adding configuration container
Setting up sam.ldb schema
Setting up sam.ldb configuration data
Setting up display specifiers
Modifying display specifiers
Adding users container
Modifying users container
Adding computers container
Modifying computers container
Setting up sam.ldb data
Setting up well known security principals
Setting up sam.ldb users and groups
Setting up self join
Adding DNS accounts
Creating CN=MicrosoftDNS,CN=System,DC=samdom,DC=example,DC=com
Creating DomainDnsZones and ForestDnsZones partitions
Populating DomainDnsZones and ForestDnsZones partitions
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba 4 has been generated at /usr/local/samba/private/krb5.conf
Setting up fake yp server settings
Once the above files are installed, your Samba4 server will be ready to use
Server Role: active directory domain controller
Hostname: DC1
NetBIOS Domain: SAMDOM
DNS Domain: samdom.example.com
DOMAIN SID: S-1-5-21-2614513918-2685075268-614796884

我的执行和这个有点不一样,显示了一大堆的python执行,最后的SID出现就好。
这里注意,使用的DNS backend 是SAMBA_INTERNAL这个samba内建的dns。官方建议的:BIND9_DLZSAMBA_INTERNAL
下面继续说内建的:

  • 编辑/etc/resolv.conf文件,设置dns服务器为自己

search samdom.example.com
nameserver 10.99.0.1

  • 配置Kerberos

cp /usr/local/samba/private/krb5.conf /etc/krb5.conf

  • 创建 systemd 脚本

vim /etc/systemd/system/samba.service
[Unit]
Description=Samba Active Directory Domain Controller
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/samba/sbin/samba -D
PIDFile=/usr/local/samba/var/run/samba.pid
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target

systemctl daemon-reload

  • 启动 samba
    systemd start samba

验证

  • 验证文件服务
$ smbclient -L localhost -U%
Domain=[SAMDOM] OS=[Unix] Server=[Samba x.y.z]

        Sharename       Type      Comment
        ---------       ----      -------
        netlogon        Disk      
        sysvol          Disk      
        IPC$            IPC       IPC Service (Samba x.y.z)
Domain=[SAMDOM] OS=[Unix] Server=[Samba x.y.z]

        Server               Comment
        ---------            -------

        Workgroup            Master
        ---------            -------
=================================================
"身份验证":要验证身份验证,使用域管理员帐户连接到netlogon共享:
$ smbclient //localhost/netlogon -UAdministrator -c 'ls'
Enter Administrator's password: 
Domain=[SAMDOM] OS=[Unix] Server=[Samba x.y.z]
 .                                   D        0  Tue Nov  1 08:40:00 2016
 ..                                  D        0  Tue Nov  1 08:40:00 2016

               49386 blocks of size 524288. 42093 blocks available
  • 验证DNS服务
$ host -t A dc1.samdom.example.com.
dc1.samdom.example.com has address 10.99.0.1
$ host -t SRV _ldap._tcp.samdom.example.com.
_ldap._tcp.samdom.example.com has SRV record 0 100 389 dc1.samdom.example.com.
$ host -t SRV _kerberos._udp.samdom.example.com.
_kerberos._udp.samdom.example.com has SRV record 0 100 88 dc1.samdom.example.com.
  • 验证Kerberos
$ kinit administrator
Password for administrator@SAMDOM.EXAMPLE.COM:
==================================================
$ klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@SAMDOM.EXAMPLE.COM

Valid starting       Expires              Service principal
01.11.2016 08:45:00  12.11.2016 18:45:00  krbtgt/SAMDOM.EXAMPLE.COM@SAMDOM.EXAMPLE.COM
    renew until 02.11.2016 08:44:59

=============================================

如果以上的没有问题,那就可以试试加

最后可以提一下的是:
可以从Windows管理Active Directory(AD),使用Microsoft远程服务器管理工​​具(RSAT)。
Installing RSAT

好了,域这个东西太复杂了,有时间慢慢看。

=============================

更多扩展阅读

=============================

  • linux加入windows AD 进行身份验证
    这是一篇 TechNet杂志 上2008.12月的文章,非常好

Authenticate and Integrate Linux with Active Directory
Windows 身份验证
 
Windows 推出集成网络身份验证和单一登录系统至今已有一段时间了。在 Windows 2000 之前,Windows NT 域控制器 (DC) 使用 NT LAN Manager (NTLM) 协议为 Windows 客户端提供身份验证服务。虽然 NTLM 不像当初想象的那样安全,但它还是非常有用的,因为它完美地解决了需要在网络上跨多个服务器维护重复用户帐户的问题。
 
自 Windows 2000 开始,Microsoft 便从 NTLM 移到了 Active Directory 及其集成 Kerberos 身份验证服务。与 NTLM 相比,Kerberos 更安全,而且更适合调整。此外,Kerberos 更是 Linux 和 UNIX 系统早已采纳的行业标准,从而为这些平台打开了与 Windows 集成的大门。
 
Linux 身份验证
 
Linux(以及在其上面运行的 GNU 工具和库)当初并不是以单一身份验证机制的设计理念进行构建的。因此,Linux 应用程序开发人员就逐渐养成了一种习惯,即创建他们自己的身份验证方案。他们设法通过在 /etc/passwd(包含 Linux 用户凭据的传统文本文件)中查询名称和密码哈希,或者提供截然不同(和个别)的机制,来实现这一目标。
 
由此产生了很多身份验证机制,以至于无法对其进行管理。1995 年,Sun 提出了称为“可插入身份验证模块”(Pluggable Authentication Modules, PAM) 的机制。PAM 提供了一组所有应用程序开发人员都可以使用的通用身份验证 API,以及管理员配置的后端,允许多种“可插入”身份验证方案。通过使用 PAM API 进行身份验证以及使用 Name Server Switch (NSS) API 来查询用户信息,Linux 应用程序开发人员可以少编写一些代码,并且 Linux 管理员可从同一个地方配置和管理身份验证过程。
 
大多数 Linux 发布版本都会随附多个 PAM 身份验证模块,其中包括支持对 LDAP 目录进行身份验证和使用 Kerberos 进行身份验证的模块。您可以使用这些模块对 Active Directory 进行身份验证,但这其中存在一些明显的限制。稍后,我将在本文中讨论这些限制。
 

Samba 和 Winbind
 
Samba 是一种开放源代码项目,旨在在 Windows 与 Linux 环境之间提供集成。Samba 包含的组件使 Linux 计算机有权访问 Windows 文件和打印服务,同时还提供了基于 Linux 的服务来模拟 Windows NT 4.0 DC。使用 Samba 客户端组件,Linux 计算机便可利用 Windows NT 和 Active Directory DC 所提供的 Windows 身份验证服务。
 
Samba 在这个项目中对我们来说最有趣的一部分叫做 Winbind。Winbind 是在 Samba 客户端上运行的后台程序(在 Windows 中称为服务),它的作用是充当在 Linux 计算机上运行的 PAM 和 NSS 与在 DC 上运行的 Active Directory 之间通信的代理。具体来说,Winbind 使用 Kerberos 来对 Active Directory 和 LDAP 进行身份验证,以检索用户和组信息。Winbind 还提供其他服务,如使用类似于 Active Directory 中 DCLOCATOR 的算法来查找 DC 的功能,以及通过使用 RPC 与 DC 进行通信来重置 Active Directory 密码的功能。
 
Winbind 解决了多个仅使用 Kerberos 和 PAM 无法解决的问题。具体来说,Winbind 并不是将 DC 进行硬编码以便按照 PAM Kerberos 模块的方式进行身份验证,而是以类似于 Microsoft DC LOCATOR 模块运行的方式通过搜索 DNS 定位程序记录来选择 DC。
 
三种身份验证策略
 
假设 Linux 计算机上提供了 LDAP、Kerberos 和 Winbind 三种身份验证,我们可以采用三种不同的实现策略允许 Linux 计算机使用 Active Directory 来进行身份验证。
 
使用 LDAP 身份验证使用 Active Directory 进行身份验证的最简单但成效最低的方法是,将 PAM 配置为使用 LDAP 身份验证,如图 1 所示。虽然 Active Directory 属于 LDAPv3 服务,但 Windows 客户端使用 Kerberos(回退到 NTLM)而不是 LDAP 进行身份验证。
 
LDAP 身份验证(称为 LDAP 绑定)通过网络以明文形式传递用户名和密码。对于大多数用途来说,这不仅不安全,而且也是无法接受的。

图1 使用 LDAP 对 Active Directory 进行身份验证

降低以明文形式传递凭据的风险的唯一方法是使用类似于 SSL 的协议加密客户端与 Active Directory 进行通信所使用的通道。这绝对可行,但会增加在 DC 和 Linux 计算机上管理 SSL 证书的负担。此外,使用 PAM LDAP 模块并不支持更改已重置的或过期的密码。
 
使用 LDAP 和 Kerberos 利用 Active Directory 进行 Linux 身份验证的另一种策略是,将 PAM 配置为使用 Kerberos 身份验证,以及将 NSS 配置为使用 LDAP 查找用户和组信息,如图 2 所示。此方案的优点是,它相对来说比较安全,而且它利用的是 Linux 的“内置”功能。但是它不利用 Active Directory DC 发布的 DNS 服务位置 (SRV) 记录,所以您会被迫挑选一组特定的 DC 来进行身份验证。对于管理即将过期的 Active Directory 密码或是直至最近的适当组成员身份查询,它提供的方法也不是很直观。
图 2 使用 LDAP 和 Kerberos 对 Active Directory 进行身份验证

使用 Winbind 使用 Active Directory 进行 Linux 身份验证的第三种方法是,将 PAM 和 NSS 配置为调用 Winbind 后台程序。Winbind 将使用 LDAP、Kerberos 或 RPC(使用其中最合适的一个),将不同的 PAM 和 NSS 请求转换为相应的 Active Directory 调用。图 3 说明了这一策略。
图 3 使用 Winbind 对 Active Directory 进行身份验证

我们的实施计划
 
由于与 Active Directory 的集成的增强,我选择在 Red Hat Enterprise Linux 5 (RHEL5) 上使用 Winbind 来进行我的 Linux 与 Active Directory 集成项目。RHEL5 是最新的商用 Red Hat Linux 发布版本,而且它在企业数据中心中相当受欢迎。
 
使 RHEL5 对 Active Directory 进行身份验证基本上需要下列五个不同的步骤:
 

  • 查找并下载适当的 Samba 以及其他依存组件。
  • 构建 Samba。
  • 安装并配置 Samba。
  • 配置 Linux,特别是 PAM 和 NSS。
  • 配置 Active Directory。
    本文的下面几节将详细介绍这些步骤。
     
    查找适当的软件
     
    Linux 与 Windows 之间最大的区别之一是,Linux 由一个小型操作系统内核和大型的可单独下载和安装的组件集构成。这虽然可以创建为某些任务而进行优化的特定 Linux 配置,但也会使服务器的配置和管理变得极为复杂。不同的发布版本处理这种情况的方式也不一样。Red Hat(及其非商用版 Fedora)使用 Red Hat Package Manager (RPM) 来安装和管理这些组件。
     
    适用于 Red Hat 的 Linux 组件包含两种形式。RPM 文件包含针对组件版本、Linux 发布版本和 CPU 体系结构的特定组合而预先编译和构建的二进制文件。因此,您可以下载和安装二进制文件,例如,针对在 Intel x86 体系结构 CPU 上运行的 Fedora 版本 10 构建的通用 UNIX 打印系统 (Common UNIX Printing System, CUPS) 的 1.3.8-5 版本。假如有十多种不同的 CPU 体系结构、100 多个 Linux 发布版本,还有上千个程序包和版本,则要选择的二进制 RPM 的数量之多便可想而知。
     
    另一方面,源 RPM 文件包含给定程序包的实际源代码。但您需要自己下载和安装源、配置构建选项,以及编译和链接二进制文件。构建您自己的操作系统组件这一想法使习惯于 Microsoft 在 Windows 安装 CD 上提供什么就安装什么的 Windows 用户十分畏怯,但是程序包管理器可使整个过程相当轻松,而且非常可靠。Samba 小组发布更新和安全修补程序的速度惊人,仅在 2008 年七、八月两个月内,就发布了四个版本的 Samba 3.2,总共包含 100 多个错误和安全修补程序。对于此项目,我下载了最新的 Samba 稳定版本 3.0.31 版的源。
     
    为什么要下载 Samba 源,而不下载预先编译的二进制文件集呢?当然,我刚开始也尝试过这么做,但在调试器上花了数小时之后,我发现下载的二进制文件并不是使用支持 Active Directory 身份验证的正确选项构建而成的。具体来说,在 Active Directory 中支持 Linux ID 映射的代码在默认版本中被关闭了,因此我必须使用适当的构建选项重建 Samba。稍后,我将在本文中详细讨论 ID 映射。
     
    虽然 Linux 原本是小型内核,但 Red Hat Enterprise 发布版本预先安装了许多程序包。这通常会使生活变得更轻松,因为您从完全正常运行的操作系统开始着手,但预先安装的程序包有时会与您以后想要安装的软件发生冲突。
     
    我在安装 Red Hat 时,因为想要使用较新的版本,所以并没有包含 Samba(通常会默认安装 Samba)。但是,较新版本的 Samba 要求已安装的几个其他库和实用工具也要使用新版本。这类的依赖问题非常烦人,不过,使用 RPM 就可以轻松解决。
     
    承载二进制 RPM 程序包的网站很多。我使用的网站(勿庸置疑,是我找到的第一个网站)称为 PBONE,网址为 rpm.pbone.net。该网站提供了搜索程序包的简便方法,并且具有我的 CPU 体系结构 (i386) 和操作系统发布版本 (Red Hat Enterprise Linux 5/Fedora 7&8) 所需的所有二进制文件。
     
    我必须下载和更新图 4 中列出的程序包来构建和安装最新的 3.0 版 Samba(但我从未尝试过较新的 3.2 版)。请注意,这些程序包主要针对 Fedora Core (fc) 发布版本。Red Hat 以 Fedora 使用的相同源为基础,而且完全可与它交互。针对 Fedora Core 7 及更高版本构建的程序包,不需要任何修改即可在 RHEL5 上运行。请将下载的 RPM 文件放在 /usr/src/redhat/RPMS 目录中。
    图 4 构建和安装 Samba 3.0.31 所需的程序包

     
    构建 Samba
     
    构建 Samba 的第一歩是下载适当的源 RPM。我从 PBONE 站点下载了 Samba 3.0.31 的源 RPM。然后,将下载的源 RPM 文件放到 /usr/src/redhat/SRPMS 中,这是构建过程中用于源 RPM 的标准目录。
     
    打开终端会话(在 Windows 中称为命令行窗口)并移至 SRPMS 文件夹。完成后,使用该命令安装源程序包,如图 5 所示。
    图 5 安装 Samba 源 RPM

    如果您看到“用户 mockbuild 不存在,请使用根”错误警告,请不要担心。这个错误指出尚未安装 Mock 构建实用工具,但没有这些实用工具,构建过程也可以进行。
     
    然后,移至 /usr/src/redhat/SPECS 目录并编辑文件 SAMBA.SPEC,该文件包含了 Samba 构建选项。搜索以“CFLAGS=”开头的那一行,并确保存在“--with-shared-modules=idmap_ad,idmap_rid”选项。此选项可确保构建过程包含将 Linux UID(唯一标识符)适当转换到 Active Directory 的代码。图 6 显示了此选项。
    图 6 with-shared-modules 构建选项

    接下来,您可能必须更新计算机上的一些库,才能适当构建和安装 Samba,具体取决于您安装的是哪个版本的库。在我的例子中,我必须使用 rpm --install 命令安装图 4 中列出的程序包;在某些情况下,我必须使用 --force 选项来克服一些依赖问题。
     
    要构建 Samba,请移至 /usr/src/redhat 目录,并运行命令 rpmbuild –bb SPECS/samba.spec,如图 7 所示。此过程将新的 samba-3.0.31-0.i386 RPM 文件留在 /usr/src/redhat/RPMS 目录中。我们稍后将在此项目中安装这个 RPM 文件。
    图 7 创建 Samba 二进制 RPM 文件

    配置 Linux 网络
     
    为了使用 Active Directory 进行身份验证,您的 Linux 计算机必须能够与 DC 通信。您必须配置三个网络设置才能与 DC 通信。
     
    首先,重要的是通过使用动态主机配置协议 (DHCP) 或使用 ifconfig 命令为 Linux 计算机分配适当的 IP 地址和网络掩码,来确保适当配置该计算机的网络接口。在 RHEL5 下,通过从“系统”|“管理”菜单中选择“网络”来配置网络,如图 8 所示。
    图 8 配置网络

    接着,确保将 Linux 计算机的 DNS 解析程序设置为与 DC 使用相同的 DNS 名称服务器;在大多数情况下,假定您要使用 Active Directory 集成的 DNS,则该 DC 是您想要加入 Linux 计算机的域中的 DC。在用于配置网络的相同网络配置实用工具的 DNS 选项卡上,配置 DNS 解析程序,如图 9 所示。
    图 9 设置主 DNS 解析程序

    最后,完成上述步骤后,您必须设置 Linux 计算机的主机名称以反映它在域中的名称。虽然您可以使用网络配置应用程序设置主机名称,但这一方法不一定始终适用。
     
    但是,可直接编辑 /etc/hosts 文件,并在具有 <IP 地址> <FQDN> <主机名称> 形式的 localhost.localdomain 条目下添加条目。(例如,“10.7.5.2 rhel5.linuxauth.local linuxauth”)。请注意,如果不这么做,当您将 Linux 计算机加入到域后,会在目录中创建错误的计算机对象。
     
    配置 Linux 时间同步
     
    Kerberos 协议需要身份验证系统具有能在相对较小的时间内同步的时钟。默认情况下,Active Directory 可允许的偏差时间最长为五分钟。为了确保您的 Linux 系统与 DC 的系统时钟维持在这个时间内,您应该将 Linux 系统配置为使用 DC 的网络时间协议 (NTP) 服务。
     
    然后,在 Linux 服务器上,从“系统”|“管理”菜单中运行日期与时间实用工具,然后单击“网络时间协议”选项卡。选中“启用网络时间协议”框,然后添加您要用作网络时间源的 DC 的 IP 地址。请注意,这通常应该是在域中担任主域控制器 (PDC) 仿真器灵活单主机操作 (FSMO) 角色的 DC。图 10 显示了如何设置 Linux 网络时间源的一个示例。
    图 10 配置网络时间协议

    配置 PAM 和 NSS
     
    PAM 和 NSS 提供 Linux 应用程序(如桌面)与 Winbind 之间的联系媒介。与许多 Linux 服务一样,您可以通过文本文件来配置 PAM 和 NSS。我们先来讨论一下如何配置 PAM。
     
    PAM 为使用它的应用程序提供了四个与身份验证相关的功能。身份验证设施允许应用程序确定使用它的用户。帐户设施提供的帐户管理功能(如登录时间限制)与身份验证并不是特别相关。密码设施提供请求和管理密码的机制。会话设施执行与用户相关的安裝和应用程序的拆卸任务,例如,在用户特定的目录中记录或创建文件。
     
    Red Hat 下的 PAM 将它的配置文件存储在 /etc/pam.d 目录中,其中包含使用 PAM 进行身份验证的每个应用程序的文本文件。例如,文件 /etc/pam.d/gdm 包含 Gnome Desktop Manager (GDM) 的 PAM 配置信息,即 Red Hat 的默认窗口运行环境。每个 PAM 配置文件都包含多行内容,其中每行分别定义 PAM 身份验证过程的某个方面。图 11 显示了 GDM 的 PAM 配置文件的内容。
    图 11 Gnome Desktop Manager 的 PAM 配置文件

    PAM 配置文件中的每个项目都具有 <管理组> <控制> <模块> <参数> 的形式,其中 <管理组> 对应于配置条目所属的设施:身份验证、帐户、密码或会话。图 12 中描述的控制关键字可控制 PAM 处理配置条目的方式。该文件的第三栏包含 /lib/security 目录中的 PAM 共享库的名称。共享库包含可动态加载的可执行代码,类似于 Windows 中的 DLL。模块名称后的其他术语都是 PAM 传递到共享库的参数。
     
    图 12 PAM 控制关键字

    您可以看到每个管理组都包含多个条目。PAM 按照调用命名的模块的顺序处理条目。然后,该模块返回成功或失败消息,而 PAM 将继续根据控制关键字进行评估。
     
    您可能会注意到,GDM 的 PAM 配置文件在它的所有管理组中都包含系统身份验证。这正是 PAM 为 GDM 建立默认身份验证行为的方式。通过修改系统身份验证,您可以修改在其 PAM 配置中包含系统身份验证文件的所有应用程序的身份验证行为。图 13 中介绍了默认系统身份验证文件。
    图 13 PAM 系统身份验证文件

    Name Service Switch (NSS) 模块将隐藏系统数据存储的详细信息以防应用程序开发人员看见,这与 PAM 隐藏身份验证的详细信息的方式大体相似。NSS 允许管理员指定存储系统数据库的方式。具体来说,管理员可以指定如何存储用户名和密码信息。因为我们希望应用程序使用 Winbind 在 Active Directory 中查询用户信息,所以我们必须修改 NSS 配置文件才能显示此信息。
     
    Red Hat 包含一个小型的图形小程序,可用来配置 PAM 和 NSS,称为 system-config-authentication。它负责管理您需要对系统身份验证和 nss.conf 文件进行的大部分(而非全部)更改。
     
    运行 system-config-authentication 应用程序后,您会看到如图 14 所示的对话框。选中“用户信息”(用于配置 nss.conf 文件)和“身份验证”(用于修改系统身份验证文件)这两个选项卡上的 Winbind 选项。
    图 14 systemconfig-authentication 对话框

    单击“配置 Winbind”按钮,您将看到如图 15 所示的对话框。在 Winbind 域字段中输入要对用户进行身份验证的域的名称,并选择“ads”作为安全模式。在 Winbind ADS 领域字段中输入 Active Directory 域的 DNS 域名称。在 Winbind 域控制器字段中,输入您希望该 Linux 系统对其进行身份验证的 DC 的名称,也可以输入星号,表明 Winbind 应通过查询 DNS SRV 记录来选择 DC。
    图 15 配置 Winbind 对话框

    选择您的 Active Directory 用户应该具有的适当默认命令行界面,在本例中,我选择的是 Bourne-again Shell 或 BASH。此时,不要按下“加入域”按钮,稍后,再将此计算机加入到域。
     
    在将 /etc/pam.d/system-auth 文件修改为支持 Winbind 后,还需要对其进行另一个更改。当 Linux 用户登录时,系统要求该用户必须拥有主目录。主目录包含许多用户特定的首选项和配置条目,与 Windows 注册表非常相似。问题在于,因为您要在 Active Directory 中创建用户,所以 Linux 不会自动为用户创建主目录。幸运的是,您可以将 PAM 配置为在其会话配置期间为用户创建主目录。
     
    打开 /etc/pam.d/system-auth 文件,然后向下滚动到底部,在标有“session optional map_mkhomedir.so skel=/etc/skel umask=0644”会话部分中的最后一行之前插入一行(请参见图 16)。这一行将 PAM 配置为创建用户的主目录(如果用户没有主目录)。它将目录 /etc/skel 用作“框架”或模板,而且将权限掩码 0644(所有者具有的读写权限、主要组具有的读取权限,以及其他人具有的读取权限)分配给新文件夹。
    图 16 为用户创建主目录

    安装和配置 Samba
     
    要安装您刚刚创建的 Samba 二进制文件,请转至 /usr/src/redhat/RPMS 目录。由 rpmbuild 命令创建的所有 RPM 文件都会显示在此目录中。请记住,Samba 包括允许 Linux 客户端访问 Windows(或 Samba)文件共享的二进制文件,以及允许 Linux 系统充当 Windows 文件服务器、Windows 打印机服务器和 Windows NT 4.0-style DC 角色的代码。
     
    要让 Linux 对 Active Directory 进行身份验证,我们根本用不到这么多角色,其实我们只需要使用 Samba 公共文件和 Samba 客户端二进制文件就可以了。为了方便起见,这些文件可为两个 RPM 文件:samba-client-3.0.31-0.i386.rpm 和 samba-common-3.0.31-0.i386.rpm。使用 rpm --install 命令安装 RPM 文件,请看下面的示例:rpm --install samba-common-3.0.31-0.i386.rpm。(请注意,您需要先安装 –common RPM 文件。)
     
    安装了 Samba 客户端二进制文件后,您必须修改默认 Samba 配置,以确保 Winbind 使用 Active Directory 适当处理身份验证。所有 Samba 配置信息(包括客户端和服务器)都可以在 smb.conf 文本文件中找到,该文件在默认情况下位于 /etc/samba 目录中。Smb.conf 可能包含大量配置选项,本文只会对其内容进行简要介绍。samba.org 网站和 Linux 主页简要讨论了 smb.conf。
     
    第一步是将 Winbind 配置为使用 Active Directory 进行身份验证。您必须将 smb.conf 中的安全模式设置为“ads”。system-config-authentication 实用工具应该已经帮您设置好了,但检查一下总是比较保险。编辑 smb.conf 文件,并搜索标有“域成员选项”的部分。找出以“security”开头的那一行,并确定它的内容是“security = ads”。下一个配置步骤是确定 Winbind 如何将 Windows 安全主体(如用户和组)映射到 Linux 标识符,这需要进行进一步的说明。
     
    ID 映射问题
     
    通过 Active Directory 对 Linux 用户进行身份验证时有个大问题我还没有提到,那就是用户和组的 UID 问题。Linux 和 Windows 在内部都不是根据用户名来引用用户的,而是使用唯一的内部标识符。Windows 使用安全标识符(即 SID),它能够唯一标识 Windows 域中的每个用户,其结构长度可以变化。SID 也包含唯一域标识符,以便 Windows 区别不同域中的用户。
     
    Linux 的方案则简单得多,Linux 计算机上的每个用户都有一个 UID,而此 UID 只是一个 32 位的整数。但是 UID 的范围受限于计算机本身。在某台 Linux 计算机上具有 UID 436 的用户,不一定与另一台 Linux 计算机上具有 UID 436 的用户相同。因此,用户必须登录他需要访问的每台计算机,这显然不是理想的情况。
     
    Linux 网络管理员解决此问题的常用方法是,使用 Network Information System (NIS) 或共享 LDAP 目录来提供网络身份验证。网络身份验证系统提供用户的 UID,而使用该身份验证系统的所有 Linux 计算机都将共享相同的用户和组标识符。在这种情况下,我将使用 Active Directory 来提供唯一的用户和组标识符。
     
    要解决此问题,我可以采用两种策略。第一个(也是最明显的)策略是,为每个用户和组创建 UID,并将该标识符与各自的对象一起存储到 Active Directory 中。这样一来,当 Winbind 对用户进行身份验证时,它就可以查询该用户的 UID,然后将它提供给 Linux 作为该用户的内部标识符。Winbind 将此方案称为 Active Directory ID 映射,或 idmap_ad。图 17 介绍了 Active Directory ID 映射的过程。
    图 17 Active Directory ID 映射

    Active Directory ID 映射的唯一缺点是,我们必须提供一种机制来确保每个用户和组都拥有标识符,而且这些标识符在林中都是唯一的。有关详细信息,请参阅“针对 Active Directory ID 映射配置 Active Directory”边栏。
     
    幸好,还有另外一种 ID 映射策略,这种策略的管理负荷要少得多。回想一下,我们在前面曾提到过 Windows SID 可以唯一标识域中的用户和域本身。SID 中能唯一标识域中用户的部分称为相对标识符(或 RID),而且这部分事实上是一个 32 位的整数。因此,Winbind 可在用户登录时直接从 SID 中提取 RID,然后将该 RID 用作唯一的内部 UID。Winbind 将此策略称为 RID 映射,或 idmap_rid。图 18 描述了 RID 映射的实际工作方式。
    图 18 RID 映射

    RID 映射具有零管理负荷的优点,但是您不能将它用在多域的环境中,因为不同域中的用户可能拥有相同的 RID 值。但是,如果您拥有单个 Active Directory 域,则可以使用 RID 映射。
     
    要配置 Winbind ID 映射策略,请再次编辑 /etc/samba/smb.conf 文件,并且添加“idmap backend = ad”行来使用 Active Directory 映射策略;如果您要使用 RID 映射策略,请添加“idmap backend = rid”行。确保该文件中不存在任何其他指定映射策略的行。
     
    对于 Winbind,我们还需要在 smb.conf 文件中添加其他配置选项。虽然我们已将 PAM 设置为在每个用户登录时为其创建主目录,但是还需要告诉 Winbind 主目录的名称是什么。我们可以通过将“template homedir = /home/%U”行添加到 smb.conf 来执行此操作(请参见图 19)。这会告诉 Winbind,使用 Active Directory 进行身份验证的每个用户的主目录都将是 /home/<用户名>。但务必要先创建好 /home 目录。
    图 19 指定主目录的名称

    加入域并登录
     
    既然网络、PAM、NSS 和 Samba Winbind 都已配置成功,现在应该将 Linux 计算机加入到域中。可使用 Samba NET 命令来执行此操作。在外壳程序提示符下,运行“net ads join –U <管理员名称>”。使用具有足够权限来将计算机加入到域的帐户名称替换 <管理员名称>。
     
    net 命令会提示您输入用户的密码。如果一切运行正常,net 命令会将您的计算机加入到域中。您可以使用 Active Directory 用户和计算机来查找刚刚创建的计算机帐户。
     
    您可以使用称为 wbinfo 的 Winbind 测试工具来测试加入的状态。运行 wbinfo –t 将测试计算机与域之间的信任关系。运行 wbinfo –u 将列出域中的所有用户,而运行 wbinfo –g 将列出域中的所有组。
     
    如果您成功将 Linux 计算机加入到域中,则下一步是尝试使用 Active Directory 用户帐户和密码登录。注销 Linux 计算机,然后使用 Active Directory 用户名登录。如果一切运行正常,您应该能够登录。
     
    针对 Active Directory ID 映射配置 Active Directory
     
    此信息仅在您使用 Active Directoryy ID 映射时才适用。如果您决定使用 RID 映射,可随时跳过此边栏。
     
    您必须先对 Active Directory 本身进行一些更改,然后才能使用 Active Directory 帐户登录到您的 Red Hat 服务器。首先,Active Directory 架构必须适合 Winbind 用来存储用户信息的属性。如果您运行的是 Windows Server 2003 R2,则表示此架构已经准备就绪。如果您拥有 Active Directory 架构的早期版本,则必须使用 Microsoft Services for UNIX (SFU) 程序包对其进行扩展。
     
    您可以在 Technet 上的 Services for UNIX 上找到更多信息。SFU 还包含另一个针对 Active Directory 用户和计算机 Microsoft 管理控制台 (MMC) 管理单元的属性页,用于管理 Linux 所需的用户 ID 和组 ID 信息。
    适当设置架构后,您必须为所有可能登录您的 Linux 计算机的用户(和他们所属的组)提供 Linux 标识符。这表示您必须为可能登录您的 Linux 计算机的用户和组定义 uidNumber 和 gidNumber 属性的值。但是您应该注意这些属性的一些要求:
     
  1. Linux 要求要进行身份验证的每个用户都必须有 UID。由于您要管理 Active Directory 中的用户信息,所以要登录 Linux 计算机的每个用户帐户都必须具有唯一的 uidNumber 属性。您用于 uidNumber 的特定值并不重要,但它在所有可能登录 Linux 计算机的用户中必须是唯一的。
  2. 每个 Linux 用户也必须具有默认组标识符,因此,要登录 Linux 计算机的每个 Active Directory 用户也需要 gidNumber 属性值。此值在用户中不必是唯一的,但它必须唯一地标识组。
  3. Active Directory 中的每个组对于它的 gidNumber 属性来说都应该具有唯一值。严格来讲,组可以没有 gidNumber 属性值,但 Winbind 在对用户进行身份验证时,会希望用户所属的每个组都具有唯一的 gidNumber 值。最简单的方法可能是确保每个组都具有唯一的 gidNumber 值。
  4. Winbind 希望它在 Active Directory 中查询的每个用户都是 Domain Users 组的成员,因此它也希望 Domain Users 组具有 gidNumber 属性值。

要是行不通怎么办?
使用 Winbind 设置 Linux 计算机以便使用 Active Directory 进行身份验证并非易事。要配置的东西有很多,而且很多地方都可能会出错,而 Linux 的每个版本和 Samba 的每个版本之间又都存在一些细微差别,这更是雪上加霜。但是您可以查找几个地方,以帮助确定怎样操作。
 
首先是 Linux 系统日志文件,它保存在 /var/log/messages 中。Samba 将重大事件的消息(例如,丢失文件或配置失败)存储在这个文件中。除了系统日志文件外,还有 Samba 和 Winbind 的日志文件。您可以在 /var/log/samba 中找到这些文件,而且它们还会为您提供一些其他信息。
 
您可以通过修改 Winbind 的启动脚本来设置调试级别,来提高 Winbind 发出的日志消息的详细程度(和数量)。编辑 /etc/init.d/winbind 外壳脚本,然后在 windbindd 命令中添加“-d 5”。这可将调试级别增加到 5(允许的值范围为 1 至 10),使 Winbind 生成更详细的错误消息。
 
如果 Winbind 最后可与 DC 通信,您可以运行网络数据包捕获实用工具,如 Netmon 3.1。这使您可以精确分析 Winbind 要进行的操作。而且,您还可以检查 DC 上的 Windows 安全日志,此日志会显示身份验证尝试。
 
如果行得通,您又应该做些什么呢?
 
如果一切都能顺利进行,现在您就可以使用在 Active Directory 中保存的凭据登录 Linux 系统中了。与在 Linux 计算机上本地管理标识,或与使用诸如 NIS 之类的不安全系统相比,这是一项重大改进。它使您可以将您的用户管理任务集中到一个标识存储上:Active Directory。
 
但是,要让这套解决方案真正具备实际用途,还缺几样东西。首先,无法保证能获得技术支持,有点像撞大运。大多数 Linux 组织对于 Active Directory 都不是很了解,而且您可以从 Linux 社区获得的支持完全取决于谁刚好读到您的帖子以及他们当天的心情。
 
Samba 也没有迁移或部署工具。如果您具有现有的 Linux 帐户及其相关的用户 ID 和权限,则您在将它们迁移至 Active Directory 时,必须手动确保它们维护其 UID。
 
最后,Samba 仍然无法使用最重要的 Active Directory 应用程序之一,即组策略,尽管已经实施了此策略。虽然您可以使用 Samba 将 Linux 系统加入到 Active Directory 中,但无法使用组策略来管理它。
 
第三方解决方案
 
使用 Active Directory 对 Linux 计算机进行身份验证显然是件好事,但使用 Samba Winbind 推出您自己的解决方案,即使不把您累死,也会让您感到枯燥无味。您可能会想,一些创新的软件供应商可能会提出易于使用的解决方案,您猜得没错。
 
对于我在本文中演示的版本,有四家商用软件供应商已经开发了易于安装和使用的相应版本。它们几乎为每个受欢迎的 Linux、UNIX 和 Apple Macintoshes 版本都提供了代码和迁移工具,另外也支持使用组策略管理 Linux 计算机。
 
这四家公司分别为 CentrifyLikewise SoftwareQuest SoftwareSymark。这四家供应商都提供了相似的功能,其中包括跨越各个 Linux 发布版本的组策略管理。Likewise Software 最近还公开了它实现的开放源代码,称为 Likewise Open,但它的组策略组件仍旧是商用产品。Likewise Open 将可用于多个主要的 Linux 发布版本。(注:撰写本文时,本人就职的公司 NetPro 已由 Quest Software 收购。)
 
有了可用的商用产品后,还有必要使用 Samba 和 Winbind 来构建自己的身份验证系统吗?如果花钱购买集成软件不在预算之内,则可以利用免费的 Samba 开放源代码路由。您还可以获得所有的源代码,这样的好处真是令人难以抗拒。但是,迁移现有的 Linux 计算机及其现有的 UID 是非常棘手的问题。
 
另一方面,假如您想要省下安装和实现的时间、需要迁移现有的 Linux 计算机,或是希望有人对您的问题提供权威性的解答,那么寻求其中的一种商用解决方案比较划算。另外,如果您需要使用组策略管理功能,那么商用产品是您唯一的选择。
 
但是,无论您采取哪种方式,将 Linux 身份验证与 Active Directory 集成都可以减少您为管理多用户帐户投入的精力、增强系统安全性,并为您提供单一的标识存储来进行管理和审核,而这些全都是相当吸引人的理由,值得试一试。
 
Gil Kirkpatrick 在他 30 年的职业生涯中设计或开发了十多种成功的商用软件产品,而且他还是 Directory 专家会议(现在改名为专家会议)的创办人。Gil 是《Active Directory Programming》的作者,并且经常为《Windows IT Pro》和《TechNet 杂志》撰写文章。Gil 目前在 NetPro(现在是 Quest Software 的一部分)担任常驻专家一职,他是各种安全性、标识和市场营销项目的顾问,并且经常在全球各地的技术讲座和会议中发表演说。


uid、gid 和 RID
您也许在 Samba 文档或者可能是在 LDAP 帐户的输出中见到过对术语 RID 的引用。那么什么是 RID 呢?UNIX 操作系统(包括象 Linux 这样的派生物)通过整数 uid(用户标识,User ID)唯一地标识用户,并通过整数 gid(组标识,Group ID)唯一地标识组。当以某一用户登录时,通过输入 id 即可访问这个信息。
 
当前的 Microsoft 操作系统通过称为 RID 的值唯一地标识用户和组,该值通常是一个用十六进制表示的整数。在 UNIX 下,用户和组存在于独立的名称空间中。而在 Microsoft 操作系统上,用户和组存在于一个名称空间中。
 
Samba 使用下列公式将 UNIX uid 和 gid 映射为 RID:
 
rid = 2 (uid) + 1000
rid = 2 (gid) + 1001
因此,如果工作在 Red Hat 系统上的用户 tom,其 uid 为 500,gid 为 500,则映射到 Microsoft 域中的 RID 分别为 2000 和 2001。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271