1.NIS部分 1.1 簡介 NIS(Network Information Service,or Yellow Page or YP) 網路信息服務,由sun公司開發並授權給unix供應商,最初稱為黃頁,簡稱YP,由於 British Telecom PLC公司優先註冊了Yellow Page商標 ...
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等。
1.2 NIS架構
NIS服務是C/S模式,NIS伺服器可以多台,分為master/slave模式,主伺服器負責資料庫製作管理,從伺服器負責從主伺服器更新數據並且提供與master
相同的查尋功能!
NIS的伺服器集中維護用戶的賬號信息,當NIS客戶機需要進行用戶登錄的信息驗證時,就向NIS伺服器發出查詢請求。當系統中的一臺NIS伺服器為多台NIS客戶機提供服務時,用戶登錄系統中的任何一臺NIS客戶機都會從NIS伺服器進行登錄驗證,這樣就實現了集中管理用戶賬號的功能。
在NIS伺服器的資料庫中主要包含以下幾類信息:用戶賬號信息,組賬號信息,IP地址和主機名稱對應記錄的信息,這些信息被保存在不同的資料庫文件中進行集中的管理。
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。
2.2 名詞術語
- KDC 指kerberos伺服器
- principal
指存放於kerberos伺服器中的條目,包括用戶條目,服務條目。常見條目寫法如下:條目 寫法 user : user/描述@xxx.com ftp server: ftp/[email protected] ssh server: host/[email protected] telnet ser: host/[email protected] nfs server: nfs/[email protected] - 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服務為例:
- 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 */[email protected] * 第一*表示用戶,第二*表示許可權 許可權可選擇的配置列表如下: 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帳號系統中還沒有,需要後面創建
- 在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配置文件里檢查下,果然是有一行預設域被註釋