NIS(Network Information Service,or Yellow Page or YP) 网络信息服务,由sun公司开发并受权给unix供应商,最初称为黄页,简称YP,因为 British Telecom PLC公司优先注册了Yellow Page商标,因此sun公司最终将其更名为NIS,可是其应用程序或脚本仍延用以yp开头。
NIS是一种应用层协议,以客户端/服务器端的方式工做,主要做用是在网络中提供轻型目录服务,如存储用户或组账号信息,计算机名信息等。就像windows中的AD,集中存储用户的账号信息,计算机信息,这样方便管理账号,在中大型企业中应用普遍。固然NIS不只能够进行账号的统一管理,还能够结合kerberos作应用服务的验证,如:ftp ssh等。node
NIS服务是C/S模式,NIS服务器能够多台,分为master/slave模式,主服务器负责数据库制做管理,从服务器负责从主服务器更新数据而且提供与master 相同的查寻功能!
NIS的服务器集中维护用户的帐号信息,当NIS客户机须要进行用户登陆的信息验证时,就向NIS服务器发出查询请求。当系统中的一台NIS服务器为多台NIS客户机提供服务时,用户登陆系统中的任何一台NIS客户机都会从NIS服务器进行登陆验证,这样就实现了集中管理用户帐号的功能。
在NIS服务器的数据库中主要包含如下几类信息:用户帐号信息,组帐号信息,IP地址和主机名称对应记录的信息,这些信息被保存在不一样的数据库文件中进行集中的管理。web
NIS客户端配置文件数据库
kerberos希腊语是看门狗的意思,由MIT研发,目前最新版应该第5版。kerberos验证过程有点复杂,曾经MIT在1988年写了一篇有趣的文章,使用对话的方式将整个过程描述出来,它就是雅典娜和欧里庇得斯的对话,有兴趣的朋友能够去阅读一下,能够很好的帮助理解kerberos。windows
条目 | 写法 |
---|---|
user : | user/描述@xxx.com |
ftp server: | ftp/hostname@xxx.com |
ssh server: | host/hostname@xxx.com |
telnet ser: | host/hostname@xxx.com |
nfs server: | nfs/hostname@xxx.com |
kerberos验证过程分为2步,初始验证过程和票据验证过程安全
以client请求登陆ssh服务为例:bash
IP | 主机名 | 功能 |
---|---|---|
192.168.5.10 | master.example.com | NIS主服务器master+kerberos服务 |
192.168.5.11 | node1.example.com | NIS从服务器slave |
192.168.5.12 | node2.example.com | ssh server+kerberos workstation |
192.168.5.13 | node3.example.com | nis client+kerberos workstation |
[root@master ~]# yum install -y ypserv yp-tools [root@node1 ~]# yum install -y ypserv yp-tools
[root@node3 ~]# yum install -y yp-tools
[root@master ~]# systemctl start rpcbind [root@master ~]# systemctl enable rpcbind [root@node1 ~]# systemctl start rpcbind [root@node1 ~]# systemctl enable rpcbind
[root@master ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper
[root@master ~]# cat /etc/hosts 192.168.5.10 master master.example.com 192.168.5.11 node1 node1.example.com 192.168.5.12 node2 node2.example.com 192.168.5.13 node3 node3.example.com
[root@master yp]# cat /var/yp/ypservers master node1
NOPUSH=false #容许主服务器向从服务器传递数据库文件
[root@master yp]# systemctl restart ypserv [root@master yp]# systemctl restart ypbind [root@master yp]# systemctl restart yppasswdd [root@master yp]# systemctl restart ypxfrd
[root@master ~]# /usr/lib64/yp/ypinit -m At this point, we have to construct a list of the hosts which will run NIS servers. master 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 next host to add: 按ctrl+d保存 The current list of NIS servers looks like this: master Is this correct? [y/n: y] y We need a few minutes to build the databases... Building /var/yp/master.example.com/ypservers... Running /var/yp/Makefile... gmake[1]: Entering directory `/var/yp/master.example.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/master.example.com' master has been set up as a NIS master server. Now you can run ypinit -s master on all slave server.
最终在/var/yp目录下生成数据库文件,查看一下服务器
[root@master ~]# ls /var/yp/ Makefile master.example.com ypservers [root@master ~]# ls /var/yp/master.example.com/ 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
[root@master ~]# useradd sshu [root@master ~]# passwd sshu Changing password for user sshu. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully.
[root@master ~]# make -C /var/yp/ make: Entering directory `/var/yp' gmake[1]: Entering directory `/var/yp/master.example.com' Updating passwd.byname... Updating passwd.byuid... Updating group.byname... Updating group.bygid... Updating netid.byname... gmake[1]: Leaving directory `/var/yp/master.example.com' make: Leaving directory `/var/yp'
使用NIS客户端工具查看数据库信息已经有了刚添加的sshu用户信息网络
[root@master ~]# ypcat -d master.example.com -h master.example.com passwd sshu:$6$WrW8Lw06$/.WxYeOBxJ02aV0u3SVzeZ2sz/2csruFdmUcjYbEiA/vLhorYVC2XCUOpGEKpuG1ImGFq87BL61sy4puUWNLO1:1000:1000::/home/frank:/bin/bash
[root@node1 ~]# /usr/lib64/yp/ypinit -s master We will need a few minutes to copy the data from master. Transferring netid.byname... Trying ypxfrd ... success Transferring group.bygid... Trying ypxfrd ... success Transferring group.byname... Trying ypxfrd ... success Transferring passwd.byuid... Trying ypxfrd ... success Transferring passwd.byname... Trying ypxfrd ... success Transferring mail.aliases... Trying ypxfrd ... success Transferring protocols.byname... Trying ypxfrd ... success Transferring protocols.bynumber... Trying ypxfrd ... success Transferring services.byservicename... Trying ypxfrd ... success Transferring services.byname... Trying ypxfrd ... success Transferring rpc.bynumber... Trying ypxfrd ... success Transferring rpc.byname... Trying ypxfrd ... success Transferring hosts.byaddr... Trying ypxfrd ... success Transferring hosts.byname... Trying ypxfrd ... success Transferring ypservers... Trying ypxfrd ... success node1's NIS data base has been set up. If there were warnings, please figure out what went wrong, and fix it. At this point, make sure that /etc/passwd and /etc/group have been edited so that when the NIS is activated, the data bases you have just created will be used, instead of the /etc ASCII files.
[root@node1 ~]# ypcat -h node1.example.com passwd frank:$6$WrW8Lw06$/.WxYeOBxJ02aV0u3SVzeZ2sz/2csruFdmUcjYbEiA/vLhorYVC2XCUOpGEKpuG1ImGFq87BL61sy4puUWNLO1:1000:1000::/home/frank:/bin/bash sshu:$6$K6XRNhSk$st/0cfN6GAq8maTFlPQktxqQwKFPLeOQ97JpqkApQ9EwzwKqsNzIo5OEYeyv9LFMD6bU25367BYeuv4NsjSOy1:1001:1001::/home/u123:/bin/bash
代表数据同步成功,固然不可能每次都要手动同步,设置个定时任务计划即可以解决这个问题。架构
在master服务器上添加任务计划并发
5 * * * * /usr/sbin/yppush -h node1.example.com passwd.byname 5 * * * * /usr/sbin/yppush -h node1.example.com passwd.byuid 5 * * * * /usr/sbin/yppush -h node1.example.com group.byname 5 * * * * /usr/sbin/yppush -h node1.example.com group.bygid
[root@node3 ~]# authconfig-tui
经过终端登陆测试 OK 验证成功
能够以/var/yp/目录下建立securenets文件来限制网络主机查看NIS服务器的数据库
[root@master yp]# vi securenets [root@master yp]# cat !$ cat securenets 255.255.255.255 192.168.5.11
表示容许5.11的主机能够查看NIS数据库
[root@node1 ~]# ypcat -d master.example.com -h master.example.com passwd frank:$6$WrW8Lw06$/.WxYeOBxJ02aV0u3SVzeZ2sz/2csruFdmUcjYbEiA/vLhorYVC2XCUOpGEKpuG1ImGFq87BL61sy4puUWNLO1:1000:1000::/home/frank:/bin/bash [root@node1 ~]# ifconfig | grep inet |grep 192 inet 192.168.5.11 netmask 255.255.255.0 broadcast 192.168.5.255
[root@node2 ~]# ifconfig |grep inet |grep 5.12 inet 192.168.5.12 netmask 255.255.255.0 broadcast 192.168.5.255 [root@node2 ~]# ypcat -d master.example.com -h master.example.com passwd No such map passwd.byname. Reason: No such map in server's domain
在master上安装 krb5-server krb5-workstation,在node2和node3安装krb5-workstation
[root@master ~]# yum -y install krb5-server krb5-workstation [root@node2 ~]# yum -y install krb5-workstation [root@node3 ~]# yum -y install krb5-workstation
[realms] //表示域 # EXAMPLE.COM = { # kdc = kerberos.example.com # admin_server = kerberos.example.com # } MASTER.EXAMPLE.COM = { //域名称随便写,通常大写,能够和NIS域名不一样 kdc = 192.168.5.10 //kdc主机地址 admin_server = 192.168.5.10 //管理主机地址 } [domain_realm] .example.com = MASTER.EXAMPLE.COM //表示后辍为example.com全部域成员
这个配置文件凡是装有krb5-workstation的主机都要有一份
[root@master ~]# for i in {2,3};do scp /etc/krb5.conf node$i:/etc/krb5.conf;done root@node2's password: krb5.conf 100% 835 121.9KB/s 00:00 root@node3's password: krb5.conf 100% 835 280.8KB/s 00:00
[root@master ~]# vi /var/kerberos/krb5kdc/kdc.conf [kdcdefaults] kdc_ports = 88 kdc_tcp_ports = 88 [realms] EXAMPLE.COM = { master_key_type = aes256-cts //取消本行的注释 default_principal_flags = +preauth //增长本行,表示预验证 acl_file = /var/kerberos/krb5kdc/kadm5.acl dict_file = /usr/share/dict/words admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal }
[root@master ~]# vi /var/kerberos/krb5kdc/kadm5.acl */admin@MASTER.EXAMPLE.COM * 第一*表示用户,第二*表示权限 权限可选择的配置列表以下: a: 容许增长principal或访问策略 A: 不容许增长principal或访问策略 c: 容许变动principals的密码 C: 不容许变动princials的密码 d: 容许删除principals或策略 D: 不容许删除principals或策略 i: 容许查看数据库 I: 不容许查看数据库 l: 容许列出principals或策略列表 L: 不容许列出principals或策略 m: 容许修改principals或策略 M: 不容许修改principals或策略 p: 容许传播(propagation)principal数据库 P: 不容许传播principal数据库 u: 容许建立使用PAM进行密码验证的单一组件用户principal U: 否决u的权限 x: a,d,m,c,i,l权限的快捷方式 *: 跟x同样
这里的admin账号系统中尚未,须要后面建立
[root@master ~]# kdb5_util create -r MASTER.EXAMPLE.COM -s Loading random data Initializing database '/var/kerberos/krb5kdc/principal' for realm 'MASTER.EXAMPLE.COM', master key name 'K/M@MASTER.EXAMPLE.COM' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: //提示输入KDC数据库密码,不能忘记 Re-enter KDC database master key to verify:
[root@master ~]# systemctl start krb5kdc && systemctl enable krb5kdc Job for krb5kdc.service failed because the control process exited with error code. See "systemctl status krb5kdc.service" and "journalctl -xe" for details.
出了错,先看看日志
[root@master ~]# tail /var/log/krb5kdc.log krb5kdc: Configuration file does not specify default realm - while attempting to retrieve default realm krb5kdc: Configuration file does not specify default realm - while attempting to retrieve default realm krb5kdc: Configuration file does not specify default realm - while attempting to retrieve default realm
日志说配置文件里没有默认的域 在/etc/krb5.conf配置文件里检查下,果真是有一行默认域被注释
[root@master ~]# !vi vi /etc/krb5.conf # Configuration snippets may be placed in this directory as well includedir /etc/krb5.conf.d/ [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] dns_lookup_realm = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true rdns = false # default_realm = EXAMPLE.COM default_realm = MASTER.EXAMPLE.COM //问题就出在这里
再次启动服务,OK问题解决
[root@master ~]# systemctl start kadmin [root@master ~]# systemctl enable kadmin Created symlink from /etc/systemd/system/multi-user.target.wants/kadmin.service to /usr/lib/systemd/system/kadmin.service. [root@master ~]# systemctl start krb5kdc [root@master ~]# systemctl enable krb5kdc Created symlink from /etc/systemd/system/multi-user.target.wants/krb5kdc.service to /usr/lib/systemd/system/krb5kdc.service.
[root@master ~]# kadmin.local Authenticating as principal root/admin@MASTER.EXAMPLE.COM with password. kadmin.local: listprincs //查看当前系统中的principal K/M@MASTER.EXAMPLE.COM kadmin/admin@MASTER.EXAMPLE.COM kadmin/changepw@MASTER.EXAMPLE.COM kadmin/master@MASTER.EXAMPLE.COM kiprop/master@MASTER.EXAMPLE.COM krbtgt/MASTER.EXAMPLE.COM@MASTER.EXAMPLE.COM kadmin.local: addprinc root/admin@MASTER.EXAMPLE.COM //添加一个principal WARNING: no policy specified for root/admin@MASTER.EXAMPLE.COM; defaulting to no policy Enter password for principal "root/admin@MASTER.EXAMPLE.COM": Re-enter password for principal "root/admin@MASTER.EXAMPLE.COM": Principal "root/admin@MASTER.EXAMPLE.COM" created. kadmin.local: listprincs K/M@MASTER.EXAMPLE.COM kadmin/admin@MASTER.EXAMPLE.COM kadmin/changepw@MASTER.EXAMPLE.COM kadmin/master@MASTER.EXAMPLE.COM kiprop/master@MASTER.EXAMPLE.COM krbtgt/MASTER.EXAMPLE.COM@MASTER.EXAMPLE.COM root/admin@MASTER.EXAMPLE.COM kadmin.local:
kadmin.local: addprinc u123@MASTER.EXAMPLE.COM //注意用户pirncipal的写法 WARNING: no policy specified for u123@MASTER.EXAMPLE.COM; defaulting to no policy Enter password for principal "sshu@MASTER.EXAMPLE.COM": Re-enter password for principal "sshu@MASTER.EXAMPLE.COM": Principal "sshu@MASTER.EXAMPLE.COM" created. kadmin.local: addprinc -randkey host/master.example.com@MASTER.EXAMPLE.COM //注意SSH主机pirncipal的写法 WARNING: no policy specified for host/master.example.com@MASTER.EXAMPLE.COM; defaulting to no policy Principal "host/master.example.com@MASTER.EXAMPLE.COM" created. kadmin.local: ktadd host/master.example.com@MASTER.EXAMPLE.COM Entry for principal host/master.example.com@MASTER.EXAMPLE.COM with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab. Entry for principal host/master.example.com@MASTER.EXAMPLE.COM with kvno 2, encryption type aes128-cts-hmac-sha1-96 added to keytab WRFILE:/etc/krb5.keytab. kadmin.local: ktadd sshu@MASTER.EXAMPLE.COM [root@master ~]# restorecon /etc/krb5.keytab //可选操做
GSSAPIAuthentication yes
这里提示有个包没有安装,安装一下
[root@node3 ~]# yum -y install pam_krb5
配置完成
[root@node3 ~]# kdestroy Other credential caches present, use -A to destroy all [root@node3 ~]# kinit sshu Password for sshu@MASTER.EXAMPLE.COM: [root@node3 ~]# klist Ticket cache: KEYRING:persistent:0:0 Default principal: sshu@MASTER.EXAMPLE.COM Valid starting Expires Service principal 11/28/2018 18:40:12 11/29/2018 18:40:09 krbtgt/MASTER.EXAMPLE.COM@MASTER.EXAMPLE.COM [root@node3 ~]# ssh sshu@master.example.com Last login: Tue Nov 27 20:40:30 2018 from 192.168.5.13 [sshu@master ~]$ exit logout Connection to master.example.com closed. [root@node3 ~]# ssh sshu@node2.example.com Last login: Tue Nov 27 20:40:20 2018 from 192.168.5.13 Could not chdir to home directory /home/sshu: No such file or directory -bash-4.2$
完成ssh免密码登陆。
nis服务器上只存账号信息,验证功能交给kerberos完成,这里须要注意的是,nis中的账号在kerberos中也要有,若是kerberos有账号而nis中没有不能完成验证。 Nis中的账户须要同步到kerberos中,而用户的密码能够不一样。 kerberos验证安全可靠,也被众多厂商支持,咱们熟知的微软公司就将kerberos揉合进了AD,无需作任何操做就帮咱们作好了验证功能。