新闻详情

新闻详情

首页 / 资讯中心 / 详情

NIS与LDAP怎么选?内网几十台Linux主机统一账号的轻量级实践

发布时间:2026/10/1 2:11:27来源:尧图网络
NIS与LDAP怎么选?内网几十台Linux主机统一账号的轻量级实践
前阵子被一个朋友拉去收拾他们实验室的测试集群。二十多台CentOS 7的机器每台/etc/passwd里都躺着好几个重复创建的账号密码改一次要跑遍所有机器离职同事的账号更是没人敢动。我第一反应是上LDAP但坐下来理了理需求发现用户量不到五十人、机器全在一个二层内网也没有复杂的组织结构需求。这种情况下用NISNetwork Information Service反而是最省力的方案十几分钟把服务端搭起来客户端装几个包、改三个配置文件就能认账号复杂度远低于LDAP那套目录树和证书体系。这篇就按我这次实际操作的过程来写从服务端搭建到客户端接入再到我踩过的几个坑最后补几个生产环境里的习惯。适合的人群很明确内网里有几十台同构Linux机器需要统一账号、但不想为此搭一套LDAP/AD体系的运维同学。1. 动手之前NIS到底解决什么问题边界在哪里1.1 看清NIS的职责范围NIS能干的事说白了就是把/etc/passwd、/etc/group、/etc/hosts、/etc/netgroup这类“主机本地信息”集中到一个服务器上。客户端在需要用户名、密码、组、主机名映射的时候会按 NSSName Service Switch名称服务切换的配置去问NIS服务器再把拿到的结果当成本地文件一样使用。它解决的是“用户名密码在哪里查”的问题而不是“用户的家目录在哪里”。很多人混淆了这一点以为配好NIS后用户登录就能直接看到自己的/home。实际上NIS只负责认证和账户属性home目录还得靠NFS autofs按需挂载这俩是分开的两个服务。我这次部署的最后一步就是补了NFS共享和autofs否则用户登录进来了会得到一个新的空目录之前的工作文件全都不在体验会很差。1.2 NIS域名和DNS域名是两个东西这是新手最先踩的坑。NIS域名长得很像DNS域名比如nis.local但它的作用只是给NIS map分组和DNS解析没有半毛钱关系。一台机器可以同时有DNS域名client01.lab.example.com和NIS域名nis.local两者互不影响。在CentOS 7上查看NIS域名的命令是nisdomainname临时设置用nisdomainname nis.local。注意不要拿hostname -d的输出来当NIS域名用。我这次部署踩过一次客户端ypbind启动后一直bind不上后来才发现是启动服务时NIS域名根本没设置成功绑定报文里带的domain和服务器上的domain不一致直接被拒绝。1.3 适用场景与不适用的场景我个人的判断标准很简单适合所有机器都在受信内网、账号数量不大几百以内、管理成本敏感、希望快速统一的场景。不适合机器跨公网、账号数量几千上万、有复杂组织结构和权限模型的场景这种还是老老实实上LDAP/AD。另外NIS的密码哈希在局域网里是明文传输的攻击者只要在链路上抓到map数据就能离线破解密码。所以它只能用在完全可信的内网环境这是我在任何场合都会提醒的一句话。2. 服务端搭建从装包到生成可查询的map服务端我用的是一台双网卡物理机内网IP192.168.1.10主机名nis-server。客户端用192.168.1.20主机名client01。NIS域名统一设为nis.local。整个服务端搭建过程核心就四步规划环境、装包、写配置、生成map。2.1 环境规划与初始化动手之前先把/etc/hosts写好这一步非常容易被忽略。ypinit -m在初始化map的时候会检查当前主机名是否能在本地解析如果/etc/hosts里没有就会报类似self is not in /etc/hosts的错误我当时第一次见到这个报错还以为是主机名没设好折腾了半天才发现只是hosts文件缺了一行。192.168.1.10 nis-server 192.168.1.20 client01然后是防火墙和SELinux。测试环境我直接关掉了firewalld如果是在生产环境建议放行rpcbind和NIS相关端口不要为了省事全关。SELinux方面CentOS 7默认enforcing状态对NIS的服务进程卡得比较严我这边实验环境直接setenforce 0。如果你不想完全关闭可以放行对应的SELinux布尔值允许NIS相关服务运行建议在装完包之后先确认服务能起来再慢慢收紧策略。2.2 安装软件包与启动顺序服务端需要两个包ypserv提供NIS服务端程序yp-tools提供ypcat、ypwhich、yppasswd这些命令行工具。yum install -y ypserv yp-tools启动顺序有个讲究一定要先启动rpcbind再启动ypserv。因为NIS基于RPC协议ypserv启动时要向rpcbind注册自己的端口rpcbind没起来ypserv就算进程起来了也无法对外服务。systemctl start rpcbind systemctl enable rpcbind在启动ypserv之前先确认NIS域名已经设置好。我用的是nisdomainname nis.local这条命令只对当前会话生效重启就丢了所以还要写进/etc/sysconfig/networkNISDOMAINnis.localCentOS 7里如果机器启用了network.service启动时会读取这个变量并设置NIS域名。如果不确定自己的环境读不读最稳妥的办法是写一个systemd单元或直接在/etc/rc.d/rc.local里补一行nisdomainname nis.local保证开机后域名一定存在。域名没设置就启动ypserv服务虽然能起来但客户端来bind的时候会直接失败这是高频坑。确认域名没问题后启动余下两个服务systemctl start ypserv systemctl start yppasswdd systemctl enable ypserv systemctl enable yppasswddyppasswdd是负责客户端改密的服务很多教程只提ypserv不提这个结果用户登录没问题一改密码就报错建议从一开始就一起装上、一起启动。2.3 配置 ypserv.conf 控制访问范围ypserv的主配置文件是/etc/ypserv.conf默认内容其实已经能跑但出于安全和可维护性考虑我一般会改成下面这样dns: no files: 30 trust: none 192.168.1.0/255.255.255.0 : * : * : none逐行解释一下。dns: no表示ypserv不要通过DNS反查客户端主机名直接按IP处理避免在DNS不通时拖慢响应甚至拒绝服务。files: 30是对以普通文本文件方式存放的map做30秒缓存几秒到几十秒之间都可以太短会频繁读盘太长又会让map改动生效变慢。trust: none表示不信任外部RPC调用者客户端必须按后面规则逐条匹配。最后一行是核心规则格式是“主机 : 域名 : map : 安全级别”。这里写的是允许整个192.168.1.0/24网段访问所有domain下的所有map安全级别为none。安全级别有三档none表示不校验客户端源端口最宽松port要求客户端源端口必须是1024以内的特权端口deny直接拒绝。如果你对安全比较敏感可以把客户端网段安全级别改成port但这要求所有客户端的ypbind都是以root身份启动的正常情况下都能满足算是一个低成本的收紧手段。配置改完记得重启ypservsystemctl restart ypserv2.4 编辑Makefile并生成mapNIS把要发布的用户、组、主机映射做成一个个“map”文件放在/var/yp/域名/目录下。生成map的执行文件是/var/yp/Makefile发布哪些内容、过滤哪些账号都在这份文件里控制。先看关键的过滤项。默认情况下Makefile会把系统用户也一起发布出去这会导致客户端里出现一堆bin、daemon、adm这类系统账号非常危险。我强烈建议设置MINUID1000 MINGID1000意思是只发布UID/GID大于等于1000的用户和组把系统账号全部隔离在NIS之外。再看合并项。默认生成的passwd map可能不带密码哈希导致客户端能看到用户名但登录时验不了密码。关键在Makefile里的这两个开关MERGE_PASSWDtrue MERGE_GROUPtrue设置为true后生成map时会把/etc/shadow里的密码哈希合并进passwd map客户端才能用密码认证。然后是all行它决定了哪些map会被生成。我的建议是保留passwd group hosts这几个常用项就够了其他像services、protocols、rpc这些在全行业务里基本用不到发出去反而增加暴露面。你可以按需改all: passwd group hosts改完配置后开始生成mapmake -C /var/yp如果一切正常在/var/yp/nis.local/目录下就能看到passwd.byname、passwd.byuid、group.byname等文件。这里有一点要提醒每次手工修改服务器的/etc/passwd、/etc/shadow、/etc/group后都需要重新跑一遍make -C /var/yp改动才会被同步到map里客户端查到的才是新数据。2.5 服务端自我检查客户端接入之前先在服务端上验证一下地图是否正常。用rpcinfo确认RPC注册用ypwhich确认NIS服务能响应再用ypcat查看map里的实际内容。rpcinfo -p localhost | grep ypserv ypwhich -d nis.local localhost ypcat -d nis.local passwdypcat passwd的输出里应该能看到你准备发布的用户列表每个条目格式和/etc/passwd一致密码字段位如果显示x或一个哈希串同时系统里shadow内容也正常说明map生成没问题。如果输出为空多半是Makefile里过滤条件设得太狠或者域名不对回到上一步检查。3. 客户端接入改对三个文件账号才能真正用起来客户端配置相比服务端要简单但最容易出问题的恰恰是那些“看起来很简单”的文件。整个过程分三步装包、改配置、启动验证。3.1 安装客户端软件并设置NIS域名客户端需要ypbind负责绑定NIS服务器和yp-tools提供查询工具yum install -y ypbind yp-tools然后同样设置NIS域名nisdomainname nis.local写入/etc/sysconfig/networkNISDOMAINnis.local这一步不能省。如果客户端启动ypbind时NIS域名为空ypbind会以空域名去广播查找结果大概率是找不到服务器。很多“客户端绑不上”的问题根源就是域名没设置。3.2 三个关键配置文件的正确写法第一个是/etc/yp.conf告诉ypbind应该去找哪台NIS服务器。有两种写法我习惯用指定服务器方式避免广播在网络环境复杂时找不到目标domain nis.local server 192.168.1.10第二个是/etc/nsswitch.conf决定系统在查询用户名、密码、组时走什么数据源。核心改动这几行passwd: files nis shadow: files nis group: files nis hosts: files nis dns这里的顺序非常关键。我把files放在前面NIS放在后面意思是先查本地文件本地没有再去查NIS。如果你把nis放在最前面一旦NIS服务器宕机客户端的登录、getent查询都会因为超时变得极其缓慢包括本地用户登录也受影响。反之服务器宕机时本地用户不受影响只是NIS用户暂时登不上。第三个是PAM配置。CentOS 7的登录认证由/etc/pam.d/system-auth控制默认会把密码验证交给pam_unix.so而pam_unix.so内部调用的就是NSS。也就是说只要nsswitch.conf里passwd和shadow行都加上了nis一般不需要再额外改PAM文件。但我见过有人只改了passwd行、忘改shadow行结果getent passwd能看到NIS用户su登录却一直密码错误。所以检查时要确认shadow行也包含nis这比passwd行还容易被遗漏。3.3 启动ypbind并验证完整链路配置写好后启动客户端绑定服务systemctl start ypbind systemctl enable ypbind验证分三步走从底层到上层逐渐确认问题。先看绑定是否成功ypwhich正常情况下会输出NIS服务器的完整主机名比如nis-server。如果输出为空或者报错说明域名、网络或服务端配置有问题。再看map能否拉到数据ypcat passwd输出里应该能看到服务端定义的那些用户。如果这里能看到数据说明网络、域名、RPC这几个环节都没问题。最后验证NSS链路也就是系统是否真的能识别NIS用户getent passwd NIS用户名如果这个命令能输出类似testuser:*:3000:3000::/home/testuser:/bin/bash的条目说明系统已经可以正常查询到NIS用户可以尝试用ssh NIS用户名客户端IP或su - NIS用户名做真实验证了。到这里账号认证已经有了。但就像开头说的用户的家目录不在NIS职责范围内登录进来的用户会得到一个空的/home/testuser而且文件都存在本机。真正要做得“像一个统一系统”还得配NFS共享和autofs服务端在/etc/exports里导出/home目录允许内网客户端访问。客户端安装autofs在/etc/auto.master里加一行/home /etc/auto.home再到/etc/auto.home里写* -rw,sync 192.168.1.10:/home/。这样用户访问/home/testuser时系统才会自动去NFS服务器挂载对应用户目录。NFS的配置不算复杂这里的重点是理解“NIS管账号、NFS管目录、autofs管挂载时机”这三个角色的分工。4. 排错实录三个高频坑的完整排查链路这部分写我是怎么一步步定位问题的而不是直接给答案。按我这次部署遇到的顺序把过程完整拆给你看。4.1 坑一客户端绑定失败日志一直报超时现象客户端执行systemctl start ypbind后卡了一段时间才起来ypwhich没有输出journalctl -u ypbind里反复出现类似timeout、no server的日志。排查过程我一开始先怀疑网络但ping 192.168.1.10是通的排除了链路层问题。接着在服务端执行rpcinfo -p看到ypserv的RPC注册信息也在说明服务端正常。然后在客户端手动执行ypbind -debug前台进程打印了完整的绑定过程日志显示它带着一个空域名或错误域名去发广播服务器端自然没回应。根因客户端的NIS域名没有设置成功。我检查时发现/etc/sysconfig/network里虽然写了NISDOMAINnis.local但当前shell里的nisdomainname输出为空说明写文件之后没有重新加载而ypbind启动时读的是当前内核里的NIS域名不是文件内容。修复在当前会话执行nisdomainname nis.local然后再启动ypbind。重启后为了让文件生效我另外确认了network.service读到了该配置。如果你用的环境不读这个文件就在/etc/rc.d/rc.local里补上这条命令。规律遇到绑定类问题先对比三处域名是否一致——服务端的nisdomainname、客户端的nisdomainname、/etc/yp.conf里的domain。这三处只要有一处不同绑定就失败。这是我处理NIS问题时第一个检查的动作。4.2 坑二ypcat能查到数据getent查不到用户现象客户端ypcat passwd输出里有NIS用户但getent passwd nisuser没结果ssh登录也提示用户不存在。排查过程这一步很迷惑因为问题不在网络也不在服务端而在客户端自身。我先确认了ypbind正常绑定又用ypmatch nisuser passwd手动查询map能查到。这就说明NIS链路完全正常问题一定出在NSS配置上。打开/etc/nsswitch.conf检查发现passwd行已经有nis但shadow行只写了files没有加nis。这里有个容易忽略的因果关系getent passwd只依赖passwd行所以能查到但登录时PAM要验证密码会去看shadow数据源找不到NIS用户的shadow记录就直接拒绝。根因nsswitch.conf里shadow行缺失nis导致密码验证阶段查不到NIS用户。修复把shadow行补成files nis重启ypbind或刷新NSS缓存目录再执行getent passwd nisuser就正常了。延伸排查如果改了shadow行还是不行第二嫌疑是SELinux。用ausearch -m avc -ts recent查一下有没有AVC拦截记录有的话按提示放行相应布尔值。我这次没遇到SELinux拦截但在网上帮人看问题时见过不少次属于必须排查的一环。4.3 坑三客户端改密要么报错要么改了不生效现象用户在客户端执行yppasswd有的机器报RPC: Cant contact yppasswdd有的机器改完提示成功但其他客户端上旧密码仍然能用、新密码登不进去。排查过程先处理报错。yppasswd命令工作时客户端会把请求发给服务端的yppasswdd服务如果没装或没启动就会报contact不到。到服务端执行systemctl status yppasswdd发现确实没启动启动后报错问题解决。再处理“改完不生效”。在服务端查看/etc/shadow发现密码字段确实已被更新说明yppasswd请求到达成功。但去客户端ypcat passwd发现map里的密码哈希还是旧的。这时候我才意识到yppasswdd只负责更新服务端的本地文件不一定自动触发map重建需要手动执行make -C /var/yp刷新。根因map没有重新生成客户端读到的还是旧数据。修复在服务端执行make -C /var/yp之后在客户端再次ypcat passwd就能看到map里密码哈希已经变化新密码可以正常登录。经验手动修改服务端/etc/passwd、/etc/group或用户改密后都养成一个习惯顺手执行make -C /var/yp。把这条写进你的变更脚本里就不会出现这种“改了等于白改”的情况。5. 使用习惯与安全建议生产环境里我的一些经验5.1 UID段位规划要提前想好NIS上线后所有客户端的UID解释都会统一因此账号的UID规划一定要事先定好。我这边约定的规则是系统用户0-999本地服务账号1000-1999NIS统一用户2000以上。在服务端Makefile里把MINUID2000、MINGID2000设置好既不会发布系统账号也不会和客户端的本地服务账号撞车。这个习惯看似简单但在实际出过事故——曾有一台机器的本地用户UID为1001NIS用户也用了1001登录后ls -l看文件所有权完全错乱。5.2 map重建的自动化与备份如果你经常在服务端批量建用户建议把make -C /var/yp写成一个脚本或者在发布账户的流程里固定带上这一步。另外/var/yp/域名/目录下的map文件虽然可以用make重新生成但也别忽略/etc/passwd、/etc/shadow、/etc/group这几个源文件的备份。map坏了可以重建源文件丢了才是真的麻烦。我通常会在每周的备份任务里额外打包一份/etc/passwd /etc/shadow /etc/group /etc/ypserv.conf /var/yp/Makefile成本很低恢复效率却很高。5.3 安全加固的具体做法NIS明文特性决定了它只适合受信内网。如果要在生产环境长期使用我会做四件事第一在/etc/ypserv.conf里严格限制允许访问的网段不要让整个办公网都能查到NIS map第二只发布必要的map我最常用的是passwd group hosts三个其他默认map一律不生成减少信息暴露面第三确保防火墙只放开必要的端口生产环境不要图省事直接停firewalld第四如果集群规模超过五十台或者有多个网段需要跨网络同步就不要再用单点NIS服务器了考虑加NIS slave或者直接迁移到FreeIPA。这些是我在多次NIS部署中沉淀下来的做法。很多教程只写到ypcat passwd出来就结束但实际运维中真正考验人的往往是你对UID规划、map刷新机制和权限边界的理解。把NIS当成一个“内网专用的统一账号服务器”来用控制在合适的规模和信任边界里它的简单和直接反而能省下不少维护成本。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

马德拉岛旅行全攻略:徒步路线、马德拉酒与丰沙尔玩法 2026/10/1 5:59:31

马德拉岛旅行全攻略:徒步路线、马德拉酒与丰沙尔玩法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
马德拉岛旅行指南:徒步路线、自驾环岛与四季玩法全解析 2026/10/1 5:59:18

马德拉岛旅行指南:徒步路线、自驾环岛与四季玩法全解析

只在搜资料时看到过“Madeira”这块拼写,绝大多数人都下意识问一句:这不是酒吗?没错,马德拉酒很有名,但Madeira首先是葡萄牙在大西洋中的一片群岛,距离摩洛哥海岸大约600公里,离里斯本飞行约1小…

阅读更多 →
AI Agent产品设计核心决策:从边界定义到架构落地 2026/10/1 5:59:18

AI Agent产品设计核心决策:从边界定义到架构落地

刚入行做 Agent 产品的人,最爱问的一个问题往往是:"现在最火的 Agent 框架是哪个?我该学 LangGraph 还是 AutoGen?" 每次听到这种问题,我都想把人拉回来:你连自己要做的 Agent 解决什么问题、边界…

阅读更多 →
AgentScope 2.0体验:RAG as Service如何重塑多智能体协作 2026/10/1 5:59:11

AgentScope 2.0体验:RAG as Service如何重塑多智能体协作

前阵子刷到AgentScope更新的消息,起初我没太当回事。毕竟多智能体框架这两年冒出来不少,个个都说自己编排能力强、扩展性好,真上手才知道怎么回事。但把AgentScope 2.0完整跑通一遍之后,我改变了判断,这确实是我目前愿…

阅读更多 →
批量出图不再OOM:GPU显存预算与动态降级策略实战指南 2026/10/1 5:59:11

批量出图不再OOM:GPU显存预算与动态降级策略实战指南

如果你习惯把几百张图的生成任务丢进队列然后去忙别的,那你大概率见过下面这个场景:任务跑到一半,终端刷出一行CUDA out of memory,ComfyUI 或者 WebUI 直接僵住,鼠标都开始变得迟钝;更麻烦的是显卡驱动直接…

阅读更多 →
15442张VOC格式条码检测数据集实战指南 2026/10/1 5:59:10

15442张VOC格式条码检测数据集实战指南

简介:本资源是面向计算机视觉领域研究者与深度学习工程师的条码目标检测专用数据集,适用于训练和评估YOLO、Faster R-CNN等VOC格式兼容的目标检测模型。数据集共15442张真实场景下的条码图像(jpg)及对应精确标注文件(x…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉