Personal tools

Sr-09-lab-1.0

From Studia Informatyczne

Spis treści

Network Information Service

Wprowadzenie

NIS (ang. Network Information Service) jest usługą katalogową, której głównym zadaniem jest umożliwienie współdzielenia informacji konfiguracyjnych w sieci. Jednym z podstawowych zastosowań jest rozprowadzanie informacji o użytkownikach systemu. Poprawnie skonfigurowany system umożliwia zrealizowanie scentralizowanego zarządzania bazą danych użytkowników.

System NIS działa w architekturze klient-serwer. Klient pobiera informacje katalogowe z serwera poprzez biblioteki systemowe, a więc w sposób przezroczysty dla aplikacji.

W jednej sieci lokalnej może pracować kilka serwerów NIS przeznaczonych dla różnych klientów. Przypisanie klientów do serwerów odbywa się za pośrednictwem tzw. domen. Pojedynczy serwer może obsługiwać wiele domen, podobnie klient może należeć do wielu. Domeny systemu NIS są mechanizmem całkowicie niezależnym od domen systemu DNS (mogą się one dowolnie przenikać). W systemie NIS domeny są płaskie, a więc nie jest możliwe tworzenie struktur hierarchicznych.

Informacje w systemie NIS są reprezentowane w postaci tzw. map, czyli baz danych przygotowywanych z istniejących w systemie plików konfiguracyjnych. Każda mapa zawiera rekordy identyfikowane pewnym kluczem. Przykładem może być baza danych o użytkownikach (zawartość pliku /etc/passwd) posortowana wg ich identyfikatorów:

+-------+----------------------------------------------------------------+
| Klucz | Wartość                                                        |
+-------+----------------------------------------------------------------+
|  1000 | sobaniec:x:1000:100:Cezary Sobaniec:/home/sobaniec:/bin/bash   |
|  1001 | kaminski:x:1001:100:Wojciech Kaminski:/home/kaminski:/bin/bash |
+-------+----------------------------------------------------------------+

Konfiguracja serwera

Konfigurację serwera należy rozpocząć od ustalenia domyślnej domeny dla systemu NIS:

# domainname nistest

Polecenie to działa analogicznie do polecenia hostname(1). To samo zadanie realizują polecenia nisdomainname(8) i ypdomainname(8). Polecenie domainname(8) uruchomione bez argumentów wyświetla nazwę domyślnej domeny:

# domainname
nistest

Następnym krokiem jest uruchomienie serwera:

# ypserv

Usługa NIS implementowana jest z wykorzystaniem mechanizmu RPC. Uruchomienie jej powoduje więc zarejestrowanie nowych usług:

# rpcinfo -p
   program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    ...
    100004    2   udp    830  ypserv      ------+
    100004    1   udp    830  ypserv            | nowe
    100004    2   tcp    833  ypserv            | usługi
    100004    1   tcp    833  ypserv      ------+
    ...

Pliki konfiguracyjne systemu NIS mieszczą się w katalogu /var/yp (Początkowo system NIS zwany był Yellow Pages. Nazwa ta została później zastrzeżona, ale w nazwach programów i plików pozostał prefiks yp. ). Początkowa zawartość tego katalogu jest zbliżona do poniższego przykładu:

/var/yp/
  |
  |-- Makefile
  |-- binding/
  |    |
  |    |-- nistest.1
  |    `-- nistest.2
  |
  |-- nicknames
  `-- securenets

Plik Makefile zawiera specyfikacje dla programu make(1) zarządzającego kompilacją map nisowych. W katalogu /binding znajdują się pliki tworzone przez klienta usługi NIS w momencie nawiązania łączności z odpowiednim serwerem. Pliki te mają nazwy takie, jak nazwa domeny i rozszerzenie wskazujące na wersję systemu NIS. Plik nicknames zawiera odwzorowania nazw skróconych dla map nisowych (aliasy), a plik securenets umożliwia ograniczenie dostępu do serwera NIS.

Konfiguracja serwera NIS sprowadza się do wskazania jakie mapy nisowe mają być utworzone i na podstawie jakich plików. Ustawienia te podaje się w pliku Makefile. Linia zaczynająca się od słowa all definiuje jakie mapy nisowe będą tworzone. Standardowo istnieje możliwość tworzenia m.in. map nisowych wymienionych poniżej:

passwd 
Baza danych użytkowników (na podstawie pliku /etc/passwd)
shadow 
Hasła użytkowników (na podstawie pliku /etc/shadow)
group 
Definicje grup użytkowników (na podstawie pliku /etc/group)
hosts 
Lokalne odwzorowania nazw na adresy IP (na podstawie pliku /etc/hosts)
services 
Odwzorowania nazw usług na numery portów (na podstawie pliku /etc/services)
rpc 
Odwzorowania nazw usług RPC na numery (na podstawie pliku /etc/rpc)
netgroup 
Definicje grup sieciowych (na podstawie pliku /etc/netgroup)
auto.master 
Konfiguracja automontera (na podstawie pliku /etc/auto.master)
auto.home 
Konfiguracja katalogu /home dla automontera (na podstawie pliku /etc/auto.home)

Po dokonaniu modyfikacji pliku Makefile można utworzyć mapy nisowe serwera:

# make
gmake{[}1]: Entering directory `/var/yp/nistest'
Updating passwd.byname...
Updating passwd.byuid...
Updating group.byname...
Updating group.bygid...
Updating services.byname...
Updating services.byservicename...
Updating hosts.byname...
Updating hosts.byaddr...
gmake{[}1]: Leaving directory `/var/yp/nistest'

Wykonanie programu make powoduje utworzenie katalogu takiego, jak nazwa domeny i utworzenie w nim map nisowych. Dla niektórych plików konfiguracyjnych tworzone są dwie mapy nisowe, indeksowane różnymi kluczami. Przykładowo: baza danych użytkowników indeksowana jest po identyfikatorach numerycznych (mapa passwd.byuid) i nazwach (mapa passwd.byname).

Poprawność konfiguracji możemy sprawdzić programem ypcat(1), który umożliwia wyświetlanie całych baz danych serwera:

# ypcat -h localhost passwd
kaminski:x:1001:100:Wojciech Kaminski:/home/kaminski:/bin/bash
sobaniec:x:1000:100:Cezary Sobaniec:/home/sobaniec:/bin/bash

Dane można wyświetlać łącznie z kluczem indeksującym, co pozwala na zaobserwowanie różnic pomiędzy wersjami map powstałymi z tego samego pliku:

# ypcat -h localhost -k passwd.byname
kaminski kaminski:x:1001:100:Wojciech Kaminski:/home/kaminski:/bin/bash
sobaniec sobaniec:x:1000:100:Cezary Sobaniec:/home/sobaniec:/bin/bash
...
# ypcat -h localhost -k passwd.byuid
1000 sobaniec:x:1000:100:Cezary Sobaniec:/home/sobaniec:/bin/bash
1001 kaminski:x:1001:100:Wojciech Kaminski:/home/kaminski:/bin/bash
...

Konfiguracja klienta

Podobnie jak w serwerze na początku należy ustawić nazwę domeny. Konfiguracja klienta sprowadza się do wskazania serwera w pliku /etc/yp.conf:

ypserver unixlab.cs.put.poznan.pl

Adres serwera w lokalnej sieci może być również automatycznie odszukany poprzez rozgłoszenie:

broadcast

Wskazanie wielu serwerów dla wielu domen jest możliwe dzięki słowu kluczowemu domain:

domain nistest server galio.cs.put.poznan.pl
domain nistest2 broadcast

W przykładzie dane z domeny nistest pochodzą z serwera galio, a dane z domeny nistest2 z komputera w lokalnej sieci.

Klient NIS wymaga uruchomienia programu usługowego ypbind(8), którego zadaniem jest utrzymywanie łączności z serwerem i pobieranie od niego informacji. Należy więc wykonać komendę:

# ypbind

Odnalezienie klienta dla wskazanej domeny i poprawne dołączenie się do niej powinno spowodować powstanie w katalogu /var/yp/binding pliku o nazwie złożonej z nazwy domeny i numeru wersji systemu NIS. Poprawne dołączenie do serwera można sprawdzić komendą ypwhich(8):

# ypwhich
galio.cs.put.poznan.pl
# ypwhich -d nistest2
unixlab.cs.put.poznan.pl

Klient po nawiązaniu łączności z serwerem może pobierać z niego dane:

# ypcat passwd
...

Pobieranie pojedynczych rekordów z mapy nisowej umożliwia komenda ypmatch(8). Wymaga ona podania klucza i nazwy mapy nisowej:

# ypmatch sobaniec passwd.byname
sobaniec:x:1000:100:Cezary Sobaniec:/home/sobaniec:/bin/bash
# ypmatch 1000 passwd.byuid
sobaniec:x:1000:100:Cezary Sobaniec:/home/sobaniec:/bin/bash

Pomimo nawiązania łączności z serwerem i dostępności informacji np. o użytkownikach, dane te nie są jeszcze wykorzystywane przez system. Wymaga to jawnego wskazania serwera NIS jako źródła informacji katalogowej. Dokonuje się tego w pliku konfiguracyjnym /etc/nsswitch.conf:

passwd:   files nis
group:    files nis

Powyższe linie spowodują, że dane o użytkownikach i grupach będą najpierw pobierane z lokalnych plików konfiguracyjnych (/etc/passwd i /etc/group), a później z serwera NIS (z map passwd i group).

Zmiana hasła użytkownika

System NIS służy do propagacji informacji konfiguracyjnych w trybie tylko do odczytu. W większości przypadków jest to rozwiązanie wystarczające, gdyż rekonfiguracja wymaga uprawnień administratora. Hasła użytkowników są tutaj wyjątkiem, który wymaga specjalnego traktowania. Standardowe polecenie passwd(1) dokonuje zmiany lokalnego hasła. W systemie, który korzysta z konfiguracji dostarczonej za pośrednictwem usługi NIS, zmiana hasła przekazywana jest do serwera za pośrednictwem dodatkowej usługi RPC. Po stronie serwera należy uruchomić program:

# rpc.yppasswdd

Zmiana hasła po stronie klienta może zostać wykonana standardowym poleceniem passwd(1) lub yppasswd(1). Istnieją również odpowiedniki komend chsh(1) i chfn(1) dla systemu NIS o nazwach odpowiednio ypchsh(1) i ypchfn(1).

Zmiana hasła po stronie serwera powoduje aktualizację bazy danych o użytkowniku (pliki /etc/passwd i /etc/shadow) i jednocześnie aktualizację odpowiednich map. Zmiana hasła na serwerze, ale wykonana standardowym poleceniem passwd(1), powoduje zmianę jedynie lokalnych plików. Aktualizację map nisowych można wykonać wykonując samodzielnie komendę make:

# make -C /var/yp

Serwery pomocnicze

W przypadku dużych sieci korzystne jest uruchomienie kilku serwerów NIS, które będą współpracowały w obsługiwaniu klientów. Współpraca realizowana jest poprzez wprowadzenie replikacji informacji z serwera głównego. Serwery podrzędne powielają informacje uzyskane od serwera głównego. Serwer podrzędny udziela dokładnie tych samych informacji co serwer główny i jest traktowany identycznie przez klientów jak serwer główny.

Uruchomienie serwera pomocniczego wymaga wstępnego skonfigurowania i uruchomienia serwera głównego. Można do tego celu wykorzystać skrypt ypinit(8):

# /usr/lib/yp/ypinit -m

Skrypt ten utworzy plik /var/yp/ypservers zawierający listę serwerów obsługujących daną domenę. Następnie na planowanym serwerze pomocniczym należy ustawić domenę NIS i wykonać komendę ypinit(8):

# /usr/lib/yp/ypinit -s unixlab.cs.put.poznan.pl

gdzie nazwa po przełączniku -s jest nazwą serwera głównego NIS. Wykonanie komendy powoduje utworzenie katalogu o nazwie domeny w katalogu /var/yp i skopiowanie do niego wszystkich map z serwera głównego. Po uruchomieniu programu ypserv, serwer pomocniczy może już udostępniać informacje klientom, którzy będą się ubiegali o te informacje.

Propagacja informacji do serwerów pomocniczych odbywa się przy pomocy programu yppush(8). Po każdej zmianie wykonanej na serwerze, podczas wykonywania komendy make, informacja o nowych mapach nisowych jest "wypychana" do serwerów pomocniczych. Lista serwerów pomocniczych znajduje się w pliku /var/yp/ypservers. Serwery pomocnicze po odebraniu powiadomienia o zmianie na serwerze głównym sprowadzają nową wersję mapy. Informowanie serwerów pomocniczych wymaga ustawienia zmiennej NOPUSH na wartość false w pliku /var/yp/Makefile na serwerze głównym. Aktualizowanie informacji na serwerach pomocniczych może być przyspieszone dzięki wykorzystaniu programu rpc.ypxfrd(8), który przesyła całą mapę jako plik nie wymagając jej rekonstrukcji po stronie serwera pomocniczego. Program powinien być uruchomiony po stronie serwera.

Uwaga: aktualizacja map na serwerze głównym wymaga, aby posiadał on uruchomiony proces klienta ypbind.

Współpraca NIS i NFS

System NIS może być wykorzystywany łącznie z systemem NFS. Identyfikacja użytkowników w systemie NFS odbywa się poprzez ich identyfikatory numeryczne, co stwarza problemy w przypadku niespójności baz danych użytkowników. Taką spójność może zapewnić właśnie system NIS. Serwery NFS i NIS mogą być uruchomione w ramach jednego systemu lub różnych.

Bezpieczeństwo

System NIS, podobnie jak system plików NFS, nie należy do zbyt bezpiecznych, chociażby z powodu wydostawania się zakodowanych haseł poza bazowy system operacyjny. Z tego powodu należy go stosować tylko w zamkniętych, wyizolowanych sieciach lokalnych. Jednocześnie należy ograniczyć liczbę komputerów, które będą mogły odwoływać się do serwera. Ograniczenia takie można wyrazić w pliku /var/yp/securenets. Oto przykład zawartości tego pliku konfiguracyjnego:

# Dostęp z adresu 127.0.0.1
255.0.0.0 127.0.0.0
 
# Dostęp dla wybranego komputera
host 192.168.10.5
 
# Dostęp dla wszystkich
0.0.0.0   0.0.0.0

Więcej informacji nt. systemu NIS można uzyskać na stronach pomocy systemowej: ypserv(8), ypbind(8), ypcat(1), yppush(8), rpc.yppasswdd(8), ypxfr(8), rpc.ypxfrd(8), passwd(5), shadow(5).

Zadania

  1. Znajdź serwer NIS dla domyślnej domeny stacji roboczej.
  2. Pobierz informacje o użytkownikach z serwera za pomocą komend ypcat i ypmatch.
  3. Skonfiguruj serwer NIS dla domeny o wybranej nazwie, udostępniający informacje o użytkownikach, grupach, grupach sieciowych i nazwach komputerów.
  4. Skonfiguruj oprogramowanie automontera pobierając konfigurację z serwera NIS.
  5. Skonfiguruj serwery NIS i NFS udostępniające informacje o użytkownikach i ich katalogi domowe dla stacji roboczej. Serwer NIS powinien pozwalać na zmianę hasła użytkowników z poziomu stacji roboczej.
  6. Skonfiguruj serwer pomocniczy dla serwera NIS.
  7. Dołącz stację roboczą do dwóch różnych domen NIS.
  8. Ogranicz prawo dostępu do serwera NIS tylko dla lokalnej podsieci.
  9. Na serwerze NIS, w pliku /etc/hosts dopisz definicję nowego komputera, np. nishost. Następnie sprawdź możliwość odwzorowania tej nazwy na adres IP po stronie klienta systemu NIS, wykonując np.:
    getent hosts nishost
    Dlaczego nie jest możliwie odwzorowanie tej nazwy z użyciem komendy host?