十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于Samba在Linux上搭建Active Directory域控实战指南

基于Samba在Linux上搭建Active Directory域控实战指南 1. 项目概述为什么要在Linux上用Samba做域控在传统的企业IT架构里一提到“域控”大家脑子里蹦出来的肯定是微软的Windows Server。Active DirectoryAD几乎成了企业身份认证和集中管理的代名词。但如果你是一个运维工程师面对一个成本敏感、或者技术栈偏向开源的环境有没有可能用一套完全免费、稳定且可控的方案来替代呢答案是肯定的而主角就是Samba。Samba不是一个新玩意儿它本质是一套让Linux/Unix系统能够理解并响应Windows网络协议主要是SMB/CIFS的软件集合。最广为人知的功能是作为文件服务器让Windows电脑能像访问网上邻居一样访问Linux共享。但很多人不知道的是从Samba 4.0版本开始它完整地实现了AD域控制器的全部功能包括域用户认证、组策略部分、DNS、DHCP等。这意味着你可以用一台普通的Linux服务器搭建一个完全兼容Windows客户端的域环境。我之所以会深入研究这个方案是因为几年前接手了一个混合环境的小型创业公司项目。服务器端全是CentOS但员工桌面端清一色的Windows 10。老板既不想为几台服务器和几十个客户端购买Windows Server授权又希望实现统一的账号管理和文件共享权限控制。Samba AD DCActive Directory Domain Controller就成了最理想的解决方案。实测下来它不仅稳定运行了数年而且在管理体验上一旦熟悉了命令行和Samba特有的工具效率甚至比在图形界面里点来点去还要高。这个方案特别适合哪些场景呢首先是预算有限的中小企业或技术团队其次是开发测试环境需要快速搭建一个域环境来验证应用再者是那些服务器主体是Linux但需要接入Windows客户端的混合IT环境。当然如果你是一个喜欢折腾、希望深入理解AD协议底层原理的技术爱好者这更是一个绝佳的学习路径。2. 核心架构与方案选型考量决定用Samba做域控可不是简单地yum install samba就完事了。在动手之前必须把整个架构和各个组件的角色想清楚这直接决定了后续实施的顺利与否。2.1 单域控 vs. 多域控高可用对于大多数中小规模环境一台Samba域控服务器足以胜任。它同时扮演着AD DC、DNS服务器、Kerberos密钥分发中心KDC等多种角色。这种“All in One”的部署方式简单直接维护成本低。但是如果对服务的可用性有要求或者用户规模较大就需要考虑部署多台域控。Samba支持多DC架构域控之间通过AD数据库基于LDAP的复制来同步用户、组等信息。这里有个关键点第一台搭建的域控称为“主域控”后续加入的称为“额外域控”。主域控拥有FSMO操作主机角色虽然Samba对FSMO角色的管理不如Windows那样直观但在规划时仍需明确。在我的实施经验里对于50人以下的团队单域控配合定时的系统级备份比如使用rsync或tar备份Samba的数据库和配置文件目录就足够了。如果超过这个规模或者有核心业务必须7x24小时认证我会建议至少部署两台域控并配置DNS轮询或负载均衡器来实现客户端的自动故障转移。2.2 集成服务规划DNS是关键一个能用的AD域严重依赖DNS。Windows AD的许多核心功能如域控制器定位、服务发现SRV记录、Kerberos认证等都需要正确的DNS记录来引导。Samba在作为域控安装时强烈推荐使用它自带的内部DNS服务器基于BIND 9的DLZ插件。这个选择省心省力因为Samba会自动创建和维护所有必需的DNS记录比如_ldap._tcp.dc._msdcs.domain这样的SRV记录。如果你坚持使用外部DNS比如公司已有的BIND或Windows DNS就需要手动添加一大堆记录非常容易出错而且后续管理也很麻烦。注意很多初次尝试者失败的原因都出在DNS上。确保你的服务器主机名是完整的FQDN完全合格域名并且网络配置中的DNS服务器地址指向了自己127.0.0.1。在安装过程中Samba会检查DNS配置如果不正确会报错。另一个需要考虑的服务是时间同步NTP。AD Kerberos认证协议对时间差非常敏感通常要求客户端和服务器的时间差不超过5分钟。因此必须确保你的Samba域控服务器与可靠的时间源同步并作为时间服务器为域内的Windows客户端提供时间。2.3 Linux发行版与Samba版本选择这不是一个随意的选择。不同的Linux发行版其软件仓库中提供的Samba版本可能差异很大。RHEL/CentOS/Rocky Linux/AlmaLinux (7.x/8.x/9.x)这些企业级发行版的默认仓库中的Samba版本往往比较保守可能不是最新的稳定版。例如CentOS 7默认是Samba 4.10左右而最新的稳定版可能已经到了4.19。好处是极度稳定与系统其他部分集成好缺点是可能缺少一些新特性或安全补丁。我通常选择从官方Samba仓库或EPEL仓库获取较新的版本。Ubuntu/Debian它们的软件仓库更新更积极。例如Ubuntu 22.04 LTS就提供了Samba 4.15。对于追求新功能和社区支持的用户这是一个好选择。openSUSE/Fedora同样提供较新的软件包适合喜欢前沿技术的用户。我的建议是生产环境优先选择RHEL系因为其长期支持LTS特性和企业级生态学习和测试环境可以用Ubuntu上手更快。无论选择哪个都要确保安装的是samba-ad-dc这个包或类似名称它包含了作为域控所需的所有组件而不仅仅是文件共享服务。3. 实战部署从零搭建Samba AD域控理论说再多不如动手做一遍。下面我将以一台全新的CentOS 8 Stream或Rocky Linux 8服务器为例演示完整的部署过程。假设我们要创建的域名为CORP.LOCAL服务器主机名为dc01.corp.localIP地址为192.168.1.10。3.1 前期系统准备与环境检查部署的第一步不是安装软件而是打好基础。一个配置不当的基础系统会让后续步骤举步维艰。1. 设置静态IP和主机名这是铁律。域控服务器绝对不能使用DHCP获取动态IP。# 编辑网络配置文件例如对于ens192网卡 sudo vi /etc/sysconfig/network-scripts/ifcfg-ens192确保包含以下关键配置BOOTPROTOnone IPADDR192.168.1.10 NETMASK255.255.255.0 GATEWAY192.168.1.1 DNS1127.0.0.1 # 先指向自己安装Samba DNS后再改 DNS2192.168.1.1 # 可设置一个上游DNS作为备用 DOMAINcorp.local设置主机名sudo hostnamectl set-hostname dc01.corp.local # 编辑/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.local dc012. 关闭并禁用不必要服务关闭SELinux和防火墙仅用于实验环境生产环境需配置安全策略sudo setenforce 0 sudo sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config sudo systemctl stop firewalld sudo systemctl disable firewalld3. 同步时间sudo yum install -y chrony sudo systemctl enable --now chronyd sudo chronyc sources3.2 安装Samba AD DC软件包配置好YUM仓库如果需要更新版本可以添加Samba官方仓库或EPEL然后安装核心包sudo dnf install -y samba-ad-dc samba-client samba-common-tools krb5-workstation bind bind-dyndb-ldap这里我们一口气安装了samba-ad-dc: 域控主程序。samba-clientsamba-common-tools: 包含管理工具如samba-tool。krb5-workstation: Kerberos客户端工具用于测试认证。bind,bind-dyndb-ldap: BIND DNS服务器及其LDAP动态数据库插件Samba将用它来提供集成DNS。3.3 使用Samba-tool创建新域这是最关键的一步。我们将使用samba-tool这个强大的命令行工具来初始化一个新的AD森林和域。sudo samba-tool domain provision --use-rfc2307 --interactive执行这个命令后会进入一个交互式配置界面Realm: 输入大写的域名例如CORP.LOCAL。这是Kerberos领域的名称。Domain: 输入NetBIOS域名通常是域名的第一部分例如CORP。这是旧式Windows网络使用的名称。Server Role: 选择dc表示作为域控制器。DNS backend: 强烈选择SAMBA_INTERNAL。这就是前面提到的集成DNS管理最方便。DNS forwarder IP address: 可以输入一个上游DNS服务器IP如8.8.8.8。当Samba DNS无法解析外部域名时会转发请求到这里。Administrator password: 设置一个强密码。这是域管理员Administrator的密码务必牢记。命令运行成功后会在/var/lib/samba/private/和/etc/samba/下生成所有必要的配置文件和数据文件。其中/etc/samba/smb.conf是主配置文件现在已经被自动配置为域控模式。一个重要操作将Samba生成的Kerberos配置文件链接到系统标准位置sudo cp /var/lib/samba/private/krb5.conf /etc/krb5.conf3.4 启动服务并验证首先需要停用并禁用可能冲突的旧版Samba服务如果之前安装过sudo systemctl disable --now smb nmb winbind然后启用并启动Samba域控服务sudo systemctl unmask samba-ad-dc sudo systemctl enable --now samba-ad-dc检查服务状态sudo systemctl status samba-ad-dc如果状态为active (running)恭喜你域控的核心服务已经跑起来了。3.5 基础功能验证现在让我们从几个维度验证域控是否工作正常。1. 验证DNS记录Samba应该已经自动注册了大量DNS记录。我们可以用host或dig命令查询# 查询域控制器定位记录 dig -t SRV _ldap._tcp.dc._msdcs.corp.local 127.0.0.1 # 查询域控的A记录 dig dc01.corp.local 127.0.0.1如果能看到正确的IP地址和SRV记录说明DNS服务运行良好。2. Kerberos认证测试尝试获取一个Kerberos票据Ticketkinit administratorCORP.LOCAL系统会提示输入密码就是provision时设置的Administrator密码。输入后使用klist命令查看当前缓存的票据。如果能看到administratorCORP.LOCAL的票据说明Kerberos认证成功。3. 使用samba-tool进行管理查询sudo samba-tool user list这条命令会列出域中的所有用户。初始状态下你应该能看到Administrator、Guest等默认账户。4. 从Windows客户端测试加入域可选找一台Windows 10/11电脑将其DNS服务器地址设置为你的Samba域控IP192.168.1.10。然后进入“系统属性”-“计算机名”选项卡点击“更改”选择“域”输入CORP.LOCAL然后使用管理员账号CORP\administrator和密码进行加入。如果成功则证明域控的核心功能完全正常。4. 日常管理与高级配置域控搭建起来只是开始日常管理才是重头戏。Samba提供了强大的命令行工具集大部分管理工作都可以通过samba-tool完成。4.1 用户与组管理在Samba AD中管理用户和组完全不需要图形界面。创建用户sudo samba-tool user create zhangsan --given-nameSan --surnameZhang --departmentIT # 创建时会随机生成密码并提示你修改。也可以指定密码 sudo samba-tool user create lisi Passw0rd123!创建组并将用户加入组sudo samba-tool group add IT-Staff sudo samba-tool group addmembers IT-Staff zhangsan,lisi修改用户属性如重置密码、禁用账户sudo samba-tool user setpassword zhangsan --newpasswordNewPass123! sudo samba-tool user disable zhangsan sudo samba-tool user enable zhangsan使用LDAP命令进行复杂查询虽然samba-tool很强大但有时需要更灵活的查询这时可以直接使用LDAP命令。Samba AD的LDAP服务端口是389。# 搜索所有用户 ldapsearch -H ldap://dc01.corp.local -x -b dccorp,dclocal (objectClassuser) sAMAccountName # 搜索特定用户详细信息 ldapsearch -H ldap://dc01.corp.local -x -b dccorp,dclocal (sAMAccountNamezhangsan)4.2 组策略对象GPO管理Samba对组策略的支持是部分实现的主要支持的是“策略”的存储和下发机制对于策略的具体内容ADMX模板其解释和执行仍然依赖于Windows客户端。但我们可以管理GPO的链接和状态。Samba将GPO信息存储在sysvol共享中路径是/var/lib/samba/sysvol/。你可以使用samba-tool来创建和链接GPO但更复杂的策略编辑通常是在一台已加入域的Windows电脑上使用“组策略管理编辑器”GPMC远程连接到Samba域控来进行。这是一个典型的混合管理场景策略存储在Linux上用Windows工具编辑。4.3 文件共享与权限集成这是Samba的老本行也是AD域价值最直接的体现。我们可以在域控或其他Linux成员服务器上创建共享并直接使用域用户和组来设置NTFS风格在Linux上是ACL的权限。假设我们要在域控上创建一个共享文件夹/srv/dept-share给IT部门使用# 1. 创建目录并设置所有权 sudo mkdir -p /srv/dept-share sudo chown -R root:CORP\Domain Admins /srv/dept-share # 2. 设置ACL赋予IT-Staff组读写权限 sudo setfacl -m g:CORP\IT-Staff:rwx /srv/dept-share sudo setfacl -m d:g:CORP\IT-Staff:rwx /srv/dept-share # 默认ACL # 3. 编辑Samba配置文件/etc/samba/smb.conf添加共享定义 [ITShare] path /srv/dept-share read only no valid users CORP\IT-Staff force group CORP\IT-Staff inherit acls yes nt acl support yes # 4. 重启Samba服务在域控上重启samba-ad-dc服务会同时重载文件共享配置 sudo systemctl restart samba-ad-dc现在IT部门的成员在Windows文件资源管理器中输入\\dc01.corp.local\ITShare用他们的域账号登录后就可以访问这个共享了并且权限完全由AD组控制。4.4 备份与恢复策略域控的备份至关重要主要备份两部分Samba数据库和系统状态。1. Samba数据库备份Samba AD的数据库位于/var/lib/samba/private/和/var/lib/samba/sysvol/。最简单的备份方式是定时打包。# 创建备份脚本 sudo vi /usr/local/bin/backup-samba-ad.sh脚本内容示例#!/bin/bash BACKUP_DIR/backup/samba-ad DATE$(date %Y%m%d_%H%M%S) tar -czf $BACKUP_DIR/samba-backup-$DATE.tar.gz \ /etc/samba/smb.conf \ /var/lib/samba/private \ /var/lib/samba/sysvol \ 2/dev/null # 保留最近7天的备份 find $BACKUP_DIR -name samba-backup-*.tar.gz -mtime 7 -delete然后添加cron任务定期执行。2. 使用samba-tool进行在线备份samba-tool提供了更专业的备份命令可以生成一个可移植的备份文件。sudo samba-tool domain backup offline --targetdir/backup/samba-ad3. 系统级备份考虑使用rsnapshot、borgbackup等工具对整个系统进行增量备份以防硬件故障。恢复演练定期在测试环境进行恢复演练非常重要。恢复的大致步骤是在新机器上安装相同版本的Samba停止服务解压备份文件到相应位置恢复配置文件然后启动服务。具体命令需参考Samba官方文档因为涉及数据库恢复操作。5. 故障排查与性能优化实录即使按照指南操作在实际部署和运行中也可能遇到各种问题。下面是我在多次部署中积累的一些常见问题及解决方法。5.1 常见问题速查表问题现象可能原因排查步骤与解决方案samba-tool domain provision失败提示“DNS服务器无法解析主机名”1. 主机名不是FQDN。2./etc/hosts文件未正确配置。3. 系统DNS设置未指向自己127.0.0.1。1.hostname -f检查是否为dc01.corp.local。2. 检查/etc/hosts确保有192.168.1.10 dc01.corp.local dc01。3. 检查/etc/resolv.conf确保第一行是nameserver 127.0.0.1。Windows客户端无法加入域提示“找不到网络路径”或“域控制器不可用”1. 网络不通或防火墙阻挡。2. 客户端DNS未指向Samba域控。3. Samba服务未运行或端口未监听。1. 从客户端ping域控IP和主机名。2. 在客户端nslookupcorp.local和_ldap._tcp.dc._msdcs.corp.local看解析是否正确。3. 在域控上运行sudo netstat -tlnp | grep -E ‘:(389|53|88|445|135|139)’检查关键端口LDAP, DNS, Kerberos, SMB等是否处于监听状态。用户登录失败提示“用户名或密码不正确”1. 密码错误。2. 账户被禁用。3. Kerberos票据问题。4. 时间不同步。1. 在域控上用samba-tool user list确认账户存在。2. 用samba-tool user status username查看账户是否禁用。3. 在域控上用kinit测试管理员账号能否获取票据。4. 检查客户端和服务器时间差异应在5分钟内。文件共享可以访问但无法写入或权限混乱1. 共享目录的Linux文件系统权限POSIX权限限制。2. Windows ACL未正确设置或继承。3. Samba配置中force user/group设置冲突。1. 检查目录的Linux所有者和权限ls -la。2. 在Linux上用getfacl查看目录的ACL确保域用户/组有相应权限。3. 检查smb.conf中该共享的valid userswrite listforce group等参数。Samba服务启动慢或客户端响应慢1. DNS反向解析问题。2. 系统资源内存、CPU不足。3. 日志级别过高磁盘I/O慢。1. 确保域控IP192.168.1.10能反向解析到自己的FQDN。2. 使用top或htop监控资源使用情况。对于大型域考虑增加内存。3. 在smb.conf的[global]部分调整log level 1默认是1如果调高会记录大量调试信息影响性能。5.2 性能监控与优化技巧一个健康的域控需要持续关注其性能表现。1. 监控工具smbstatus: 查看当前Samba连接、打开的文件和锁状态。sudo smbstatus -L可以看锁对排查文件访问冲突很有用。samba-tool dbcheck: 定期检查Samba内部数据库的一致性。系统工具top,htop,iotop,nethogs。重点关注samba进程的CPU、内存占用以及网络I/O。2. 日志分析Samba的日志默认在/var/log/samba/目录下。log.smbd记录文件共享相关log.netlogon记录域登录相关。当出现问题时提高日志级别在smb.conf中设置log level 3然后复现问题再分析日志是定位复杂问题的终极手段。3. 配置优化建议Socket Options: 在smb.conf的[global]部分可以添加socket options TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF131072 SO_SNDBUF131072来优化网络性能。日志轮转: 确保logrotate配置正常避免日志文件无限增大占满磁盘。定期更新: 关注Samba安全公告及时通过包管理器更新到稳定版本。5.3 安全加固要点用Linux做域控安全同样不能松懈。最小化网络暴露: 在防火墙如果开启上只开放必要的端口TCP 53 (DNS), 88 (Kerberos), 135 (RPC), 139/445 (SMB), 389 (LDAP), 464 (Kerberos kpasswd), 3268 (全局编录)等。UDP 53, 88, 123 (NTP), 137/138 (NetBIOS)如果不需要NetBIOS名称解析可以关闭137/138。定期审计: 使用sudo samba-tool user list --locked查看被锁定的账户使用日志分析工具监控异常登录行为如大量失败尝试。备份加密: 对备份文件进行加密并存放在异地或离线介质中。系统安全: 定期进行系统安全更新使用强密码策略可以通过samba-tool domain passwordsettings set来设置禁用默认的Guest账户。部署和维护一个基于Samba的AD域控是一个将开源软件的灵活性与企业级目录服务需求相结合的过程。它要求你不仅了解Linux系统管理还要对Windows AD的核心概念如Kerberos、LDAP、DNS集成有深入的理解。这个过程充满挑战但一旦成功带来的那种对技术栈的完全掌控感和成本节约的成就感是使用商业软件无法比拟的。最关键的是所有操作都通过命令行完成这为自动化运维如用Ansible批量管理用户打开了大门这才是现代运维的精髓所在。
返回列表