使用Kerberos实现统一认证(二)

日期: 2008-04-20 作者:Alf Wachsmann 来源:TechTarget中国

  使用一个经过验证的、可靠的、统一的目录控制管理谁能登陆到什么地方。


  认证是一个判断实体X是否可以访问资源Y的过程,判断X的身份是认证过程的工作,在计算机网络环境下的认证任务之一就是定义和判断哪个用户可以访问网络中哪台计算机,一个简单的样本就是/etc/passwd文件中的一行(如joe:X:1234:56:/home/joe:/bin/bash),它允许用户joe访问这台计算机。如果你想让joe访问其他计算机,你就要将这行添加到其他计算机上的/etc/passwd文件中去。


  在Linux上,趋向于给每个单独的用户创建一个本地账号,允许他们登陆到该计算机。这很有代表性,因为一个用户不仅需要登陆权限,而且需要访问其他资源的权限,如一个home目录,在每台计算机上创建本地账号时都要处理这些内容。


  使用本地账号的问题是这些账号彼此不能保持一致。在不同的计算机上相同的用户名具有不同的用户ID和/或组ID,更麻烦的是在不同的计算机上两个不同的账号共享相同的用户ID和组ID,用户joe在计算机1上的用户ID是1234,组ID是56,用户jane在计算机2上有相同的用户ID 1234和组ID 56。在使用共享资源时有巨大的安全风险。这两个不同的账号有同一个NFS服务器,因此这些用户可以彻底摧毁其他人的文件。


  解决这个不一致性问题的方案是使用唯一一个集中的、校验的数据源,你所有的计算机通过访问集中数据源的方式来得到这种信息。 这正好是目录服务所做的事情。两种目录服务大都用于集中校验数据。一种是网络信息服务(NIS,以前被称作黄页或简称yp),一种是轻量级别目录访问协议(LDAP)。


  NIS对LDAP


  当决定使用哪个目录服务(NIS还是LDAP?)时需要考虑几个事情,如果你的公司已经有一个LDAP服务器,看起来向它里面添加数据非常简单,通常启用的LDAP服务器被用于白页和类似非常轻量级的任务,添加认证任务就给LDAP服务器添加有效负载,因为为每一个单独的用户名、UID、GID等进行检索时,程序需要一一解答,添加一台额外的LDAP服务器专门用于认证通常很有意义,同时,对于大量的不同种类的目录查询,要获得性能调整到良好的程度相当艰难,你需要添加所有必须的LDAP索引定义到你的slapd.conf文件中,以提升常用查询的性能,但是你不应该添加太多的索引定义,这样会使LDAP后端数据库文件非常大,做任何事情都会再次变慢。


  LDAP是那些有丢弃UDP数据包问题的网络的最佳选择,因为它使用TCP/IP协议,中继是被内置在网络协议层中的。相反,NIS使用基于UDP的远程过程调用(RPC)。每一个丢弃的数据包导致一个无回答的NIS查询,NIS客户端需要重复这些查询,在你网络上的不同机器不同时间使用netstat –s –u命令来查看你网络遭受的这个问题,通过这个命令,你应该会看到非常少的错误报告。


  本文将详细介绍NIS,因为在出现问题时它更容易迁移到LDAP,PADL Software Pty公司提供了一套开源的工具来帮助你完成从NIS数据文件到LDAP的转换(看后面资源),你仍然需要做性能调整,但是,如果你想从LDAP迁移到NIS你得自己写迁移工具。


  配置NIS服务器


  NIS服务器不需要太多的硬件资源,你身边任何一台机器都能胜任,你或许想将新功能放在专门的机器上,斯坦福直线加速中心(SLAC)有超过500Linux和Solaris客户端,但只有一台旧的Sun Netra T1服务器,没有发生任何问题。


  我们曾经做过4台大约有700Solaris和Linux桌面计算机的NIS服务器,另外有6台NIS服务器为大约2500Solaris和Linux计算机服务,我们的客户端围绕服务器不均衡地分布开。


  主服务器配置


  登陆到你想安装NIS的主服务器上,确保安装最新的portmap、ypserv和yp-tools RPM包,如果不是,下载再安装,下面所有的命令都必须以root身份执行,用下面的命令启动portmapper后台服务:
# service portmap start


  接下来,定义你新NIS域的名字,这个名字可以是任意的,但是它应该要有一定的意义,如表现你公司的部门特征。nis.example.com是所有example.com的NIS域,eng.example.com是工程部门的域。
# domainname nis.example.com


  同时,你也要添加下面这一行
NISDOMAIN=nis.example.com
到文件/etc/sysconfig/network.


  创建文件/var/yp/securenets来限制对你新NIS服务器的访问,内容如下:
# netmask       # network
255.255.255.0 192.168.0.0
255.255.256.0


  这是一个重要的安全步骤,如果你没有这个文件全世界都可以查询你的NIS服务器。下一步是定义你要放入NIS的内容,对于认证目的,/etc/group和/etc/passwd文件以及netgroup就足够了。为了获得启发,请查找你NIS服务器上/var/yp/Makefile文件。


  下面,我将展示如何配置我前面谈到的三个文件。


  调整Makefile生成NIS映射数据库文件:
# cp /var/yp/Makefile /var/yp/Makefile.save
# vi /var/yp/Makefile


  将下面两个条目的指从true修改为false,防止passwd和shadow文件以及group和gshadow文件的合并:
MERGE_PASSWD=false
MERGE_GROUP=false


  修改NIS查询数据源目录:
YPSRCDIR = /etc/NIS
YPPWDDIR = /etc/NIS


  注释掉所有NIS数据库不会建立的文件,我只保留了下面三个文件:
GROUP       = $(YPPWDDIR)/group
PASSWD      = $(YPPWDDIR)/passwd
NETGROUP    = $(YPSRCDIR)/netgroup


  注释掉所有以all:开头的行,它们包含了所有潜在NIS映射的列表。添加一个新行:
all: passwd group netgroup


  注意TAB字符,在Makefile中,你必须只使用TAB字符(不能使用空格)来缩进命令。


  现在,创建在Makefile中定义的数据源目录:
# mkdir /etc/NIS/
# chmod 700 /etc/NIS


  然后放入一个passwd文件:
# grep -v ’^root’ /etc/passwd > /etc/NIS/passwd


  你应该从这个文件中移除所有系统账号,包括root,只保留真实的用户账号。如果你仍然在使用/etc/passwd,现在是将其转换为Kerberos 5的时候了,我在《使用Kerberos实现统一认证(一)》中已经叙述过如何做了,如果你不这样做,当passwd文件分发到从NIS服务器或NIS客户端时,你加密的密码就会暴露在网络上。



  配置NIS服务器


  NIS服务器不需要太多的硬件资源,你身边任何一台机器都能胜任,你或许想将新功能放在专门的机器上,斯坦福直线加速中心(SLAC)有超过500Linux和Solaris客户端,但只有一台旧的Sun Netra T1服务器,没有发生任何问题。


  我们曾经做过4台大约有700Solaris和Linux桌面计算机的NIS服务器,另外有6台NIS服务器为大约2500Solaris和Linux计算机服务,我们的客户端围绕服务器不均衡地分布开。


  主服务器配置


  登陆到你想安装NIS的主服务器上,确保安装最新的portmap、ypserv和yp-tools RPM包,如果不是,下载再安装,下面所有的命令都必须以root身份执行,用下面的命令启动portmapper后台服务:
# service portmap start


  接下来,定义你新NIS域的名字,这个名字可以是任意的,但是它应该要有一定的意义,如表现你公司的部门特征。nis.example.com是所有example.com的NIS域,eng.example.com是工程部门的域。
# domainname nis.example.com


  同时,你也要添加下面这一行
NISDOMAIN=nis.example.com
到文件/etc/sysconfig/network.


  创建文件/var/yp/securenets来限制对你新NIS服务器的访问,内容如下:
# netmask       # network
255.255.255.0 192.168.0.0
255.255.256.0


  这是一个重要的安全步骤,如果你没有这个文件全世界都可以查询你的NIS服务器。下一步是定义你要放入NIS的内容,对于认证目的,/etc/group和/etc/passwd文件以及netgroup就足够了。为了获得启发,请查找你NIS服务器上/var/yp/Makefile文件。
下面,我将展示如何配置我前面谈到的三个文件。


  调整Makefile生成NIS映射数据库文件:
# cp /var/yp/Makefile /var/yp/Makefile.save
# vi /var/yp/Makefile


  将下面两个条目的指从true修改为false,防止passwd和shadow文件以及group和gshadow文件的合并:
MERGE_PASSWD=false
MERGE_GROUP=false


  修改NIS查询数据源目录:
YPSRCDIR = /etc/NIS
YPPWDDIR = /etc/NIS


  注释掉所有NIS数据库不会建立的文件,我只保留了下面三个文件:
GROUP       = $(YPPWDDIR)/group
PASSWD      = $(YPPWDDIR)/passwd
NETGROUP    = $(YPSRCDIR)/netgroup


  注释掉所有以all:开头的行,它们包含了所有潜在NIS映射的列表。添加一个新行:
all: passwd group netgroup


  注意TAB字符,在Makefile中,你必须只使用TAB字符(不能使用空格)来缩进命令。
现在,创建在Makefile中定义的数据源目录:
# mkdir /etc/NIS/
# chmod 700 /etc/NIS
然后放入一个passwd文件:
# grep -v ’^root’ /etc/passwd > /etc/NIS/passwd


  你应该从这个文件中移除所有系统账号,包括root,只保留真实的用户账号。如果你仍然在使用/etc/passwd,现在是将其转换为Kerberos 5的时候了,我在《使用Kerberos实现统一认证(一)》中已经叙述过如何做了,如果你不这样做,当passwd文件分发到从NIS服务器或NIS客户端时,你加密的密码就会暴露在网络上。


  现在,收集所有属于你NIS域范围内的机器的本地/etc/passwd文件,移除所有系统账号并将它们合并到一起:
% cat passwd_1 passwd_2 passwd_3 … > passwd_merge


  用下面的命令去除所有重复的条目:
% sort passwd_merge | uniq > passwd_uniq


 用下面的命令检查剩下的条目的一致性:


% cut -d’:’ -f1 passwd_uniq | sort | uniq -c |
egrep -v “s*1”


  如果执行这个命令有任何输出,就表明你有两个不同的条目具有相同的账号名,如果不同之处不是UID或GID字段,只需简单地移除一个保留另外一个即可,如果不同之处是UID或GID字段,你需要解决这个冲突,解决起来可能相当复杂。


  另一个一致性检查是查看是否有两个不同的账号有相同的UID:
% cut -d’:’ -f3 passwd_uniq | sort | uniq -c |
egrep -v “s*1”


  如果产生任何输出,第二个数字就是重复的UID,解决这个冲突非常复杂,合并相同种类并检查所有的/etc/group文件。


  拷贝最后合并好的文件到/etc/NIS/passwd和/etc/NIS/group,稍后我将回到netgroup文件,现在暂时不考虑它。


现在,用下面的命令启动你的主NIS服务器:
# service ypserv start
用下面的命令初始化NIS映射:
# /usr/lib/yp/ypinit –m


  为了让所有NIS映射对你的主NIS服务器都可用,你可能也想将这台机器设置为NIS客户端,确保这个NIS客户端只与该NIS服务器绑定,避免启动所有机器时出现循环依赖问题。


  从服务器配置


  NIS从服务器从主NIS服务器接收映射然后再分发到其他NIS客户端,确保在所有从服务器上安装的是最新的portmap、ypserv、ypbind和yp-tools RPM程序包,配置NIS从服务器的第一步是将其配置为NIS客户端,查看下一小节的内容。


  一旦NIS客户端配置完成后,用下面的命令启动:
# service ypbind start


  在你的主NIS服务器上,添加从NIS服务器的名字到文件/var/yp/ypservers,并执行下面的命令:
# cd /var/yp
# /usr/lib/yp/makedbm ypservers
/var/yp/nis.example.com/ypservers


  你还需要在主NIS服务器上修改/etc/YP/Makefile文件中的NOPUSH定义,将其从true修改为false,以便从NIS服务器从主NIS服务器获取NIS映射更新。


  回到你新的从服务器,用下面的命令初始化从服务器:
# /usr/lib/yp/ypinit -s nismaster


  nismaster是你主NIS服务器的名字,需要使用完全限定域名(FQDN),从主NIS服务器拷贝文件/var/yp/securenets到所有的从NIS服务器上,用下面的命令启动从NIS服务器:
# service ypserv start


  客户端配置


  在所有客户端上安装最新的ypbind、yp-tools、portmap RPM程序包,编辑文件/etc/yp.conf告诉客户端NIS服务器:
ypserver nismaster.example.com


  同时,为每个从NIS服务器添加一行,如果有不止一台从服务器,可以在客户端上随机排列这些从服务器,实现负载均衡。


  在/etc/sysconfig/netwokr中添加一行定义客户端的NIS域:
  NISDOMAIN=nis.example.com


  用下面的命令指定NIS域名:
  # domainname nis.example.com


  用下面的命令启动portmap:
  # service portmap start


  用下面的命令启动客户端:
  # service ypbind start


  请在每个客户端上都这样启动。


  ypwhich命令可以显示出客户端绑定的NIS服务器。
  使用ypcat命令检查NIS映射的内容,如:
  % ypcat passwd


  接下来,需要告诉客户端的所有查找都使用NIS,通过修改名称服务切换配置文件/etc/nsswitch.conf来实现,修改passwd、group、netgroup条目为:
passwd:       compat
group:        files nis
netgroup:     nis


  它定义了检索group的顺序:从本地文件/etc/group开始,然后尝试NIS查找。Netgroup只使用NIS,为passwd设置为compat。


  名称服务缓存后台服务(nscd)有时在更新它内部的缓存时有问题,影响是在某个特殊的客户端上NIS映射的改动是不可见的,只有在那个客户端上重新启动nscd才能解决这个问题。


  典型用法


  你应该熟悉两个从NIS查询信息的命令:ypcat和ypmatch。ypcat输出在一个NIS映射中所有密钥的值,命令ypcat passwd输出所有NIS passwd映射条目,ypmatch输出来自NIS映射的一个或更多密钥的值,ypmatch jane passwd输出账号jane的passwd条目。


  NIS组映射


  NIS组映射的典型用法是允许在多个用户之间共享文件,这可以用于本地文件也可以用于NFS文件,这里将介绍如何实现它,我们假设你有两个用户(这个技术可以应用与任何数量的用户),它们的passwd映射条目如下:



jane:*:1234:42:Jane:/home/jane:/bin/bash
joe:*:5678:57:Joe:/home/joe:/bin/bash


  它定义了jane的主组ID是42,joe的主组ID是57。


  使用NIS组映射,你可以给账号添加额外的组成员。组条目:
projectX:*:127:jane,joe


  它定义一个新组projectX,没有密码(*),组ID是127,有两个成员。在group文件中不能有注释。


  如果你现在为组projectX创建一个目录,并设置了读/写/执行权限:
# mkdir /projects/X/
# chgrp projectX /projects/X/
# chmod g+wrx /projects/X/


  在projectX组中每个成员在这个文件空间内都有读/写/执行权限,用户可能首先需要执行newgrp projectX命令。


  无论什么时候,你要往组映射中添加或要从中移除账号时,在你的主NIS服务器上编辑 /etc/NIS/group文件后,执行下面的命令:
% cd /var/yp
% sudo make group


  这就产生一个新的组映射,这让所有客户端可以立即收到改动信息,不需要接触任何客户端。现在任何事情都集中在你的主NIS服务器上进行。


  NIS 网络组


  网络组是与组不同,网络组分两种,用户网络组和主机网络组。两种网络组都可以包含网络组作为成员,因此网络组定义可以是分层的,两种网络组都定义在相同的netgroup文件中,这个文件是允许使用注释信息的。


  主机网络组在/etc/NIS/netgroup文件中的定义象下面这样子:



# Group of project groups:
projects
      projectA
      projectB
      projectX


# Group of hosts for Project X
projectX
        (host1.example.com,-,)
        (host2.example.com,-,)
        (host3.example.com,-,)


 


  现在这些主机网络组定义允许你导出NFS空间到你机器的子集,在你NFS服务器上的/etc/exports文件中,你可以使用象下面的结构:


# export the /projects directory to all machines
# in the “projects” netgroup
/projects    @projects(rw,root_squash)


# export Project X’ space only to machines
# in the “projectX” netgroup
/projects/X           @projectX(rw,root_squash)


 


  再说一次,添加或移除主机,添加/删除网络组只需要编辑主NIS服务器上的/etc/NIS/netgroup文件即可。执行cd /var/yp;sudo make netgroup更新NIS映射,改动就会立即生效。


  用户网络组


  用户网络组,它的成员是账号,典型地,被用于限制登陆计算机,用户网络组定义与主机网络组定义看起来只有一点点不同:


# Group of project user groups
u-projects
        u-projectA
        u-projectB
        u-projectX


# Group of users in Project X
u-projectX
        (-,jane,)
        (-,joe,)
        (-,nick,)


 


  在名字中的前缀u-是区别用户网络组和主机网络组的约定。使用这些定义,现在你可以授权或限制登陆访问你的计算机,在这些计算机上编辑/etc/passwd文件,在passwd文件的末尾移除a+:


  允许u-projects网络组中所有账号访问,其他的全部不允许:
+@u-projects
  只允许u-projectX网络组中的成员访问,其他不允许:
+@u-projectX
  允许属于u-projects但不属于u-projectX的每个人访问:
-@u-projectX
+@u-projects
  这里顺序并不重要。


  允许u-projectA中的每个人和账号nick访问:
+@u-projectA
+nick


  关于nick的信息(home目录、登陆shell等)来自NIS passwd映射,最好避免在这里提交有冲突的账号名,因为这些条目的管理不是集中的。


  要使+/-语法工作,在你的客户端/etc/nsswitch.conf文件中需要条目:
passwd:         compat


  结论


  一旦你克服了安装NIS服务器最初的困难和使得你的认证数据保持一致,你就可以开始享受集中统一管理的好处了,网络组允许从一个统一的地方管理复杂的和细粒度的访问控制。


  资源


  1、管理NFS和NIS 第二版 作者:Hal Stern, Mike Eisler and Ricardo Labiaga出版社:O’Reilly


  2、关于Linux NIS有用的信息使NIS-HOWTO: www.tldp.org/HOWTO/NIS-HOWTO/index.html.


  3、PADL Software Pty Ltd., NIS到LDAP的迁移工具: www.padl.com/OSS/MigrationTools.html.

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐

  • Kerberos能抵御哈希值传递攻击吗?

    Kerberos是一种用于各种计算机系统的开放式身份验证协议,其中密码哈希既不被发送也不被存储,所以无法被获取或者重复利用。Kerberos能有效抵御哈希值传递攻击吗?

  • 客户端服务器应用上的SSO

    问:SSO可以在客户端应用上采用吗?
    Passport和Liberty是SSO的解决反感吗?他们出现过漏洞吗?

  • 编写你自己的单点登录(SSO)服务(三)

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。本文是编写自己的单点登录服务的第三部分……

  • 使用Kerberos实现统一认证(一)

    Kerberos可以解决账号管理方面的痛苦。在一个分布式的Uinux/Linux环境中,如果通过手工进行账号管理,将变得复杂、混乱。本文讲的是少量计算机环境如何解决这个问题。