Samba/Active Directory 域控制器

出自 ArchWiki

本文介绍如何使用 Samba 设置 Active Directory 域控制器。假定所有配置文件都处于其未修改的安装后状态。本文是在全新安装上编写和测试的,除了设置静态 IPv4 网络连接(必需)外,没有其他修改。最后,以下大多数命令都需要提升的权限。尽管传统观点认为不应该这样做,但从 root 会话运行这些简短的命令可能比在需要时获取权限更容易。

安装

注意: 确保您可以通过主机名访问网络中的计算机。有关更多信息,请参阅 网络配置#本地网络主机名解析

一个功能齐全的 samba 域控制器需要 Samba 发行版中未包含的几个程序。安装 krb5ntppython-dnspythonpython-markdownopenresolvsamba 软件包,它们来自官方仓库。

Samba 包含其自己功能齐全的 DNS 服务器,但是如果您需要维护外部域的 DNS 区域,强烈建议您改用 BIND。如果您需要共享打印机,您还需要 CUPS。如果需要,请安装 bind 和/或 cups 软件包。

创建新目录

配置

创建 Active Directory 域的第一步是配置。这包括设置内部 LDAPKerberos 和 DNS 服务器,并执行目录所需的所有基本配置。如果您之前设置过目录服务器,您无疑会意识到使这些单独组件作为一个单元协同工作存在潜在的错误。这样做的难度正是 Samba 开发人员选择提供这些程序的内部版本的原因。上面安装的服务器软件包仅用于客户端实用程序。使用 Samba 进行配置要容易得多。只需发出以下命令

# samba-tool domain provision --use-rfc2307 --interactive

参数解释

--use-rfc2307
此参数将 POSIX 属性 (UID/GID) 添加到 AD 架构。如果您打算除了 Microsoft Windows 之外还对 Linux、BSD 或 macOS 客户端(包括本地计算机)进行身份验证,这将是必要的。
--interactive
此参数强制配置脚本以交互方式运行。

或者,您可以通过运行 samba-tool domain provision --help 来查看配置步骤的帮助。

交互式配置解释

Realm
INTERNAL.DOMAIN.COM - 这应该与 DNS 域名相同,全部大写。通常使用仅限内部的子域将您的内部域与外部 DNS 域分开,但这不是必需的。
Domain
INTERNAL - 这将是 NetBIOS 域名,通常是最左侧的 DNS 子域,但可以是您喜欢的任何名称。例如,名称 INTERNAL 就不是很具有描述性。也许公司名称或首字母缩写词会更合适。这应该全部大写输入,并且为了与旧客户端兼容,长度应为 15 个字符的最大长度。
Server Role
dc - 本文假定您正在新域中安装第一个 DC。如果您选择任何不同的选项,本文的其余部分可能对您无用。
DNS Backend
BIND9_DLZSAMBA_INTERNAL - 这取决于服务器管理员的个人偏好。同样,如果您为外部域托管 DNS,则强烈建议您使用 BIND9_DLZ 后端,以便平面区域文件可以继续使用,并且现有传输规则可以与内部 DNS 服务器共存。如果不确定,请使用 SAMBA_INTERNAL 后端。
DNS forwarder IP address
xxx.xxx.xxx.xxxnone - 此选项仅在使用 SAMBA_INTERNAL DNS 后端时显示。提供 DNS 服务器的 IP 地址以转发非本地 DNS 查询,或者使用字符串 none 始终执行根查找。
Administrator password
xxxxxxxx - 您必须为管理员帐户选择一个密码。最低要求是一个大写字母、一个数字和至少八个字符。如果您尝试使用不符合复杂性要求的密码,配置将失败。

配置守护进程

NTPD

为您的网络时间服务器创建合适的 NTP 配置。有关说明和附加配置选项,请参阅 网络时间协议守护程序

使用以下内容修改 /etc/ntp.conf 文件

/etc/ntp.conf
# Please consider joining the pool:
#
#     http://www.pool.ntp.org/join.html
#
# For additional information see:
# - https://wiki.archlinux.org.cn/index.php/Network_Time_Protocol_daemon
# - http://support.ntp.org/bin/view/Support/GettingStarted
# - the ntp.conf man page

# Associate to Arch's NTP pool
server 0.arch.pool.ntp.org
server 1.arch.pool.ntp.org
server 2.arch.pool.ntp.org
server 3.arch.pool.ntp.org

# Restrictions
restrict default kod limited nomodify notrap nopeer mssntp
restrict 127.0.0.1
restrict ::1
restrict 0.arch.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
restrict 1.arch.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
restrict 2.arch.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
restrict 3.arch.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery

# Location of drift file
driftfile /var/lib/ntp/ntpd.drift

# Location of the update directory
ntpsigndsocket /var/lib/samba/ntp_signd/

创建状态目录并设置权限

# install -d /var/lib/samba/ntp_signd
# chown root:ntp /var/lib/samba/ntp_signd
# chmod 0750 /var/lib/samba/ntp_signd

启用并启动 ntpd.service 单元。

BIND

如果您选择使用 BIND9_DLZ DNS 后端,请安装 bind 软件包并创建以下 BIND 配置。有关说明和附加配置选项,请参阅 BIND。请务必将 x 字符替换为合适的值

创建 /etc/named.conf 文件

/etc/named.conf
// vim:set ts=4 sw=4 et:
acl local-networks {
    127.0.0.0/8;
    xxx.xxx.xxx.xxx/xx;
// Uncomment the following line(s) if using IPv6
    //::1/128;
    //xxxx:xxxx:xxxx:xxxx::/64;
};

options {
    directory "/var/named";
    pid-file "/run/named/named.pid";
    session-keyfile "/run/named/session.key";

    // Uncomment this line to enable IPv6 connections support
    //  listen-on-v6 { any; };
    // Add this for no IPv4:
    //  listen-on { none; };

    // Add any subnets or hosts you want to allow to the local-networks acl
    allow-query       { local-networks; };
    allow-recursion   { local-networks; };
    allow-query-cache { local-networks; };
    allow-transfer    { none; };
    allow-update      { none; };

    version none;
    hostname none;
    server-id none;

    auth-nxdomain yes;
    datasize default;
    empty-zones-enable no;
    tkey-gssapi-keytab "/var/lib/samba/bind-dns/dns.keytab";

    // Uncomment if you wish to use ISP forwarders
    //  forwarders { xxx.xxx.xxx.xxx; xxx.xxx.xxx.xxx; };
};

zone "localhost" IN {
    type master;
    file "localhost.zone";
};

zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "127.0.0.zone";
};

zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" {
    type master;
    file "localhost.ip6.zone";
};

// Load AD integrated zones
include "/var/lib/samba/bind-dns/named.conf";

//zone "example.org" IN {
//    type slave;
//    file "example.zone";
//    masters {
//        192.168.1.100;
//    };
//    allow-query { any; };
//    allow-transfer { any; };
//};

logging {
    channel xfer-log {
        file "/var/log/named.log";
            print-category yes;
            print-severity yes;
            severity info;
        };
        category xfer-in { xfer-log; };
        category xfer-out { xfer-log; };
        category notify { xfer-log; };
};

设置权限

# chgrp named /var/lib/samba/private/dns.keytab
# chmod g+r /var/lib/samba/private/dns.keytab
# touch /var/log/named.log
# chown root:named /var/log/named.log
# chmod 664 /var/log/named.log

启用并启动 named.service 单元。

转发器的良好值是您的 ISP 的 DNS 服务器。 Google (8.8.8.8, 8.8.4.4, 2001:4860:4860::8888 和 2001:4860:4860::8844) 和 OpenDNS (208.67.222.222, 208.67.220.220, 2620:0:ccc::2 和 2620:0:ccd::2) 免费提供合适的公共 DNS 服务器。子网的适当值特定于您的网络。

Kerberos 客户端实用程序

上面的配置步骤创建了一个完全有效的 krb5.conf 文件,用于 Samba 域控制器。使用以下命令安装它

# mv /etc/krb5.conf{,.default}
# cp /var/lib/samba/private/krb5.conf /etc

DNS

您现在需要开始使用本地 DNS 服务器。重新配置 resolvconf 以仅使用 localhost 进行 DNS 查找。创建 /etc/resolv.conf.tail(不要忘记将 internal.domain.tld 替换为您的内部域)

# Samba configuration
search internal.domain.tld
# If using IPv6, uncomment the following line
#nameserver ::1
nameserver 127.0.0.1

设置权限并重新生成新的 /etc/resolv.conf 文件

# chmod 644 /etc/resolv.conf.tail
# resolvconf -u

Samba

启用并启动 samba.service 单元。如果您打算使用 LDB 实用程序,您还需要创建 /etc/profile.d/sambaldb.sh 文件来设置 LDB_MODULES_PATH

export LDB_MODULES_PATH="${LDB_MODULES_PATH}:/usr/lib/samba/ldb"

设置文件权限并加载它

# chmod 0755 /etc/profile.d/sambaldb.sh
# . /etc/profile.d/sambaldb.sh

测试安装

DNS

首先,验证 DNS 是否按预期工作。执行以下命令,将 internal.domain.comserver 替换为适当的值

# host -t SRV _ldap._tcp.internal.domain.com.
# host -t SRV _kerberos._udp.internal.domain.com.
# host -t A server.internal.domain.com.

您应该收到类似于以下内容的输出

_ldap._tcp.internal.domain.com has SRV record 0 100 389 server.internal.domain.com.
_kerberos._udp.internal.domain.com has SRV record 0 100 88 server.internal.domain.com.
server.internal.domain.com has address xxx.xxx.xxx.xxx

NT 身份验证

接下来,验证密码身份验证是否按预期工作

# smbclient //127.0.0.1/netlogon -U Administrator -c 'ls'

系统将提示您输入密码(您之前选择的密码),并将获得如下目录列表

  .                                   D        0  Wed Nov 27 23:59:07 2013
  ..                                  D        0  Wed Nov 27 23:59:12 2013

		50332 blocks of size 2097152. 47185 blocks available

Kerberos

现在验证 KDC 是否按预期工作。请务必替换 INTERNAL.DOMAIN.COM 并使用大写字母

# kinit administrator@INTERNAL.DOMAIN.COM

系统将提示您输入密码并获得类似于以下内容的输出

Warning: Your password will expire in 41 days on Wed 08 Jan 2014 11:59:11 PM CST

验证您是否实际获得了票证

# klist

您应该获得类似于以下的输出

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@INTERNAL.DOMAIN.COM

Valid starting       Expires              Service principal
11/28/2013 00:22:17  11/28/2013 10:22:17  krbtgt/INTERNAL.DOMAIN.COM@INTERNAL.DOMAIN.COM
	renew until 11/29/2013 00:22:14

作为最后的测试,将 smbclient 与您最近获得的票证一起使用。将 server 替换为正确的服务器名称

# smbclient //server/netlogon -k -c 'ls'

输出应与上面测试密码身份验证时的输出相同。

附加配置

DNS

您还需要在 DNS 中为环境中的每个子网创建反向查找区域。重要的是,这应保留在 Samba 的 DNS 中,而不是 BIND 中,以便允许客户端进行动态更新。对于每个子网,使用以下命令创建反向查找区域。将 server.internal.domain.tldxxx.xxx.xxx 替换为适当的值。对于 xxx.xxx.xxx,请以相反的顺序使用子网的前三个八位字节(例如:192.168.0.0/24 变为 0.168.192)

# samba-tool dns zonecreate server.internal.domain.tld xxx.xxx.xxx.in-addr.arpa -U Administrator

现在,为您的服务器添加记录(如果您的服务器是多宿主的,则为每个子网添加记录),再次如上所述替换适当的值。 zzz 将被服务器 IP 的第四个八位字节替换

# samba-tool dns add server.internal.domain.tld xxx.xxx.xxx.in-addr.arpa zzz PTR server.internal.domain.tld -U Administrator

最后,测试查找。将 xxx.xxx.xxx.xxx 替换为您的服务器的 IP

# host -t PTR xxx.xxx.xxx.xxx

您应该获得类似于以下内容的输出

xxx.xxx.xxx.xxx.in-addr.arpa domain name pointer server.internal.domain.tld.

TLS

默认情况下未启用 TLS 支持,但是,当 DC 启动时,会创建一个默认证书。随着 Samba 4.3.8 和 4.2.2 的发布,默认情况下禁用不安全的 LDAP 绑定,您必须配置 TLS 才能将 Samba 用作身份验证源(而不会降低 Samba 安装的安全性)。要使用默认密钥,请将以下行附加到 /etc/samba/smb.conf 文件的 “[global]” 部分

/etc/samba/smb.conf
[global]
tls enabled  = yes
tls keyfile  = tls/key.pem
tls certfile = tls/cert.pem
tls cafile   = tls/ca.pem

如果需要受信任的证书,请创建签名密钥和证书请求(有关详细说明,请参阅 OpenSSL)。让您选择的证书颁发机构签署请求,并放入此目录。如果您的证书颁发机构还需要中间证书,请连接证书(服务器证书在前,然后是中间证书)并使 tls cafile 为空。

重启 samba 以使更改生效。

向现有域添加第二个域控制器

先决条件

与设置新域时的配置设置一样,您必须按照 上面的说明 配置 ntp。此外,原始域设置上的一些参数和选项必须在此处复制。

参数解释

--option='idmap_ldb:use rfc2307 = yes'
如果您选择在现有域上包含 Unix UID/GID 支持(使用 Samba 配置步骤的 --use-rfc2307 选项或应用 RFC 2307 架构扩展),则这是必需的。
--dns-backend=DNSTYPE
DNSTYPE 替换为 BIND9_DLZSAMBA_INTERNAL - 这再次取决于服务器管理员的个人偏好。如果使用 BIND9_DLZ 后端,您将需要在加入域后按照 上面的说明 配置 bind
--option="dns forwarder="xxx.xxx.xxx.xxx"
这仅对 SAMBA_INTERNAL DNS 后端有效,它允许您指定 DNS 转发器。将 xxx.xxx.xxx.xxx 替换为适当的值。
--site=SITE
如果您定义了多个站点,请使用此选项直接加入该站点。

有关其他选项,请参阅 samba-tool domain join --help 的输出。

将现有域作为新 DC 加入

执行以下命令(将上面任何必要的参数添加到命令末尾)

# samba-tool domain join internal.domain.tld DC -U"INTERNAL\administrator"

现在复制 krb5.conf

# cp /var/lib/samba/private/krb5.conf /etc/krb5.conf

如果您使用了 RFC 2307 架构扩展,您需要从现有 DC 复制 idmap。如果使用 Samba,请从另一个 DC 执行以下命令

# tdbbackup -s .bak /var/lib/samba/private/idmap.ldb

这将生成文件 /var/lib/samba/private/idmap.ldb.bak,将此文件传输到新服务器的 /var/lib/samba/private 目录中,删除 .bak 扩展名。如果您打算保留多个 DC,您将需要使用 Samba 网站 此处 列出的方法之一来自动化此过程。这也适用于从 Windows DC 传输 idmap。

启用并启动 samba.service 单元。

如果使用 BIND9_DLZ DNS 后端,您需要按照上面的 BIND 部分进行操作。检查是否创建了 /var/lib/samba/private/dns 目录,如果未创建,请运行以下命令(忽略有关更新 named.conf 的警告)

# samba_upgradedns --dns-backend=BIND9_DLZ

重启 named.service,然后使用以下命令更新 DNS 记录

# samba_dnsupdate --all-names --use-samba-tool --verbose

现在按照新域的 LDB 配置和测试进行操作 此处

转移 FSMO 角色

如果打算用它来替换现有的域控制器,您需要在降级现有 DC 之前转移 FSMO 角色。这目前不在本文档的范围之内。请参阅 Samba Wiki 此处

附加服务

打印

默认情况下,当 Samba 服务器配置为域控制器时,默认情况下不启用打印。您需要将以下行添加到 /etc/samba/smb.conf 文件的 global 部分

/etc/samba/smb.conf
[global]
...
        rpc_server:spoolss = external
        rpc_daemon:spoolssd = fork
        printing = CUPS
...
[printers]
       path = /var/spool/samba/
       printable = yes

上述配置将启用自动共享所有 CUPS 打印队列。如果您希望仅共享特定的打印队列,您需要添加以下附加行(删除上面的 [printers] 共享)

/etc/samba/smb.conf
[global]
...
        load printers = no
...
# Add an example print share
[HPDJ3050]
       path = /var/spool/samba/
       printable = yes
       printer name = hpdj3050

技巧与窍门

使用动态 DNS 更新的 DHCP

应该注意的是,使用此方法会影响 Windows 客户端的功能,因为它们仍会尝试自行更新 DNS。当这种情况发生时,机器将被拒绝执行此操作的权限,因为记录将由 dhcp 用户而不是机器帐户拥有。虽然这基本上是无害的,但它会在违规机器的系统日志中生成警告。您应该创建一个 GPO 来克服这个问题,但不幸的是,Samba 还没有命令行实用程序来修改 GPO。您将需要一台安装了 RSAT 工具的 Windows PC。只需使用组策略编辑器创建一个专用的 GPO,并仅应用于包含使用 DHCP 的工作站的 OU(以便 Samba/Windows 服务器和静态配置的 Samba/Windows 客户端仍然可以使用“ipconfig /registerdns”更新),并配置以下设置

Computer Configuration
  Policies
    Administrative Templates
      Network
        DNS Client
          Dynamic Update = Disabled
          Register PTR Records = Disabled

安装 dhcpsudosamba-dhcpd-updateAUR 软件包。

在 AD 中创建一个非特权用户来执行更新。当提示输入密码时,使用安全密码。63 个随机的、混合大小写的字母数字字符就足够了。可选地,samba-tool 也接受 random 参数

# samba-tool user create dhcp --description="Unprivileged user for DNS updates via DHCP server"

由于这是一个服务帐户,建议禁用用户帐户的密码过期,但不是必需的

# samba-tool user setexpiry dhcp --noexpiry

授予用户管理 DNS 的权限

# samba-tool group addmembers DnsAdmins dhcp

创建 SPN 并将用户凭据导出到私有 keytab

# samba-tool spn add server/server.internal.domain.tld@INTERNAL.DOMAIN.TLD dhcp
# samba-tool domain exportkeytab --principal=dhcp@INTERNAL.DOMAIN.TLD dhcpd.keytab
# install -vdm 755 /etc/dhcpd
# mv dhcpd.keytab /etc/dhcpd
# chown root:root /etc/dhcpd/dhcpd.keytab
# chmod 400 /etc/dhcpd/dhcpd.keytab

使用以下命令修改 dhcpd-update-samba-dns.conf 文件(将 serverinternal.domain.tldINTERNAL.DOMAIN.TLD 替换为正确的值)

/etc/dhcpd/dhcpd-update-samba-dns.conf
# Variables
KRB5CC="/tmp/dhcpd4.krb5cc"
KEYTAB="/etc/dhcpd/dhcpd.keytab"
DOMAIN="internal.domain.tld"
REALM="INTERNAL.DOMAIN.TLD"
PRINCIPAL="dhcp@${REALM}"
NAMESERVER="server.${DOMAIN}"
ZONE="${DOMAIN}"

授予 dhcp 用户帐户权限,使其无需密码提示即可运行更新脚本(将 server 替换为服务器的主机名)

/etc/sudoers.d/dhcp-update
dhcp server = (root) NOPASSWD: /usr/bin/dhcpd-update-samba-dns.sh

按照 dhcpd 文章配置 dhcpd 服务器,并将以下内容添加到 /etc/dhcpd.conf 文件中提供 DHCP 服务的所有子网声明中

  on commit {
    set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
    set ClientName = pick-first-value(option host-name, host-decl-name);
    execute("/usr/bin/sudo", "/usr/bin/dhcpd-update-samba-dns.sh", "add", ClientIP, ClientName);
  }

  on release {
    set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
    set ClientName = pick-first-value(option host-name, host-decl-name);
    execute("/usr/bin/sudo", "/usr/bin/dhcpd-update-samba-dns.sh", "delete", ClientIP, ClientName);
  }

    on expiry {
    set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
    set ClientName = pick-first-value(option host-name, host-decl-name);
    execute("/usr/bin/sudo", "/usr/bin/dhcpd-update-samba-dns.sh", "delete", ClientIP, ClientName);

这是一个完整的 /etc/dhcpd.conf 文件示例,供参考

/etc/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.100 192.168.1.199;
  option subnet-mask 255.255.255.0;
  option routers 192.168.1.254;
  option domain-name "internal.domain.tld";
  option domain-name-servers 192.168.1.1;
  option broadcast-address 192.168.1.255;
  default-lease-time 28800;
  max-lease-time 43200;
  authoritative;

  on commit {
    set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
    set ClientName = pick-first-value(option host-name, host-decl-name);
    execute("/usr/bin/sudo", "/usr/bin/dhcpd-update-samba-dns.sh", "add", ClientIP, ClientName);
  }

  on release {
    set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
    set ClientName = pick-first-value(option host-name, host-decl-name);
    execute("/usr/bin/sudo", "/usr/bin/dhcpd-update-samba-dns.sh", "delete", ClientIP, ClientName);
  }

    on expiry {
    set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
    set ClientName = pick-first-value(option host-name, host-decl-name);
    execute("/usr/bin/sudo", "/usr/bin/dhcpd-update-samba-dns.sh", "delete", ClientIP, ClientName);
  }
}

最后,启用并启动(或重启)dhcpd4 服务。

将用户从一个目录转移到另一个目录

不幸的是,没有内置实用程序可以将用户从一个目录导出到另一个目录。这是一种方法,尽管非常笨拙,但可以将用户特定字段从您现有的 SAM 中提取出来,并转换为适用于 ldbmodify 的 LDIF 格式

# ldbsearch -H /var/lib/samba/private/sam.ldb \
    -s sub -b cn=Users,dc=internal,dc=domain,dc=tld '(objectClass=user)' | \
    grep -e "^\# record" -e "^accountExpires:" -e "^c:" -e "^cn:" -e "^co:" -e "^codePage:" \
         -e "^comment:" -e "^company:" -e "^countryCode:" -e "^department:" \
         -e "^description:" -e "^displayName" -e "^displayNamePrintable:" \
         -e "^distinguishedName" -e "^division:" -e "^dn:" -e "^employeeID:" \
         -e "^facsimileTelephoneNumber:" -e "^generationQualifier:" \
         -e "^givenName" -e "^homeDirectory:" -e "^homeDrive:" -e "^homePhone:" \
         -e "^homePostalAddress:" -e "^info:" -e "^initials:" \
         -e "^internationalISDNNumber:" -e "^ipPhone:" -e "^l:" -e "^mail:" \
         -e "^manager:" -e "^middleName:" -e "^mobile:" -e "^name:" -e "^o:" \
         -e "^objectClass" -e "^otherFacsimileTelephoneNumber:" \
         -e "^otherHomePhone:" -e "^otherIpPhone:" -e "^otherMailbox:" \
         -e "^otherMobile:" -e "^otherPager:" -e "^otherTelephone:" -e "^pager:" \
         -e "^personalTitle:" -e "^physicalDeliveryOfficeName:" -e "^postalAddress:" \
         -e "^postalCode:" -e "^postOfficeBox:" -e "^proxyAddresses\: SMTP" \
         -e "^proxyAddresses: smtp" -e "^referredDeliveryMethod:" \
         -e "^primaryInternationalISDNNumber:" -e "^primaryTelexNumber:" \
         -e "^profilePath:" -e "^registeredAddress:" -e "^sAMAccountName:" \
         -e "^scriptPath:" -e "^sn:" -e "^st:" -e "^street:" -e "^streetAddress:" \
         -e "^telephoneNumber:" -e "^teletexTerminalIdentifier:" \
         -e "^telexNumber:" -e "^title:" -e "^userAccountControl:" -e "^userPrincipalName:"\
         -e "^url:" -e "^userSharedFolder:" -e "^userSharedFolderOther:" -e "^wWWHomePage:" | \
    sed '/^dn:.*/ a\changetype: add' | sed '/^# record/ i\\n' > user-export.ldif

说明:仅在 users 容器中运行 ldbsearch,使用子树搜索 objectclass=user。如果您需要整个目录,您可以修改搜索库以使用根目录或其他 OU。然后将 ldbsearch 的输出通过管道传输到一个非常长的 grep 命令,该命令仅返回要保留在新目录中的适当属性。这显然是主观的,可能应该根据您的具体用例进行定制。最后,我们使用 sed 插入 changetype 行(用于告诉 ldbmodify 我们正在添加用户),并为每个导出的对象添加一个空行前缀(使其更易于阅读)。

注意: 您需要修改输出文件并删除任何您不想传输的对象。输出文件将包含对象(服务用户、内置对象等),如果您未能删除它们,这些对象可能会破坏您的新目录!它还将包含 "dn" 和 "distinguishedName" 属性中的旧域,必须在导入前进行更改。

要导入,在编辑文件并传输到新服务器后,只需在您的新 Samba 域控制器上运行以下命令

# ldbmodify -H /var/lib/samba/private/sam.ldb user-export.ldif

密码复杂度

默认情况下,Samba 要求强密码。要禁用复杂度检查,请执行以下命令

# samba-tool domain passwordsettings set --complexity=off

有关更多信息,请参阅 Samba Wiki 中的 密码设置对象