如何根据 Active Directory 验证 Linux 帐户并在登录时挂载 Windows 共享?

如何根据 Active Directory 验证 Linux 帐户并在登录时挂载 Windows 共享?

我正在使用 Ubuntu 10.04 Server。

答案1

[编辑] 我已经测试了这个完整版Ubuntu 10.04 服务器(2010 年 5 月 21 日)

我已经配置了我的Ubuntu 10.04 服务器 LTS驻留在 Windows 网络上,使用活动目录对登录进行身份验证,然后安装 Windows 共享作为主目录。

以下是我从初始安装 Ubuntu 开始所做的事情。

  1. 下载并安装Ubuntu 服务器 10.04 LTS
  2. 获取更新

    # sudo apt-get update && sudo apt-get upgrade

  3. 安装 SSH 服务器(sshd

    # sudo apt-get install openssh-server

    有些人会认为你应该通过禁用 root 登录来“锁定 sshd”。我认为如果你足够聪明,能够破解 ssh 会话以获取 root 密码,那么你可能不会因为PermitRootLogin no在文件中添加而受阻/etc/ssh/sshd_config。如果你偏执或只是不相信,那么请编辑该文件或尝试以下操作:

    # (grep PermitRootLogin /etc/ssh/sshd_config && sudo sed -ri 's/PermitRootLogin ).+/\1no/' /etc/ssh/sshd_conifg) || echo "PermitRootLogin not found. Add it manually."

  4. 安装所需的软件包

    # sudo apt-get install winbind samba smbfs smbclient ntp krb5-user

  5. 进行一些基本的网络清理,为即将进行的特定包配置做好准备。

    1. 确定您的 Windows 域名、DNS 服务器名称和 Active Directory 服务器的 IP 地址(用于 Samba)。为了方便起见,我为 Windows 域和 DNS 服务器设置了环境变量。对我来说,它是(我的 AD IP 地址是 192.168.20.11):

      # WINDOMAIN=mydomain.local && WINDNS=srv1.$WINDOMAIN && WINDNS_IP=192.168.20.11

      如果你想弄清楚你的域名和 DNS 服务器是什么(我是承包商,不了解网络),请查看这个有用的参考

    2. 我们需要在新网络上为 Linux 机器命名,这可以通过编辑主机文件来完成(用 Windows DNS 的 FQDN 替换 DNS):
      # sudo sed -ri "s/^(127\.0\.[01]\.1[ \t]).*/\1$(hostname).$WINDOMAIN localhost $(hostname)/" /etc/hosts

    3. 我们还应该告诉即将安装的服务它们在哪里可以找到领导者:一些网络将具有 netbios 名称查找服务,但以防万一,请在文件中添加一个明确的条目/etc/hosts,在我的配置中,我在第三(3)行添加了条目:
      # sudo sed -ri "3 i $WINDNS_IP $WINDNS" /etc/hosts

    4. Windows 和 Linux 机器的身份验证和文件共享过程需要使它们的时钟一致。使用 NTP 服务执行此操作,在 Ubuntu 的服务器版本上,NTP 服务已安装并配置为(1) NTP 服务器。在 Ubuntu 服务器之前添加您的服务器(或完全替换它)。我加入的网络也有 DNS 服务器提供 NTP 服务。
      # sudo sed -ri "s/^(server[ \t]+)(.+)/\1$WINDNS\n\1\2/" /etc/ntp.conf
      重新启动 NTP 守护程序:
      # sudo /etc/init.d/ntp restart

  6. Kerberos 配置。
    以下说明不应按字面意思理解:编辑文件时,需要将MYDOMAIN.LOCAL和 的值srv1.mydomain.local替换为适合您网络的值,但请注意,使用大写字母时需要使用大写字母
    如果在使用apt-get installKerberos 期间您能够洞察并正确回答“默认域”问题,那么,您就大功告成了,否则,您必须执行以下操作。

    1. 编辑(上面安装的)/etc/krb5.conf文件。

      1. 找到该[libdefaults]部分并更改键值对:

        [libdefaults]
        default_realm = MYDOMAIN.LOCAL

      2. 将以下内容添加到[realms]文件的部分:

        MYDOMAIN.LOCAL = {
        kdc = srv1.mydomain.local
        admin_server = srv1.mydomain.local
        default_domain = MYDOMAIN.LOCAL
        }

      3. 将以下内容添加到[domain_realm]文件的部分:
        .mydomain.local = MYDOMAIN.LOCAL
        mydomain.local = MYDOMAIN.LOCAL

      4. 此时,一个很好的测试是查看您的 AD 控制器是否会向您发出 Kerberos 票证。这不是必需的,但它可能会让一些人感到兴奋:
        # kinit <some_windows_domain_user>
        然后查看票证:
        # klist
        您将看到有关票证缓存、到期和续订的信息。一旦兴奋消退,您也可以释放/销毁票证:
        # kdestroy

  7. 配置samba。
    根据以下内容: 有时无法使用 CIFS,或者其他网络文件系统选择更好。如果需要 kerberos (krb5/SPNEGO) 身份验证支持来增加安全性,则必须使用 Samba 的 smbclient 或 smbfs,而不是 cifs
    唉,cifsubuntu 10.04(基于内核版本 2.6.32.9)的内核支持版本为 1.61,而根据内核文档,实验性的 kerberos 实现自版本 1.54 以来就已存在。
    所以就是这样。我不知道它是否cifs可行,所以我给你提供了 samba 配置:

    1. 替换/etc/samba/smb.conf(记住我是在一个干净的 Ubuntu 发行版上工作的,所以我不担心破坏任何东西):
      [global]
      security = ads
      realm = MYDOMAIN.LOCAL
      password server = 192.168.20.11
      workgroup = MYDOMAIN
      idmap uid = 10000-20000
      idmap gid = 10000-20000
      winbind enum users = yes
      winbind enum groups = yes
      template homedir = /home/%U
      template shell = /bin/bash
      client use spnego = yes
      client ntlmv2 auth = yes
      encrypt passwords = yes
      winbind use default domain = yes
      restrict anonymous = 2

    2. 启动和停止各种服务。

      # sudo /etc/init.d/winbind stop
      # sudo service smbd restart
      # sudo /etc/init.d/winbind start

  8. 设置身份验证。

    1. 编辑/etc/nsswitch.conf。我​​能够运行以下命令来获取我需要的内容:这是我的文件
      # sed -ri 's/(compat)/\1 winbind/' /etc/nsswitch.conf
      的内容:/etc/nsswitch.conf
      passwd: compat winbind
      group: compat winbind
      shadow: compat winbind
      hosts: files dns
      networks: files
      protocols: db files
      services: db files
      ethers: db files
      rpc: db files

    2. 启动和停止各种服务。
      # sudo /etc/init.d/winbind stop
      # sudo service smbd restart
      # sudo /etc/init.d/winbind start

  9. 将计算机加入域。我不确定这是必要的;特别是因为文件smb.conf( security = ads) 中的安全选项。也许有人可以对此发表意见...
    # sudo net ads join -U any_domain_user_account
    您可能会收到错误DNS update failed!,但您将加入域。如果您收到有关无法找到服务器的错误,则需要修改您的 DNS 记录。在 Ubuntu 安装期间,名称服务器通常会指向您的网关:大多数路由器都会提供 DNS 服务。Windows 服务器管理的最佳实践是 ADC 也应该运行 DNS。在我的情况下,我的/etc/resolve.conf看起来像这样:
    nameserver 192.168.20.11
    nameserver 8.8.8.8
    8.8.8.8是一个谷歌 DNS,如果 Windows DNS 出现故障,这是一个相当可靠的备份。

此时我可以登录(也许重新启动后),主目录不存在,但我可以登录。

  1. 登录时安装 CIFS
    下一步对我来说是关键;我不想承担备份每个人的工作目录的责任,而 Ubuntu 所运行的机器在可靠性方面也值得怀疑。通过执行以下操作,用户可以登录并查看他们的 Windows 用户目录自动地

    1. 下载pam_mount模块:
      # sudo apt-get install libpam-mount
      我希望挂载点位于传统位置:此部分由文件 ( )/home/<user>配置。但我需要它钻取共享并指向自己的 windows 目录。这是通过编辑文件(尽管它的意图是 XML)来实现的/etc/samba/smb.conftemplate homedir = /home/%U/etc/security/pam_mount.conf.xml不是人类可读):

    2. 添加以下内容/etc/security/pam_mount.conf.xml并进行修改:
      <volume
      user="*"
      server="srv1.mydomain.local"
      path="UserShares"
      mountpoint="home"
      fstype="cifs"
      />

      <cifsmount>mount -t cifs //%(SERVER)/%(VOLUME)/%(USER) %(MNTPT)/%(USER) -o "user=%(USER),uid=%(USERUID),gid=%(USERGID)%(before=\",\" OPTIONS)"</cifsmount>

      因为我的挂载点很愚蠢,所以我还必须添加这一行:

      <umount>umount %(MNTPT)/%(USER)</umount>

      这样就可以自动创建用户目录(用于挂载点),找到该行并使其如下:

      <mkmountpoint enable="1" remove="false" />

      remove="false"位非常重要:如果设置为 true,pam_mount.so则会尝试删除目录挂载点,但如果用户多次登录,则无法执行此操作。在这种情况下,您最终会在系统上看到大量杂散挂载。

      pam_mount.so仍然没有完全按照承诺交付。在当前形式下,挂载不断堆积,主目录没有被创建。从这里到 10.04 服务器的上一个 Beta 2 版本之间,它一直在工作。但我无法重新创建它。与此同时,
      对于我依赖的目录创建pam_mkhomedir.so,并在行之前立即插入一行pam_mount.so以适应。
      我仍然没有解决多重挂载问题。但在pam_mount.so修复之前,这是我在文件中得到的内容/etc/pam.d/common-session

      session [default=1]     pam_permit.so  
      session requisite       pam_deny.so  
      session required        pam_permit.so  
      session required        pam_unix.so  
      session optional        pam_winbind.so  
      session required        pam_mkhomedir.so skel=/etc/skel/ umask=0022  
      session optional        pam_mount.so
      

就是这样。它对我有用,我希望你觉得它有用。

我考虑了许多资源,以便弄清楚这一点。下面是一个简短的列表(其中许多链接指向我自己关于这个主题的问题):

相关内容