Linux上部署Samba AD域控:实现混合环境统一身份管理 1. 项目概述为什么要在Linux上用Samba做域控在传统的企业IT架构里提到“域控”Domain Controller大家的第一反应几乎都是微软的Windows Server。Active DirectoryAD几乎成了企业身份认证和集中管理的代名词。但如果你和我一样长期混迹在开源和混合环境里就会遇到一个很实际的痛点成本、灵活性和异构环境的管理。一台正版Windows Server的授权费用不菲而很多中小团队、实验室环境或者特定场景下的开发测试环境又确实需要一个集中管理用户、计算机和策略的“域”环境。这时候把目光投向Linux世界用开源的Samba来实现一个域控制器就成了一条非常务实且富有挑战性的技术路径。简单来说这个项目就是要在Linux操作系统上配置和部署Samba服务使其能够扮演一个完整的、兼容微软AD协议的域控制器角色。这意味着你不仅可以用它来管理Linux主机更能让Windows客户端Windows 10, Windows 11等无缝地加入这个域使用域账户登录应用组策略虽然功能上有差异实现统一的身份认证和资源访问管理。这不仅仅是省下一笔授权费用更深层的价值在于它让你在一个以Linux为核心的基础设施中拥有了统一身份管理的“大脑”实现了Windows与Linux混合环境的有机整合。无论是用于内部开发测试、教育培训还是作为某些特定应用如文件共享、内部服务认证的后台支撑都极具实用价值。2. 核心架构与方案选型解析2.1 Samba AD DC模式 vs. NT4模式决定用Samba做域控首先得理解它的两种主要模式经典的NT4风格域模式和现代的Active Directory域模式。这是整个方案的基石选择。早期的Samba主要模拟Windows NT 4.0的域控制器也就是我们常说的“NT4域”或“经典安全模式”。在这种模式下用户和机器账户信息存储在本地的smbpasswd或tdbsam数据库中。它的优点是配置相对简单对资源要求低。但缺点非常明显功能单一无法使用AD丰富的特性如组策略对象GPO、多主复制、LDAP目录服务的完整功能等与现代Windows客户端尤其是Windows Vista之后的兼容性会越来越差经常会遇到各种奇怪的认证和加域问题。而我们今天要搭建的是Samba的Active Directory Domain Controller模式。从Samba 4.0版本开始它引入了一个内置的、自包含的LDAP目录服务、Kerberos密钥分发中心KDC和DNS服务器完全重写了代码旨在实现与微软AD域控的高度协议兼容。在这个模式下Samba使用开源的OpenLDAP后端具体是Samba自己定制和打包的版本来存储所有AD对象用户、组、计算机、组织单元OU等使用Heimdal Kerberos实现安全的票据认证并可以集成BIND9或使用Samba内置的DNS服务来提供AD必需的SRV记录定位。选择AD DC模式意味着你获得了一个功能上更接近Windows Server AD的体验支持Windows 10/11客户端顺利加域支持更精细的权限管理和部分组策略功能。注意虽然Samba AD DC在协议层面实现了高度兼容但它并非100%等同于Windows AD。一些高级功能如某些特定的组策略设置、Exchange Server的深度集成、复杂的AD信任关系等可能无法实现或需要额外配置。它的定位是一个“足够好”的、开源替代方案尤其适合不需要微软全家桶深度绑定的环境。2.2 系统与软件版本选择工欲善其事必先利其器。版本选择直接决定了项目的成败和后续维护的难易度。Linux发行版选择理论上任何主流的Linux发行版都可以。但基于稳定性和社区支持我强烈推荐选择Rocky Linux 8/9、AlmaLinux 8/9或Ubuntu Server 20.04 LTS/22.04 LTS。RHEL系Rocky/Alma的优势在于企业级的稳定性和长期支持其软件仓库中的Samba版本可能稍旧但经过充分测试。Ubuntu Server的优势在于软件包较新文档和社区问答非常丰富。我个人在生产测试环境中更倾向于Rocky Linux因为它提供了极佳的稳定性和可预测性。避免使用滚动更新的发行版如Arch Linux因为域控是一个核心基础设施需要的是稳定而非最新。Samba版本选择这是关键中的关键。你必须使用Samba 4.x系列并且强烈建议使用当前稳定版的最新版本。例如在项目进行时Samba 4.19.x是稳定版。AD DC模式是Samba 4.x的专属功能4.0之前的版本根本不支持。你可以通过samba --version命令来查看。Ubuntu的长期支持版仓库中的版本通常足够新而RHEL系可能需要启用EPELExtra Packages for Enterprise Linux仓库或通过其他方式获取较新版本。其他依赖时间同步NTP域内所有计算机包括域控和客户端的时间必须高度同步误差通常不能超过5分钟否则Kerberos认证会失败。你需要确保Linux主机配置并运行了chronyd或ntpd服务并指向可靠的NTP服务器。DNS服务AD严重依赖DNS来定位域控制器通过_ldap._tcp.dc._msdcs.域名等SRV记录。你可以选择使用Samba AD DC内置的DNS服务器推荐最省事或者与一个外部的BIND9 DNS服务器进行集成。内置DNS是初始配置最简单的方式。主机名与网络为你的Linux服务器设置一个静态的、完全合格域名FQDN例如dc01.mydomain.local。确保/etc/hosts文件正确解析了这个FQDN和IP地址。网络配置需要是静态IPDHCP获取的IP在域控上会带来很多麻烦。3. 详细部署与配置实操3.1 前期系统准备与环境检查假设我们在一台全新的Rocky Linux 9服务器上操作主机名规划为dc01域名规划为corp.demo这是一个示例域名请根据实际情况修改建议使用.local后缀的私有域名以避免与公网冲突。第一步进行系统更新和主机名设置。sudo dnf update -y sudo hostnamectl set-hostname dc01.corp.demo编辑/etc/hosts文件确保有一行指向本机127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.10 dc01.corp.demo dc01请将192.168.1.10替换为你服务器的真实静态IP地址。第二步配置防火墙。Samba AD DC需要开放一系列端口最稳妥的方式是在防火墙中允许Samba服务。sudo firewall-cmd --permanent --add-servicesamba sudo firewall-cmd --permanent --add-servicekerberos sudo firewall-cmd --permanent --add-serviceldap sudo firewall-cmd --permanent --add-serviceldaps sudo firewall-cmd --permanent --add-servicedns sudo firewall-cmd --permanent --add-servicentp sudo firewall-cmd --reload如果你使用iptables则需要手动开放TCP/UDP的53DNS、88Kerberos、135RPC、139/445SMB、389LDAP、464Kerberos密码更改、3268全局编录等端口。第三步确保时间同步服务运行。Rocky Linux 9默认使用chronyd。sudo systemctl enable --now chronyd sudo chronyc sources3.2 安装Samba及相关软件包在Rocky Linux 9上Samba 4.x通常已经在默认仓库中。我们安装Samba AD DC所需的全部包。sudo dnf install samba samba-dc samba-client samba-common-tools krb5-workstation bind bind-dyndb-ldap -y这里我们一并安装了BIND9 DNS服务器及其与LDAP的动态集成模块为后续使用Samba内置DNS或与BIND集成做准备。3.3 使用samba-tool创建新AD域这是最关键的一步我们将把这台Linux服务器提升为域控制器并创建一个全新的AD林。首先需要停止并禁用可能冲突的Samba旧服务如果存在sudo systemctl disable --now smb nmb winbind然后使用samba-tool domain provision命令来配置新的域。这个命令是交互式的但为了可重复性和自动化我更喜欢使用带参数的非交互方式。以下命令创建了一个名为CORP.DEMO的域NetBIOS名为CORP管理员密码设置为MySuperSecretPass123!。sudo samba-tool domain provision --use-rfc2307 --realmCORP.DEMO --domainCORP --server-roledc --dns-backendSAMBA_INTERNAL --adminpassMySuperSecretPass123! --host-namedc01 --host-ip192.168.1.10 --siteDefault-First-Site-Name --optionidmap_ldb:use rfc2307 yes让我们拆解一下这个命令的关键参数--use-rfc2307极其重要。这个选项让Samba将POSIX属性如UID/GID存储在AD中这对于Linux客户端通过SSH使用域账户登录、或者NFSv4与AD集成至关重要。它创建了idmap.ldb数据库来映射Windows SID和Linux UID/GID。--realmKerberos领域名通常是大写的域名。--domainNetBIOS域名通常是大写的短名不能超过15个字符。--server-roledc指定角色为域控制器。--dns-backendSAMBA_INTERNAL使用Samba内置的DNS服务器。这是最简单的选择。--adminpass设置目录服务还原模式DSRM和管理员账户的密码。请务必使用强密码。--host-ip指定本机IP确保DNS记录正确生成。命令执行成功后会在/var/lib/samba/目录下生成所有必要的数据库和配置文件。最重要的配置文件/etc/samba/smb.conf已经被自动生成和配置好了。3.4 启动Samba AD DC服务并验证配置完成后需要启动Samba AD DC服务。在Samba 4 AD DC模式下传统的smb和nmb服务不再使用取而代之的是samba服务它作为一个集成服务来运行所有必要的守护进程LDAP、KDC、DNS等。sudo systemctl disable --now smb nmb winbind sudo systemctl unmask samba sudo systemctl enable --now samba使用systemctl status samba检查服务状态确保所有组件都运行正常。接下来进行一系列验证确保域控核心功能正常。1. 验证Kerberos票据颁发首先配置本机的/etc/krb5.conf使其指向我们新建的域控。Samba的provision命令应该已经生成了这个文件。我们可以尝试获取管理员用户的Kerberos票据。kinit administratorCORP.DEMO系统会提示输入密码就是provision时设置的--adminpass。输入后使用klist命令查看当前缓存的票据。如果成功你会看到一张授予administrator的票据。2. 验证LDAP目录查询使用ldapsearch命令查询AD目录树这是检查LDAP服务是否正常工作的好方法。ldapsearch -H ldap://dc01.corp.demo -x -D administratorcorp.demo -W -b dccorp,dcdemo输入管理员密码后你应该能看到LDAP目录的根目录信息。3. 验证DNS记录AD依赖DNS的SRV记录。使用host或dig命令查询关键记录。dig -t SRV _ldap._tcp.corp.demo 192.168.1.10 dig -t SRV _kerberos._udp.corp.demo 192.168.1.10这些命令应该返回指向dc01.corp.demo的SRV记录。如果使用Samba内置DNS请确保客户端的DNS服务器已设置为这台域控的IP地址。3.5 配置Linux主机使用AD进行身份认证现在域控已经运行我们可以配置另一台Linux客户端使其加入域并使用域账户登录。这里以Rocky Linux客户端为例。首先在客户端上安装必要的软件sudo dnf install realmd oddjob oddjob-mkhomedir sssd samba-common-tools krb5-workstation adcli -y使用realmd工具发现并加入域这是一个简化流程的工具sudo realm discover corp.demo sudo realm join --useradministrator corp.demo系统会提示你输入administrator的密码。realmd会自动配置sssdSystem Security Services Daemon和/etc/krb5.conf。加入成功后你可以验证sudo realm list输出应显示corp.demo域并注明client-software: sssd。现在你可以使用域账户了。例如创建一个域用户在域控上操作sudo samba-tool user create zhangsan --given-nameSan --surnameZhang --mail-addresszhangsancorp.demo sudo samba-tool user setpassword zhangsan然后在客户端上你可以切换到该用户sssd会自动创建家目录因为安装了oddjob-mkhomedirsu - zhangsancorp.demo或者直接使用域账户通过SSH登录客户端如果SSH配置了PasswordAuthentication yes或配置了Kerberos认证。4. Windows客户端加域与基础管理4.1 Windows客户端加入Samba域这是检验Samba AD DC兼容性的“试金石”。在一台Windows 10/11计算机上操作。配置DNS将Windows客户端的首选DNS服务器指向你的Samba域控IP192.168.1.10。这是必须的否则Windows无法定位域控制器。系统属性右键点击“此电脑” - “属性” - “高级系统设置” - “计算机名”选项卡 - 点击“更改”。加入域在“计算机名/域更改”对话框中选择“域”并输入你的域名corp.demo点击“确定”。输入凭据在弹出的对话框中输入有权限加域的账户名和密码通常是CORP\administrator或administratorcorp.demo以及对应的密码。重启根据提示重启计算机。重启后你应该可以使用域账户例如CORP\zhangsan登录这台Windows计算机。登录成功后在“此电脑” - “属性”中可以看到“域”已显示为corp.demo。实操心得Windows客户端加域失败90%的原因出在DNS上。请务必确保客户端DNS指向域控并且能正确解析dc01.corp.demo和相关的SRV记录。可以在Windows命令行用nslookup dc01.corp.demo和nslookup -typeSRV _ldap._tcp.corp.demo来排查。4.2 使用RSAT进行基础AD管理虽然我们可以在Linux域控上使用samba-tool和ldb命令进行一切管理但对于习惯图形界面的管理员可以在一台加入域的Windows计算机上安装远程服务器管理工具RSAT。在Windows 10/11上通过“设置”-“应用”-“可选功能”-“添加功能”找到并安装“RSATActive Directory 域服务和轻型目录服务工具”。安装后在开始菜单中找到“Active Directory 用户和计算机”并打开。连接到你的corp.demo域你就可以像管理Windows AD一样在图形界面中创建组织单元OU、用户、组、计算机对象了。需要注意的是Samba AD DC支持的AD架构是基础版本并非所有Windows AD的高级功能都能在RSAT中完美显示或操作但基本的对象管理是完全可行的。4.3 组策略GPO的有限支持Samba AD DC支持一部分组策略。组策略设置实际上存储在sysvol共享\\\\corp.demo\\sysvol的特定目录中。你可以使用Windows上的“组策略管理编辑器”来创建和编辑GPO并将其链接到OU。但是Samba本身并不解释或应用这些GPO设置。当Windows客户端处理GPO时它会从sysvol下载策略文件并由Windows本地的组策略客户端引擎gpsvc来应用这些针对Windows的设置。这意味着你只能管理那些由Windows客户端理解的策略。Samba域控在这里主要扮演一个策略文件的存储和分发角色。对于Linux客户端有像sssd、pam和polkit这样的机制来实现策略但它们与Windows GPO不是一回事需要单独配置。5. 高级配置、维护与故障排查5.1 配置Samba内置DNS管理如果你在provision时使用了--dns-backendSAMBA_INTERNAL那么DNS管理可以通过samba-tool命令或Windows DNS管理控制台需安装RSAT的DNS工具进行。使用samba-tool管理DNS记录# 添加A记录 sudo samba-tool dns add dc01.corp.demo corp.demo webserver A 192.168.1.20 # 添加CNAME记录 sudo samba-tool dns add dc01.corp.demo corp.demo www CNAME webserver.corp.demo # 查看记录 sudo samba-tool dns query dc01.corp.demo corp.demo ALL从Windows DNS管理器连接在安装了RSAT DNS工具的Windows上打开“DNS管理器”右键“DNS”-“连接到DNS服务器”输入dc01.corp.demo即可进行图形化管理。5.2 备份与恢复域控制器的备份至关重要。Samba AD DC的备份主要涉及两个部分配置文件和数据库。配置文件备份主要是/etc/samba/smb.conf和/etc/krb5.conf。直接复制即可。数据库备份使用samba-tool domain backup命令。这是一个在线热备份命令。sudo samba-tool domain backup offline --targetdir/opt/samba_backup这个命令会创建一个包含所有AD数据库sam.ldb,secrets.ldb等的压缩归档文件。定期执行此命令并妥善保管备份文件。恢复恢复需要在类似的新系统上安装相同版本的Samba软件包然后使用samba-tool domain restore命令并指定备份文件。这个过程比较复杂需要严格遵循官方文档并确保主机名、IP等信息与备份时一致。5.3 常见问题与排查技巧实录在实际部署和运维中你会遇到各种各样的问题。这里记录几个最典型的场景和排查思路。问题1Windows客户端无法加入域提示“找不到网络路径”或“域控制器不可用”。排查思路防火墙这是首要怀疑对象。在域控上使用sudo firewall-cmd --list-all确认所有Samba相关服务端口都已开放。临时关闭防火墙测试sudo systemctl stop firewalld是快速定位问题的方法但之后一定要配置好规则再开启。DNS在Windows客户端上nslookup dc01.corp.demo必须能解析到正确的IP。nslookup -typeSRV _ldap._tcp.corp.demo必须能返回域控的SRV记录。如果失败检查客户端DNS设置并登录域控检查Samba DNS服务状态sudo systemctl status samba和日志sudo tail -f /var/log/samba/log.samba。时间同步确保客户端和服务器时间差在5分钟以内。Kerberos对时间极其敏感。问题2Linux客户端使用realm join失败报错“Permission denied”或“KDC reply did not match expectations”。排查思路凭证问题确保使用的用户名密码正确并且账户有加域权限默认Domain Admins和Domain Computers组有权限。Kerberos配置检查客户端/etc/krb5.conf文件确保[realms]和[domain_realm]部分正确指向了域控。可以手动尝试kinit administratorCORP.DEMO看能否获取票据。主机名解析确保客户端能通过DNS或/etc/hosts正确解析域控的FQDN。问题3域用户登录Linux客户端时家目录无法自动创建。排查思路确保客户端安装了oddjob-mkhomedir包。检查/etc/sssd/sssd.conf文件确保[domain/corp.demo]段落下设置了fallback_homedir /home/%u并且pam服务配置正确。通常realm join会自动配置但有时需要手动检查/etc/pam.d/system-auth和/etc/pam.d/password-auth文件确保包含了pam_sss.so的配置。查看/var/log/secure日志获取更详细的认证和家目录创建错误信息。问题4Samba服务启动失败日志中出现“Failed to set up CLDAP server”或“LDAP server initialization failed”。排查思路端口占用使用sudo ss -tlnp | grep :389或sudo ss -tlnp | grep :53检查389LDAP或53DNS端口是否被其他进程如systemd-resolved,named占用。需要停止并禁用这些冲突服务。数据库文件权限确保/var/lib/samba/private和/var/lib/samba/sysvol等目录的权限属于samba用户和组。可以尝试运行sudo samba-tool ntacl sysvolreset来重置sysvol的ACL。配置文件错误检查/etc/samba/smb.conf是否有语法错误可以用testparm命令测试。部署和维护一个基于Samba的AD域控是对你Linux系统管理、网络服务和故障排查能力的综合锻炼。它不是一个“一键部署”的简单服务但一旦稳定运行它将为你的混合IT环境提供一个强大、免费且可控的统一身份管理核心。记住耐心和细致的日志分析是你最好的朋友。每次遇到问题/var/log/samba/目录下的日志文件如log.sambalog.ldb是第一个应该查看的地方。