nis+kerberos 實現服務驗證

1.NIS部分

1.1 簡介

    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

1.2 NIS架構

    NIS服務是C/S模式,NIS服務器能夠多臺,分爲master/slave模式,主服務器負責數據庫製做管理,從服務器負責從主服務器更新數據而且提供與master 相同的查尋功能!
    NIS的服務器集中維護用戶的帳號信息,當NIS客戶機須要進行用戶登陸的信息驗證時,就向NIS服務器發出查詢請求。當系統中的一臺NIS服務器爲多臺NIS客戶機提供服務時,用戶登陸系統中的任何一臺NIS客戶機都會從NIS服務器進行登陸驗證,這樣就實現了集中管理用戶帳號的功能。
    在NIS服務器的數據庫中主要包含如下幾類信息:用戶帳號信息,組帳號信息,IP地址和主機名稱對應記錄的信息,這些信息被保存在不一樣的數據庫文件中進行集中的管理。
web

1.3 NIS工做原理

  • NIS服務器根據本地保存的系統信息,製做數據庫文件
  • NIS主輔服務器進行數據同步,主能夠主動推送到從,從也能夠主動找主更新
  • 客戶端向NIS服務器發送請求(先從本地驗證,找不到再向服務器請求)
  • 客戶端選擇處於存活狀態且爲yp.conf指定的NIS服務器,該服務器響應請求,若是客戶端廣播,則有ypbind進程查詢NIS服務器,響應最快的服務器將與客戶端通訊。

    1.4 NIS應用程序及配置文件

    1.4.1 服務端

    1.4.1.1 服務端主要守護進程及功能
  • /lib/systemd/system/ypserv.service
      NIS服務器提供的主要服務
  • /lib/systemd/system/ypxfrd.service
      用於NIS主從數據同步
  • /lib/systemd/system/yppasswdd.service
      經過此服務,NIS客戶端登陸的用戶能夠直接修改在NIS服務器上的密碼
  • /lib/systemd/system/ypbind.service
      用於提供端口綁定服務 ##### 1.4.1.2 服務端主配置文件
  • /etc/ypserv.conf 
      關鍵配置文件,規範NIS客戶端登陸權限等。

    1.4.2 客戶端

    NIS客戶端配置文件數據庫

  • /etc/hosts 
      主機名與IP地址對應關係
  • /etc/yp.conf 
      ypbind的主要配置文件,設定NIS Server
  • /etc/nsswitch.conf
       重要的配置文件,設定賬號密碼等信息

    2 kerberos部分

    2.1 簡介

        kerberos希臘語是看門狗的意思,由MIT研發,目前最新版應該第5版。kerberos驗證過程有點複雜,曾經MIT在1988年寫了一篇有趣的文章,使用對話的方式將整個過程描述出來,它就是雅典娜和歐里庇得斯的對話,有興趣的朋友能夠去閱讀一下,能夠很好的幫助理解kerberos。windows

    2.2 名詞術語

  • KDC   指kerberos服務器
  • principal
      指存放於kerberos服務器中的條目,包括用戶條目,服務條目。常見條目寫法以下:
    條目 寫法
    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
  • TGT 票據受權票

    2.3 工做原理

        kerberos驗證過程分爲2步,初始驗證過程和票據驗證過程安全

    2.3.1 初始驗證過程

  • 1. 用戶輸入用戶名和密碼
  • 2. client登陸程序向kdc發送請求
  • 3. kdc知道用戶的密碼併發給client一張以用戶密碼加密過的TGT
  • 4. client用本身的密碼解開了KDC發給以本身的加密過的TGT並將票據存在本地,此時完成驗證,容許登陸

    2.3.2 票據驗證過程

    以client請求登陸ssh服務爲例:bash

  • 1. client向KDC發送服務驗證請求
  • 2. kdc向client發送1個以TGT加密過的ticket和1個以服務密碼加密過的ticket
  • 3. client收到ticket後用存在本地的TGT進行解密,再將解密後的ticket加上一個時間戳加密造成ticket2和以服務密碼加密過的ticket一塊兒發給ssh服務器
  • 4. ssh服務器用本身的服務密碼解開ticket,有了ticket即可以解開ticket2從而解開時間戳,完成整個驗證過程。

    3 實驗部分

    3.1 實驗環境

    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

    3.2 功能實現

  • 實現NIS主從服務器數據同步及查詢功能
  • 實現node3以NIS服務器中用戶sshu賬號登陸本機
  • 實現node3以NIS服務器中用戶sshu賬號ssh到node2免密碼

    3.3 NIS主從架構實驗

    3.3.1 軟件包安裝

  • 在master和node1上安裝NIS服務端和客戶端軟件包:
    [root@master ~]# yum install -y ypserv yp-tools [root@node1 ~]# yum install -y ypserv yp-tools 
  • 在node3上安裝NIS客戶端軟件包:
    [root@node3 ~]# yum install -y yp-tools 

    3.3.2 啓動rpcbind服務

  • 在master和node1上啓動爲rpcbind服務並設置爲開機自啓動
    [root@master ~]# systemctl start rpcbind [root@master ~]# systemctl enable rpcbind [root@node1 ~]# systemctl start rpcbind [root@node1 ~]# systemctl enable rpcbind 
  • 查看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 

    3.3.3 修改相關配置文件

  • 在master上編輯/etc/sysconfig/network文件,添加以下內容 主要設置主機名和nisdomain ``` HOSTNAME=master.example.com NISDOAMIN=master.example.com ```
  • 在master和node1上修改/etc/hosts文件
    [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 
  • 配置/var/yp/ypservers
    [root@master yp]# cat /var/yp/ypservers  master node1 
  • 修改/var/yp/Makefile文件
    NOPUSH=false #容許主服務器向從服務器傳遞數據庫文件 

    3.3.4 啓動nis服務

  • 在master和node1上啓動nis服務並設置爲開機自啓動
    [root@master yp]# systemctl restart ypserv [root@master yp]# systemctl restart ypbind [root@master yp]# systemctl restart yppasswdd [root@master yp]# systemctl restart ypxfrd 
  • 從服務器的配置只需將主服務器的yp.conf文件拷貝過來便可,並啓動4個服務 #### 3.3.5 初始化NIS數據庫並添加用戶信息
  • 在master上初始化NIS數據庫
    [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. 
  • 將新建賬戶添加到NIS數據庫中
    [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 
  • 在node1從服務器上同步主服務器的所有文件
    [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. 
  • 在從服務器上查看是否有sshu用戶
    [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 

    代表數據同步成功,固然不可能每次都要手動同步,設置個定時任務計劃即可以解決這個問題。架構

    3.3.6 主從同步配置

    在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 

    3.3.7 客戶端登陸驗證

  • 將node3配置爲使用nis驗證 ``` [root@node3 ~]# cat /etc/yp.conf # /etc/yp.conf - ypbind configuration file # Valid entries are # # domain NISDOMAIN server HOSTNAME # Use server HOSTNAME for the domain NISDOMAIN. domain master.example.com server master.example.com domain master.example.com server node1.example.com ```
  • 更改驗證方式
    [root@node3 ~]# authconfig-tui 

    經過終端登陸測試  OK 驗證成功

    3.3.8 NIS數據庫訪問安全性

    能夠以/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數據庫

  • 到5.11上驗證:查詢成功
    [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 
  • 到5.12上再試一下:查詢失敗
    [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 

    3.4 NIS+kerberos實現應用服務驗證

    3.4.1 安裝kerberos

    在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 

    3.4.2 配置kerberos

  • 在master上編輯/etc/krb5.conf
    [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 
  • 在master上編輯/var/kerberos/krb5kdc/kdc.conf
    [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 } 
  • 在master上編輯/var/kerberos/krb5kdc/kadm5.acl
    [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: 容許傳播(propagationprincipal數據庫 P: 不容許傳播principal數據庫 u: 容許建立使用PAM進行密碼驗證的單一組件用戶principal U: 否決u的權限 x: a,d,m,c,i,l權限的快捷方式 *: x同樣 

    這裏的admin賬號系統中尚未,須要後面建立

  • 在master上生成kerberos數據庫
    [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: 
  • 在master上啓動服務
    [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. 
  • 在master上建立admin賬號
    [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: 
  • 在master上添加用戶sshu和ssh主機principal
    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 //可選操做 
  • 在master上修改ssh服務配置文件支持kerberos 確保這一行開啓
    GSSAPIAuthentication yes 

    3.4.3 使用kerberos驗證ssh service

  • 在node3上開啓kerberos驗證 ![](https://i.imgur.com/Ez14wBU.png)

     這裏提示有個包沒有安裝,安裝一下

    [root@node3 ~]# yum -y install pam_krb5 

     配置完成

  • 在node3上測試登陸node2的ssh服務
    [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,無需作任何操做就幫咱們作好了驗證功能。

相關文章
相關標籤/搜索