Jak trwoga to do „boga" cz. 3 - LDAP, bash
Na początku za wszystko chciałbym podziękować rodzinie i akademii...
Niestety życie to nie film, nie jest łatwe. Często po wielu bojach i wyzwaniach nie czeka nas nic innego jak kolejna potyczka i zmagania. Po dwóch wpisach przyszedł czas na otwarcie pieczęci i wypuszczenia na świat czterech jeźdźców apokalipsy- Zwycięzca - laboratorium 3.
- Wojna - laboratorium 4.
- Głód - laboratorium 5.
- Śmierć - laboratorium 6.
[youtube=https://www.youtube.com/watch?v=KSymAAFF39A] Zanim przystąpimy do gry ponownie poukładajmy pionki na naszej szachownicy.
Szachy czarodziejów
W poprzednich wpisach dokonaliśmy instalacji DNS, skonfigurowaliśmy też w domyślnej startowej konfiguracji serwer LAMP (Linux, Apache2, MySQL, PHP). Zainstalowaliśmy nakładkę phpMyAdmin na silnik baz danych która, znacznie ułatwiła nam tworzenie i edycję danych. Całą konfigurację sprawdziliśmy zakładając użytkownika i bazę w wyżej wymienionej platformie. Zainstalowaliśmy Joomla która, już w "pełni" wykorzystywała wszystkie cztery procesy działające na naszej wirtualnej maszynie. Po tej bitwie oprócz potu, łez i krwi pozostałą Ci jedynie duma i zachwyt że, udało Ci się przebrnąć przez te trzy laboratoria.
A co jeśli powiem Ci że, to co do tej port zrobiłeś jest nic nie warte.
Wykonana praca jest warta - zaliczenia. Warta jest też merytoryczna wiedza którą, tu zdobyłeś.
Teraz pewnie drogi czytelniku trochę Ci namieszałem. Raz mówi że, nie warte raz że warte? O co tu chodzi?
Zadajmy sobie fundamentalne pytanie. Czy tak skonfigurowany serwer byłbyś w stanie wystawić na światło dzienne zwane internetem? Odpowiedz powinna być natychmiastowa i jedna słuszna. NIE!
Wspominałem już kilkukrotnie że, prezentowane tu środowisko jest środowiskiem testowym a nie środowiskiem produkcyjnym. Same silne hasła nie wystarczą na to by oprzeć się naporowi ogromnej fali którą, jest internet. A w wodzie tej pełno jest wygłodniałych ryb które, tylko czekają by dorwać się do twojego akwenu którym, jest twoja wewnętrzna infrastruktura IT.
Dzięki użytkownikowi NieGooglujMnie mogę mój wpis uzupełnić o bardzo ważną kwestię jaką jest bezpieczeństwo. Jednak nie będzie to wpis, bynajmniej w tym wpisie o tym jak to zrobić. Ale pozostawię tu mały ślad który, warto zbadać:
SSH
- http://www.cyberciti.biz/tips/linux-unix-bsd-openssh-server-best-practices.html
- https://feeding.cloud.geek.nz/posts/hardening-ssh-servers/
- https://askubuntu.com/questions/2271/how-to-harden-an-ssh-server
Apache2
- http://www.tecmint.com/apache-security-tips
- https://geekflare.com/apache-web-server-hardening-security/
MySQL
- https://www.upguard.com/articles/top-11-ways-to-improve-mysql-security
PHP
- http://www.phptherightway.com/
LInux
- https://www.debian.org/doc/manuals/securing-debian-howto/
Pamiętaj:
Bezpieczeństwa systemów informacyjnych nie należy traktować jako jednorazowe przedsięwzięcie, ale jako proces, który powinien być modyfikowany wraz z pojawiającymi się zmianami w otoczeniu wewnętrznym i zewnętrznym organizacji.
- Ryszard Borowiecki, Mirosław Kwieciński (red.), Monitorowanie otoczenia : przepływ i bezpieczeństwo informacji. w stronę inteligencji przedsiębiorstwa, Zakamycze, Kraków 2003, ISBN: 83‑7333-246-4
Czterech jeźdźców apokalipsy
Lightweight Directory Access Protocol bo takie jest rozszerzenie skrótu (LDAP) jest protokołem przeznaczonym do korzystania z usług katalogowych, bazujący na standardzie X.500. Jest to również nazwa usługi katalogowej pozwalającej na wymianę informacji za pośrednictwem TCP/IP. Wykorzystywany jest praktycznie w adresacji sieci Internet/Intranet w celu zapewnienia niezawodności, skalowalności i bezpieczeństwa danych. W odróżnieniu od X.500 nie potrzebuje ani szerokiego pasma, ani dużej mocy obliczeniowej. Ponieważ pracuje w oparciu o protokół TCP/IP (które działa tylko w warstwie transportowej modelu OSI), daje niezwykle szybkie odpowiedzi na żądania zgłaszane przez klienta. Dane grupowane są w strukturze przypominającej drzewo katalogów. Każdy obiekt jest jednoznacznie identyfikowany poprzez swoje położenie w drzewie, tzw. Distinguished Name (DN).
Laboratorium 3
Do zabawy z LDAP będziemy potrzebować doinstalować do naszego Serwera Ubuntu kilka pakietów:
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install slapd ldap-utils
Instalacja tych pakietów wymaga interakcji z użytkownikiem tak jak było to w przypadku instalacji MySQL i phpMyAdmin. W pierwszym oknie nadajemy hasło dla użytkownika administracyjnego LDAP - nie mylić z użytkownikiem administracyjnym systemu operacyjnego.
W oknie tym tak jak już wspomniałem nadajemy hasło dla użytkownika admin LDAP.
Powtarzamy hasła dla użytkownika admin.
Wykorzystując polecenie konfiguracji pakietu uruchamiamy konfigurację pakietu slapd poleceniem:
sudo dpkg-reconfigure slapd
Re‑konfigurator zapyta nas się czy "Po włączeniu tej opcji , nie zostanie utworzona żadna wstępna konfiguracja lub bazy danych dla Ciebie. Czy Pominąć konfigurację serwera OpenLDAP" odpowiadamy wybierając opcje "Nie" gdyż zależy nam na skonfigurowaniu LDAP.
Konstruujemy bazowy wpis DN dla LDAP wpisując DNS domain name lab.pl
Podajemy nazę organizacji tu tez wpiszmy lab.pl
Ustawiamy hasło dla administratora LDAP
Potwierdzamy hasło poprzez wpisanie takiego samego hasła jak w punkcie poprzednim
Wybieramy database backend poprzez wybranie opcji HDB. Więcej informacji o backendach znajdziecie tutaj:
- http://www.openldap.org/doc/admin24/backends.html
- http://www.openldap.org/faq/data/cache/756.html
- http://www.zytrax.com/books/ldap/ch6/bdb.html
- http://www.openldap.org/faq/data/cache/1166.html
Na pytanie czy ma usunąc bazę odpowiadamy "Nie".
Starą konfiguracje i bazę przenosimy poprzez wybranie opcji "Tak".
Uruchamiamy protokuł w wersji LDAPv2
Zmieniamy wpis BASE usuwając znak # i poprawiamy tak by odpowiadał pod nasza domenę dc=lab,dc=pl. Zmieniamy też wpis URL usuwając znak # i poprawiamy wpis by wskazywał na localhost ldap://localhost wszystkie zmiany robimy w pliku /etc/ldap/ldap.conf
sudo nano /etc/ldap/ldap.conf
Po konfiguracji LDAP, otwieramy przeglądarkę i pobieramy oprogramowanie JXplorer do przeglądania struktury LDAP
Naciskamy Connection z górnego menu.
Potem w oknie Open LDAP/DSML Connection ustawiamyn odpowiednio
- pole Host na adres IP serwera,
- pole port na 389,
- pole protocol na LDAP v3,
- pole Base DN na cd=lab,dc=pl.
W sekcji Security
- pole Level wybieramy opcję User + Password,
- w polu User DN wpisujemy cn=admin,dc=lab,dc=pl,
- w polu Password wpisujemy podane wcześniej haslo.
- Po przyciśnięciu przycisku OK zostanie nawiązane połączenie.
W oknie głównym aplikacji po lewej stronie otworzy nam się drzewo LDAP gdzie po kliknięcie w gałąź lab, będziemy mogli dodać nowego użytkownika przez prawo klik na wpisie lab i wybranie z menu podręcznego opcji New.
W nowo otwartym oknie konfigurujemy odpowiednio
- pole, Parent DN powinno zawierać wpis dc=lab,dc=pl,
- pole Enter RDN powinno zawierać cn=user1.
Z pola selekt box zatytułowanego Available Classes wybieramy i przenośimy do Selected Classes klasy typu
- simpleSecurityObject
- top
- percon
- posixAccount
Taką konfiguracje na koniec potwierdzamy przyciskiem OK.
W oknie głownym teraz w elemencie Table Editor bedziemy mieli mozliwośc wprowadzenia ustwień dla usera1. Odpowiednio usupełniamy:
- gidNumber wartościa 100
- homeDirectory wartościa /home/user1
- sn - jest to pole opisu.
- uid wartośc user1
- uidNumber wartość 10001
- userPassword - podajemy hasło dla naszego user1
na sam koniec zmiany zatwierdzamy przyciskiem submit
Tak o to mamy dodanego użytkownika user1 do struktury LDAP. Możemy teraz odłączyć się od LDAP w programie i przechodzimy z powrotem do konsoli terminala putty.
Testujemy działanie komendy:
ldapsearch -x -LLL
Komenda tam powinna nam zwrócić to co przedstawia obrazek powyżej.
Po rozszerzeniu polecenia o parametr uid=user1 otrzymamy informacje o użytkowniku user1.
ldapsearch -x -LLL uid=user1
Po skonfigurowaniu jak powyżej środowiska LDAP i sprawdzeniu że wszystko działa możemy przejść do kolejnego laboratorium.
Laboratorium 4
Wykorzystując edytor nano utwórzmy nowy plik w którym umieścimy kod BASH do tworzenia nowych użytkowników. Przydatne polecenia z którymi warto się zapoznać:
ldapsearch – przeszukiwanie LDAP
cut – wybór lub cięcie tekstu
grep – delektowanie wyświetlania
tr – translacja danych (zmiana wielkości liter, zamiana znaków, itp.)
echo – wyświetlanie na ekranie
read – czytanie ze standard IO do zmiennej tekstu
if – wykonanie warunkowe
sort – sortowanie danych
head – odczytanie informacji od początku ileś linii
ldapmodify – wprowadzanie zmian do LDAP
chmod – zmiana uprawnień do obiektu
chown – zmiana właściciela obiektu
mkdir – tworzenie katalogu
Przykładowy kod BASH do czytania parametru do programu oraz danych w programie
#!/bin/bash echo "Podaj dane i zakoncz ENTER:" read dane echo „Wprowadzono dane: ” $dane
Zmiana uprawnień:
chmod +x nazwa_pliku
Przykład wywołania:
./nazwa_pliku
Przygotujmy program pozwalający utworzyć użytkownika w LDAP na podstawie 3 danych:
- Imienia
- Nazwiska
- Hasła
Na podstawie tak zdobytych danych utworzymy nazwę użytkownika. Konto powinno zawierać 1 literę imienia i całe nazwisko (np. jkowalski). Nazwa konta powinna być z małych liter. Powinno mieć następny numer UID (następny wolny powyżej 10000)
Przykład pobierania ostatniego UIDNumber z LDAP (największa wartość)
zmienna=$(ldapsearch -x -LLL uidnumber | grep "uidNumber" | cut -d" " -f2 | sort -n -r | head -1) echo $zmienna zmienna=$[$zmienna+1] echo $zmienna
Powinno mieć przypisany katalog domowy w /home/nazwa_użytkownika. Powinien zostać utworzony taki właśnie katalog na dysku wraz z przypisaniem uprawnień chmod i chown. Katalogi użytkownika powinny być tworzone dopiero po poprawnym wykonaniu zakładania konta w LDAP. Do sprawdzenie poprawności wykonania poprzedniej komendy służy zmienna $? I można sprawdzić poleceniem if :
if [ "$?" = "0" ] then polecenie_1 polecenie_2 polecenie_3 fi
Tworzenie katalogu, zmiana uprawnień i zmiana właściciela:
mkdir /home/katalog_użytkownika
chmod 700 /home/katalog_użytkownika
chown $zmienna:100 /home/katalog_użytkownika
Hasło jest w polu LDAP o nazwie „userpassword” Polecenie dodawania użytkownika po utworzeniu danych wsadowych ldif w pliku
ldapmodify -a -x -D cn=admin,dc=lab,dc=pl -W -f nazwa_pliku
Przykłady kodów BASH. Czytanie ze standard IN (wprowadzanie danych do skryptu) z wyświetlaniem ich
read nazwisko echo $nazwisko echo -n "Podaj nazwisko: " read nazwisko echo "Wprowadzono: "$nazwisko
Zapisanie informacji do pliku w trybie "nadpisywania danych"
echo "dn: $user,dc=lab,dc=pl" > /root/katalog/plik
Zapisanie informacji do pliku w trybie "doklejania danych"
echo "uid: "$LoginName >> /root/katalog/plik
echo "userpassword: "$UserPassword >> /root/katalog/plik
Zamiana znaków (duże na małe)
zmienna=$(echo $zmienna1 | tr [:upper:] [:lower:])
Wycięcie jednej litery z ciągu
litera=$(echo $imie | cut -c 1)
A tak prezentuje się skrypt w całośći:
#!/bin/bash #################################################################################### # Skrtpt dodający LDAP made by TheMamuth # # ver 1.0 # # # # uzywajcie i korzystajcie :) # # # # # #################################################################################### # begin # -- Poprosimy użytkownika o imię echo -n "PODAJ SWOJE IMIĘ: " read imie # -- Poprosimy użytkownika o nazwisko echo -n "PODAJ SWOJE NAZWISKO: " read nazwisko # -- Teraz wyswietlmy użytkownikowi jego wprowadzone dane echo " " echo "##############################################################################" echo "WPROWADZIŁEŚ IMIE: " $imie "ORAZ NAZWISKO: " $nazwisko echo "##############################################################################" echo " " echo -n "PODAJ OPIS DLA TWOEJEGO KONTA: " read opis echo " " # -- Jak można już zauważyć, polecenie echo wyświetla wprowadzone dane miedzy cudzysłowami # -- read to kontener na zmienną -> read <nazwa_zmiennej> # -- Teraz pobierzmy hasło od naszego użytkownika które, chce używać do logowania w ldap echo -n "PODAJ HASLO DO LDAP:" read -s haslo echo " " # -- teraz według polecenia mamy zmienić wszystkie duże litery na małe w imieniu i nazwisku imie=$(echo $imie | tr [:upper:] [:lower:]) nazwisko=$(echo $nazwisko | tr [:upper:] [:lower:]) # -- teraz należy pobrać pierwsza literę imienia i dokleić ja przed nazwiskiem litera=$(echo $imie |cut -c 1) username=$litera$nazwisko # -- teraz należy z pobranych danych utworzyć plik który, posłuży nam jako wpis dodający usera, wzorujemy się na tym co utworzyliśmy w poprzednim # -- labie. #-- pobranie uidnumber uidnumber=$(ldapsearch -x -LL uidnumber | grep "uidNumber:" | cut -d" " -f2 | sort -n -r | head -1) echo "OSTATNI uidNumber TO: " $uidnumber #-- zwiększenie uidnumber, bo nie może się powtarzac uidnumber=$[$uidnumber+1] echo "NOWY uidNumber TO: " $uidnumber #-- pobranie gidnumber gidnumber=$(ldapsearch -x -LL gidnumber | grep "gidNumber:" | cut -d" " -f2 | sort -n -r | head -1) echo "gidNumber to: " $gidnumber echo "Login to: " $username # -- pobralismy potrzebne nam zmienne czas teraz na utworzenie pliku echo "dn: cn="$username",dc=lab,dc=pl" > ldap.txt echo "cn: "$username >> ldap.txt echo "gidNumber: "$gidnumber >> ldap.txt echo "homeDirectory: /home/"$username >> ldap.txt echo "objectClass: simpleSecurityObject" >> ldap.txt echo "objectClass: person" >> ldap.txt echo "objectClass: posixAccount" >> ldap.txt echo "objectClass: top" >> ldap.txt echo "sn: "$opis >> ldap.txt echo "uid: "$username >> ldap.txt echo "uidNumber: "$uidnumber >> ldap.txt echo "userpassword: "$haslo >> ldap.txt # -- polecenie dodające usera do ldap ldapmodify -a -x -D cn=admin,dc=lab,dc=pl -W -f ldap.txt # -- tworzymy warunek który sie wykona jeżeli powyższe polecenie nie zglosi bledu; if [ "$?" = 0 ]; then # -- Tworzymy katalog; mkdir /home/$username # -- Nadajemy uprawnieni; chmod 700 /home/$username # -- Zmieniamy właściciela; chown $uidnumber:100 /home/$username # -- Komunikat; echo "Wszystko wukonane - if" fi # end;
Skrypt zapisujemy i tak zapisanemu pliku nadajemy uprawnienia
chmod +x <nazwa_pliku>
aby go wykonać.
./<nazwa_pliku>
Uruchommy nasz skrypt i dodajmy nowego użytkownika LDAP. Po poprawnym dodaniu możemy przejść do kolejnego ćwiczenia.
Uwaga: Skrypt nie jest idealny a jedynie spełnia założenia ćwiczenia - możesz go ulepszyć dodając weryfikacje hasła, kontrolę wpisywanych wartości itp.
Laboratorium 5
Uruchamiamy integrację systemu operacyjnego z LDAP. W tym celu musimy zainstalować kilka dodatków rozszerzających.
sudo apt-get install libnss-ldap
W trakcie instalacji system poprosi o podanie danych pozwalających na przyłączenie się do LDAP (podaj adres 127.0.0.1):
Wpisujemy adres ldap://127.0.0.1
Wpisujemy dc=lab,dc=pl
Wersje LDAP wybieramy 3
Wybieramy opcje TAK
Wybieramy opcje TAK
Wpisujemy cn=admin,dc=lab,dc=pl
Podajemy hasła dla konta głównego LDAP
Wpisujemy cn=admin,dc=lab,dc=pl
Podajemy hasło
Zmieniamy ustawienia w pliku "/etc/ldap/ldap.conf" usuwamy znak komentarza w pozycji scope sub oraz pam_password clear
W pliku /etc/nsswitch.conf dopisujemy do sekcji passwd, group, shadow, słowo ldap.
Laboratorium 6
To laboratorium jest uwieńczeniem sukcesu, naszych zmagań z poprzednimi trzema laboratoriami. Wystarczy tylko zrestartować ldap ssh i zalogować się na użytkownika ldap.
sudo /etc/init.d/libnss-ldap restart && sudo /etc/init.d/ssh restart
.Gratulację :).[youtube=https://www.youtube.com/watch?v=KSymAAFF39A]
P.S. Rozwiązanie zagadki z poprzedniego laboratorium - by ze zdalnego komputera (komputer z którego będziesz wyświetlał stronę www) móc połączyć się po adresie http://lab.lokalne/ należy wpisać w ustawieniach danych o serwerach DNS, adres serwera DNS który, jest jednocześnie adresem IP naszej maszyny wirtualnej.