ARTICLE DETAIL

资讯详情

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

CentOS 7 NIS集中账号管理指南:服务端配置与客户端绑定实战

CentOS 7 NIS集中账号管理指南:服务端配置与客户端绑定实战 公司服务器从几十台涨到几百台的时候你会发现最痛苦的不是装系统而是每台机器都要手动加一遍用户。今天说 CentOS 7 上配置 NIS 的详细过程。NIS 全称 Network Information Service是早年 Sun 搞出来的集中账号管理方案虽然比 LDAP 老但在内网环境下够简单、够直接尤其适合那种“我就想让所有 Linux 机器共享同一套用户和密码”的场景。我这次就把服务端、客户端、常见坑完整过一遍照着做基本能跑通。1. 内容整体设计与思路拆解1.1 NIS 能解决什么问题先想清楚为什么要上 NIS。运维日常里最常见的痛点是新同事入职你要在几十台服务器上重复执行 useradd有人改密码你得挨台机器去同步离职要删号也是一台一台来。这些操作在机器少的时候手动还能忍机器一多就纯属消耗生命。NIS 的核心思路就是“集中存储、按需拉取”。所有用户、密码、组的信息集中在 NIS 服务器上客户端机器启动时通过 ypbind 找到服务器登录时去服务器查询用户信息本地不再需要真正创建这个用户。你能在客户端看到 NIS 上的用户并且直接用他的账号登录这就够了。1.2 方案选型为什么不用 LDAP 或直接上 Kerberos现在很多新人上来就推荐 LDAP说功能更强大、支持 TLS、能存更多属性。这话没错但 LDAP 的目录结构设计、schema 扩展、权限模型、证书配置学习成本相当高。如果只是想让 Linux 集群共享账号密码NIS 的部署时间大约只需要 LDAP 的五分之一。平心而论NIS 的缺点是明文传输、认证机制弱所以在跨公网环境我绝不推荐。但在一个可信的内网网段里比如机房内网、办公室研发内网NIS 作为账号统一方案完全够用而且排查问题直观——配置文件就那几个命令就那么几条。选型逻辑说白了就是场景匹配比功能堆砌更重要。1.3 整体架构与核心组件配置 NIS 之前先把架构捋清楚。整套系统包含三块NIS 服务端安装 ypserv负责生成和维护用户数据库的 map 文件响应客户端的查询请求。绑定客户端安装 ypbind 和 yp-toolsypbind 负责自动找到并绑定 NIS 服务器。辅助服务yppasswdd 允许用户在客户端上修改自己的 NIS 密码rpcbind 是所有 RPC 服务NIS 依赖 RPC 传输的基础必须先启动。NIS 服务器可以配置 master/slave中小规模场景一台 master 就足够。下面的实操就以单台 master 为例。2. 核心细节解析与实操要点2.1 NIS 域名与网络规划很多人第一次接触 NIS 会被“域名”这个名字带偏以为 NIS 域名就是 DNS 域名。其实它只是一个逻辑分组标识在同一 NIS 域中的客户端才能看到该域的用户数据。我的习惯是在规划阶段就定好统一的命名规范比如内网环境一律使用example.local或nis.yourdomain.com服务端和客户端必须完全一致。域名不一致是新手最常见的坑ypbind 怎么都绑不上。同时建议把 NIS 服务器的 IP 和主机名写成静态对应关系推荐直接写入每台机器的 /etc/hosts避免依赖内网 DNS。因为 ypbind 在使用server指令指定服务器时需要解析主机名如果解析不到就会陷入等待超时。2.2 理解 map 文件和数据库的概念NIS 服务端并不是直接读 /etc/passwd 给客户端看的而是通过make -C /var/yp将这些本地文件编译成二进制的 map 数据库存放在/var/yp/NIS域名/目录下。这一点必须提前理解否则后面改用户时会很困惑明明在服务端改了密码客户端却还是显示旧密码原因就是没重新生成 map。map 文件包含 passwd、group、hosts如果你选择发布、shadow 等具体发布哪些由 /var/yp/Makefile 控制。2.3 端口与防火墙的底层逻辑NIS 基于 RPC 协议早期依赖 portmaprpcbind来映射端口号。ypserv 本身默认动态使用的端口可能会让防火墙配置比较头疼但常见的几个服务端口是固定的rpcbind 111ypserv 834yppasswdd 853ypxfrd 875。在内网环境我推荐两种做法如果机器之间完全可信任直接在 firewalld 中允许这几个端口如果网络策略严格就在/etc/sysconfig/network里给 NIS 服务指定固定端口再只放行指定端口。后面的实操里我会给出具体的 firewall-cmd 命令。3. 实操过程与核心环节实现3.1 服务端软件安装与初始化配置我用一台 CentOS 7.9 的最小化安装机器作为 NIS 服务器IP 规划为 192.168.10.10主机名 nisserver。先安装所需软件包yum install -y ypserv yp-tools安装完成后确认服务端程序的版本和路径。CentOS 7 的 ypserv 主程序位于 /usr/sbin/ypserv辅助命令 ypinit 位于 /usr/lib64/yp/ypinit64位系统下在 lib6432位在 /usr/lib/yp/这个路径在使用 ypinit 时需要注意。接着设置 NIS 域名。编辑 /etc/sysconfig/network追加一行NISDOMAINexample.local然后执行以下命令让域名在当前会话立即生效nisdomainname example.local确认生效可以执行nisdomainname输出 example.local 即正常。这个操作顺序不能反如果先启动 ypserv 再设域名服务端无法正确识别域后面 ypbind 很难绑定成功。接着修改 /etc/ypserv.conf。这个文件控制服务端的访问规则安全起见我会在文件末尾加一行限制来源网段192.168.10.0/24 : * : * : none这行的含义是来自 192.168.10.0/24 网段的客户端对任意 map 的查询都不做限制none 表示不拒绝。如果你的内网网段不同把 IP 段替换掉。配置文件修改后重启 ypserv 生效。3.2 初始化 NIS 数据库ypinit 的关键操作这是整个配置过程中最核心的一步。初始化数据库前先确保服务器上已有的用户和组信息是最终想要的因为 ypinit 会把 /etc/passwd、/etc/group、/etc/shadow 等文件编译成 map。执行初始化命令/usr/lib64/yp/ypinit -m执行过程中会提示输入 NIS 服务器的名称也就是 master 服务器的 hostnamenext host to add: nisserver next host to add:第二行直接按 CtrlD 结束即可因为这里只配置单台 master。如果误输入了错误的主机名后面生成 map 时可能出现同步错误需要重新执行 ypinit。初始化完成后再手动生成一遍全部 map确保初始数据是最新的make -C /var/yp执行完可以在 /var/yp/example.local/ 目录下看到 passwd.byname、passwd.byuid、group.byname、shadow.byname 等文件。看到这些文件说明数据库生成成功。3.3 启动服务并配置防火墙CentOS 7 使用 systemd 管理服务启动前先把需要的基础服务拉起来systemctl enable --now rpcbind systemctl enable --now ypserv systemctl enable --now yppasswdd然后检查监听状态rpcinfo -p localhost输出里应该能看到 100004、100009 等程序号对应的 ypserv 和 yppasswdd 服务。如果 rpcinfo 里看不到说明 rpcbind 启动顺序或域名设置有误多半是 ypserv 启动失败。防火墙方面我在内网测试环境直接放行了核心端口firewall-cmd --permanent --add-port111/tcp firewall-cmd --permanent --add-port111/udp firewall-cmd --permanent --add-port834/tcp firewall-cmd --permanent --add-port834/udp firewall-cmd --permanent --add-port853/tcp firewall-cmd --permanent --add-port853/udp firewall-cmd --permanent --add-port875/tcp firewall-cmd --permanent --add-port875/udp firewall-cmd --reload如果 production 环境的安全策略更严格建议先关闭 NIS 各服务的随机端口给服务固定端口再放行这部分需要改动系统文件并重载服务不再展开。3.4 客户端完整配置过程我用第二台 CentOS 7 机器做测试客户端IP 为 192.168.10.20主机名 nisclient。客户端安装的软件包与服务端不同需要的是绑定工具和查询工具yum install -y ypbind yp-tools注意客户端不需要安装 ypserv那是服务端程序。yp-tools 提供 ypwhich、ypcat、ypmatch 这些查询命令调试时一旦绑定不上全靠它们定位问题。设置客户端的 NIS 域名同样写入 /etc/sysconfig/networkNISDOMAINexample.local立即生效nisdomainname example.local编辑 /etc/yp.conf手动指定 NIS 服务器。这里有两种写法直接写 IP 或写主机名。如果写主机名要确保 /etc/hosts 里有对应记录。我的测试环境直接写 IP 更省事。domain example.local server 192.168.10.10接下来配置名称服务切换。编辑 /etc/nsswitch.conf把 passwd、shadow、group 三行改为同时查询本地文件和 NISpasswd: files nis shadow: files nis group: files nis顺序很重要。files 在前表示本机用户优先NIS 作为补充如果你希望 NIS 用户覆盖本地同名用户就把 nis 放前面。日常场景我建议 files 在前更安全——万一 NIS 服务器抽风本地 root 等关键账号还能用。这里我再强调一个容易忽略的细节启动 ypbind 前确认 rpcbind 已启动否则 ypbind 会因为无法注册 RPC 而绑定失败。systemctl enable --now rpcbind systemctl enable --now ypbind如果你希望用户第一次登录时自动创建家目录还要启用 mkhomedirauthconfig --enablemkhomedir --update这一步需要安装 oddjob-mkhomedir 和相关 pam 模块否则会报错。执行完该命令后系统会在客户端本地为 NIS 用户自动创建 /home/用户名 目录。3.5 功能验证与测试方法配置完成后先做绑定验证。在客户端执行ypwhich预期输出是 NIS 服务器的主机名或 IP表示绑定成功。如果返回Domain not bound说明 ypbind 没有连上服务端。接着验证数据能正常拉到ypcat passwd | grep nistest如果能输出 nistest 用户的信息说明 passwd map 查询正常。再用 getent 验证系统级查询getent passwd nistest ssh nistest127.0.0.1最后用 SSH 或直接在控制台登录测试是最有说服力的验证方式。我第一次配完 NIS就是用一个新建的 NIS 用户从客户端 SSH 登录本机成功进去并且自动创建了家目录才算彻底放心。到这一步NIS 服务端和客户端的核心链路就通了。4. 常见问题与排查技巧实录4.1 问题速查表配置 NIS 时我踩过的坑不少这里整理成一张速查表方便你对照排查现象可能原因排查命令与解法ypwhich 提示 Domain not boundNIS 域名不一致、rpcbind 未启动检查nisdomainname对比服务端与客户端域名确保 rpcbind 启动ypbind 启动失败端口被防火墙挡掉rpcinfo -p 服务端IP验证 RPC 通路getent 看不到 NIS 用户nsswitch.conf 未配置或 ypbind 未启动检查 /etc/nsswitch.conf 是否含 nis检查 ypbind 状态客户端拿到旧密码服务端修改用户后没重新生成 map在服务端执行make -C /var/yp登录时报 could not chdir to homemkhomedir 未配置执行authconfig --enablemkhomedir --update确认 oddjob-mkhomedir 已安装yppasswd 修改密码失败yppasswdd 未启动检查服务端 yppasswdd 状态4.2 域名不生效的坑NIS 域名是系统级配置我遇到过一种情况sysconfig/network 里写了 NISDOMAIN但重启后域名丢失。这是因为某些 CentOS 7 环境下network 服务默认不会把 NISDOMAIN 传给内核接口。稳妥的做法是把域名设置写进开机自启动例如在 /etc/rc.local 中追加nisdomainname example.local并确保 rc.local 有执行权限。这个操作不复杂但在生产环境里能让故障发生率显著降低。域名不一致还有一个隐蔽场景你设置域名时敲了不同的后缀比如服务端是 example.local客户端多打了一个点写成 example.local.绑定就会一直超时。这个连 ypbind 日志都不太看得出让我当时排查了半个小时最后用ypwhich -d逐字比对方才定位。4.3 客户端重启后失联的修复流程NIS 客户端经常在重启后出现“登录界面一直转圈卡在验证阶段”的病例。真正原因通常是 ypbind 启动比 network 早网络还没就绪就尝试绑定超时失败后系统认为用户验证失败。遇到这种情况别慌在单用户模式下先把 /etc/nsswitch.conf 里的passwd: files nis临时改回passwd: files重启后进入系统再手动启动 rpcbind 和 ypbind。确认ypwhich正常后再把 nis 加回去。这个坑我觉得有必要多说一句NIS 的内网依赖特性决定了它对网络状态极其敏感。有条件的话建议给客户端配 NetworkManager 的在线等待机制或者用 systemd 的 After 和 Wants 约束 ypbind 的启动顺序避免网络未就绪就抢跑。4.4 安全加固与运维建议NIS 是明文协议这一点不能回避。我能给的建议是在部署前先审视网络边界只在完全可控、无对外暴露的网段内使用。如果网络环境稍微复杂建议至少在服务端用 /etc/ypserv.conf 做来源限制或者干脆考虑 LDAP Kerberos。还有几个运维上的小习惯值得养成服务端所有用户变更操作后立刻执行make -C /var/yp形成肌肉记忆。定期备份 /var/yp 目录map 损坏时能快速恢复。不要在 NIS 服务器上运行需要频繁修改用户的其他管理软件避免 map 频繁重建出问题。用系统审计命令定期检查 ypserv 日志确认没有异常来源的查询请求。我个人在实际操作中最深的体感是NIS 本身不难难的是把“域名、端口、map 生成”这一条链路吃透。只要把这三个环节的底层逻辑理顺CentOS 7 上配置 NIS 这件事基本就是照着命令复制粘贴的机械操作。踩过几轮坑之后我现在配置一套 NIS 主从环境的时间能控制在一小时以内希望这篇记录也能帮你把时间压到这个量级。
返回列表