Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1984004
  • 博文数量: 593
  • 博客积分: 20034
  • 博客等级: 上将
  • 技术积分: 6779
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-06 14:07
文章分类

全部博文(593)

文章存档

2016年(1)

2011年(101)

2010年(80)

2009年(10)

2008年(102)

2007年(16)

2006年(283)

我的朋友

分类: LINUX

2008-11-11 00:40:38

Kerberos可以解决你的账号管理方面的痛苦。在一个分布式的Uinux/Linux环境中,如果通过手工进行账号管理,将变得复杂、混乱。大型站点使用特殊的工具来解决这个问题,在本文中,我叙述的是针对少量计算机的环境如何解决这个问题,如家里的三台电脑组成的小网络。

  在一个分布式环境中的问题是,如果发生账号改动的情况,每台机器上的password文件和shadow文件需要一个一个地去修改,账号改动包括修改密码、添加/删除账号、账号名修改(任何情况下,修改UID/GID是一个大问题)、添加/删除登陆计算机的权限等。我也将叙述如何用 Kerberos解决分布式计算环境中的认证问题,在第二部分,我将叙述一个解决认证问题的解决方案。

  认证一个连接到计算机的用户大多数是通过密码来解决的,尽管有其他方法(包括智能卡和生物特征)是可用的,这些密码存储在/etc /passwd中,现在使用影子密码,它存储在/etc/shadow中,因为这些文件是在本地计算机上的,要保持是最新状态是很大的一个问题,目录服务如NIS、NIS+和LDAP能解决这个问题,但是这些服务引入了新的问题:它们工作在网络上,密码也是暴露在网络上的,它们只使用了很弱的加密。

  通过Kerberos实施的认证协议联合网络服务的优势,完全不需要在两台计算机之间传输密码了,要实现这个,Kerberos需要你在一个安全的服务器上运行两个后台进程,密钥分发中心(KDC)后台进程处理所有的密码验证请求,并生成Kerberos证书,叫做凭证授予凭证(TGT),第二个后台进程,Kerberos管理进程,它允许你远程添加、删除和修改账号,而不用登陆到运行Kerberos管理进程的计算机上,它也处理来自用户的密码修改请求,使用Kerberos,只有一个密码修改需要通过网络传输一个强壮的加密密码。

  在认证用户的过程中,Kerberos KDC给用户授予一个临时的证书,TGT,典型地,这些证书有10或24小时的有效期,这个有效期是可以配置的,但是不能超过24小时,万一TGT被偷,小偷只能在TGT的有效期时间内使用,如果你只使用Kerberos进行身份认证,证书失效了不会引起问题,但是,如果你正在使用Kerberized服务,你需要培训你的用户在他们目前的证书失效后获取新的证书,即使他们仍然可以登陆。

  Kerberos是在MIT创造出来的,最新的版本是Kerberos 5,它的协议定义在RFC 1510。今天,Kerberos有两个实现是可用的,参考文章后面的资源。MIT的Kerberos 5包括在Red Hat Linux中,而Heimdal包括在SuSe和Debian Linux发行版中,Kerberos 5实现也包括在微软的windows(2000以及更高版本)、Sun的Solaris(SEAM,Solaris2.6及更高版本)和Apple的 Mac OS X中,我使用MIT的Kerberos发布版贯穿本文,因为它提供了简单密码质量检查功能,密码老化和密码历史,这些功能都是开箱即用的。

  先决条件

  在你转到Kerberos认证前需要满足两个先决条件,首先,所有包括在Kerberos中的计算机的时钟需要与运行KDC的机器进行同步,最简单的方法就是在所有的机器上使用网络时间协议(NTP)来同步。

  第二个先决条件很难满足,所有计算机上的账号名、UID和GID都必需一样,这是必需的,因为这些账号变成一个新的与Kerberos账号无关的了,叫做委托人,你不得不仔细检查所有的本地文件/etc/passwd,以及检查这个需求是否满足,如果没有,你需要合并你的账号,如果你想添加 windows或Mac OS X客户端到你的Kerberos设备上,你需要考虑那些机器上的所有帐户。

  如果你决定使用来自你Linux发行版中的Kerberos程序包,简单地安装它,如果你想自己编译Kerberos发布包,请按照下面的指令做:

  创建和安装MIT Kerberos

  1) 从资源中列出的URL中选择一个源下载源码包,并获取它的PGP签名,用下面的命令校验包的完整性和准确性:
  % gpg --verify krb5-1.3.4.targz.asc

  2) 用下面的命令解压源码包
  % tar zxvf krb5-1.3.4.tar.gz

  3) 进入源码目录
  % cd krb5-1.3.4/src

  4) 执行
  % ./configure –help

  这个命令执行结果将告诉你可用的配置选项,/usr/local/是默认的安装位置,如果你需要将软件安装到另外的目录,在下一步使用一个—prefix=/新的目录路径 参数。

  5) 在大多数情况下,默认的配置就能工作得很好
  % ./configure

  6) 用下面的命令编译
  % make

  我遇到了一个问题,在krb5-1.3.4/src/kadmin/testing/util目录中有个文件有点问题,但可以安全地忽略掉,在本例中,使用%make –i重新启动编译过程

  7) 使用下面的命令检查编译的准确性
  % make check

  8) 如果检查顺利通过,就可以开始安装了
  % sudo make install

  永远不要用root进行编译,仅当必需的时候才使用root权限,在这些步骤中都一样

  9) 现在你将MIT Krb5安装到/usr/local/中了,还需要手动创建一些目录和设置它们的权限

  10)
  % sudo mkdir -p /usr/local/var/krb5kdc
  % sudo chown root /usr/local/var/krb5kdc
  % sudo chmod 700 /usr/local/var/krb5kdc

  如果你真需要或想编译属于你自己的PAM模块,这里提供一下步骤,首先获取软件包并解压:

  % tar zxf pam_krb5-1.3-rc7.tar.gz
  % cd pam_krb5-1.3-rc7

  首先,你需要在你的$PATH环境变量中设置Kerberos的路径,例如:

  % PATH=/usr/local/bin:$PATH

  如果你自己已经将其安装到/usr/local中,那么执行:
  % ./configure

  然后编译和安装该软件包:
  % make

  创建你自己的区域

  Kerberos区域是一个管理域,它有它自己的Kerberos数据库,每个Kerberos区域都有它自己的一套Kerberos服务员,你的区域名可以是任何内容,但是它应该映射到你在DNS中的区域,如果新Kerberos区域是为你的整个DNS域example.com准备的,你应该将你的Kerberos区域取一个相同的名字(所有字母大写,这是Kerberos的惯例):EXAMPLE.COM,或者,如果你正在 example.com下创建一个新的工程部区域,你应该选项ENG.EXAMPLE.COM作为区域名。

  创建你自己的区域的第一步是创建/etc/krb5.conf文件,它包括了所有关于这个区域的必需的信息,每个想访问你新的Kerberos 区域的计算机都必需要krb5.conf文件,这里有一个区域EXAMPLE.COM的样本文件,KDC和管理服务器都运行在机器 kdc.example.com上:

[realms]
    EXAMPLE.COM = {
        # specifies where the servers are and on
        # which ports they listen (88 and 749 are
        # the standard ports)
        kdc = kdc.example.com:88
        admin_server = kdc.example.com:749
    }
[domain_realm]
    # maps your DNS domain name to your Kerberos
    # realm name
    .example.com = EXAMPLE.COM
[logging]
    # determines where each service should write its
    # logging info
    kdc = SYSLOG:INFO:DAEMON
    admin_server = SYSLOG:INFO:DAEMON
default = SYSLOG:INFO:DAEMON

  下一个文件是/usr/local/var/krb5kdc/kdc.conf,KDC服务器的配置文件,只有运行了KDC后台服务的计算机才需要这个文件,每个条目都有一个合理的默认值,创建一个空文件应该满足大多数情况:

% sudo touch /usr/local/var/krb5kdc/kdc.conf

  下面的命令应该在你的KDC计算机上执行:
% sudo /usr/local/sbin/kdb5_util create –s

  为新区域创建一个初始化Kerberos数据库,它要求你提供新区域数据库管理密码,并将其存储在文件/usr/local/var /krb5kdc/.k5.EXAMPLE.COM中,这个命令也创建了第一套委托人在你的Kerberos 5 帐户数据库中,你可以使用下面的命令列出它们:

% sudo /usr/local/sbin/kadmin.local

  然后在kadmin.local提示符处输入listprincs,打印出一个列表:

K/M@EXAMPLE.COM
kadmin/admin@EXAMPLE.COM
kadmin/changepw@EXAMPLE.COM
kadmin/history@EXAMPLE.COM
krbtgt/EXAMPLE.COM@EXAMPLE.COM

  在这时候,我们没有准备好使用远程的kadmin工具。

  在你新的区域下开始创建任何委托人之前,你应该定义一个策略,由它来决定如何处理密码:

kadmin.local:  add_policy -maxlife 180days -minlife
?2days -minlength 8 -minclasses 3
?-history 10 default

  这个输入为我们从现在开始创建的委托人定义了默认的策略,它确定了密码的最长有效期是180天,最小是2天;密码最小长度是8个字符,这些字符必须来自5个可用类型中3个不同的类型:小写字母、大写字母、数字、标点符号和其他,保留最后10个密码的历史以便重新使用。如果你想用字典检查密码,象下面这样添加一个dict_file定义:

[realms]
    EXAMPLE.COM = {
        dict_file = /usr/share/dict/words
}

  到你的kdc.conf文件中。
  现在你就准备好给你自己创建一个管理委托人了:

kadmin.local: addprinc john/admin

  调整名字为你的账号名,但保留/admin。然后它将要求你为这个委托人输入两次新密码。你可以用下面的命令来查看新账号:

kadmin.local:  getprinc john/admin

  它在屏幕上打印出类似下面的内容:

Principal: john/admin@EXAMPLE.COM
Expiration date: [never]
Last password change: Wed Dec 24 09:55:17 PST 2003
Password expiration date: Mon Jun 21 10:55:17 PDT 2004
Maximum ticket life: 1 day 00:00:00
Maximum renewable life: 0 days 00:00:00
Last modified: Wed Dec 24 09:55:17 PST 2003 (root/admin@EXAMPLE.COM)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 2
Key: vno 1, Triple DES cbc mode with HMAC/sha1, no salt
Key: vno 1, DES cbc mode with CRC-32, no salt
Attributes:
Policy: default

  输入quit退出kadmin.local程序,用下面的命令启动KDC后台服务:
% sudo /usr/local/sbin/krb5kdc
  输入下面的目录获取一个Kerberos 5 TGT:
% /usr/local/bin/kinit john/admin@EXAMPLE.COM

  用下面的命令查看你的TGT:

% /usr/local/bin/klist
Ticket cache: FILE:/tmp/krb5cc_5828
Default principal: john/admin@EXAMPLE.COM
Valid starting     Expires            Service principal
12/23/03 14:15:39  12/24/03 14:15:39  krbtgt/EXAMPLE.COM@EXAMPLE.COM

  祝贺你!你刚好完成你的第一次成功的Kerberos认证。现在你应该给这个管理账号指定权限了,它由文件/usr/local/var /krb5kdc/kadm5.acl中的条目决定。你可以给john/admin授予管理所有委托人的权限,通过添加下面这样一行到/usr /local/var/krb5kdc/kadm5.acl中,并使用通配符实现:
john/admin@EXAMPLE.COM  *

  在你能通过网络启动管理后台服务(kadmind)之前,你需要创建一个包含密钥的keytab文件:
kadmin.local:  ktadd -k /usr/local/var/krb5kdc/
?kadm5.keytab kadmin/changepw

  现在为Kerberos管理后台服务的事情都准备好了,可以启动它了:
% sudo /usr/local/sbin/kadmind

  这个后台服务允许你使用kadmin客户端工具远程管理你的Kerberos委托人,而不需要登陆到你的KDC,如果你想让你的Kerberos后台服务随系统启动而启动,将它们添加到你KDC中的/etc/rc文件中。

  使用前面获取到的Kerberos TGT,启动远程管理工具:

% /usr/local/sbin/kadmin
Authenticating as principal john/admin@EXAMPLE.COM
with password.
Password for john/admin@EXAMPLE.COM:

  添加新账号

  新账号仍然需要添加到你的shadow文件或你的密码映射中,无论如何,不要将密码放入这些位置,你要创建一个新的Kerberos委托人并将它的密码存储在KDC中。
使用kadmin工具:
% /usr/local/sbin/kadmin

  用下面的命令给常规用户添加一个委托人:

kadmin:  addprinc john
NOTICE: no policy specified for john@EXAMPLE.COM; assigning "default"
Enter password for principal "john@EXAMPLE.COM":
Re-enter password for principal "john@EXAMPLE.COM":
Principal "john@EXAMPLE.COM" created.

  创建委托人过程中输入的密码在john获取Kerberos TGT时需要或登陆到一个被配置成使用你的Kerberos 5区域的计算机时需要。现在你可以手工给你所有的账号创建委托人或使用下一小节将要介绍的迁移技术。

  添加从KDC

  如果你计划在你站点上的产品中使用Kerberos,你应该使用额外的从KDC来为你的安装提供故障容错功能。主KDC需要安装一个额外的传播服务,由它来发送KDC数据库版本更新到所有的从KDC服务器,从服务器需要为传播服务安装一个接收终端,请查看MIT文档。

  配置客户端

  启用Kerberos认证的最容易的方法是使用可插拔认证模块(PAM),因为它使用的是Kerberos API调用,它工作需要配置文件/etc/krb5.conf,因此,第一步是从你的KDC上拷贝/etc/krb5.conf到各个客户端机器。

  Kerberos不仅提供对用户的认证,也对计算机提供认证,防止你使用一个劫持的ip地址登陆到机器,要这样工作,每个计算机都需要它自己的Kerberos委托人和存储在文件(keytab文件)中的密钥(密码),计算机委托人构成如下:
host/.example.com@EXAMPLE.COM.

  第一步是为每个客户端计算机创建一个新的委托人,下面的命令用client1作为计算机名当例子,用客户端计算机主机名替换client1,登陆到你的每个客户端计算机并执行:
% sudo /usr/local/sbin/kadmin
kadmin: addprinc -randkey host/
?client1.example.com@EXAMPLE.COM

  它给新委托人指定一个随机密码,然后,提取密钥放入keytab文件:
kadmin: ktadd host/client1.example.com@EXAMPLE.COM

  它创建了/etc/krb5.keytab文件,要获得对/etc/目录的写入许可,你需要用suho运行kadmin命令,简单创建一个委托人不需要这些特殊的权限,小心/etc/krb5.keytab所有权和文件许可,无论如何,它只能对root是可读的,否则,这个机器的安全就会受到威胁。

  有几个为Kerberos 5准备的PAM可用,它们都叫pam_krb5。因为在MIT Kerberos 5 1.3版本中有一些API发生了变化,它们中的大部分都不再工作,你现在最好的选择是使用来自你的Linux发行版中的PAM模块,请查看前面的小节了解如何从源代码创建一个PAM模块。

  现在,通过编辑文件/etc/pam.d/system-auth (在Red Hat系统上)来添加一个新的PAM模块到你的系统认证堆栈:

auth  required    /lib/security/$ISA/pam_env.so
auth  sufficient  /lib/security/$ISA/pam_unix.so likeauth nullok
auth  sufficient  /lib/security/$ISA/pam_krb5.so use_first_pass
auth  required    /lib/security/$ISA/pam_deny.so
account   required      /lib/security/$ISA/pam_unix.so
account   [default=bad success=ok user_unknown=ignore
?service_err=ignore system_err=ignore]
?/lib/security/$ISA/pam_krb5.so
password  required    /lib/security/$ISA/pam_cracklib.so
?retry=3 type=
password  sufficient  /lib/security/$ISA/pam_unix.so
?nullok use_authtok md5 shadow
password  sufficient  /lib/security/$ISA/pam_krb5.so
?use_authtok
password  required    /lib/security/$ISA/pam_deny.so
session   required    /lib/security/$ISA/pam_limits.so
session   required    /lib/security/$ISA/pam_unix.so
session   optional    /lib/security/$ISA/pam_krb5.so

  这些改变使每个程序都要使用system-auth PAM堆栈(它的配置文件在/etc/pam.d/目录下)完成Kerberos认证。

  与非Linux客户端的内部操作

  如果你已经安装了一个windows活动目录(AD)KDC,你可以将它作为你Linux/Unix机器的主KDC,假如这样,你可以跳过全部服务器的安装,只需要安装上面叙述的设置你的客户端,你的/etc/krb5.conf文件需要定义windows KDC而不是Unix KDC,关于如何创建和拷贝keytab文件的更多信息请参考资源部分列出的文章。

  如果在你的工作组中有许多的windows机器,你也可以使用Unix KDC为它们提供服务,但是仅当你的windows客户端不属于windows AD域时才可以。

  在你的Kerberos 5区域中使用Mac OS X客户端很容易,只需要在你的Mac上配置好你的Unix KDC的名字就可以了。再说一下,账号名必须匹配。

  从本地或NIS/LDAP迁移密码到Kerberos

  现在你已经有一个在运行的Kerberos 5区域了,你的客户端也配置好了,你还需要转换你全部的用户账号,迄今为止,你账号的密码还是保存在本地的/etc/shadow文件或一个NIS /LDAP密码映射中,这些密码使用单向hash函数加密是不可能的,要破解它或转换为Kerberos 5格式,对于那些没有超级计算机的用户来说是不切实际的,一个好的办法是使用pam_krb5_migrate模块来从你现在的位置迁移到 Kerberos,这个模块可以在少数计算机上安装,每当有人登陆时,它在你的Kerberos 5 KDC中为该账号创建一个新的委托人,并重复使用该账号当前的密码。

  在每个人都登陆到这些指定的机器后,你所有账号就有一个对应的Kerberos 5委托人了,然后你可以在本地的密码文件或你的NIS/LDAP密码映射中用一个占位符(如krb5)替换密码,现在Kerberos PAM模块就可以认证你的用户了,到此为止,你也可以从迁移系统移除pam_krb5_migrate模块了。

  支持Kerberos的应用程序

  现在你的Kerberos已经处于运行中了,你可以使用利用它的服务了,你应该安装支持Kerberos的telnet和ftp,但是你真正应该使用ssh,你可以使你的Apache web服务器和Mozilla浏览器支持Kerberos;在使用Kerberos之前,你要使用这些服务必须输入密码,使用Kerberos后,这些应用程序都使用存储的Kerberos证书进行内部认证,这就是传说中的单点登陆了。

  资源

  1、两个可用的Kerberos实现,一个来自MIT: web.mit.edu/kerberos/dist,另外一个叫Heimdal,来自瑞典的KTH:
2、pam_krb5_migrate: freshmeat.net/projects/pam_krb5_migrate
3、pam_krb5: sourceforge.net/projects/pam-krb5
4、 MIT Kerberos 5发布版包括许多好的关于安装、管理和使用Kerberos的文档,最近O’Reilly发行了一般关于Kerberos的书: The Definitive Guide作者Jason Garman (ISBN 0-596-00403-6) 是关于如何创建一个新的区域和如何与其他操作系统一起工作的很好的书籍。
5、与Kerberos客户端一起使用微软的活动目录:
www.microsoft.com/windows2000/techinfo/planning/security/kerbsteps.asp



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

  认证是一个判断实体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:

  3、PADL Software Pty Ltd., NIS到LDAP的迁移工具:

 
阅读(1260) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~