Sr-09-lab-1.0
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
- Znajdź serwer NIS dla domyślnej domeny stacji roboczej.
- Pobierz informacje o użytkownikach z serwera za pomocą komend
ypcat
iypmatch
. - Skonfiguruj serwer NIS dla domeny o wybranej nazwie, udostępniający informacje o użytkownikach, grupach, grupach sieciowych i nazwach komputerów.
- Skonfiguruj oprogramowanie automontera pobierając konfigurację z serwera NIS.
- 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.
- Skonfiguruj serwer pomocniczy dla serwera NIS.
- Dołącz stację roboczą do dwóch różnych domen NIS.
- Ogranicz prawo dostępu do serwera NIS tylko dla lokalnej podsieci.
- 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 komendyhost
?