用户信息集中化管理


NIS  ( network information  service)  网络信息服务

  yellow  page


nis   软件包
  ypserver    (yollow page )   --服务端
  yp-tool --工具
  ypbind --连接服务器
 
 辅助服务
  portmap    --端口由portmap分配


 /etc/ypserv.conf 规范NIS客户端是否可登入的权限
 /etc/sysconfig/network   指定NIS的域名
 /var/yp/Makefile 建立数据库有关的配置文件
 

 /usr/sbin/ypserv NIS服务器提供的主要服务
 /usr/sbin/rpc.ypxfrd 用与master/slave之间传输数据库的服务

 


nis  服务     主----从 架构  push   推送


配置主nis服务器 10.1.1.209

第一步:
安装软件包
[root@station209 ~]# yum install yp*

主机名配置  (配置主机名三步)
hostname
vim /etc/sysconfig/network

vim /etc/hosts
10.1.1.209      master.cluster.com
10.1.1.249      slave.cluster.com 
--主和从的/etc/hosts里都加上,从如果不加主的,会造成主从同步数据等待很久,后报错失败


第二步: 时间同步,关闭iptables,selinux
 ntpdate 10.1.1.1

 

第三步:修改配置文件

vim /etc/ypserv.conf       --在最后加上下面几句,表示只有本机和10网段才可以做此服务器的从服务器或是客户端;  man ypserv.conf可以查看帮助

127.0.0.1/255.255.255.0 :*      :*      :none
10.1.1.0/255.255.255.0  :*      :*      :none
*       :*      :*      :deny

--上面三句是对访问的权限进行一个控制,也就是除了本地和10.1.1.0网段外的都拒绝

 

[root@station209 ~]# vim /var/yp/Makefile  --定义主从服务器的角色
 
 
NOPUSH=false  --把这里改成false,双重否定表示肯定,也就是push,因为是主角色,所以要push到从的


all:  passwd group hosts rpc services netid protocols mail \ --这里可以选择要push过去的maps,但我这里用默认值,所有它定义的maps都会在初始化build


第四步:配置nis域
 第一种配置永久生效配置方法:
[root@station209 ~]# nisdomainname nis.com --临时生效,域名随便写
[root@station209 ~]# echo 'nisdomainname nis.com'>> /etc/rc.local
 第二种配置永久生效配置方法:
[root@station209 ~]# nisdomainname nis.com
[root@station209 ~]# vim /etc/sysconfig/network
   NISDOMAIN=nis.com

 

第五步:  启动服务,初始化主服务器

[root@station209 ~]# /etc/init.d/ypserv start --启动服务

[root@station209 ~]# /usr/lib/yp/ypinit -m --m  代表初始化主服务器

At this point, we have to construct a list of the hosts which will run NIS
servers.  master.cluster.com is in the list of NIS server hosts.  Please continue to add
the names for the other hosts, one per line.  When you are done with the
list, type a <control D>.
        next host to add:  master.cluster.com
        next host to add:    --这里敲control + d
The current list of NIS servers looks like this:

master.cluster.com

Is this correct?  [y/n: y]  y --这里输入y,回车,下面就会看到build出来很多数据文件
We need a few minutes to build the databases...
Building /var/yp/nis.com/ypservers...
Running /var/yp/Makefile...
gmake[1]: Entering directory `/var/yp/nis.com'
Updating passwd.byname...
Updating passwd.byuid...
Updating group.byname...
Updating group.bygid...
Updating hosts.byname...
Updating hosts.byaddr...
Updating rpc.byname...
Updating rpc.bynumber...
Updating services.byname...
Updating services.byservicename...
Updating netid.byname...
Updating protocols.bynumber...
Updating protocols.byname...
Updating mail.aliases...
gmake[1]: Leaving directory `/var/yp/nis.com'

master.cluster.com has been set up as a NIS master server.

Now you can run ypinit -s master.cluster.com on all slave server.


[root@station209 ~]# ls /var/yp/nis.com/  --这个目录和目录下的文件就是初始化后产生的maps
group.bygid   mail.aliases   protocols.byname    services.byname
group.byname  netid.byname   protocols.bynumber  services.byservicename
hosts.byaddr  passwd.byname  rpc.byname          ypservers
hosts.byname  passwd.byuid   rpc.bynumber
 

-------------------------------------------------------------------

配置从nis服务器

第一步:
 装软件包
 设置主机名

第二步:
 时间同步
 关闭iptables
 关闭selinux

第三步:
 修改配置文件
[root@li ~]# vim /etc/ypserv.conf  --针对于客户端的访问权限也可以进行一下设置

127.0.0.1/255.255.255.0 :*      :*      :none
10.1.1.0/255.255.255.0  :*      :*      :none
*       :*      :*      :deny

[root@li ~]# vim /var/yp/Makefile
NOPUSH=true  --确认为true,表示不推送,说明为从服务器


第四步:设置nis域
  nisdomainname nis.com
   vim /etc/sysconfig/network
   NISDOMAIN=nis.com


第五步:初始化从服务器,启动服务
[root@li ~]# /usr/lib/yp/ypinit -s master.cluster.com  --后面接的是主服务器的主机名(但要写到/etc/hosts里),否则就直接写IP

[root@li ~]# ls /var/yp/nis.com/ --初始化后,就可以看到主服务器的这些文件给同步过来了
group.bygid   netid.byname        rpc.byname
group.byname  passwd.byname       rpc.bynumber
hosts.byaddr  passwd.byuid        services.byname
hosts.byname  protocols.byname    services.byservicename
mail.aliases  protocols.bynumber  ypservers

 

[root@li ~]# /etc/init.d/ypserv start --启动服务

 


---------------------------------------------------

 

客户端的设置
1,主机名设置,/etc/hosts 可以写上主NIS服务器,和从nis服务器,如果不写的话也行,后面直接指定IP就可以
 时间同步

2, yum install ypbind yp-tools

vim /etc/yp.conf --加上下面一句

domain nis.com server 10.1.1.209 --指写nis域,和nis服务器(主或者从都可以)的IP或者主机名(如果写主机名的话,要写到/etc/hosts里)


3,vim /etc/nsswitch.conf --在下面几个里都加上nis的查找

passwd:     files nis
shadow:     files nis
group:      files nis
 
hosts:      files nis dns

4,/etc/init.d/ypbind  start --启动ypbind服务


注意:   第2,3,4步,合起来可以使用一个图形化的配置方法
  authconfig-tui 使用这个命令,把使用nis前面打*号,然后下一步
  填上nis域名和指向的nis服务器

 

5,测试,
 第一种:客户端指向主nis服务器
 nis服务器对用户和密码有修改,需要cd /var/yp ;make  同步一下
 客户端就会生效了

 如果客户端指向从nis服务器
 nis服务器对用户和密码有修改,需要cd /var/yp ;make  同步一下
 在从nis服务器/usr/lib/yp/ypinit -s master.cluster.com把主的信息推送过来
 从nis服务器把信息从主推送过来后,也要cd /var/yp; make同步一下
 客户端就会生效了

 

测试例子1:
测试/etc/nsswitch.conf文件里的下面这句
passwd:    files  nis 
--这句的意思是当客户端要用到用户名时(默认500uid以后的,在nis里可以配置范围),
--会先找本机的/etc/passwd,再找NIS服务器的/etc/passwd。所以是本机的优先,如果要NIS优先,可以把files nis换成nis files。
--这样的话,客户端最好就不要去建立普通用户,免得和NIS服务器上的信息冲突。或者就是把files nis只写nis,统一由nis服务器来管理


使用id命令就可以验证

 

测试例子2:
测试/etc/nsswitch.conf文件里的下面这句
shadow:    files  nis 


使用su - 切换,输入密码来验证


测试例子3:
测试/etc/nsswitch.conf文件里的下面这句
hosts:    files  nis   dns

使用ping NIS服务器里/etc/hosts里定义的主机名来测试验证


测试例子4:
如果我想客户端/etc/services文件里端口的对应也使用NIS服务器,如何做和验证?
1, 在NIS服务器里的/etc/services里把ssh 对应的22端口改成2222
2, cd /var/yp ;make  更新一下
3, 在客户端写一个文件
# vim /etc/xinetd.d/ssh
service  ssh
{
        disable = yes
        socket_type = stream
        protocol = tcp
        port = 2222
        wait = no
        user = root
        server = /usr/sbin/sshd
        server_args = -i
}
4,在客户端/etc/init.d/sshd stop   再lsof -i:22  没有查看到
5,在客户端/etc/init.d/xinetd restart 再lsof -i:2222 也没有
6,把客户端的/etc/nsswitch.conf里下面的一句改一下
   services:  nis files --把这一句把nis加在files前面,表示先找nis服务器的/etc/services里定义的2222端口,而不是客户端本机定义的22端口
7,客户端再一次/etc/init.d/xinetd restart 
 lsof -i:2222   --查看到了,说明是用的NIS服务器上的/etc/services文件,验证成功

 

--------------------------------------------------------

1,关于用户家目录和环境变量的问题:

需要使用nfs服务器把家目录给共享出来,--nfs需要在nis服务器上做

vim /etc/exports
/home 10.1.1.0/255.255.255.0(rw)  --注意这里给的是可读可写

/etc/init.d/portmap restart
/etc/init.d/nfs restart


2,这样做了,需要客户端去手动挂载nis服务器上的/home目录,为了实现自动挂载
还需要借助于autofs服务,--autofs是在客户端做


vim /etc/auto.master
/home  /etc/auto.home

vim /etc/auto.home
*   -rw  10.1.1.209:/home/&   

/etc/init.d/autofs restart


到此nis+nfs+autofs搭建完毕

 


==================================================================


ldap (lightweight   directory  access protocol ) 轻量级目录访问协议
   X.500   


  数据集中存放
 
  用于读多写少的环境


数据库以表的形式来存放数据
 用户名     密码      UID     GID     comment   homeDIR   shell
  root    x        0       0        root      /root   /bin/bash
 x
 x
 x
 x

  select * from user  where username='root';

 

ldap以树状的层次结构来存放数据,所以没有数据库里相关的回滚等机制


   公司


 sales  it  manager


张三   李四   王五 

 

在树型的每个节点上,   称为(条目 entry)

   顶部为根,    DN 来表示

    dc=uplooking,dc=com


  以下要用OU来区分    organaization  unit


    ou=sales,dc=uplooking,dc=com
  ou=manager,ou=sales,dc=uplooking,dc=com

  uid=zhangsan,ou=sales,dc=uplooking,dc=com

 

安装软件包
  yum install openldap*
openldap   必要套件,要先安装
openldap-servers  服务套件
openldap-clients  操作程序套件
openldap-devel   开发工具套件包

 

守护进程:
slapd: 主ldap服务器守护进程

本地对数据库操作的命令
slapadd  把本地的LDIF(ldap目录交换格式)里指定的entry添加到LDAP数据库中
slappasswd   生成密码

网络上操作的客户命令
ldapadd    连接ldap服务器,修改或增加条目
ldapsearch   连接ldap服务器,指定参数进行搜索


[root@ldap ~]# useradd a1
[root@ldap ~]# useradd a2
[root@ldap ~]# useradd a3
[root@ldap ~]# echo 1 | passwd --stdin a1
Changing password for user a1.
passwd: all authentication tokens updated successfully.
[root@ldap ~]# echo 2 | passwd --stdin a2
Changing password for user a2.
passwd: all authentication tokens updated successfully.
[root@ldap ~]# echo 3 | passwd --stdin a3
Changing password for user a3.
passwd: all authentication tokens updated successfully.


[root@ldap openldap]# slappasswd    --此命令生成密码串
New password:
Re-enter new password:
{SSHA}dWHxAobZR5BqnhGesa6BltpePjb4ofQ2 

 


[root@ldap ~]# vim /etc/openldap/slapd.conf


include         /etc/openldap/schema/nis.schema --这一句定义了nis所包含的规则,也就是/etc/passwd,/etc/shadow等文件里所有的列


database        bdb  --后端数据库类型
suffix          "dc=cluster,dc=com" --我定义的基准DN
rootdn          "cn=admin,dc=cluster,dc=com"  --管理DN
rootpw          {SSHA}dWHxAobZR5BqnhGesa6BltpePjb4ofQ2  --管理DN的密码,由slappasswd来生成密文,也可以使用明文


   
   dc=cluster,dc=com
    |
 |---------------------------------------------|
     ou=people       ou=group
 |           | 
|-----------------|      |------------------------|
uid=user1 uid=user2  gid=group1     gid=group2

 

下面开始迁移本机的用户和密码到openldap数据库里
[root@ldap ~]# cd /usr/share/openldap/migration/  --cd到migration tool的目录,现在在rhel 5后集成到openldap-servers包里去了,此目录下全是perl程序写的迁移程序;由PADL这个公司所开发

 

[root@ldap migration]# vim migrate_common.ph


# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "cluster.com"; 

# Default base
$DEFAULT_BASE = "dc=cluster,dc=com"; --把这两句修改成自己的基准DN

 


[root@ldap migration]# ./migrate_passwd.pl /etc/passwd > /etc/openldap/user.ldif
[root@ldap migration]# ./migrate_group.pl /etc/group > /etc/openldap/group.ldif

--上面这两句是使用它的两个默认perl程序脚本把本机的/etc/passwd和/etc/group生成.ldif文件(此类型文件可用于导入到openldap数据库中)

 

--如果不生成root用户和系统用户,则先用awk分离,再生成

# awk -F: '$3>499&&$3!=65534 {print $0}' /etc/passwd > /etc/passwd.migrate
# awk -F: '$3>499&&$3!=65534 {print $0}' /etc/group > /etc/group.migrate

# ./migrate_passwd.pl /etc/passwd.migrate > /etc/openldap/user.ldif
# ./migrate_group.pl /etc/group.migrate > /etc/openldap/group.ldif

 

--上面生成了user和group,但user.ldif和group.ldif里定义的people和group这两个ou没有定义

[root@ldap migration]# cd /etc/openldap/

--下面我再定义三个ldif文件,用来保存cluster.com和对应的人和组
[root@ldap openldap]# vim /etc/openldap/cluster.ldif

dn: dc=cluster,dc=com
dc: cluster
objectclass: dcobject
objectclass: organizationalunit
ou: cluster.com


[root@ldap openldap]# vim /etc/openldap/ou_people.ldif

dn: ou=people,dc=cluster,dc=com
objectclass: organizationalUnit
ou: people


[root@ldap openldap]# vim /etc/openldap/ou_group.ldif

dn: ou=group,dc=cluster,dc=com
objectclass: organizationalunit
ou: group


[root@ldap openldap]# ls *.ldif
cluster.ldif  ou_group.ldif   user.ldif
group.ldif    ou_people.ldif
--这五个ldif文件定义的就是我的树状结构图所有节点(包括根)定义


--下面就要使用slapadd命令把上面的五个ldif文件添加到openldap的数据库中

[root@ldap openldap]# cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG


[root@ldap openldap]# slapadd -vl cluster.ldif
added: "dc=cluster,dc=com" (00000001)

[root@ldap openldap]# slapadd -vl ou_people.ldif
added: "ou=people,dc=cluster,dc=com" (00000002)

[root@ldap openldap]# slapadd -vl ou_group.ldif
added: "ou=group,dc=cluster,dc=com" (00000003)


[root@ldap openldap]# slapadd -vl user.ldif  
。。。。。。

[root@ldap openldap]# slapadd -vl group.ldif
。。。。。。

 

[root@ldap openldap]# chown ldap.ldap /var/lib/ldap/ -R


[root@ldap openldap]# /etc/init.d/ldap start


--可以用下面命令查找一下,显示下面内容则OK    
[root@ldap openldap]# ldapsearch -x -b '' -s base '(objectclass=*)' namingcontexts
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: namingcontexts
#

#
dn:
namingContexts: dc=cluster,dc=com

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

 


继续安装基于php的web管理ldap的图形软件phpldapadmin

[root@dns ~]# ls /share/soft/ldap/    --软件包路径
mhash-0.9.2-6.el5.i386.rpm
phpldapadmin-1.2.0.4.tgz
php-mhash-5.1.6-5.el5.i386.rpm


[root@ldap ldap]# yum install httpd httpd-devel php php-ldap php-devel -y

[root@ldap ldap]# rpm -ivh mhash-0.9.2-6.el5.i386.rpm
[root@ldap ldap]# rpm -ivh php-mhash-5.1.6-5.el5.i386.rpm

[root@ldap ldap]# tar xvf phpldapadmin-1.2.0.4.tgz -C /var/www/html/
[root@ldap ldap]# cd /var/www/html/
[root@ldap html]# mv phpldapadmin-1.2.0.4/ phpldapadmin
[root@ldap html]# chown apache.apache phpldapadmin/ -R
[root@ldap html]# cd phpldapadmin/config/
[root@ldap config]# cp config.php.example config.php

 

[root@ldap config]# vim config.php

57 $config->custom->appearance['language'] = 'zh_CN';

276 $servers->setValue('server','host','127.0.0.1');
279 $servers->setValue('server','port',389);
283 $servers->setValue('server','base',array('dc=cluster,dc=com'));


[root@ldap config]# /etc/init.d/httpd restart


--在另一台机器使用firefox 访问 http://10.1.1.36/phpldapadmin
现在看到一个php的内存限制报错

解决:
vim /etc/php.ini 
memory_limit = 64M   --把16M改大点,最少为24M

/etc/init.d/httpd   restart   

 

登录帐号:
cn=admin,dc=cluster,dc=com
密码
就上slappasswd生成的密码


-----------------

客户端验证:

使用authconfig-tui打开验证选择界面
在use LDAP 前打*
在use LDAP authentication 前打*

下一步

输入
10.1.1.36
dc=cluster,dc=com

 

可以查看到ldap服务器的用户,但家目录还是有问题
家目录一样可以使用autofs来解决:


--在ldap服务端使用nfs共享家目录
[root@ldap config]# vim /etc/exports
/home   *(rw)

[root@ldap config]# /etc/init.d/nfs restart
[root@ldap config]# /etc/init.d/portmap restart


--在ldap客户端配置autofs服务
vim /etc/auto.master
/home /etc/auto.home

vim /etc/auto.home
* 10.1.1.36:/home/&

/etc/init.d/autofs restart

 

然后在客户端上对先前的a1,a2,a3用户及其密码进行验证,都OK

 


==================================

 


例:新增加一个用户


# useradd a4
# echo 4 |passwd --stdin a4
Changing password for user a4.
passwd: all authentication tokens updated successfully.

# id a4
uid=542(a4) gid=543(a4) groups=543(a4)

 


在phpldapadmin页面的ou_group下面选择--创建新条目-->创建样板选择Generic:Posix Group -->组 (写上a4) -->GID号(现在不能改成543,先用它给的默认值)-->创建对象-->提交   

 

创建完这个组后,在ou_group点a4这个组条目--点switch template--选择默认--把gidnumber改成对应的543--点update object --提交

 

然后在people下面选择--创建新条目--创建样板选择写上Generic:User Account--a4相关的信息(但现在是cn=a4不是uid=a4,还有就是uid为1000,组选择a4,密码填5,家目录选择/home/a4,登录shell没有/bin/bash能选择,先选一个/bin/sh)--创建对象--提交


创建完后,点a4这个条目--点switch template--选择默认--在cn=a4点重命名,改成
uid=a4--把uid由1000改成542--把/bin/sh改成/bin/bash

--做完上面的步骤后,就可以用客户端验证了

 

==================================================================


现在尝试使用一个普通用户改自己的密码,会报权限不足,需要在ldap服务器上去授权


[a4@slave ~]$ passwd
Changing password for user a4.
Enter login(LDAP) password:   --输入原密码
New UNIX password:    --新密码,但要求复杂度高
Retype new UNIX password:
LDAP password information update failed: Insufficient access --报错,更新ldap密码信息权限不够

passwd: Permission denied

 

 

[root@ldap config]# vim /etc/openldap/slapd.conf
--加上下面两段;第一段表示针对userpassword这个属性,admin管理员可以写,匿名需要验证,用户自己可以改自己的密码,其它无权限
--第二段,表示除了userpasswd属性外的其它所有属性,只有admin管理员可以写,其它都只读

 

access to attrs=userpassword
        by dn="cn=admin,dc=cluster,dc=com" write
        by anonymous auth
        by self write  --主要是这一句,表示用户可以修改用户自己的密码
        by * none
access to *
        by dn="cn=admin,dc=cluster,dc=com" write
        by * read

 

[root@ldap config]# /etc/init.d/ldap restart

 

再去验证,普通用户自己就可以改自己的密码了

 

===========================

 

 

测试使用ldap用户登录客户端的vsftpd服务器


在一个ldap客户端上
yum install vsftpd  

/etc/init.d/vsftpd restart


然后使用另一台机器使用ftp登录ldap客户端的ftp服务器(使用ldap的用户和密码)

可以成功登录,并且登录后上传的文件在ldap server的家目录里

如果不想要上传的文件在ldap server,可以在ftp上使用local_root等参数定义到自己机器的目录

 

测试使用ldap用户登录客户端的postfix服务器

在一个ldap客户端上
yum install postfix*  dovecot -y

配置postfix和dovecot    --步骤省略

/etc/init.d/postfix  restart
/etc/ini.d/dovecot  restart


再用一个xp使用outlook来验证(使用的用户为ldap server的用户和密码)


发的邮件在postfix的/var/mail目录下对应的用户名邮箱文件里( 因为用户在ldap server
上,并不在postfix服务器上,所以当收对应用户的邮件时,会自动在/var/mail下创建,所以
outlook就可以通过pop3对应的收取邮件了)