Slow7 - Linux http://slow7.pl Tue, 12 Apr 2022 17:06:28 +0000 Joomla! - Open Source Content Management pl-pl Macierze RAID w systemie Linux http://slow7.pl/linux/item/143-macierze-raid-w-systemie-linux http://slow7.pl/linux/item/143-macierze-raid-w-systemie-linux

O macierzach w systemie Windows (bądź jak kto woli o pulach magazynu) już stosowny wpis napisałem (a nawet dwa) jednak do tej pory nic nie zostało powiedziane jak łączenie dysków w jedną, wspólną przestrzeń dyskową przeprowadzić w systemie Linux. Czas nadrobić tę zaległość a więc po zapoznaniu się z tym artykułem dowiesz się jak utworzyć i zarządzać macierzą RAID w systemie Linux.

 

Jak utworzyć macierz w systemie Windows oraz jak nią zarządzać dowiesz się Czytelniku po lekturze tych wpisów:

 

Utworzenie macierzy przeprowadzimy w systemie Linux Ubuntu 16.04 a zajmiemy się macierzami typu RAID0, RAID1 oraz RAID5.

 

Zanim przejdziemy do ich konfiguracji szybkie przypomnienie dotyczące typu tworzonych macierzy.

 

Wikipedia bardzo fajnie podaje definicję i sens stosawnia tego typu rozwiązania (źródło: https://pl.wikipedia.org/wiki/RAID)

 

RAID (ang. Redundant Array of Independent Disks – nadmiarowa macierz niezależnych dysków) – sposób wykorzystania w systemie komputerowym dwóch lub większej liczby dysków twardych, w którym dyski te współpracują pomiędzy sobą. Osiąga się w ten sposób szereg różnorodnych możliwości nieosiągalnych przy użyciu zarówno pojedynczego dysku, jak i kilku dysków podłączonych jako oddzielne.

 

Rozwiązania typu RAID używane są w następujących celach:

  • zwiększenie niezawodności (odporność na awarie);
  • zwiększenie wydajności transmisji danych;
  • powiększenie przestrzeni dostępnej jako jedna całość.

 

W artykule zajmiemy się macierzą RAID0, RAID1 oraz RAID5 tak więc zanim przejdziemy do konfiguracji krótkie omówienie.

 

RAID0 (tzw. striping)

 

Do utworzenia macierzy należy użyć przynajmniej dwa dyski (można więcej), powstała macierz oczywiście w systemie będzie widziana jako pojedynczy dysk (tak samo jest w przypadku RAID1 oraz RAID5), przy czym dostępna przestrzeń równa jest: liczba dysków x rozmiar najmniejszego z dysków (w wpisie będziemy łączyć dwa dyski o rozmiarze 5 GB tak więc całkowity rozmiar utworzonej macierzy wyniesie 10 GB). Zapis danych rozłożony jest pomiędzy dyskami co oznacza, że dany plik (a raczej jego część) tak naprawdę zapisywany jest na każdym z dysków wchodzącym w skład macierzy. Dzięki równoległemu zapisowi pliku znacząco podnosimy wydajność wykonywanych operacji odczytu/zapisu w myśl zasady - „co ma wykonać jeden to w dwójkę pójdzie szybciej”. Wadą tego typu rozwiązania jest wzrost awaryjności gdyż w przypadku wystąpienia usterki jednego z dysków tracimy dostęp do przechowywanych danych.

 

Macierz RAID0 schematycznie została pokazana na rysunku poniżej.

 

 

 

RAID1 (tzw. mirroring)

 

Praca macierzy opiera się na replikacji zapisywanych danych pomiędzy dyskami budującymi macierz. Całkowity pojemność macierzy przyjmuje rozmiar najmniejszego użytego dysku. Priorytetem przy wyborze tego typu rozwiązania jest bezpieczeństwo przechowywanych danych ponieważ awaria dysku nie powoduje utraty plików gdyż ich kopia znajduje się na innym dysku wchodzącym w skład macierzy. Wadą macierzy RAID1 jest zmniejszona szybkość zapisu danych (choć zależne jest to wyboru strategii zarządzania bo np. możliwe jest użycie dwóch macierzy RAID0 a następnie połączenie ich w macierz RAID1).

 

Macierz użyta w wpisie przyjmie rozmiar 8 GB gdyż do jej zbudowania zostaną użyte dwa dyski o takiej właśnie pojemności.

 

Schemat zapisu danych na macierzy typu RAID1 został przedstawiony poniżej.

 

 

RAID5

 

Praca macierzy opiera się na wyliczeniu tzw. sum kontrolnych, których zadaniem jest przywrócenie danych w przypadku awarii jednego z dysków. Sumy te są rozproszone po całej strukturze dysku co oznacza, że są one zapisywane na każdym z dysków. Do budowy macierzy należy przeznaczyć minimum trzy dyski przy czym jej pojemnośc równa się: n minus 1 dysków (do obliczenia całkowitej pojemności macierzy brany jest dysk o najmniejszym rozmiarze). Użycie tego typu macierzy zapewnia Nam zwiększone bezpieczeństwo przechowywanych danych przy jednoczesnym zapewnieniu wysokich wartości odczytu i zapisu.

 

Do utworzenia macierzy RAID5 użyjemy trzech dysków o pojemności 10 GB każdy tak więc całkowity rozmiar macierzy wyniesie 20 GB (3 dyski razy 10 GB minus pojemność najmniejszego czyli 10 GB).

 

Schemat zapisu danych na macierzy RAID5 został ukazany na rysunku poniżej.

 

 

To co zostało już kilka razy zaznaczone ale nie powiedziane wprost to sprawa pojemności użytych dysków, które posłużą do zbudowania macierzy. Jak już pewnie sam do tego Czytelniku doszedłeś to przy konfiguracji macierzy nie opłaca używać się nośników o różnej pojemności gdyż zawsze wiąże się to z marnotrastwem pojemności dysku. Dlatego też dobrą zasadą jest używanie dysków o takim samym rozmiarze.

 

Przechodzimy do konfiguracji macierzy.

 

Po podłączeniu nowych dysków twardych rozpoczynamy od sprawdzenia czy dyski te widoczne są w systemie. Do sprawdzenia może posłużyć Nam komenda: lsblk Jak widać poniżej wszystkie 6 dysków jest aktywnych (dyski od sdb do sdh - dwa o pojemności 5GB, dwa o pojemności 8GB i trzy o pojemności 10 GB).

 

 

Wylistowanie dostępnych dysków możemy również sprawdzić za pomocą innego polecenia (a tak naprawdę dwóch połączonych ze sobą poleceń): ls | grep sd (polecenie wydajemy po przejściu do folderu /dev/).

 

 

Po upewnieniu się, że wszystkie z podłączonych dysków działają prawidłowo przechodzimy do utworzenia na nich partycji. Partycję utworzymy za pomocą narzędzia: fdisk.

 

Poniżej na rysunku została przedstawiona lista wszystkich dostępnych opcji, zaś my wykorzystamy kilka z nich:

  • n - definicja nowej partycji,
  • m - pomoc,
  • L - lista typów partycji,
  • w - zapis ustawień.

 

 

Narzędzie wywołujemy z parametrem dysku - polecenie przyjmie postać: fdisk /dev/sdb

 

Po wywołaniu polecenia (przez operację tworzenia partycji przeprowadzi nas kreator) na pierwsze pytanie dotyczące wyświetlenia pomocy odpowiadamy przecząco - wybieramy: n (wyświetlenie pomocy odbywa się po wybraniu znaku: m) - punkt 1.

 

Na każdym z dysków będzie tworzona tylko jedna podstawowa partycja (partycji tej zostanie przypisane całe dostępne miejsce) dlatego też by utworzyć partycję tego typu na kolejne pytanie odpowiadamy poprzez wprowadzenie znaku: p - punkt 2

 

Kolejne pytania kreatora dotyczą numeru partycji (punkt 3) oraz definicji numeru pierwszego i ostatniego sektora dysku (punkt 4). Na pytania te odpowiadamy wybierając klawisz Enter akceptując tym samym zaproponowane opcje domyślne.

 

Po zatwierdzeniu wszystkich opcji partycja zostaje utworzona (punkt 5).

 

 

Ostatnią czynność jaką musimy wykonać jest zdefiniowanie typu partycji. Aby określić typ partycji należy wprowadzić znak: t - punkt 6.

 

Aby poznać wszystkie możliwości została wprowadzona litera: L po wybraniu, której wyświetli się tabela wszystkich dostępnych opcji - punkt 7.

 

Ponieważ tworzona partycja będzie należeć do macierzy jej typ ustalamy na: Linux RAID auto Typ ten definiujemy poprzez wprowadzenie wartości: fd - punkt 8.

 

Aby zatwierdzić całość wprowadzonych ustawień wybieramy: w Narzędzie fdisk kończy swoje działanie - punkt 9.

 

Wszystkie opcje dotyczące struktury dysku zostały zdefiniowane.

 

 

Operację tą powtarzamy dla wszystkich pozostałych dysków (od sdc do sdh).

 

Po definicji partycji dysku, efekt przeprowadzonej konfiguracji sprawdzimy poprzez ponowne wybranie polecenia: lsblk (użycie parametru -a powoduje ukazanie wszystkich dysków). Partycje podstawowe na wszystkich dyskach zostały utworzone (jedna partycja na każdym z dysków: od sbb1 do sdh1).

 

 

I ten sam efekt uzyskamy wydając znane Nam już polecenie: ls /dev/ | grep sd - jak widać i tu wydanie komendy uwidacznia fakt utworzenia partycji dla każdego z dysków.

 

 

Tworzenie macierzy rozpoczniemy od utworzenia macierzy typu RAID0.

 

Do utworzenia wszystkich macierzy oraz do zarządzania nimi użyjemy narzędzia: mdadm Jeśli nie mamy go zainstalowanego pobieramy je za pomocą polecenia: apt-get install mdadm

 

 

Program został zainstalowany.

 

Aby utworzyć macierz należy posłużyć się poleceniem o ogólnej składni: mdadm --create <nazwa_tworzonej_macierzy> --level=<typ_macierzy> --raid-devices=<liczba_dysków_wchodzących_w_skład_macierzy> <definicja_dysków>

 

W scenariuszu przyjęto, że macierz RAID0 (nazwa: md1) będzie składać się z dwóch dysków sdb1 oraz sdc1 tak więc polecenie tworzące macierz przyjmie postać: mdadm --create /dev/md1 --level=raid0 --raid-devices=2 /dev/sdb1 /dev/sdc1 Po wydaniu komendy macierz RAID0 została utworzona.

 

 

Przechodzimy do utworzenia macierzy RAID1 (nazwa: md2). W skład macierzy wchodzą również dwa dyski: sdd1 oraz sde1 - polecenie tworzące macierz przyjmie kształt: mdadm --create /dev/md2 --level=raid1 --raid-devices=2 /dev/sdd1 /dev/sde1 Macierz RAID1 została utworzona.

 

 

Ostatnią macierz jaką utworzymy będzie macierz typu RAID5 (nazwa: md3) W skład macierzy wejdą trzy dyski: sdf1, sdg1 oraz sdh1. Aby utworzyć macierz wydajemy komendę: mdadm --create /dev/md3 --level=raid5 --raid-devices=5 /dev/sdf1 /dev/sdg1 /dev/sdh1 I tym razem utworzenie macierzy kończy się powodzeniem.

 

 

Wszystkie trzy macierze zostały utworzone (od md1 do md3) aby zweryfikować ich stan możemy posłużyć się kilkoma poleceniami. Pierwszym z nich jest komenda: mdadm --query <nazwa_macierzy> Jak widać poniżej wydając polecenie odnośnie wszystkich trzech macierzy uzyskujemy informację o: wielkości macierzy (jak można zauważyć wartości wyliczone przy opisie typu macierzy są zgodne z wartościami rzeczywistymi), typu macierzy, ilości dysków budujących macierz oraz liczbie dysków zapasowych (do tematu wrócimy w dalszej części wpisu).

 

 

Bardziej szczegółowe informacje na temat danej macierzy uzyskamy wydając polecenie: mdadm --detail <nazwa_macierzy> Poniżej przedstawiono wynik jaki uzyskano po wydaniu polecenia odnośnie macierzy /dev/md1

 

Informacje zostały wzbogacone o: czas utworzenia macierzy, aktualny status macierzy, ilość dysków wadliwych oraz nazwy dysków wchodzących w jej skład.

 

 

Te same polecenie lecz tym razem sprawdzamy macierz RAID1 (/dev/md2)

 

 

I macierz RAID5 (/dev/md3).

 

 

Ostatnim poleceniem jakie możemy użyć by zweryfikować stan macierzy jest komenda: cat /proc/mdstat Po wydaniu komendy poznamy stan wszystkich macierzy dostępnych w systemie.

 

 

Wydanie opisanych poleceń potwierdziło iż wszystkie z utworzonych macierzy działają prawidłowo. Aby móc zacząć zapisywanie plików ostatnią czynność jaką musimy wykonać jest formatowanie. Proces formatowania wykonamy za pomocą polecenia: mkfs.<system_plików> <nazwa_macierzy> Wszystkie macierze formatujemy z wykorzystaniem systemu plików ext4. Macierze zostały sformatowane.

 

 

Po wykonaniu formatowania macierze zostaną automatycznie zamontowane. Efekt montowania możemy śledzić np. z wykorzystaniem graficznego trybu użytkownika w oknie menadżera plików.

 

 

Macierze dysku zostały poprawnie utworzone i zamontowane od tej pory możemy rozpocząć prowadzenie zapisu plików.

 

Kolejną czynność jaką wykonamy jest dodanie odpowiednich informacji do pliku /etc/fstab tak by macierze te były automatycznie montowane wraz ze startem systemu. Aby dokonać wpisu do pliku /etc/fstab musimy znać tak zwany numer UUID (ang. Universally Unique IDentifier) macierzy. Identyfikator ten jest 128-bitowym unikalnym numerem, generowanym losowo na podstawie posiadanego w systemie sprzętu oraz wartości zegara systemowego. Sprawdzenie UUID dokonamy z wykorzystaniem polecenia: blkid Wpis w pliku /etc/fstab możemy dokonać przy użyciu zdefiniowanej nazwy macierzy ale jest to sposób nie zalecany gdyż w niektórych dystrybucjach Linuxa wcześniej określona nazwa macierzy po restarcie komputera może ulec zmianie. Tak więc odpowiednie wpisy bezpieczniej jest wykonać właśnie z wykorzystaniem identyfikatora UUID.

 

Numer UUID jest również wyświetlany po wydaniu komendy: mdadm --detail <nazwa_macierzy> lecz nie jest to identyfikator macierzy lecz ostatniego dysku, który do macierzy został dodany.

 

 

Po poznaniu numerów UUID macierzy przechodzimy do edycji pliku /etc/fstab. Edycje oczywiście możemy wykonać w dowolnym edytorze, Ja wybrałem mcedit. Po otwarciu pliku należy dodać trzy dodatkowe wpisy dla każdej z macierzy osobno. Ogólna składnia wpisu wygląda następująco: UUID="<identyfikator_UUID>" <punkt_montowania> ext4 defaults 0 0 Na rysunku poniżej zaprezentowano dodanie wpisów odnoszących się do wcześniej utworzonych macierzy.

 

Przyjęto następujące punkty montowań:

  • macierz md1 (RAID0) - /dev/macraid0
  • macierz md2 (RAID1) - /dev/macraid1
  • macierz md13(RAID5) - /dev/macraid5

 

 

Aby montowanie zakończyło się sukcesem należy utworzyć katalogi, które odpowiadają zdefiniowanym punktom montowania.

 

 

Można by było w tym momencie wykonać restart komputera ale za nim to wykonamy sprawdźmy czy na pewno wszystko przebiegnie po Naszej myśli. Edycja pliku /etc/fstab niesie za sobą ryzyko popełnienia błędu, który może doprowadzić do nieuruchomienia się systemu. Dlatego zawsze warto przed wykonaniem ponownego uruchomienia komputera upewnić się, że wszystko zostało skonfigurowane prawidłowo.

 

Wykonanie montowania w zdefiniowanych lokacjach nie powiedzie się, gdyż utworzone macierze domyślnie zostały uaktywnione i ich punkt montowania został przypisany do innej lokacji. Aby sprawdzić ich stan należy posłużyć się poleceniem: df -h Jak widać poniżej wszystkie trzy macierze zostały zamontowane w katalogu /media/luk/

 

Aby je zwolnić wydajemy polecenie: umount <nazwa_macierzy> Macierze został zwolnione.

 

 

Sprawdzenia poprawności montowania z wykorzystaniem wpisów zdefiniowanych w /etc/fstab wykonamy za pomocą komendy: mount -a Jak widać poniżej wydanie polecenia i ponowne sprawdzenie uwidacznia fakt poprawnego zamontowania macierzy.

 

 

Przed wykonaniem restartu komputera na każdej z macierzy został zapisany plik tekstowy.

 

 

Ostatni test to ponowne uruchomienie komputera. Host został zrestartowany.

 

Po uruchomieniu maszyny sprawdzamy stan macierzy. Jak można zaobserwować macierze zostały zamontowane prawidłowo. Uważny Czytelnik na pewno zauważy fakt zmiany nazw macierzy:

  • macierz /dev/md1 na /dev/md127 - RAID0
  • macierz /dev/md2 na /dev/md125 - RAID1
  • macierz /dev/md3 na /dev/md126 - RAID5

 

Zmiana nazwy jest jak najbardziej działaniem prawidłowym i jak już wspomniałem w niektórych dystrybucjach Linuksa występuje. Dlatego też co już również zaznaczyłem wpisy w pliku /etc/fstab wykonujemy z wykorzystaniem identyfikatora UUID.

 

 

Dodatkowo stan macierz sprawdzono z wykorzystaniem polecenia: cat /proc/mdstat

 

 

Macierze działają prawidłowo i tak naprawdę wpis ten można by było w tym miejscu zakończyć. Ale jak już mamy macierze skonfigurowane sprawdźmy jak poradzić sobie w sytuacji w której jeden z dysków tworzących macierz ulega uszkodzeniu.

 

Rozpoczynamy od macierzy RAID0. Została zasymulowana sytuacja uszkodzenia macierzy - jeden z dysków macierzy został celowo odłączony.

 

Jak widać poniżej ponowne uruchomienie komputera kończy się niepowodzeniem. Macierz RAID1 oraz RAID5 zostają zamontowane prawidłowo, montowanie macierzy RAID0 kończy się niepowodzeniem.

 

 

Na szczęście dla Nas system Ubuntu został wyposażony w mechanizm uruchomienia się w trybie awaryjnym. Jeśli z jakiś powodów system nie może załadować się prawidłowo tryb recovery zostanie uruchomiony automatyczne. Po uruchomieni systemu w trybie tym należy zalogować się z uprawnieniami użytkownika root. Po poprawnym wykonaniu tego kroku przechodzimy do edycji pliku /etc/fstab w którym to blokujemy wykonanie linii wpisu dotyczącego macierzy RAID0 (do blokowanie wykorzystujemy znak komentarza - #).

 

 

Po zapisie zmian wykonujemy ponowny rozruch maszyny i sprawdzamy zamontowane macierze.

 

Macierze RAID znów zmieniły swoją numerację:

  • macierz /dev/md125 - RAID0 - nieobecna
  • macierz /dev/md127 - RAID1
  • macierz /dev/md126 - RAID5

 

 

Sprawdzamy szczegóły macierzy RAID0 - jak można zauważyć macierz ta jest nieaktywna.

 

 

Dostęp do plików zapisanych na macierzy został utracony. W przypadku tego typu macierzy tak naprawdę niewiele można zrobić, sposób alokacji danych (podział ich na różne dyski) na dyskach skutecznie uniemożliwi Nam ich odzyskanie. Szybkość zapisu w tego typu macierzach jest okupiona bezpieczeństwem.

 

 

Sprawdźmy zatem co stanie się w przypadku macierzy typu RAID1.

 

Uszkodzeniu ulega jeden z dysków macierzy i tak jak poprzednio system nie zostaje poprawnie uruchomiony. Zostają zamontowane macierze RAID0 (macierz została przywrócona poprze podłączenie uprzednio odłączonego dysku) oraz RAID5.

 

System uruchamia się w trybie awaryjnym.

 

 

Tak jak w przypadku RAID0 w pliku /etc/fstab zostaje zablokowana linia montowania macierzy lecz tym razem blokujemy wpis odnoszący się do macierzy RAID1.

 

 

Po wprowadzeniu zmian ich zapisie restartujemy komputer, system uruchamia się prawidłowo.

 

Macierze RAID ponownie zmieniły swoją numerację:

  • macierz /dev/md125 - RAID0
  • macierz /dev/md126 - RAID1 - nieobecna
  • macierz /dev/md127 - RAID5

 

Sprawdzamy stan macierzy RAID1. Po analizie danych stan macierzy został ustalony na: inactive (bardzo często zdarza się, że w przypadku niedziałających prawidłowo macierzy narzędzie mdadm źle definiuje jej typ, jak się Czytelniku przyjrzysz typ macierzy został ustalony na RAID0 co oczywiście jest błędem).

 

 

Aby macierz naprawić (wszak po to definiowaliśmy macierz RAID1 by w razie jej awarii nie utracić dostępu do swoich plików) w pierwszej kolejności należy ją zatrzymać. Zatrzymanie realizujemy za pomocą polecenia: mdadm --stop <nazwa_macierzy> Macierz RAID1 przestała być aktywna.

 

 

Za pomocą komendy: lsblk sprawdzamy identyfikatory dysków (odłączenie dysku spowodowało zmianę ich nazw) jak widać poniżej jedynym dyskiem nieprzypisanym do macierzy jest dysk sdd1 tak więc dysk ten musi należeć do macierzy RAID1. Aby macierz uaktywnić wydajemy polecenie: mdadm --assemble --force <nazwa_macierzy> <nazwa_dysku> Po wydaniu komendy macierz została uruchomiona z jednym aktywnym dyskiem.

 

 

Aby sprawdzić stan macierzy wydajemy polecenie: mdadm --detail <nazwa_macierzy> Przeglądając uzyskane wyniki zauważyć można, że jest to macierz typu RAID1 a w jej skład wchodzi tylko jeden dysk.

 

 

Przejdźmy zatem do jej zamontowania i sprawdzenia czy uzyskamy dostęp do naszych plików.

 

W tym celu w pliku /etc/fstab ponownie uaktywniamy linię odpowiedzialną za automatyczne zamontowanie macierzy RAID1 podczas startu sytemu.

 

 

Po naniesieniu poprawek za pomocą komendy: mount -a wykonujemy operację montowania macierzy (punkt 1). Próba podłączenia macierzy do zasobu kończy się niepowodzeniem (punkt 2). Powodem takiego stanu rzeczy jest brak katalogu. Szybko poprawiamy konfigurację poprzez utworzenie folderu /dev/macraid1 (punkt 3) i ponawiamy próbę montowania. Tym razem próba kończy się powodzeniem (punkt 4).

 

 

Macierz została podłączona. Fakt ten potwierdzamy wydaniem polecenia: df -h

 

 

Ostatni test to próba otwarcia pliku i jak widać kończy się on sukcesem. Odzyskaliśmy dostęp do naszych plików.

 

 

Naprawmy naszą macierz RAID1 i dodajmy do niej drugi, sprawny dysk. Napęd został podłączony do hosta. Po uruchomieniu systemu sprawdzamy litery dysku. Jak widzimy niżej jedynym wolnym dyskiem jest dysk sdd1 (po podłączeniu nowego dysku zmieniają się ich nazwy a także po raz kolejny nazwy macierzy: /dev/md125 - macierz RAID1) i to jego włączymy w strukturę macierzy RAID1.

 

 

Aby upewnić się co do nazwy macierzy sprawdzamy jej stan.

 

 

Po sprawdzeniu i upewnieniu się co do nazwy macierzy i jej typu przystępujemy do dołączenia nowego dysku. Dysk dodajemy za pomocą już znanego Nam polecenia: mdadm --add <nazwa_dysku> Dysk został dodany poprawnie. Ponowne sprawdzenie stanu macierzy ukazuje fakt jej odbudowy.

 

 

Macierz RAID1 została w pełni odbudowana i odzyskała swoją sprawność.

 

Zanim przejdziemy dalej wykonajmy jeszcze jeden eksperyment. Do macierzy został dodany nowy dysk /dev/sdd1, drugim dyskiem wchodzącym w jej skład jest napęd /dev/sde1 zasymulujmy uszkodzenie tego napędu i sprawdźmy czy w dalszym ciągu będzie możliwy dostęp do plików. Tak więc scenariusz sprowadza się do sytuacji w której mieliśmy działającą macierz RAID1 złożoną z dwóch dysków, pierwszy z nich uległ uszkodzeniu, macierz naprawiliśmy dodając nowy dysk (zastępując ten wadliwy) lecz niestety dotąd dobry dysk numer dwa również ulega awarii (sytuacja trochę naciągana ale nie niemożliwa).

 

 

Dysk /dev/sde1 za pomocą komendy: mdadm <nazwa_macierzy> --fail <nazwa_dysku> odznaczamy jako uszkodzony. Sprawdzenie stanu macierzy potwierdza fakt odznaczenia dysku.

 

 

Dysk /dev/sde1 z macierzy RAID1 został usunięty.

 

Pomimo usunięcia dysku dostęp do naszych danych jest nadal możliwy ponieważ ich kopia znajduje się na drugim dysku. Nasz test zakończył się powodzeniem ponieważ macierz zdążyła się odbudować.

 

 

Naprawmy naszą macierz i dodajmy z powrotem dysk /dev/sde1

 

 

Dysk został dodany, sprawdzenie stanu macierzy uwidacznia jej odbudowę. Po odbudowaniu macierz RAID1 wraca do pełnej funkcjonalności.

 

 

W przypadku macierzy RAID1 mamy do czynienia z sytuacją odwrotną niż w przypadku RAID0 - bezpieczeństwo przechowywanych danych ma wyższy priorytet niż szybkość ich zapisu/odczytu.

 

Do rozważenia pozostała Nam sytuacja w której to uszkodzeniu ulega macierz typu RAID5. Procedura uzyskiwania dostępu do danych jest bardzo podobna do tej przedstawionej w opisie macierzy RAID1 ale nic nie stoi na przeszkodzie by ją szybko omówić.

 

Jeden z dysków tworzących macierz zostaje uszkodzony jak już pewnie Czytelniku się domyślasz efektem tego jest brak dostępu do systemu (na szczęście mamy tryb awaryjny). Macierz RAID0 oraz RAID1 zostają zamontowane prawidłowo.

 

 

Po uruchomieniu trybu awaryjnego w pliku /etc/fstab blokujemy wpis dotyczący montowania macierzy RAID5.

 

 

Po poprawnym uruchomieniu systemu sprawdzamy stan zamontowanych macierzy.

 

Nazwy macierzy przedstawiają się następująco:

  • macierz /dev/md125 - RAID0
  • macierz /dev/md127 - RAID1
  • macierz /dev/md126 - RAID5 - nieobecna

 

Wyświetlając szczegóły macierzy RAID5 (i tu ponownie macierz zostaje błędnie zidentyfikowana) jej stan zostaje określony jako: inactive

 

 

Aby odzyskać dostęp do danych:

1 - zatrzymujemy macierz - mdadm --stop <nazwa_macierzy>

2 - ponownie uruchamiamy macierz wraz z definicją dysków - mdadm --assemble --force <nazwa_macierzy> <nazwa_dysku>

 

Sprawdzenie stanu macierzy (punkt 3) potwierdza fakt jej uruchomienia.

 

 

Gdy macierz działa w pliku /etc/fstab uaktywniamy wpis odnoszący się do jej montowania.

 

 

Aby macierz została prawidłowo zamontowana musimy ponownie utworzyć katalog, który został zdefiniowany w pliku /etc/fstab Brak punktu montowania uniemożliwi załadowanie macierzy.

 

Po wykonaniu tych wszystkich czynności dostęp do plików zostaje przywrócony.

 

 

Jeżeli chcemy macierz usunąć musimy wykonać następujące kroki:

- wykasowanie wpisów w pliku /etc/fstab odnoszących się do skonfigurowanych macierzy,

- zatrzymanie macierzy - polecenie: mdadm --stop <nazwa_macierzy>

- usunięcie dysków wchodzących w skład macierzy - polecenie: mdadm <nazwa_macierzy> -r <nazwa_dysku>

- jeżeli dysk ma pracować jako normalny wolumin warto również wydać polecenie: dd if=/dev/zero of=<nazwa_dysku> bs=1M count=1024 celem usunięcia informacji dotyczących konfiguracji dysku (ostrożnie z poleceniem, gdyż jego użycie wiąże się z zniszczeniem danych przechowywanych na dysku) a następnie użycia narzędzia fdisk celem utworzenia nowych partycji.

 

Z narzędziem mdadm związana jest jeszcze jedna ciekawa funkcja a mianowicie podczas konfiguracji macierzy można zdefiniować dysk zapasowy tzw. spare devices, który w razie wystąpienia awarii przejmie zadania dysku uszkodzonego.

 

Prześledźmy sposób konfiguracji mechanizmu na przykładzie macierzy RAID1 (z macierzą typu RAID0 funkcja ta nie ma zastosowania).

 

W systemie istnieją trzy dyski: sdb1, sdc1 oraz sdd1. Dwa pierwsze z nich posłużą do zbudowania macierzy zaś trzeci będzie dyskiem zapasowym.

 

Rozpoczniemy od utworzenia macierzy RAID1 złożonej z dwóch dysków i jednego zapasowego. Aby skonfigurować macierz wydajemy polecenie: mdadm --create <nazwa_macierzy> --level=<typ_macierzy> --raid-devices=<ilość_dysków> <nazwa_dysków> --spare-devices=<ilość_dysków_zapasowych> <nazwa_dysków>

 

Tak więc podstawiając wszystkie dane aby utworzyć macierz RAID1 z wykorzystaniem dwóch dysków sdb1 oraz sdc1 i jednym zapasowym sdd1 należy wydać polecenie jak na zrzucie poniżej. Macierz RAID1 została utworzona.

 

 

Sprawdźmy dane szczegółowe macierzy. Jak można zauważyć macierz tworzą 3 dyski przy czym dwa z nich są aktywne a zaś jeden jest dyskiem zapasowym.

 

 

Po utworzeniu macierzy przeprowadzamy jej formatowanie.

 

 

Oraz celem automatycznego montowania dodajemy odpowiedni wpis w pliku /etc/fstab

 

 

Macierz została zamontowana w lokacji /dev/macraid1

 

 

Na macierzy został utworzony plik: plikmacraid1.txt

 

 

Po wykonaniu tych wszystkich czynności celem ostatecznego sprawdzenia dokonujemy restartu komputera.

 

Ładowanie systemu przebiega bez żadnych problemów a jak się można domyślać po ponownym uruchomieniu hosta następuje zmiana nazwy macierzy. Macierz z /dev/md1 została przemianowana na /dev/md127

 

Ponowne sprawdzenie szczegółów macierzy potwierdza, iż wszystko jest w porządku.

 

 

Macierz działa i jest sprawna czas zatem sprawdzić jak zachowa się ona w sytuacji uszkodzenia jednego z dysków.

 

Dysk sdb1 ulega awarii i odznaczamy go jako uszkodzony (punkt 1) po wykonaniu tej operacji sprawdzamy szczegóły macierzy (punkt 2). Dotąd nie aktywny dysk sdd1 automatycznie przejął (bez żadnej ingerencji) zadania dysku sdb1 (punkt 3) - rozpoczęła się odbudowa macierzy tak by przywrócić jej pełną funkcjonalność.

 

 

Dostęp do zapisanych plików jest oczywiście możliwy.

 

 

Dotarliśmy do końca - mam nadzieję, że po lekturze tego wpisu macierze w systemie Linux nie będą miały przed Tobą żadnych tajemnic.

 


 

BIBLIOGRAFIA:

 

https://forum.ivorde.com/mdadm-how-can-i-destroy-or-delete-an-array-t85.html

https://raid.wiki.kernel.org/index.php/RAID_setup

https://www.digitalocean.com/community/tutorials/how-to-create-raid-arrays-with-mdadm-on-ubuntu-16-04

http://www.tecmint.com/create-raid0-in-linux/

]]>
[email protected] (pikolo) Linux Sun, 02 Apr 2017 17:55:58 +0000
Windows i Linux w jednej stali sieci. http://slow7.pl/linux/item/134-windows-i-linux-w-jednej-stali-sieci http://slow7.pl/linux/item/134-windows-i-linux-w-jednej-stali-sieci

Administrując dana siecią komputerową prędzej czy później zmierzysz się z scenariuszem w którym będziesz musiał skonfigurować udostępnianie zasobów pomiędzy systemami Linux oraz Windows. Aby sprostać zadaniu w artykule opis sytuacji obejmujący udostępnianie plików pomiędzy systemem Windows-Linux, Linux-Windows oraz Linux-Linux.

Przechodzimy do scenariusza pierwszego w którym systemem udostępniającym pliki jest Windows natomiast klientem host pracujący pod kontrolą systemu Linux.

 

 

Komunikacja pomiędzy komputerami jest oczywiście zapewniona (ping z hosta Linux w kierunku hosta Windows).

 

 

Rozpoczynamy od utworzenia w systemie Windows folderu do którego będą mieli dostęp użytkownicy systemu Linux. Nazwa zasobu została ustalona na: linux_udostepniony.

 

Zasób został udostępniony dla Wszystkich z możliwością odczytu i zapisu. Udostępnienie realizujemy po zaznaczeniu danego folderu i po wybraniu z menu kontekstowego Udostępnij a następnie Określone osoby bądź po wybraniu Właściwości i przejściu na kartę Udostępnianie (przycisk: Udostępnij).

 

 

Po określeniu kont mających prawo do korzystania z zasobu, zasób staje się widoczny w otoczeniu sieciowym. Folder jest osiągalny za pomocą adresu: \\XXX\linux_udostepniony (wykorzystanie nazwy komputera) bądź \\192.168.1.50\linux_udostepniony (wykorzystanie adresu IP komputera).

 

 

Konfiguracja na systemie Windows została wykonana. Przechodzimy do systemu Linux a mówiąc bardziej szczegółowo do Ubuntu 16.04

 

W systemie tym zostaną przedstawione dwa przykłady: pierwszy będzie obejmował uzyskanie dostępu do udostępnionego zasobu z wykorzystaniem wiersza poleceń drugi zaś z wykorzystaniem GUI (dla każdego coś się znajdzie).

 

Rozpoczynamy od wiersza poleceń. Pierwszą czynnością jest zainstalowanie dodatkowych pakietów. W tym celu uruchamiamy terminal i wydajemy polecenie: apt-get install cifs-utils

 

Dzięki instalacji pakietu otrzymamy możliwość wykorzystania protokołu SMB/CIFS (ang. Server Message Block protokół służący udostępnianiu zasobów komputerowych, m.in. drukarek czy plików, znany jest również pod nazwą CIFS ang. Common Internet File System). Dodatkowo pakiet dostarcza narzędzia do zarządzania punktami montowań sieciowych systemów plików.

 

 

Po prawidłowym zainstalowaniu pakietu cifs-utils tworzymy katalog do którego zamontujemy udostępniony folder w systemie Windows (punkt 1). Jak widać poniżej katalog został utworzony poprawnie (punkt 2). Nazwa katalogu została ustalona na: na_windows a został on utworzony w katalogu domowym użytkownika root.

 

 

Powracamy jeszcze na chwilę do systemu Windows i w udostępnionym zasobie tworzymy plik tekstowy o nazwie: tekst.txt, do zawartości pliku został dopisany tekst: plik_udostepniony Dodatkowo został sprawdzony adres IP hosta Windows - 192.168.1.50 oraz nazwa użytkownika - luk (informacje będą potrzebne za chwilę).

 

 

Powracamy do systemu Ubuntu w którym wykonamy czynność zamontowania zasobu sieciowego do utworzonego przed chwilą katalogu.

 

Montowanie zasobu przeprowadzamy za pomocą polecenia: mount.cifs <udostępniony_zasób_sieciowy> <katalog_montowania> -o user=<nazwa_użytkownika>

 

W scenariuszu zmienne przyjęły następujące wartości:

udostępniony_zasób_sieciowy - ścieżka sieciowa do zasobu sieciowego - //192.168.1.50/linux_udostepniony - do określenia ścieżki sieciowej został użyty adres IP hosta Windows,

katalog_montowania - katalog na komputerze lokalnym do którego montujemy udostępniony zasób sieciowy - ~/na_windows - ścieżka określa katalog domowy użytkownika root (użyta tylda) i katalog: na_windows

user=<nazwa_użytkownika> - nazwa użytkownika w systemie Windows, który ma prawo skorzystać z udostępnionego zasobu - user=luk

 

Po wydaniu polecenia aby zakończyć proces montowania zasobu należy podać hasło użytkownika luk (oczywiście podajemy hasło używane w systemie Windows).

 

 

Czas sprawdzić efekt przeprowadzonej konfiguracji. Po przejściu do katalogu na_windows (punkt 1) sprawdzamy jego zawartość (punkt 2). Jak widać zamieszczony przez Nas plik tekst.txt znajduje się w zamontowanym katalogu (punkt 3).

 

 

Aby upewnić się że wszystko jest po Naszej myśli, plik tekst.txt zostaje wyedytowany i do pliku zostaje dodane: dopisane z systemu linux

 

 

Po przejściu do systemu Windows widać efekt zmian. Tekst dodany w systemie Linux jest widoczny w systemie Windows.

 

 

Dzięki zamontowaniu udostępnionego zasobu sieciowego w systemie Windows do utworzonego katalogu w systemie Linux uzyskaliśmy możliwość przenoszenia plików pomiędzy oboma systemami.

 

Dzięki przeprowadzonej konfiguracji oraz w połączeniu z narzędziem mc w bardzo prosty sposób możemy realizować operację kopiowania plików pomiędzy systemami.

 

 

Do odmontowania zasobu wykorzystaj polecenie: umount <nazwa_zasobu>

 

 

Jeżeli chcemy uzyskać dostęp do zasobu z wykorzystaniem interfejsu graficznego należy rozpocząć od uruchomienia menedżera plików. Po uruchomieniu narzędzia z prawej strony odszukujemy gałąź Sieć. Po jej wybraniu powinny ukazać się Nam wszystkie komputery do których mamy dostęp z poziomu naszej sieci. Nasz testowy zasób sieciowy jest udostępniany na komputerze o nazwie XXX tak więc aby uzyskać do niego dostęp klikamy na ikonę z nazwą komputera. Po wybraniu ikony reprezentującej dany komputer zostaniemy poproszeni o podanie poświadczeń użytkownika mającego prawo skorzystania z zasobu. Podobnie jak w przypadku wiersza poleceń podajemy dane uwierzytelniające użytkownika, którego konto znajduje się w systemie Windows.

 

Dodatkowo możemy określić jedną z trzech opcji dotyczącą zachowania wprowadzonego hasła.

 

 

Po dokonaniu poprawnego uwierzytelnienia uzyskamy dostęp do udostępnionego zasobu.

 

 

I podobnie jak w przypadku użycia wiersza poleceń tak i tu dokonujemy edycji pliku poprzez dopisanie komentarza: dopisane z GUI

 

 

Jak się można domyślać zmiany zostaną odzwierciedlone w systemie Windows.

 

 

Życie administratora jest znacznie bardziej skomplikowane i czasem te najprostsze rozwiązania musimy nieco zmodyfikować tak by odpowiadały one Naszym potrzebom. Tak więc powyższy przykład zmodyfikujmy i prześledźmy scenariusz w którym użytkownikom systemu Linux nałożymy pewne ograniczenie polegające na zdefiniowaniu ilości przestrzeni dyskowej, która może być przez Nich wykorzystywana. Czyli jak w praktyce w systemie Windows skonfigurować mechanizm quota.

 

Scenariusz zakłada, że użytkownik systemu Linux ma do swojej dyspozycji 100 MB wolnego miejsca, przestrzeń tę może wykorzystać w sposób dowolny lecz niemożliwy będzie zapis nowych plików powyżej ustalonego limitu.

 

Rozpoczynamy od uruchomienia konsoli MMC (w oknie Uruchom - skrót:Win+R wpisujemy mmc) i dodaniu przystawki Użytkownicy i grupy lokalne (czynności tej nie da się wykonać w wersjach Home systemu Windows). Przystawka oczywiście musi uwzględniać użytkowników i grupy komputera lokalnego.

 

Dodanie przystawki zrealizujemy po wybraniu z menu konsoli MMC opcji Plik a następnie Dodaj/Usuń przystawkę. W nowo otwartym oknie z listy dostępnych przystawek odszukujemy przystawkę Użytkownicy i grupy lokalne i za pomocą przycisku Dodaj umieszczamy ją w sekcji Wybrane przystawki. Zatwierdzamy wybór klawiszem OK.

 

 

Po rozwinięciu przystawki odszukujemy gałąź Użytkownicy i po kliknięciu na nią PPM z menu kontekstowego wybieramy opcję Nowy użytkownik. W oknie Nowy użytkownik definiujemy dane niezbędne do utworzenia nowego konta. Niezbędne dane, które należy podać to nazwa użytkownika oraz hasło, pozostałe opcje są ustawieniami opcjonalnymi. Całość konfiguracji zatwierdzamy przyciskiem Utwórz. Konto nowego użytkownika zostało utworzone. W dalszej części opisu posłużono się kontem o nazwie: jankow

 

 

Kolejną czynnością jest utworzenie grupy, której zadaniem będzie zebrać wszystkie konta użytkowników łączących się z hostem Windows przy wykorzystaniu systemu Linux.

 

Nie zamykamy przystawki lecz z dostępnych gałęzi wybieramy Grupy a następnie z menu kontekstowego wskazujemy opcję Nowa grupa. W nowo otwartym oknie Nowa grupa definiujemy nazwę tworzonej grupy (grupę nazwano: linux_users) oraz opcjonalnie możemy określić jej krótki opis.

 

Po definicji nazwy grupy za pomocą przycisku Dodaj określamy jej członków. Użytkownik jankow został dodany do grupy linux_users.

 

 

W systemie Windows konfigurację przydziałów przeprowadzamy za pomocą karty Przydział dostępnej w Właściwościach danego dysku/partycji. Po przejściu do karty wybieramy przycisk Pokaż ustawienia przydziałów.

 

 

Po uaktywnieniu funkcji Przydziałów przechodzimy do ich konfiguracji:

1 - celem włączenia funkcji zaznaczamy Włącz zarządzanie przydziałami,

2 - zaznaczamy opcję Odmów miejsca na dysku użytkownikom przekraczającym limit przydziałów,

3 - opcjonalnie możemy włączyć rejestrowanie zdarzeń związanych z przekroczeniem zdefiniowanego limitu (tzw. quota twarda) oraz osiągnięciem progu ostrzeżenia (tzw. quota miękka).

4 - wybieramy przycisk Wpisy przydziałów.

 

 

W nowo otwartym oknie Wpisy przydziału dla … z górnego menu wybieramy Przydział a następnie Nowy wpis przydziału W kolejnym oknie definiujemy użytkowników co do których konfigurowany przydział będzie miał zastosowanie (dodajemy użytkownika jankow, niestety nie da się zdefiniować grupy). Po wybraniu OK ustalamy limit przydziału oraz próg po którym będzie generowane ostrzeżenie o wysokim wykorzystaniu przydzielonego miejsca.

 

 

Po zatwierdzeniu wszystkich ustawień przydział został skonfigurowany.

 

 

Na pytanie dotyczące włączenia przydziału i aktualizacji statystyk wykorzystania dysku odpowiadamy twierdząco wybierając przycisk OK.

 

 

Ostatnią rzeczą jaką musimy wykonać to nadanie uprawnień grupie linux_users do udostępnionego zasobu linux_udostepniony. Otwieramy okno Udostępnienia plików dla zasobu i za pomocą przycisku Dodaj, dopisujemy grupę, pozwalając jej tym samym na korzystanie z zasobu. Prawa dla grupy linux_users zostały ustalone na odczyt/zapis. Całość zatwierdzamy przyciskiem Udostępnij.

 

 

Aby grupa mogła prowadzić swobodny zapis należy dodatkowo zdefiniować prawa systemu plików. W tym celu na zakładce Udostępnianie wybieramy przycisk Udostępnienie zaawansowane.

 

 

W oknie Udostępnienie zaawansowane wybieramy przycisk Uprawnienia.

 

 

Po otwarciu nowego okna do sekcji Nazwy grup lub użytkowników za pomocą przycisku Dodaj należy dopisać grupę linux_users oraz określić jej uprawnienia. Uprawnienia grupy zostały określone na: Pełna kontrola Całość konfiguracji oczywiście należy zatwierdzić.

 

 

Konfiguracja w systemie Windows została zakończona. Przechodzimy z powrotem do systemu Linux. Za pomocą znanego Nam polecenia montujemy udostępniony zasób do katalogu lokalnego. Aby móc skorzystać z zasobu należy podać poświadczenia użytkownika: jankow.

 

 

Zasób został zamontowany. Sprawdźmy zatem czy przydział działa. Limit plików został ustalony na 100 MB tak więc po wykorzystaniu go dalszy zapis będzie niemożliwy. Zostały przygotowane dwa pliki o rozmiarze 61 MB każdy, co jak łatwo obliczyć łączny rozmiar plików wynosi 122 MB czyli więcej niż ustalony przydział. Jak widać poniżej udało się z hosta Linux (panel lewy) przekopiować plik: film_1.avi do lokalizacji sieciowej (panel prawy).

 

 

Wykonajmy kopiowanie drugiego pliku. Operacja ta (co jak można było się spodziewać) kończy się niepowodzeniem - całe dostępne miejsce w ramach przydzielonego limitu zostało wykorzystane. Otrzymujemy komunikat błędu o niemożności wykonania operacji.

 

 

Ponieważ podczas definicji quoty została zaznaczona opcja rejestracji tego typu zdarzeń, tak więc wpis o zajściu zostanie zapisany w dzienniku. Po otwarciu okna Podglądu zdarzeń w sekcji System odnajdujemy wpis o przekroczeniu limitu ustalonego przydziału.

 

 

Aby zasób sieciowy był automatycznie montowany wraz ze startem systemu do pliku konfiguracyjnego /etc/fstab należy dodać wpis jak na zrzucie poniżej:

1 - ścieżka do zasobu sieciowego,

2 - ścieżka do katalogu w którym zasób ma zostać zamontowany,

3 - system plików,

4 - opcje dodatkowe takie jak nazwa użytkownika czy hasło.

 

 


Udostępnianie plików z wykorzystaniem systemu Windows wraz z dostępem do nich z poziomu Linux mamy omówione. Odwracamy sytuację czyli zadanie polega na utworzeniu zasobu w systemie Linux, tak by był on dostępny dla hostów pracujących pod kontrolą systemu Windows.

 

Topologia sieciowa zostaje zachowana.

 

Konfigurację rozpoczynamy od systemu Linux a mówiąc bardziej szczegółowo od instalacji serwera Samba. Aby zainstalować niezbędne pakiety wydajemy polecenie: apt-get install samba

 

 

Serwer Samba został zainstalowany kolejny krok to definicja użytkowników, którzy za pośrednictwem serwera będą mogli skorzystać z udostępnionego zasobu. Przypisanie użytkowników realizujemy za pomocą komendy: smbpasswd -a <nazwa_użytkownika> Poniżej została przeprowadzona operacja dodania konta: luk do usługi serwera Samba.

 

 

Mała uwaga (a nawet dwie) odnośnie czynności związanych z ustaleniem konta serwisu Samba. (Uwaga nr 1) Dodawane konto musi istnieć w systemie Linux czyli nie zdefiniujemy konta serwera Samba użytkownikowi, który nie posiada konta w systemie Linux. (Uwaga nr 2) Definicja hasła następuje w sposób całkowicie niezależny od tego już istniejącego. Oznacza to, że hasło wykorzystywane do realizacji zadań wynikających z uruchomienia serwera Samba może różnić się od tego wykorzystywanego do procesu logowania do systemu Linux.

 

Po dodaniu konta do serwera Samba, celem zarządzania nim, można użyć następujących przełączników:

  • -x - skasowanie użytkownika,
  • -d - wyłączenie konta użytkownika,
  • -e - włączenie konta użytkownika.

 

Aby zmienić hasło danemu użytkownikowi użyj ponownie polecenia: smbpasswd -a <nazwa_użytkownika>

 

Następnym krokiem jaki musimy wykonać jest określenie katalogu, który będzie dostępny dla użytkowników Windows a tym samym zasobu w którym będą mogli oni prowadzić proces zapisu i odczytu plików.

 

W scenariuszu został użyty katalog użytkownik_windows znajdujący się w katalogu domowym użytkownika luk. Katalog został założony.

 

 

Po założeniu katalogu należy go udostępnić tak by był on osiągalny z poziomu Otoczenia sieciowego systemu Windows. Udostępnienie realizujemy poprzez edycję pliku konfiguracyjnego serwera Samba: /etc/samba/smb.conf Aby móc edytować plik wydajemy polecenie: mcedit /etc/samba/smb.conf (edycję przeprowadzamy z uprawnieniami root-a oraz z wykorzystaniem edytora mcedit).

 

Plik smb.conf zawiera szereg ustawień wpływających na pracę serwera omówienie ich wszystkich wykracza poza ramy artykułu (serwerem Samba zajmiemy się jeszcze w odrębnych artykułach, jego użycie zostało również opisane w wpisie: Active Directory w wydaniu Linux).

 

W sekcji konfiguracji globalnej za pomocą parametru: workgroup definiujemy nazwę grupy roboczej (została pozostawiona domyślna nazwa WORKGROUP) - punkt 1. Opcjonalnie za pomocą parametru netbios name ustalamy nazwę komputera (punkt 2) zaś parametru server string opis (punkt 3).

 

 

Po wprowadzonych ustawieniach restartujemy serwer Samba poleceniem: service smbd restart

 

 

Host w Otoczeniu sieciowym systemu Windows powinien być widoczny i jak widać poniżej tak rzeczywiście jest. Do zasobu nie mamy jeszcze dostępu gdyż żadnego katalogu znajdującego się w systemie Linux nie udostępniliśmy.

 

 

Podczas instalacji systemu Linux można było określić nazwę komputera, nazwa ta będzie się wyświetlać na liście komputerów obecnych w sieci. Jeśli istniejąca nazwa komputera nam nie odpowiada, oczywiście możemy ją zmienić. Zmianę wykonujemy poprzez edycję dwóch plików: /etc/hostname oraz /etc/hosts.

 

W pierwszym pliku, obecną nazwę zastępujemy nową i tak samo postępujemy z drugim plikiem (nazwa komputera będzie znajdowała się obok adresu IP należącego do sieci 127.0.0.0/8 - tzw. adresu localhost - wysyłając ping na podany adres „pingujesz” sam siebie).

 

Przechodzimy do określenia zasobu, którego definicję rozpoczynamy od nadania mu nazwy. Nazwę zapisujemy w nawiasach kwadratowych - [uzytkownik_windows] Po określeniu nazwy definiujemy opcje dodatkowe:

1 - path = <ścieżka_do udostępnianego_zasobu> Ponieważ zapis realizowany przez użytkowników systemu Windows będzie realizowany w katalogu: uzytkownik_windows znajdujący się w folderze domowym użytkownika luk tak więc wpis przyjmie postać:
path = home/luk/uzytkownik_windows

2 - valid users = luk - definicja sprawdzenia poświadczeń użytkownika mającego prawo skorzystania z zasobu. Jeśli lista użytkowników nie została zdefiniowana (domyślnie), oznacza to, że każdy użytkownik może z zasobu korzystać. Aby zabronić dostępu do udostępnionego zasobu określonym użytkownikom użyj opcji: invalid users = <użytkownicy> np. invalid users = root beata

3 - available = yes - czy udostępniany zasób ma być dostępny,

4 - browsable = yes - czy zasób można przeglądać,

5 - read only = no - czy zasób tylko do odczytu,

6 - writable = yes - czy można przeprowadzić operację zapisu,

7 - public = yes - czy dostępny publicznie.

 

 

Konfiguracja udostępniania zasobu jest zakończona. Aby móc skorzystać z zasobu restartujemy usługę serwera Samba wraz z restartem usługi serwera nazw NetBIOS.

 

 

Ostatnią czynnością jest sprawdzenie efektów przeprowadzonej konfiguracji. Sprawdźmy zatem czy uzyskamy dostęp do zasobu z poziomu systemu Windows. Jeszcze raz sprawdzamy otoczenie sieciowe i jak można zauważyć poniżej zasób został umieszczony na liście. Aby móc skorzystać z zasobu należy podać poświadczenia użytkownika: luk. Po podaniu poprawnych danych zasób jest dla Nas dostępny.

 

 

Udało się uzyskać dostęp do zasobu znajdującego się na hoście kontrolowanym przez system Linux. Sprawdźmy zatem czy możliwy będzie zapis oraz odczyt. Tak jak w przypadku poprzednim rozpoczynamy od utworzenia pliku tekstowego: test.txt i jego edycji. W pliku umieszczono tekst: informacja od użytkownika windows

 

 

Po przejściu do systemu Linux odczyt i zapis pliku test.txt jest możliwy. Do pliku przez użytkownika systemu Linux zostaje dodany tekst: informacja od użytkownika linux

 

 

Informacja pozostawiona przez użytkownika systemu Linux bez problemu zostaje odczytana w systemie Windows.

 

 

Wszystko działa, obustronna komunikacja pomiędzy systemami jest możliwa.

 

Czasem jednak pomimo poprawnie przeprowadzonej konfiguracji możemy natrafić na problemy, które uniemożliwią Nam swobodny zapis informacji pomiędzy systemami. Najczęściej spotykam dwa problemy, które objawiają się tym, że uzyskuje dostęp do zasobu lecz brak jest możliwości wykonania kopiowania/zapisu plików. Więc poniżej krótki opis i szybkie rozwiązanie.

 

Problem pierwszy związany jest z brakiem przeprowadzonego uwierzytelnienia. W momencie próby otwarcia udostępnionego zasobu powinno pojawić się okno logowania w którym musimy podać login i hasło użytkownika mającego prawo do korzystania z zasobu. Okno się nie pojawia, udaje się wejść do folderu i na tym Nasze uprawnienia się kończą. Problem ten najczęściej występuje w systemie Windows 7 (w Windows 8 oraz Windows 10 jeszcze mi się nie przydarzyło). Na szczęście rozwiązanie jest bardzo proste. Wybieramy ikonę Komputer i po kliknięciu PPM wybieramy Mapuj dysk sieciowy (opcjonalnie wywołanie narzędzia możemy wykonać poprzez okno Komputer).

 

 

Po wywołaniu okna Mapowanie dysku sieciowego wybieramy literę dysku pod jaką będzie figurował zasób sieciowy oraz podajemy ścieżkę do niego (jak nie znamy ścieżki można skorzystać z przycisku Przeglądaj) - punkt 1. Drugą czynność jaką musimy wykonać to zaznaczyć opcję Połącz przy użyciu innych poświadczeń - punkt 2.

 

 

Kliknięcie Zakończ wymusi wywołanie okna w którym podamy poświadczenia użytkownika.

 

Drugi problem powodujący brak możliwości zapisu do folderu to brak uprawnień nadanych katalogowi w systemie Linux. Sprawdź zatem uprawnienia folderu i jeśli brak jest uprawnień nadaj je za pomocą polecenia: chmod (np. chmod 777 uzytkownik_windows - dokładny opis komendy znajdziesz w wpisie: Dogadać się z Linuxem. Powłoka systemu oraz operacje na plikach).

 

 


Zadanie wykonane. Przechodzimy do ostatniego możliwego wariantu dostępu do plików czyli klientem jest host z zainstalowanym systemem Linux oraz komputer udostępniający pliki również zarządzany jest przez system Linux.

 

 

Do udostępnienia zasobów innym komputerom wykorzystamy protokół NFS (ang. Network File System).

 

Rozpoczynamy od komputera udostępniającego swoje pliki czyli serwera. Aby móc rozpocząć udostępnianie zasobów w sieci wydajemy polecenie: apt-get install nfs-kernel-server

 

 

Niezbędne pakiety zostały zainstalowane. Weryfikację działania serwera NFS możemy przeprowadzić m. in. za pomocą polecenia: rpcinfo -p | grep nfs

 

Serwer działa i oczekuje na połączenia. Protokół NFS do działania wykorzystuje protokół UDP oraz TCP w połączeniu z portem 2049 a jak widać poniżej port 2049 zarówno dla TCP jak i UDP jest otwarty i oczekuje na połączenie.

 

 

Po upewnieniu się, że serwer NFS działa przechodzimy do definicji katalogu, który udostępnimy w sieci. W katalogu /home został utworzony folder o nazwie zasob.

 

 

Ponieważ katalog został utworzony z poziomu użytkownika root należy zmienić uprawnienia katalogu gdyż tylko ten użytkownik będzie mógł prowadzić zapis. Uprawnienia folderu za pomocą polecenia: chmod zostają ustawione w ten sposób aby wszyscy mogli prowadzić swobodny odczyt i zapis plików.

 

 

Aby zasób był widoczny w otoczeniu sieciowym należy go zdefiniować w pliku konfiguracyjnym serwera. Definicję zasobu wykonamy wydając polecenie: mcedit /etc/exports

 

Do pliku konfiguracyjnego zostaje dopisana linia: /home/zasob 192.168.1.0/24(rw)

/home/zasob - ścieżka dostępu do udostępnianego katalogu,

192.168.1.0/24 - definicja komputerów (ich adresów IP), które z zasobu mogą skorzystać,

(rw) - określenie praw, hosty będą miały możliwość odczytu (r - read) oraz zapisu (w - write). Opcjonalnie możemy dodać parametr: sync zwiększający pewność prowadzonej transmisji danych - parametr podajemy po przecinku (rw,sync)

 

 

Przy definicji wpisów należy pamiętać o jednej ważnej rzeczy a mianowicie nie wolno stawiać spacji pomiędzy ip/nazwą hosta a nawiasem.

 

Poniżej przykład dwóch wpisów obrazujących tą regułę:

/home/user_1/ 10.0.0.1(rw) (ro) - dostęp do zasobu /home/user_1 z maszyny 10.0.0.1 z uprawnieniami odczyt/zapis oraz dostęp dla wszystkich ale tylko z prawem odczytu,

/home/user_2/ 10.0.0.1 (rw) - dostęp do zasobu /home/suer_2 dla wszystkich z uprawnieniami odczyt/zapis.

 

Sprawdzenie wszystkich udostępnionych przydziałów możemy dokonać za pomocą komendy: exportfs -v

 

 

Folder został udostępniony tak więc umieśćmy w nim plik. W katalogu /home/zasob został zapisany plik tekstowy: plik.txt w który został zawarty tekst: zasob udostepniony

 

 

Po stronie serwer konfigurację mamy przeprowadzoną nie pozostaje nic innego jak zastosowanie ustawień. Serwer restartujemy za pomocą polecenia: service nfs-kernel-server restart (opcjonalnie możemy skorzystać z polecenia: exportfs -a)

 

 

Aby można było przeprowadzić operację uzyskania dostępu do zasobu na hoście klienta instalujemy pakiet: nfs-common

 

 

Po instalacji pakietu zakładamy katalog w którym będzie montowany zasób sieciowy. W naszym przypadku został utworzony folder: serwer w katalogu domowym użytkownika root.

 

 

Montowanie udostępnionego katalogu realizujemy za pomocą polecenia: mount -t nfs <adres_IP_serwera>:<ścieżka_zasobu_zdalnego> <ścieżka_katalog_lokalny> Wpis przyjmie postać jak na rysunku poniżej.

 

 

Po wydaniu polecenia udostępniony zasób (katalog /home/zasob na hoście 192.168.1.100) będzie dostępny za pośrednictwem folderu lokalnego serwer zlokalizowanego w katalogu domowym użytkownika root.

 

Sprawdzenie udostępnienia możemy wykonać za pomocą polecenia: df -h Jak widać poniżej wszystko je OK.

 

 

Wszystkie czynności zostały wykonane, sprawdźmy zatem efekt przeprowadzonej konfiguracji.

1 - wylistowanie katalogu domowego użytkownika root,

2 - przejście do katalogu serwer,

3 - wylistowanie katalogu serwer, jak można zauważyć w folderze znajduje się udostępniony plik tekstowy,

4 - sprawdzenie zawartości pliku.

 

 

Dostęp do zasobu i jego odczyt działa, sprawdźmy czy uda się wykonać operację zapisu do udostępnionego pliku. Do tego celu został wykorzystany edytor nano (tak dla urozmaicenia) i za jego pośrednictwem do pliku został dopisany wiersz: dopisane przez klienta Plik został zapisany.

 

 

Proces zapisu pliku przebiegł bez żadnych problemów i dopisany tekst możemy przeglądnąć po stronie serwera. Udostępnianie zasobów z wykorzystaniem protokołu NFS działa.

 

 

Zanim przejdziemy do dalszej części wpisu jeszcze krótki opis automatycznego montowania zasobu wraz ze startem systemu.

 

Rozpoczynamy od edycji pliku: /etc/fstb Do pliku należy dodać wpis: <adres_IP_serwera>:<ścieżka_do_zasobu> <punkt_montowania> nfs defaults 0 0 Wpis przyjmie postać jak na rysunku poniżej.

 

 

Po wykonaniu wpisu sprawdźmy czy przeprowadzona konfiguracja zadziała.

1 - za pomocą polecenia: umount <zasób_sieciowy> wykonujemy operację odmontowania zasobu sieciowego,

2 - sprawdzamy czy odmontowanie się powiodło (zasób został zwolniony),

3 - za pomocą komendy: mount -a wymuszamy ponowne zamontowanie sytemu plików,

4 - sprawdzenie czy został zamontowany skonfigurowany zasób sieciowy (montowanie udziału powiodło się).

 

 

I ostatnia kwestia jaka pozostała Nam do omówienia to ustalenie przydziału dyskowego w systemie Linux.

 

Tradycyjnie już rozpoczynamy od instalacji niezbędnych pakietów tym razem będzie to pakiet quota oraz quotatool. Całość operacji oczywiście przeprowadzamy na komputerze udostępniającym pliki. Aby pobrać narzędzia wydajemy polecenie: apt-get install quota quotatool.

 

 

Narzędzia zostały poprawnie zainstalowane. Aby mechanizm przydziałów mógł zacząć funkcjonować edytujemy plik /etc/fstab i w linii reprezentującej dysk na którym przydziały mają zostać włączone dopisujemy: usrquota,grpquota - bez znaków spacji. Dopisanie opcji należy wykonać bardzo dokładnie gdyż pomyłka może spowodować problemy z uruchomieniem systemu. Oba wpisy włączają przydział oparty o użytkownika i grupę.

 

 

Aby wszystko zaczęło poprawnie działać wykonujemy restart maszyny bądź za pomocą polecenia: mount -o remount,rw / wykonujemy ponowne zamontowanie systemu plików.

 

Po wykonaniu restartu maszyny za pomocą polecenia: repquota -ast możemy wygenerować raport zużycia zasobów dyskowych wszystkich użytkowników (flaga: -t odpowiedzialna za skrócenie nazwy udziału do 9 znaków, flaga: -s jednostki są pokazywane w kB oraz MB a nie w bajtach, flaga: -a oznacza wszystko).

 

Po wydaniu polecenia ukaże się Nam tabela w której zostaną zebrani wszyscy użytkownicy wraz z informacją o ilości wykorzystywanych zasobów dyskowych.

 

Tabela dodatkowo podzielona jest na dwa obszary: limity miejsca i limity plików w których wyświetlane są informacje o aktualnym wykorzystaniu ustalonych limitów.

 

Limity jakie możesz ustawić dotyczą ilości wykorzystywanego miejsca na dysku bądź ilości tworzonych plików.

 

Dodatkowo każda z sekcji została podzielona na kolumny w których znajdziemy informację o:

  • aktualne wykorzystanie przestrzeni dyskowej/ilości utworzonych plików,
  • wartościach zdefiniowanych limitów miękkich oraz twardych,
  • okresie pobłażania (domyślnie 7 dni).

 

Limit miękki (ang. soft limit) definiuje przydział, który dany użytkownik może przekraczać dowolną ilość razy lecz limit ten ograniczony jest tzw. okresem pobłażania, czyli czasem po którym dalszy zapis nie będzie możliwy.

 

Limit twardy (ang. hard limit) określa wartość maksymalnego rozmiaru przydzielonych zasobów dyskowych dla konkretnego użytkownika. Limit twardy nie może być przekroczony.

 

Zarówno limit miękki jak i twardy możemy ustawić w kontekście ilości miejsca oraz ilości możliwych do utworzenia plików.

 

 

Włączenie/wyłączenie mechanizmu quota dokonujemy za pomocą poleceń: quotaon -avug oraz quotaoff -avug

 

 

Sprawdźmy zatem działanie mechanizmu przydziału dyskowego w praktyce. Sprawdzenia dokonujemy od utworzenia nowego użytkownika: user_1, któremu ustalimy limit wykorzystania dysku.

 

 

Ustalenie limitów obejmujące użytkownika odbywa się po wydaniu polecenia: edquota -u <nazwa_użytkownika> czyli w naszym przypadku należy wydać polecenie: edquota -u user_1 Jeśli chcesz ustalić limit, który będzie obejmował daną grupę wydaj komendę: edquota -g <nazwa_grupy> Po wydaniu polecenia ustalamy wartości limitów. W ćwiczeniu dla użytkownika: user_1 limit miękki został ustalony na 50000kB (50 MB) zaś twardy na 100000kB (100 MB).

 

 

Po zdefiniowaniu wartości limitów sprawdźmy czy mają one zastosowanie. Wygenerowanie raportu uwidacznia stan obowiązujących przydziałów. Raport zgadza się z przeprowadzoną przez Nas konfiguracją.

 

 

Limity zostały ustalone sprawdźmy zatem czy działają. Po zalogowaniu się na konto użytkownika: user_1 przechodzimy do poprania programu Acrobat Reader, który zajmuje około 37 MB. Plik programu pobiera się bez żadnych problemów.

 

 

Po zapisie pliku ponownie przeprowadzamy sprawdzenie wykorzystania zasobów. Jak można zauważyć limit miękki został przekroczony lecz nie skutkuje to jeszcze żadnymi konsekwencjami gdyż okres pobłażania przyjął domyślną wartość 7 dni.

 

 

Sprawdźmy jak zachowa się system w przypadku osiągnięcia wartości określonej przez limit twardy. Następuje próba skopiowania uprzednio ściągniętego programu. Dotychczasowe użycie dysku jest na poziomie około 83 MB więc dodanie kolejnych 37 MB spowoduje przekroczenie limitu ustalonego przez przydział twardy. Jak się można domyślać skopiowanie pliku kończy się niepowodzeniem. Operacja zostaje przerwana z powodu przekroczenia ustalonego limitu.

 

 

W ten o to prosty sposób możemy prowadzić kontrolę wykorzystanie miejsca na dysku.

 

Każdy użytkownik za pomocą polecenia: quota sam może sprawdzić stopień wykorzystania przydzielonego mu limitu.

 

 

Jeśli zależy Nam na zmianie okresu pobłażania to definicję interwału czasu wykonamy za pomocą komendy: edquota -t Poniżej domyślny okres pobłażania trwający 7 dni został zmieniony na okres 4 dni.

 

 

Po zapisie pliku nowy okres pobłażliwości zaczyna obowiązywać.

 

 

I na tym etapie wpis swój chciałbym zakończyć. Mam nadzieję, że po lekturze artykułu nie będziesz miał Czytelniku żadnego problemu by udostępniać swoje zasoby sieciowe z wykorzystaniem hostów pracujących pod kontrolą systemu Windows oraz Linux.


BIBLIOGRAFIA

 

http://www.tecmint.com/how-to-setup-nfs-server-in-linux/

https://linuxconfig.org/how-to-configure-nfs-on-linux

https://www.samba.org/samba/docs/pl/smb.conf.5.pl.html

http://www.linuxnix.com/how-to-linux-group-disk-quota-implementation/

]]>
[email protected] (pikolo) Linux Fri, 30 Dec 2016 19:16:40 +0000
Serwer Syslog (po raz drugi) z wykorzystaniem systemu Linux. http://slow7.pl/linux/item/131-serwer-syslog-po-raz-drugi-z-wykorzystaniem-systemu-linux http://slow7.pl/linux/item/131-serwer-syslog-po-raz-drugi-z-wykorzystaniem-systemu-linux

Kontynuujemy temat rejestracji zdarzeń z wykorzystaniem serwera Syslog. Wpis ten jest kontynuacją wpisu: Rejestracja zdarzeń z wykorzystaniem serwera Syslog lecz tym razem skupiamy się na systemie Linux i wykorzystaniu deamona rsyslog.

 

Ponieważ jak już zaznaczyłem wpis ten jest kontynuacją tak więc część informacji została celowo pominięta tak by nie powielać ich ponownie. To co nie zostało poruszone w tym wpisie, znajdziesz Czytelniku w artykule, do którego link podałem Ci powyżej.

 

W systemie Linux za gromadzenie informacji o zdarzeniach odpowiedzialny jest mechanizm: rsyslog (dawniej – syslog).

Pliki konfiguracyjne odpowiedzialne za działanie tej usługi (i nie tylko tej):

rsyslog - /etc/rsyslog.conf – plik zawierający konfigurację mechanizmu wraz z definicją logowanych zdarzeń,

logrotate - /etc/logrotate – plik zawierający konfigurację mechanizmu odpowiedzialnego za porządkowanie utworzonych logów – planowanie czasu przechowywania logów czy definicja rozmiarów plików zawierających przechwycone zdarzenia.

 

By móc prowadzić skuteczną rejestrację wystąpienia danych sytuacji w pierwszej kolejności musimy zdecydować jakie kategorie zdarzeń muszą podlegać logowaniu.

Kategorie zdarzeń (selektor), które mogą podlegać logowaniu to:

auth,authpriv - autoryzacja użytkowników,

kern - jądro systemowe,

security - logi bezpieczeństwa,

user - aplikacje wykorzystywane przez użytkowników,

mail - zdarzenia związane z pocztą,

lpr - komunikaty dotyczące obsługi drukarek i procesu wydruku,

ftp - logi serwera ftp,

cron - informacje dotyczące deamona cron.

 

Po definicji interesującej nas kategorii należy określić ich poziom:

 

Poziom Nazwa poziomu Definicja syslog Opis
0 Emergency EMERG Najwyższy priorytet. Tak jak w przypadku routerów/przełączników awaria na tyle poważna, że uniemożliwia uruchomienie systemu.
1 Alert ALERT Potrzebna natychmiastowa interwencja
2 Critical CRIT Sytuacja krytyczna
3 Error ERR Błędy w działaniu usługi
4 Warning WARNING Ostrzeżenie
5 Notice NOTICE Powiadomienie, ważniejsze zdarzenia
6 Informational INFO Komunikaty informacyjne
7 Debug DEBUG Szczegółowe informacje o działaniu danego procesu

 

Przykładowe wpisy:

security.* /var/log/security - logi bezpieczeństwa o każdym priorytecie będą zapisywane w pliku: /var/log/security,

*.warning;mail.none;ftp.none /var/log/warning - logi wszystkich kategorii o priorytetach od emergency do warning (włącznie) będą zapisywane w pliku: /var/log/warning Rejestracji nie podlegają logi kategorii: mail oraz ftp,

auth.=crit /var/log/authcrit - logi dotyczące kategorii auth będą zapisywane w pliku: /var/log/authcrit Rejestracji podlegają tylko zdarzenia o priorytecie critical (brak rejestracji zdarzeń dotyczących poziomów wyższych).

 

Sprawdzenie statusu usługi rsyslog następuje po wydaniu polecenia: /etc/init.d/rsyslog status Jak widać poniżej usługa działa a jej numer PID to 3637

 

 

Dodatkowo sterowanie usługą możemy kontrolować za pomocą parametrów:

1 - stop - zatrzymanie usługi rsyslog,

2 - start - uruchomienie usługi,

3 - restart - zrestartowanie usługi np. celem wprowadzenia nowych ustawień.

 

 

Tak więc aby móc zacząć rejestrować interesujące nas zdarzenia musimy określić kategorię oraz podać poziom zdarzeń, które rejestracji mają podlegać.

 

Rejestrację zdarzeń określamy poprzez definicję roli. Konfiguracja danej roli odbywa się poprzez edycję pliku: /etc/rsyslog.conf bądź jak w naszym przypadku poprzez edycję pliku: /etc/rsyslog.d/50-default.conf (generalnie definicja roli odbywa się w pliku rsyslog.conf lecz jak to bywa zasada ta nie zawsze jest regułą, w Ubuntu 14.04 oraz 16.04 rolę tą przejął plik: 50-default.conf)

 

Tak więc spróbujmy utworzyć jakąś rolę i sprawdźmy czy rejestrowanie zdarzeń działa.

 

Poniżej została utworzona rola rejestracji zdarzeń związanych z autoryzacją użytkowników. Poprzez wpis: auth,authpriv.* w pliku: /var/log/użytkownicy.log będą zapisywane wszystkie te zdarzenia (użycie gwiazdki spowoduje rejestrację wszystkich możliwych sytuacji - wszystkie możliwe poziomy), które dotyczą zdefiniowanej roli.

 

 

By wprowadzona definicja mogła zacząć obowiązywać należy wykonać restart usługi rsyslog.

 

Listening plików zawartych w katalogu: /var/log nie uwidacznia istnienia pliku: użytkowicy.log ponieważ jeszcze żadne zdarzenie podlegające rejestracji nie miało miejsca.

 

 

Zmieńmy zatem ten stan i wymuśmy sytuację w której zaistniałe zdarzenie zostanie odnotowane przez serwer Syslog.

 

Zdefiniowana rola dotyczy autoryzacji użytkowników tak więc najprostszą sytuacją wymuszającą zapisanie logów jest użycie konta root - użytkownik luk podwyższa swoje uprawnienia do poziomu root.

 

 

Wykonanie zmiany poświadczeń użytkownika wymusiło rejestrację tego faktu. Plik: użytkownicy.log został utworzony.

 

 

Sprawdzenie zawartości pliku przekonuje nas, że zasymulowana przez Nas sytuacja została zarejestrowana.

 

 

W ten oto prosty sposób możemy utworzyć dowolny schemat logowania zdarzeń, które muszą podlegać rejestracji.

 

Lokalne rejestrowanie zdarzeń mamy omówione. Przejdźmy zatem do skonfigurowania rejestracji zdarzeń pochodzących od urządzeń sieciowych.

 

Poniżej dla przypomnienia obowiązująca topologia sieciowa, różnica z wpisem poprzednim polega na zamianie systemu pod kontrolą, którego pracuje serwer Syslog. Z systemu Windows przechodzimy na Linux Ubuntu 16.04

 

 

Pierwsza czynność, którą należy wykonać to włączenie obsługi połączeń sieciowych. Włączenie nasłuchiwania na porcie UDP 514 obsługującym połączenia następuje po wykasowaniu znaku komentarza (#) umieszczonego przed definicjami:

  • ModLoad imudp
  • UDPServerRun 514

 

Zmianę tą należy dokonać w pliku: /etc/rsyslog.conf w sekcji Modules.

 

 

W przypadku systemu Linux mamy możliwość skorzystania z rejestracji zdarzeń wykorzystując do tego protokół TCP. Aby włączyć tą funkcjonalność należy uaktywnić linie:

  • ModLoad imtcp
  • InputTCPServerRun 514

 

Na uwadze należy jednak mieć fakt iż możliwość zmiany protokołu bądź portu docelowego usługi Sysylog musi mieć zaimplementowane również urządzenie, które logi będzie generować.

 

Po wprowadzonej zmianie serwer Syslog restartujemy za pomocą znanego nam już polecenia: /etc/init.d/rsyslog restart

 

Sprawdzenie statusu portu sprawdzimy za pomocą polecenia: netstat -tul Jak widać na zrzucie poniżej usługa serwera Syslog została włączona.

 

 

Bardziej szczegółowe informacje uzyskamy wydają komendę: netstat -ulpn

 

 

Mamy pewność, że serwer Syslog oczekuje na nadchodzące połączenia.

 

Przechodzimy do kolejnego kroku konfiguracji a mianowicie do określenia kategorii i poziomu rejestrowanych zdarzeń. Opcje te należy zdefiniować w pliku: /etc/rsyslog.d/50-default. Aby móc rejestrować zdarzenia pochodzące od urządzeń Cisco należy do pliku dodać wpis: local7.* <ścieżka_plik_log> Czemu akurat taki wpis? Ponieważ routery/przełączniki domyślnie wszystkie komunikaty dotyczące zaistniałych zdarzeń klasyfikują do kategorii local7. Dodanie znaku gwiazdki spowoduje włączenie rejestrowania zdarzeń na poziomie Debug czyli tak naprawdę wszystkie możliwe zdarzenia. Włączenie tak wysokiego poziomu rejestracji tak naprawdę jest bez znaczenia gdyż informacja o typie wysyłanych komunikatów zostanie skonfigurowana na routerze.

 

Poniżej na zrzucie zaprezentowano włączenie rejestrowanie zdarzeń pochodzących od routera R1. Serwer przeprowadzi zapis zdarzeń do pliku: /var/log/routerR1.log

 

 

Serwer Syslog został skonfigurowany prawidłowo, przejdźmy zatem do konfiguracji routera R1 i jego współpracy z mechanizmem Syslog. Konfigurację przeprowadzamy analogicznie jak w poprzednim wpisie.

 

 

1 - określamy adres IP serwer Syslog z wykorzystaniem polecenia: logging host <adres_IP_serwera_Syslog>,

2- określamy poziom wysyłanych komunikatów - polecenie: logging trap <poziom>,

3 - za pomocą polecenia: logging source-interface <interfejs> możemy określić interfejs wyjściowy,

4 - włączamy proces wysyłania powiadomień - polecenie: logging on

 

Router R1 został skonfigurowany, czas zatem przetestować całą przeprowadzoną konfigurację i sprawdzić czy zdarzenia będą poprawnie wysyłane i logowane. W tym celu zasymulujemy zdarzenie, które będzie polegać na włączeniu i wyłączeniu jednego z interfejsów routera. Poniżej na zrzucie przedstawiono proces włączenia i wyłączenia interfejsu f0/1 routera R1. Jak widać odpowiednie informacje towarzyszące temu zdarzeniu zostały wygenerowane.

 

 

Te same informacje powinny zostać zapisane w logach serwera Syslog. Plik: routerR1.log powinien zostać utworzony w katalogu: /var/log i jak można zauważyć poniżej tak też się stało - punkt 1.

 

Sprawdzenie informacji zawartych w pliku przekonuje Nas iż rejestrowanie zdarzeń działa prawidłowo. Użycie polecenia: tail w połączeniu z nazwą pliku oraz z flagą -f pozwala na bieżąco śledzić pojawiające się komunikaty - punkt 2.

 

 

Poniżej na rysunku przechwycony ruch sieciowy pomiędzy routerem R1 a serwerem Syslog. Jak można zauważyć użyty protokół to UDP w połączeniu z docelowym portem 514.

 

 

Podczas konfiguracji zapisu logów pochodzących od routera R1 użyliśmy domyślnej kategorii: local7 co nie oznacza, że nie możemy skorzystać z innych kategorii. Do czego użycie innej kategorii logowania zdarzeń może się przydać? - zapytasz Czytelniku. A mianowicie użycie różnych kategorii pozwala nam na separację logów pochodzących z różnych urządzeń. Wykorzystanie różnych kategorii podczas konfiguracji urządzeń spowoduje zapis logów do odrębnych plików. Możliwy jest również scenariusz w którym to np. wszystkie routery mają przypisaną określoną stałą kategorię obowiązującą dla tego typu urządzeń zaś przełączniki inną. Tak przeprowadzona konfiguracja spowoduje zapis zdarzeń pochodzących od routerów do jednego pliku zaś przełączników do drugiego.

 

Lista dostępnych i możliwych do wykorzystania kategorii została zamieszczona w tabeli poniżej.

 

Kategoria Opis
auth autoryzacja użytkowników
cron mechanizm cron
deamon informacje dotyczące procesów deamon
kern jądro systemowe
local0 użytek lokalny
local1 użytek lokalny
local2 użytek lokalny
local3 użytek lokalny
local4 użytek lokalny
local5 użytek lokalny
local6 użytek lokalny
local7 użytek lokalny (domyślna kategoria dla urządzeń CISCO)
lpr mechanizm drukowania
mail obsługo poczty
news grupy dyskusyjne USENET
sys9 wykorzystywane przez system
sys10 wykorzystywane przez system
sys11 wykorzystywane przez system
sys12 wykorzystywane przez system
sys13 wykorzystywane przez system
sys14 wykorzystywane przez system
syslog mechanizm Syslog
user procesy użytkownika
uucp mechanizm Unix to Unix Copy

 

Wykorzystajmy zatem zdobytą wiedzę i skonfigurujmy router R2 do korzystania z mechanizmu Syslog tylko z tą różnicą, że logi routera R2 będą zapisywane w oddzielnym pliku.

 

Tak jak poprzednio rozpoczynamy od wprowadzenia stosownych ustawień na serwerze Syslog. Ponownie edytujemy plik: /etc/rsyslog.d/50-default.conf Do bieżącej konfiguracji dodajemy wpis nakazujący logowanie zdarzeń wszystkich poziomów przypisanych do kategorii: local6 do pliku: /var/log/routerR2.log

 

 

Oczywiście aby ustawienia mogły zacząć obowiązywać, restartujemy usługę deamona rsyslog.

 

Serwer Syslog został skonfigurowany.

 

Ostatnim etapem konfiguracji jest wprowadzenie stosownych ustawień na routerze R2. Konfiguracja routera przebiega analogicznie jak routera R1 z jednym małym wyjątkiem. Aby serwer Syslog, mógł zapisać zdarzenia routera R2 do odrębnego pliku (pominięcie tego kroku spowoduje zapisanie logów z wykorzystaniem domyślnie ustawionej kategorii: local7 czyli do pliku routerR1.log) należy dokonać zmiany kategorii wysyłanych przez router komunikatów. Zmianę kategorii dokonujemy za pomocą polecenia: logging facility <kategoria>

 

 

I tak jak poprzednio celem sprawdzenia poprawności wykonanych czynności przeprowadzamy zmianę stanu interfejsu routera R2.

 

 

Jak widać poniżej wszystkie zdarzenia zostały poprawnie przesłane i zarejesrtowane przez serwer Syslog.

 

 

Opcjonalnie możemy skonfigurować zapis zaistniałych zdarzeń w osobnych plikach czyli zapis zdarzenia w zależności od jego poziomu będzie realizowany w odrębnym pliku. Poniżej zdefiniowano zapis zajść pochodzących od routera R1 o poziomie ERROR (numer poziomu: 3) do pliku: routerR1_err.log oraz o poziomie NOTICE (numer poziomu: 5) do pliku: routerR1_notice.log

 

 

Po zrestartowaniu usługi Syslog oraz ponownym wygenerowaniu zdarzenia (zmiana stanu interfejsu) sprawdzamy efekt ich rejestracji na serwerze Sysylog. Jak widać poniżej odpowiednie pliki zostały wygenerowane. Sprawdzenie zawartości plików przekonuje Nas, że w plikach tych zostały zapisane zdarzenia odpowiadające danemu poziomowi.

 

 

Uważny Czytelnik po analizie rysunku powyżej na pewno zauważy, że w pliku routerR1_err.log znajdują się logi odpowiadające zdarzeniom tylko z tego poziomu natomiast w pliku routerR1_notice.log oprócz logów przypisanych do poziomu 5 znajduje się jedno, zapisane zdarzenie poziomu 3 - %LINK-3-UPDOWN Dlaczego tak się stało? Odpowiedź jest prosta - Użycie definicji: local7.notice spowoduje zapisanie logów należących do wszystkich poziomów od 0 do 5. Aby rejestrować logi należące tylko do poziomu NOTICE definicję zapisu należy skorygować na wpis: local7.=notice Użyte polecenie spowoduje zarejestrowanie tylko zdarzeń przypisanych do poziomu 5 czyli NOTICE.

 

 

Sprawdźmy zatem wprowadzoną zmianę i jeszcze raz wygenerujmy zdarzenie. Jak widać poniżej wprowadzona przez Nas zmiana spowodowała zapis logów w pliku: routerR1_notice.log - zostały zapisane tylko zdarzenia przynależne poziomowi 5.

 

 

Na początku wpisu zaznaczyłem, że do odbierania informacji o zdarzeniach przez serwer Syslog zamiast domyślnego protokołu UDP może zostać użyty protokół TCP. Spróbujmy zatem skonfigurować serwer Syslog w ten sposób by mógł on prowadzić komunikację z innymi urządzeniami właśnie przy wykorzystaniu TCP.

 

W pierwszej kolejności poprzez edycję pliku: /etc/rsyslog.conf wyłączamy komunikację opartą o protokół UDP (punkt 1). Do zablokowania protokołu UDP wykorzystujemy: #

 

Po wyłączeniu UDP, włączamy TCP. Aby protokół TCP mógł zacząć działać usuwamy znak: # przed liniami:

  • Module(load="imtcp"),
  • Input(type="imtcp" port="700")

 

W ćwiczeniu dodatkowo zamieniono domyślny port 514 na port 700.

 

 

Po wprowadzeniu zmian oczywiście restartujemy usługę serwera Syslog.

 

Stan włączenia usługi wraz z otwarciem portu 700 możemy zweryfikować za pomocą komendy: netstat -utlpn Serwer Syslog działa i oczekuje na nadchodzące informacje na porcie TCP 700.

 

 

Serwer Syslog został skonfigurowany tak więc czas by skonfigurować router. W ćwiczeniu użyjemy routera R1. Aby router R1 mógł nawiązać poprawne połączenie z serwerem Syslog należy zmodyfikować domyślne ustawienia komunikacji. Definicję tą przeprowadzamy za pomocą już znanego nam polecenia: logging host <adres_serwera_Syslog>, uzupełniając je o dodatkowe informacje tj. użyty protokół oraz wykorzystywany numer portu. Definicję protokołu przeprowadzamy za pomocą flagi: transport natomiast numer portu określamy przy użyciu opcji: port.

 

 

Standardowo aby sprawdzić poprawność przeprowadzonej konfiguracji wymuszamy zdarzenie polegające na zmianie stanu interfejsu.

 

Zdarzenia te jak widać zostały poprawnie zarejestrowane przez serwer Syslog.

 

 

I na koniec - fakt przesłania danych przez router R1 w kierunku serwera Syslog można dodatkowo zweryfikować przeglądając informacje uzyskane dzięki sniffingowi. Jak widać poniżej do przesłania logów został wykorzystany protokół TCP oraz port 700.

 

 

Tak więc wpisem tym temat logowania zdarzeń przy wykorzystaniu serwera Syslog kończymy, co nie oznacza, że do zagadnienia rejestracji zdarzeń nie powrócimy. Został Nam do omówienie protokół SNMP.

]]>
[email protected] (pikolo) Linux Mon, 28 Nov 2016 17:49:11 +0000
Protokoły dostępu zdalnego w systemie Linux. http://slow7.pl/linux/item/126-protokoly-dostepu-zdalnego-w-systemie-linux http://slow7.pl/linux/item/126-protokoly-dostepu-zdalnego-w-systemie-linux

Możliwość nawiązania zdalnego połączenia z systemem celem przeprowadzenia czynności administracyjnych dla wielu jest nieoceniona gdyż zyskujemy możliwość wykonania niezbędnej konfiguracji systemu bez fizycznego obcowania z komputerem. W wcześniejszych artykułach opisałem jak sesję zdalną ustalić z systemami z rodziny Windows, pomijając system Linux. Czas więc tą zaległość nadrobić - w wpisie tym zajmiemy się ustaleniem sesji zdalnej z systemem Linux z wykorzystaniem takich protokołów jak Telnet czy SSH.

Rozpoczynamy od najstarszego rozwiązania czyli Telnetu. Spróbujemy tak skonfigurować system Linux Ubuntu aby można było nim zarządzać zdalnie z wykorzystaniem tego protokołu.

 

Aby móc zestawić połączenie Telnet z systemem należy rozpocząć od instalacji niezbędnych pakietów tak więc wydajemy polecenie: apt-get install xinetd telnetd Po wydaniu komendy nastąpi instalacja oprogramowania niezbędnego do zestawienia sesji Telnet.

 

 

Automatycznie po instalacji oprogramowania odpowiedni port umożliwiający nawiązanie połączenia powinien zostać otwarty (stan nasłuchiwania). W przypadku Telnetu jest to port TCP 23. Aby sprawdzić stan portów wydaj polecenie: netstat -tlpn Jak widać poniżej port TCP 23 jest w stanie nasłuchiwania (gotowy do nawiązania połączenia).

 

 

Zanim przejdziemy dalej chwilkę zatrzymajmy się przy użytej komendzie netstat. Polecenie netstat służy między innymi do wyświetlania aktywnych połączeń sieciowych a także portów, na których komputer nasłuchuje. Wydana komenda: netstat -tlpn spowoduje użycie następujących opcji:

-t - pokaż tylko porty TCP/IP,

-l - pokaż porty tylko w trybie nasłuchiwania (LISTEN),

-p - pokaż PID procesu związanego z otwartym portem,

-n - pokaż adresy IP bez ich rozwiązywania.

 

W przypadku portów UDP należy użyć flagi: -u np. pokaż porty TCP oraz UDP w stanie nasłuchiwania: netstat -tul

 

Jeśli wszystko się zgadza powinno udać nam się nawiązać połączenie zdalne z hostem przy wykorzystaniu protokołu Telnel.

 

Ale nie zawsze wszystko może zacząć działać od razu o ile w przypadku Linux Ubuntu 14.04 nie było żadnych problemów to już przy wersji 16.04 takowe nastąpiły. Po instalacji niezbędnych pakietów nawiązanie połączenia nie było możliwe.

 

Aby rozwiązać ten problem pierwsze nasze kroki powinniśmy skierować ku katalogowi: /etc/xinetd.d i sprawdzić czy istnieje plik: telnet W przypadku jego braku należy go utworzyć a jego zawartość powinna być następująca:

service telnet

{

disable = no

flags = REUSE

socket_type = stream

wait = no

user = root

server = /usr/sbin/in.telnetd

log_on_failure += USERID

}

 

 

Po ewentualnym utworzeniu pliku należy wydać polecenie: sudo /etc/init.d/xinetd restart celem ponownego uruchomienia serwera i wprowadzenia nowych ustawień.

 

Po wprowadzeniu zmian powinno udać nam się zestawić połączenie Telnet. Jak widać poniżej tak też się stało.

 

 

Status i stan serwera możemy sprawdzić po wydaniu polecenia: sudo /etc/init.d/xinetd status

 

 

Domyślny port 23 usługi Telnet możemy zmienić poprzez edycję pliku: /etc/services Po otwarciu pliku odnajdujemy linię odnoszącą się do usługi Telnet i zmieniamy domyślną wartość portu 23 na pożądaną.

 

Aby móc zestawić połączenie z systemu Windows przy wykorzystaniu wiersza poleceń w pierwszej kolejności musimy zainstalować klienta Telnet. Klienta zainstalujemy po przejściu do Panelu sterowania a następnie wybraniu opcji Programy i funkcje Po otwarciu okna (z lewej strony) klikamy na opcję Włącz lub wyłącz funkcje systemu Windows i wśród dostępnych funkcji odszukujemy Klient Telnet. Funkcję należy zaznaczyć a następnie wybrać OK. Po instalacji polecenie: telnet będzie dostępne z linii poleceń.

 

 

Aby nawiązać połączenie zdalne w oknie wiersza poleceń wydajemy polecenie: telnet <adres_hosta>

 

 

Dokładniejszy opis narzędzia: telnet znajdziesz w wpisie: Nie samym GUI człowiek żyje. Rzecz o CMD

 

Opis narzędzi graficznych przedstawiono w dalszej części wpisu.

 

Jak wiadomo (i co już nie raz podkreślałem) użycie protokołu Telnet nie jest rozwiązaniem z punktu bezpieczeństwa zbyt trafnym gdyż w protokole tym nie przewidziano, żadnych mechanizmów pozwalających na zabezpieczenie całej komunikacji. Oznacza to, że w przypadku przechwycenia ruchu sieciowego nasze hasło i login będzie można bez problemu odczytać. Poniżej przedstawiam zrzut, który obrazuje fakt zdobycia loginu i hasła.

 

 

Jeśli już nie mamy wyjścia to przynajmniej warto zabezpieczyć możliwość nawiązania połączenia z systemem do zaufanych hostów. Aby określić komputery, które mają prawo do zestawienia połączenia należy edytować plik: /etc/xinetd.d/telnet i do bieżącej konfiguracji dodać linię: only_from = <adres_IP/adres_sieci> Możemy określić adres IP hosta bądź zakres hostów poprzez definicję sieci. Definicję hostów możemy również przeprowadzić poprzez podanie nazwy domeny np. only_from = .slow7.pl

 

 

Inne przydatne parametry:

  • no_access = 192.168.120.{101,105} - zabronienie połączenia, hosty o podanych adresach IP nie będą mogły zestawić sesji Telnet (w ten sam sposób możemy zdefiniować hosty mogące połączenie nawiązać),
  • access_times = 7:00-10:00 22:00-23:00 - określenie czasu w którym może nastąpić połączenie,
  • instances = 2 - ustawia maksymalną liczbę równocześnie realizowanych połączeń (parametr zdefiniowany w pliku: /etc/xinetd.conf),
  • log_on_failure += <rejestrowane_parametry> - rejestrowanie zdarzeń związanych z nieudanym logowaniem,
  • log_on_success += <rejestrowane_parametry> - rejestrowanie zdarzeń związanych z udanym logowaniem,
  • log_type = FILE <ścieżka_do_pliku> - określenie pliku dziennika.

Parametry, które podlegają zapisowi w pliku dziennika to:

  • ATTEMPT - rejestruje fakt dokonania nieudanej próby logowania (log_on_failure),
  • DURATION - rejestruje czas trwania połączenia (log_on_success),
  • EXIT - rejestruje fakt zakończenia usługi (log_on_success),
  • HOST - rejestruje adres IP zdalnego hosta (log_on_failure i log_on_success),
  • PID - rejestruje identyfikator procesu odbierającego żądanie (log_on_success),
  • USERID - rejestruje nazwę zdalnego użytkownika (log_on_failure i log_on_success).

Poniżej jeszcze przykład konfiguracji serwera Telnet z uwzględnieniem niektórych powyższych opcji.

 

 

Jak widać logi serwera Telnet są zapisywane w zdefiniowanym pliku: telnet.log, którego lokalizacja została zdefiniowana na katalog: /var/log/ Przykład zawartości pliku dziennika serwera zaprezentowano poniżej.

 

 

Protokół SSH (ang. Secure Shell - bezpieczna powłoka) został stworzony jako rozwiązanie, którego głównym zadaniem jest zabezpieczenie połączeń typu klient-serwer i stanowi alternatywę dla sesji wykorzystującej Telnet. Mając wybór użycia połączenia zawsze jest lepiej wybrać SSH.

 

Konfigurację połączenia SSH rozpoczynamy od instalacji niezbędnych pakietów. Aby móc nawiązać połączenie SSH należy zainstalować bibliotekę: openssh-server Instalację przeprowadzimy wydając polecenie: sudo apt-get install openssh-server

 

 

Poprawność instalacji możemy zweryfikować wydając polecenie: /etc/init.d/ssh status Jak można stwierdzić po analizie poniższego zrzutu serwer jest uruchomiony (punkt 1) oraz, że nasłuchuje na domyślnym porcie usługi czyli porcie TCP 22 (punkt 2).

 

 

Aby sprawdzić czy serwer rzeczywiście nasłuchuje na porcie TCP 22 możemy posłużyć się znanym nam już poleceniem: netstat

 

 

Dodatkową weryfikację możemy wykonać posługując się poleceniem: lsof -i:22 Wydanie komendy sprawdzi jaka usług nasłuchuje na zdefiniowanym porcie 22.

 

 

Wiemy już, że serwer SSH działa spróbujmy więc dokonać połączenia. W pierwszym kroku do nawiązania połączenia użyjemy systemu Linux a w następnym przykładzie systemu z rodziny Windows.

 

Połączenie nastąpi z hosta na którym jest zainstalowany system Ubuntu 14.04. A więc przed nawiązaniem połączenia sprawdzamy dostępność hosta (punkt 1) – serwer SSH o adresie IP 192.168.1.132 jest dostępny.

 

Aby móc nawiązać połączenie z powłoką hosta należy wydać polecenie: ssh <adres_IP_systemu_zdalnego> - punkt 2.

 

Przy próbie zestawiania pierwszego połączenia jesteśmy proszeni a potwierdzenie tego faktu. – tzw. „odcisk palca” serwera nie został zweryfikowany. Aby móc nawiązać połączenie wprowadzamy: yes (samo y nie wystarczy) – punkt 3.

 

Aby w pełni nawiązać połączenie musimy jeszcze podać hasło przypisane do konta luk – punkt 4.

 

Po podaniu hasła sesja zdalna z hostem o adresie IP 192.168.1.132 zostaje ustanowiona – punkt 5.

 

 

W przykładzie powyżej doszło do pewnego uproszczenia. Uważnemu Czytelnikowi na pewno przyjdzie do głowy pytanie – Skąd protokół wiedział by prosić o hasło przypisane do konta luk? Odpowiedź – zbieg okoliczności gdyż następuje połączenie z konta w systemie lokalnym o takiej samej nazwie jak ta zdefiniowana w systemie zdalnym. W naszym przypadku użytkownik z konta luk (komputer nawiązujący połączenie) chce się połączyć z system zdalnym wykorzystując poświadczenia przypisane również do konta luk.

 

Co zrobić jeśli chcemy do połączenia użyć poświadczenia innego konta? Należy połączenie wywołać za pomocą innej komendy. Aby móc zestawić połączenie z systemem zdalny z użyciem określonych poświadczeń wydajemy polecenie: ssh <nazwa_konta>@<adres_IP_systemu_zdalnego> Poniżej przykład zestawienia połączenia z konta lokalnego root z kontem zdalnym luk.

 

 

Połączenie SSH z wykorzystaniem systemu Linux zostało ustanowione.

 

Co zrobić w sytuacji w której połączenie będzie realizowane z komputera pracującego pod kontrolą systemu Windows? Do zestawienia zdalnej sesji SSH posłużymy się programem Putty. PuTTY jest bardzo popularnym a co najważniejsze bezpłatnym narzędziem za pomocą, którego możemy zestawić połączenie SSH lecz nie tylko gdyż program może również pełnić rolę klienta Telnet, Rlogin czy Serial (połączenie realizowane m.in. za pomocą złącza RS232 celem konfiguracji urządzeń np. przełączniki lub routery Cisco). Program działa zarówno pod kontrolą systemu Windows jak i Unix/Linux a dostępny jest w formie portable jak i instalatora. Program pobierzemy z tej strony: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

 

Po pobraniu aplikacji spróbujmy ją wykorzystać do ustanowienia połączenia SSH. Uruchamiamy narzędzie i przechodzimy do gałęzi Session (domyślnie uruchomiona karta).

 

W polu Host Name określamy adres IP zdalnego systemu (można skorzystać również z nazwy DNS) - punkt 1 a następnie w polu Port określamy docelowy port usługi (przydatne gdy usługa została skonfigurowana do działania na innym niż domyślnym porcie) - punkt 2. Kolejnym krokiem jest określenie sposobu prowadzenia dialogu z hostem docelowym - wybieramy SSH - punkt 3.

 

Sekcja Load, save or delete a stored session służy do zapisu sesji połączeń tak by można było się do nich odwoływać bez podawania danych niezbędnych do zestawienia sesji.

 

 

Po wpisaniu danych hosta zdalnego wybieramy przycisk Open. Podczas pierwszego połączenia będziemy poproszeni o zaakceptowanie alertu bezpieczeństwa związanego z brakiem w bazie tzw. „odcisku palca”. Wybieramy Tak.

 

 

Aby nasze połączenie doszło do skutku będziemy musieli podać login oraz hasło użytkownika. Jak widać poniżej po podaniu danych uwierzytelniających udało nam się zestawić połączenie z hosta o adresie IP 192.168.1.10 z hostem zdalnym 192.168.1.132

 

 

Tak jak wspomniałem z narzędzia PuTTY można również korzystać w systemie Linux.

 

 

Ci którzy preferują wiersz poleceń zainteresują się programem OpenSSH. System Windows domyślnie nie ma zaimplementowanych narzędzi za pomocą, których można by było zestawić połączenie SSH. Aby uzupełnić tę lukę wystarczy ze strony: https://sourceforge.net/projects/opensshwindows/ pobrać wyżej wspomnianą aplikację. Instalacja programu przebiega w sposób standardowy.

 

 

Aby przy pomocy pobranego i zainstalowanego narzędzia nawiązać połączenie SSH w pierwszym kroku należy przejść do katalogu instalacyjnego, domyślna ścieżka instalacji to: c:\program files\OpenSSh for Windows\bin (w przypadku systemu 64-bitowego ścieżka instalacji będzie miała postać: c:\program files (x86)\OpenSSh for Windows\bin)

 

Proces nawiązywania sesji rozpoczniemy po wydaniu polecenia: ssh <nazwa_użytkownika>@<adres_IP_hosta_zdalnego> Po zaakceptowaniu połączenia oraz podaniu danych uwierzytelniających połączenie z hostem zdalnym zostaje nawiązane.

 

 

Sesja z hostem zdalnym przy wykorzystaniu protokołu SSH została poprawnie skonfigurowana. Aby pokazać wyższość tego rozwiązania nad protokołem Telnet (szczególnie w kwestii bezpieczeństwa) spójrz na zrzut poniżej w którym został przedstawiony fragment sesji SSH. Jak można zauważyć przesyłanych informacji nie da się już odczytać w tak prosty sposób jak to było w przypadku sesji Telnet.

 

 

Naszą transmisję z hostem zdalnym możemy dodatkowo zabezpieczyć poprzez wybranie rozwiązania opartego na zastosowaniu kluczy - klucza prywatnego oraz klucza publicznego.

 

Zastosowany mechanizm bazujący na parze kluczy (prywatnym i publicznym) jest określane jako szyfrowanie asymetryczne gdyż za pomocą jednego klucza następuje szyfrowanie wiadomości zaś za jej odszyfrowanie odpowiada klucz drugi.

 

Aby sesja w wykorzystaniem kluczy mogła zostać nawiązana musimy wykonać następujące czynności:

1 - Rozpoczynamy od wygenerowania pary kluczy poprzez wydanie polecenia: ssh-keygen -t rsa Klucze są generowane dla użytkownika luk na hoście z którym będziemy chcieli ustanowić połączenie.

2 - Po wydaniu polecenia w pierwszej kolejności jest generowany klucz prywatny (domyślna nazwa klucza: id_rsa), klucze domyślnie zapisywane są w katalogu domowym użytkownika w ukrytym folderze .ssh Domyślną nazwę klucza i lokalizację możemy zmienić.

3 - Klucz dodatkowo zabezpieczamy hasłem.

4 - Po wygenerowaniu klucza prywatnego tworzony jest klucz publiczny - domyślna nazwa klucza to: id_rsa.pub, klucz zapisywany jest w tym samym katalogu co klucz prywatny.

5 - Graficzna mapa klucza.

 

 

Po wygenerowaniu pary kluczy należy je umieścić w odpowiedniej lokalizacji. I tu rodzi się pytanie - Gdzie i jaki klucz użyć? Klucz prywatny jest najważniejszy i to jego chronimy a jego użycie zostanie przedstawione za chwilę. Przechodzimy do klucz publicznego.

 

Domyślna lokalizacja klucza publicznego to serwer (host z którym będziemy chcieli nawiązać połączenie), katalog umiejscowienia klucza to folder .ssh, folder jest umiejscowiony w domowym katalogu użytkownika, którego poświadczenia użyjemy do wykonania stosownych operacji na serwerze (w naszym przypadku jest to użytkownik luk). Miejsce zapisu klucza publicznego zostało zdefiniowane w pliku: /etc/sshd_config w sekcji: AuthorizedKeysFile Edycja danych zawartych w tym pliku pozwoli nam na określenie dowolnej lokalizacji składowania kluczy publicznych użytkowników (w pliku mogą być zawarte klucze publiczne wielu użytkowników).

 

 

W naszym przypadku para kluczy została zapisana w folderze .ssh, który oczywiście jest umiejscowiony w katalogu domowym użytkownika luk. Po przejściu do katalogu .ssh (punkt 1) sprawdzamy czy klucze faktycznie zostały wygenerowane (punkt 2). Po stwierdzeniu istnienia kluczy musimy wykonać zapis klucza publicznego użytkownika luk do pliku authorized_keys. Zapis najlepiej jest wykonać przy wykorzystaniu komendy: cat (polecenie wyświetla zawartość pliku) z przekierowaniem (symbol >>) do pliku authorized_keys. Wydanie polecenia przedstawionego na poniższym zrzucie (punkt 3) spowoduje dopisanie zawartości pliku id_rsa.pub (klucz publiczny) do pliku authorized_keys. Przy wydawaniu polecenia zwróć uwagę na symbol przekierowania gdyż użycie symbolu: > spowoduje nadpisanie (zastąpienie) już istniejących danych.

 

 

Fakt dokonania zapisu zawartości pliku klucza publicznego do pliku authorized_keys możemy sprawdzić porównując je ze sobą. Jak widać poniżej zawartość plików jest ze sobą zgodna - informacje zawarte w kluczu publicznym zostały prawidłowo przeniesione.

 

 

Host zdalny został skonfigurowany. Czas więc przejść do konfiguracji komputera, który połączenie będzie nawiązywał.

 

Połączenie SSH z wykorzystaniem kluczy zostanie nawiązane z hosta działającego pod kontrolą systemu Linux z konta użytkownika root. Aby operacja zestawiania połączenia zakończyła się sukcesem musimy wykorzystać plik klucza prywatnego. Klucz prywatny musimy umieścić w katalogu .ssh użytkownika który będzie realizował połączenie. W pierwszej kolejności sprawdzamy fakt istnienia katalogu .ssh w folderze domowym użytkownika root - punkt 1. W razie jego braku z pomocą komendy: mkdir .ssh należy go utworzyć. Gdy katalog istnieje (bądź po jego utworzeniu) umieszczamy w nim plik klucza prywatnego: id_rsa (punkt 2 - zostało użyte polecenie cp odpowiedzialne za wykonanie procesu kopiowania) Po wykonaniu procesu kopiowania klucza prywatnego sprawdzamy poprawność wykonanych operacji - punkt 3. Klucz prywatny użytkownika luk został zapisany w katalogu .ssh użytkownika root.

 

 

Po wykonaniu opisanych czynności czas sprawdzić czy uda nam się nawiązać połączenie. Połączenie inicjujemy za pomocą znanej nam już komendy: ssh <nazwa_użytkownika>@<adres_komputera_zdalnego> Wydanie polecenia generuje błąd o braku zabezpieczenia pliku klucza prywatnego (WARRNING: UNPROTECTED PRIVATE KEY FILE) i niemożności jego wykorzystania a co za tym idzie użycie pliku klucza prywatnego zostaje pominięte.

 

 

Powodem błędu są nałożone prawa na plik id_rsa. Aby móc wykorzystać plik klucza prywatnego musimy dokonać takiej modyfikacji praw by tylko użytkownik nawiązujący połączenie mógł z tego pliku skorzystać. Uprawnienia do odczytu i zapisu pliku id_rsa przez użytkownika root nadamy wydając polecenie: chmod 600 id_rsa - punkt 1

 

Po zmianie uprawnień pliku wykonujemy kolejną próbę połączenia. Tym razem połączenie z wykorzystaniem pary kluczy udaje się nam nawiązać (oczywiście po podaniu hasła chroniącego plik klucza prywatnego) – punkt 2.

 

 

Co zrobić jeśli połączenie SSH z wykorzystaniem kluczy chcemy zestawić przy wykorzystaniu systemu Windows? Aby móc uzyskać połączenie z hostem zdalnym należy ponownie użyć narzędzia PuTTY. Lecz zanim będziemy mogli użyć PuTTY musimy dokonać konwersji pliku klucza prywatnego tak aby móc go użyć z programem.

 

Do przeprowadzenia konwersi użyjemy dedykowanego programu PuTTY Key Generator (do pobrania ze strony: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html nazwa pliku: puttygen, narzędzie jest standardowo dostępne w systemie gdy pobraliśmy instalator programu PuTTY a nie wersję portable).

 

Po uruchomieniu programu z górnego menu wybieramy Converions a następnie Import key.

 

 

Aby móc dokończyć wczytywanie klucza należy wprowadzić hasło klucza prywatnego (oczywiście jeśli takowe hasło zostało zdefiniowane).

 

 

Po wprowadzeniu wszystkich danych import klucza prywatnego zakończy się sukcesem. Po wczytaniu klucza by zapisać go w wymaganym formacie należy wybrać przycisk Save private key

 

 

Po wybraniu opcji definiujemy nazwę oraz lokalizację zapisu pliku klucza.

 

 

Plik klucza prywatnego został zapisany w formacie PPK i jest gotowy do użycia z narzędziem PuTTY.

 

Aby móc zestawić sesję zdalną z wykorzystaniem plików kluczy uruchamiamy aplikację PuTTY. Standardowo w sekcji Host Name określamy adres IP i port systemu zdalnego, dodatkowo musimy określić lokalizację pliku klucza prywatnego. Aby wykonać to zadanie przechodzimy do gałęzi SSH a następnie po jej rozwinięciu wybieramy Auth. Lokalizację klucza prywatnego określamy po wybraniu przycisku Browse.

 

 

Po wprowadzeniu wszystkich danych nie pozostaje nam nic innego jak kliknąć na przycisk Open. Następuje próba nawiązania połączenia SSH, która jak widać poniżej po podaniu hasła do klucza prywatnego zostaje ustalona.

 

 

Udało nam się nawiązać połączenie SSH z wykorzystaniem klucza prywatnego i publicznego, połączenie nastąpiło z systemu Windows przy wykorzystaniu narzędzia PuTTY.

 

Wraz z instalacją obsługi funkcji SSH uzyskujemy możliwość bezpiecznego kopiowania plików. Kopiowanie plików może zostać zrealizowane za pomocą protokołu SCP lecz także protokołu SFTP.

 

Protokół SCP (ang. Secure copy) do wykonania procesu przesyłu plików pomiędzy zdalnymi hostami korzysta z zabezpieczonego połączenia. Oprócz zapewnienie bezpieczeństwa transferu plików (choć w implementacji protokołu brak funkcji uwierzytelniania) przy wykorzystaniu SSH zapewnia on przekazanie wraz z przesyłanym plikiem jego atrybutów.

 

SFTP (ang. SSH File Transfer Protocol) – to protokół komunikacyjny typu klient-serwer, który umożliwia przesyłanie plików poprzez sieć TCP/IP. Wykorzystanie protokołu FTP do zapisu/odczytu plików gwarantuje nam poprawność przeprowadzanej operacji lecz bez zachowania bezpieczeństwa – nasze hasła i dane tak samo jak przy użyciu protokołu Telnet nie są szyfrowane, co potencjalnie naraża nas na ich kradzież. Znaczną poprawę bezpieczeństwa przynosi protokół SFTP, który nie wymaga obecności serwera FTP, a przesyłane dane są szyfrowane z wykorzystaniem klucza szyfrującego. SFTP nie powinien być mylony z protokołem FTPS, który jest rozszerzeniem protokołu FTP.

 

Przetestujmy więc przesył plików z wykorzystaniem wyżej wspomnianych protokołów. Rozpoczniemy od protokołu SCP z wykorzystaniem hosta pracującego pod kontrolą systemu Linux.

 

Aby przesłać plik na host zdalny musimy użyć polecenia, którego ogólna składnia przedstawia się następująco: scp <ścieżka_do_pliku_wysyłanego> <użytkownik>@<adres_hosta_zdalnego>:<lokalizacja_zapisu_przesyłanego_pliku> Poniżej na zrzucie przedstawiono przykład w którym przesłano plik: do_wyslania, plik został zapisany w katalogu domowym użytkownika luk (znak tyldy oznacza katalog domowy). Do wysłania użyto poświadczeń użytkownika luk.

 

 

Po przejściu na hosta zdalnego i wydaniu polecenia: ls widać iż plik został przesłany prawidłowo.

 

 

Podczas korzystania z narzędzia scp mamy szereg flag za pomocą, których możemy skonfigurować narzędzie. Poniżej kilka z nich:

-1 - wymuszenie użycia pierwszej wersji protokołu,

-2 - wymuszenie użycia drugiej wersji protokołu,

-4 - adresacja oparta o IPv4,

-6 - adresacja oparta o IPv6,

-B - włączenie trybu wsadowego,

-P <port> - zdalny por na którym została uruchomiona usługa serwera SSH (przydatne w sytuacjach w których SSH działa na niestandardowym porcie),

-i <ścieżka_do_pliku_klucza> - opcja wykorzystywana podczas ustanawiania połączenia opartego o klucze,

-l <limit> - definicja limitu transferu danych (wartość ta wyrażana jest w Kb/s),

-p - nakaz zachowania atrybutów pliku tj. czas modyfikacji, prawa dostępu,

-r - włącza kopiowanie rekurencyjne (przydatne w sytuacji kiedy chcemy wykonać kopiowanie wszystkich plików zawartych w katalogu), 

-q - uruchomienie paska postępu,

-v - włącza tryb debugowania (opcji tej użyj gdy występuje problem z przekazywaniem plików).

 

Aby proces kopiowania przeprowadzić z lokalizacji zdalnej na host lokalny należy użyć polecenia: scp <użytkownik>@<adres_hosta_zdalnego>:<lokalizacja_pliku_kopiowanego> <lokalizacja_zapisu_pliku>

 

W przypadku systemu Windows możemy skorzystać m.in z narzędzia wiersza poleceń scp zawartego po instalacji OpenSSH (opis narzędzi wykorzystujących GUI za chwilę). Aby zapisać plik na hoście zdalnym należy skorzystać z bliźniaczego polecenia scp dostępnego w systemie Linux. Składnia polecenia jest identyczna. Poniżej przedstawiono przykład zapisu pliku: do_wyslania_2.txt i tak jak to opisano w poprzednim kroku plik również zapiszemy w katalogu domowym użytkownika luk z wykorzystaniem tych samych poświadczeń.

 

 

Po wysłaniu pliku sprawdzamy fakt zapisu po stronie hosta zdalnego. Ponowne wydanie polecenia: ls przekonuje nas o prawidłowości wykonania całej operacji.

 

 

Do zapisu plików z wykorzystaniem protokołu SCP możemy również użyć narzędzia pscp zawartego po instalacji programu PuTTY (aplikacje możemy pobrać oddzielnie). Aby przesłać plik należy skorzystać z komendy: pscp <ścieżka_do_pliku_wysyłanego> <użytkownik>@<adres_hosta_zdalnego>:<lokalizacja_zapisu_przesyłanego_pliku> Poniżej przykład zapisu pliku: do_wyslania_3.txt

 

 

Sprawdzenie poprawności z wykorzystaniem polecenia: ls potwierdza fakt zapisu pliku.

 

 

Pomimo możliwości skorzystania z narzędzi opartych o protokół SCP znacznie częściej wykorzystuje się te wspierające SFTP (m.in. dlatego iż za pomocą SFTP możemy skorzystać z transmisji opartej o uwierzytelnienie oparte o klucze). Znacznie łatwiej do przesyłu plików używać narzędzi graficznych ponieważ aplikacje te ułatwiają nam wykonanie całości zamierzonych zadań w szczególności gdy trzeba przeglądać złożone struktury katalogów. Jednym z takich narzędzi jest: mc (pierwowzorem narzędzia był stary, dobry Norton Commander - Ci trochę starsi na pewno wiedzą o co chodzi). Po pobraniu i zainstalowaniu programu (operację wykonujemy w systemie Linux) wybieramy z Menu opcję Lewy bądź Prawy a następnie Połączenie SFTP. Wybranie opcji umożliwi nam nawiązanie połączenia z hostem zdalnym.

 

 

Aby móc nawiązać połączenie w oknie Połączenie SFTP z komputerem podajemy nazwę użytkownika oraz adres IP hosta zdalnego.

 

 

Aby dokończyć zestawianie połączenia niezbędne będzie również hasło użytkownika.

 

 

Po wprowadzeniu wszystkich niezbędnych danych połączenie z wykorzystaniem protokołu SFTP zostaje ustanowione. Po ustaleniu połączenia możemy przeprowadzać operacje związane z kopiowaniem plików (oczywiście proces kopiowania odbywa się w obu kierunkach).

 

 

Narzędzie mc umożliwia nam także zestawienie połączenia po powłoce. Wybranie żądania dostępne jest po wybraniu opcji: Połączenie po powłoce Uzyskanie połączenia przebiega w analogiczny sposób jak z wykorzystaniem protokołu SFTP. Po zestawieniu połączenia uzyskujemy możliwość wykonywania poleceń, których działanie będzie przeprowadzane na hoście zdalnym.

 

 

Jednym z narzędzi za pomocą, którego będziemy mogli przesłać pliki z wykorzystaniem protokołu SFTP jest aplikacja psftp (dostępna po instalacji PuTTY lub do pobrania jako oddzielny plik). Narzędzie wykorzystuje wiersz poleceń.

 

Aby móc korzystać z narzędzia należy wywołać polecenie: psftp (punkt 1) a następnie za pomocą komendy open <nazwa_użytkownika>@<adres_hosta> (punkt 2) określić dane niezbędne do nawiązania połączenia z hostem zdalnym. Po podaniu hasła sesja zostaje ustalona. Wydanie polecenia wylistowania plików na hoście zdalnym kończy się sukcesem (punkt 3) - połączenie zostało zestawione prawidłowo.

 

 

Opis dostępnych opcji uzyskamy (jak to jest zazwyczaj przy użyciu narzędzi opartych o wiersz poleceń) po wydaniu polecenia help.

 

 

Przydatne komendy:

! - uruchomienie komendy, polecenie jest wykonywanie lokalnie,

bye - kończenie sesji SFTP,

cd - zmiana katalogu, polecenie wykonywane na hoście zdalnym,

chmod - zmiana uprawnień pliku, polecenie wykonywane na hoście zdalnym,

close - zamknięcie sesji lecz bez wyjścia z programu psftp,

del - skasowanie pliku, polecenie wykonywane na hoście zdalnym,

dir - listening katalogów i plików,

get - pobranie pojedynczego pliku z serwera

help - pomoc,

lcd - ustalenie lokalnej lokalizacji zapisu ściąganych plików,

lpwd - sprawdzenie lokalnej lokalizacji zapisu,

ls - wylistowanie zawartości folderu,

mget - pobranie wielu plików z hosta zdalnego,

mkdir - utworzenie katalogu na hoście zdalnym,

mput - wysłanie wielu plików na serwer,

mv - przeniesienie bądź zmiana nazwy plików,

open - nawiązanie sesji z hostem zdalnym,

put - wysłanie pliku na serwer,

pwd - sprawdzenie lokalizacji zapisu pliku,

reget - kontynuacja ściągania pliku,

ren - przeniesienie bądź zmiana nazwy plików,

reput - kontynuacja przesyłania pliku,

rm - usunięcie pliku ze zdalnej stacji roboczej,

rmdir - usunięcie folderu ze zdalnej stacji roboczej.

 

Prócz narzędzi działających w wierszu poleceń możemy skorzystać z tych opartych o interfejs graficzny. Jednym z takich programów działających pod kontrolą systemu Windows jest WinSCP. Program ten umożliwi nam wykonanie operacji bezpiecznego przesyłania plików z wykorzystaniem SSH (SCP/SFTP). Aplikacja ta jest również klientem FTP.

 

Po pobraniu narzędzia z strony: https://winscp.net/eng/download.php przechodzimy do jego instalacji (aplikacja dostępna jest również w wersji portable). Po uruchomieniu pliku instalatora będziemy mogli dokonać wyboru przebiegu procesu instalacji - wybieramy: Niestandardowa instalacja

 

 

Wybranie opcji pozwoli nam na określenie komponentów (wraz z językiem interfejsu), które zostaną zainstalowane wraz z programem.

 

 

Na kolejnym ekranie możemy zdecydować o opcjach dodatkowych takich jak: aktualizacje automatyczne, lokalizacji skrótów czy dodanie katalogu instalacyjnego do zmiennej PATCH (przydatne podczas korzystania z wiersza poleceń gdyż by wywołać dane narzędzie nie musimy znajdować się w katalogu instalacyjnym programu).

 

 

Ostatnią decyzją jest określenie stylu interfejsu programu. Możemy wybrać pomiędzy stylem znanym z Eksploratora bądź z takiego narzędzia jak Total Commander.

 

 

Po określeniu wszystkich opcji nastąpi instalacja programu.

 

Po uruchomieniu narzędzia w oknie Zaloguj możemy określić protokół z którego będziemy korzystać.

 

 

Połączenie z hostem następuje po podaniu nazwy hosta, portu oraz danych uwierzytelniających.

 

 

Wybranie opcji Logowanie spowoduje wykonania połączenia z hostem zdalnym. Podczas nawiązywania pierwszego połączenia będziemy musieli zaakceptować odcisk palca serwera.

 

 

Wybranie Tak spowoduje ustanowienie połączenia. Jak widać poniżej sesja z hostem zdalnym została nawiązana.

 

 

Po ustanowieniu połączenia oprócz kopiowania plików będziemy mieli możliwość skorzystania z konsoli. Konsola umożliwia nam wydawanie poleceń, które będą wykonywane na hoście zdalnym.

 

 

Dodatkowo gdy mamy zainstalowane narzędzie PuTTY możemy je bezpośrednio wywołać z okna programu WinSCP. Po uruchomieniu PuTTY zostanie nawiązana osobna sesja z hostem zdalnym.

 

 

WinSCP umożliwia uzyskanie połączenia również z wykorzystaniem mechanizmu opartego o klucz prywatny i publiczny. Jako podsumowanie całego wpisu przyjmijmy o to taki scenariusz iż do połączenia asymetrycznego wykorzystamy parę kluczy wygenerowanych za pomocą narzędzia PuTTYgen. Logowanie na hoście zdalnym zostanie wykonane na koncie luk.

 

Narzędzie PuTTYgen możemy uruchomić bezpośrednio z poziomu WinSCP (o ile zostało zainstalowane) wybierając po uruchomieniu programu przycisk Narzędzia a następnie Uruchom PuTTYgen. PuTTYgen możemy również pobrać bezpośrednio z sieci.

 

 

Po uruchomieniu aplikacji PuTTYgen wybieramy opcję Generate. Domyślne parametry klucza możemy pozostawić bez zmian tj. RSA i długość klucza 2048.

 

 

Aby zakończyć generowanie kluczy poruszamy kursorem w obrębie okna uruchomionej aplikacji.

 

 

Po wygenerowaniu kluczy, klucz prywatny zabezpieczamy hasłem – punkt 1 a następnie za pomocą przycisku Save public key zapisujemy klucz publiczny – punkt 2. Ostatnią czynnością jaką musimy wykonać to zapis klucza prywatnego, klucz zapisujemy z wykorzystaniem opcji Save private key – punkt 3.

 

 

Aby móc zestawić połączenie asymetryczne należy wygenerowany klucz publiczny zapisać w pliku authorized_keys. Klucz prześlemy z wykorzystaniem protokołu SFTP – na tym etapie wykorzystujemy poświadczenia konta luk, należące do użytkownika, którego konto znajduje się na hoście zdalnym.

 

 

Przed ustanowieniem połączenia warto w opcjach aplikacji WinSCP włączyć wyświetlanie ukrytych folderów (ponieważ plik authorized_keys jest zapisany w ukrytym folderze .ssh). Włączenie pokazywania ukrytych plików zrealizujemy po przejściu do Ustawień programu WinSCP (aby włączyć ustawienia należy w głównym oknie programu wybrać przycisk Narzędzia a następnie Preferencje) i wybraniu gałęzi Panele. Stosowna opcja znajduje się w sekcji Ogólne.

 

 

Po ustanowieniu połączenia plik w którym zapisano wygenerowany klucz publiczny kopiujemy do katalogu .ssh (folder ten powinien znajdować się w katalogu domowym użytkownika luk). W scenariuszu tym kopiowany plik nosi nazwę: klucz_publiczny

 

 

Po przekopiowaniu pliku: klucz_publiczny jego zawartość kopiujemy do pliku authorized_keys. Operację tę wykonamy za pomocą znanego już nam polecenia: cat.

 

 

Po zapisie klucza publicznego czas by podjąć próbę nawiązania połączenia zdalnego. Testową próbę wykonamy za pomocą narzędzia PuTTY. Po skonfigurowaniu narzędzia jak widać poniżej próba kończy się niepowodzeniem, gdyż serwer odrzucił nasz klucz.

 

 

Winą odrzucenia klucza jest format jego zapisu. Aby móc wykorzystać klucz publiczny z narzędziem OpenSSH należy dane zawarte w nim odpowiednio sformatować. Musimy wykonać dwie czynności.

 

Po otwarciu pliku zawierającego klucz publiczny (dokonujemy tego w dowolnym edytorze tekstu) kasujemy zaznaczone na poniższym zrzucie linie.

 

 

Druga czynność jaką musimy wykonać to umieszczenie całości wygenerowanych danych w jednym wierszu poprzez usunięcie znaków końca wiersza (całość klucza musi być zapisana w pojedynczym wierszu) a następnie umieszczeniu na początku wiersza zapisu: ssh-rsa. Tak zmodyfikowany plik należy zapisać a następnie umieścić jego zawartość w pliku authorized_keys.

 

 

Tu muszę przyznać się że zamierzony efekt (próba połączenia zakończona sukcesem) da się osiągnąć znacznie łatwiej gdyż już na etapie wygenerowania pary kluczy przez narzędzie PuTTYgen można było uzyskać odpowiedni format klucza publicznego. Wystarczyło przekopiować dane z sekcji Key do pliku tekstowego by w następnym kroku umieścić je w pliku authorized_keys.

 

 

Lecz specjalnie wybrałem ścieżkę na okrętkę by pokazać na jakie trudności możemy się natknąć przy próbie konfiguracji połączenia SSH z wykorzystaniem kluczy wygenerowanych za pomocą innych narzędzi.

 

Po umieszczeniu danych klucza publicznego na serwerze zdalnym możemy przejść do zestawienia sesji SFTP z wykorzystaniem narzędzia WinSCP oraz klucza prywatnego.

 

Po uruchomieniu WinSCP w pierwszym kroku określamy adres hosta zdalnego (pola Nazwa użytkownika oraz Hasło specjalnie zostały puste – podczas ustanawiania połączenia program poprosi o te dane) – punkt 1. W kroku drugim określamy lokalizację klucza prywatnego (ścieżkę do klucza prywatnego określimy po wybraniu przycisku Zaawansowane a następnie w nowo otwartym oknie w sekcji Parametry identyfikacyjne dostępnej w gałęzi SSH --> Uwierzytelnienie) – punkt 2.

 

 

Po konfiguracji narzędzia WinSCP możemy przeprowadzić próbę połączenia. Jak widać poniżej opuszczone parametry musimy podać w trakcie nawiązywania połączenia. Połączenie odbywa się z wykorzystaniem klucza prywatnego. Aby połączenie mogło zostać sfinalizowane podajemy hasło chroniące klucz prywatny.

 

 

Wszystko przebiegło po naszej myśli - udało nam się ustanowić sesję SFTP z wykorzystaniem uwierzytelnienia opartego o szyfrowanie asymetryczne.

 

 

Konfiguracja systemu Linux odnośnie nawiązywania połączeń zdalnych nie jest trudna a mam nadzieję, że poradnik ten wątpliwości w tej kwestii rozwiewa.

 


BIBLIOGRAFIA:

 

SSH Tutorial for Linux - Support Documentation

How can the Telnet service on Ubuntu Server 14.04 LTS be enabled? - Ask Ubuntu

Install and Enable Telnet server in Ubuntu Linux - Ubuntu Sharing

xinetd Configuration Files Fixing “WARNING: UNPROTECTED PRIVATE KEY FILE!” on Linux

Key-Based SSH Logins With PuTTY

Microsoft Word - ANSI_C_Linux_SSH - ANSI_C_Linux_SSH.pdf

SCP copy windows local file to linux remote folder - Server Fault

10 SCP Commands to Transfer Files/Folders in Linux

]]>
[email protected] (pikolo) Linux Wed, 10 Aug 2016 15:48:46 +0000
Dogadać się z Linuksem. Zarządzanie kontem użytkownika. http://slow7.pl/linux/item/113-dogadac-sie-z-linuksem-zarzadzanie-kontem-uzytkownika http://slow7.pl/linux/item/113-dogadac-sie-z-linuksem-zarzadzanie-kontem-uzytkownika

To, że z danego komputera może korzystać wiele osób nie jest żadną tajemnicą i stwierdzeniem tym nikogo nie zaskoczę. Oznacza to nie mniej, ni więcej, że dane urządzenie może służyć wielu osobom. Lecz by takie rozwiązanie zdało egzamin należało opracować mechanizm ochrony zapisanych plików różnych użytkowników czy uruchomionych procesów tak by dany użytkownik nie skasował danych nie należących do niego czy nie przerwał zadań uruchomionych przez innego użytkownika. Tak więc w tym wpisie postaram się omówić zagadnienia związane z użytkownikiem tj. kontem użytkownika, hasłami czy przynależnością do danej grupy.

Na początek zacznijmy od omówienia informacji zawartych w plikach: /etc/shadow oraz /etc/passwd gdyż w tych dwóch plikach są zapisane informacje dotyczące stworzonych kont użytkowników a opisywane narzędzia do tych danych często będą sięgały.

Plik /etc/passwd jest plikiem tekstowym w którym przechowywana jest informacja na temat zdefiniowanej nazwy użytkownika wraz z przydzielonym identyfikatorem. Zawartość tego pliku przedstawia się następująco:

 

 

Uważny Czytelnik na pewno zauważy, że każdy wiersz w pliku /etc/passwd reprezentuje jednego użytkownika a ten bardziej dociekliwy, że w wierszu tym znajduje się siedem pól oddzielonych od siebie dwukropkami (:). Każde z pól przechowuje inną informację o użytkowniku. Definicja pól obejmuje:

 

1 - nazwę użytkownika,

2 - hasło użytkownika - hasło w systemie Linux nie jest zapisywane w sposób jawny a jego lokalizacja to plik /etc/shadow Znak x widoczny w drugim polu pliku /etc/passwd oznacza właśnie, że hasła należy szukać w wspomnianym pliku /etc/shadow Przeglądając plik /etc/passwd możemy natknąć się również na znak * oznaczający niemożność zalogowania się do systemu zaś puste pole (dwa dwukropki obok siebie) oznacza brak zdefiniowanego hasła (logowanie bez hasła).

3 - identyfikator użytkownika (ang. user ID - czyli UID) - numer opisujący danego użytkownika. Dozwolone jest by numer UID w systemie był powielony lecz może prowadzić to do nieoczekiwanych błędów dlatego przyjmuje się niepowtarzalność identyfikatora UID.

4 - identyfikator grupy podstawowej (ang. group ID - czyli GID) - identyfikator określa przynależność do grupy o danym identyfikatorze. Powiązanie nazwy grupy z identyfikatorem znajduje się w pliku /etc/group,

5 - pole GECOS - prawdziwa nazwa użytkownika. W polu tym mogą być również zapisane inne informacje np. numer telefonu. Informacje te od siebie oddzielone są przecinkiem,

6 - lokalizacja katalogu domowego użytkownika,

7 - powłoka użytkownika.

 

 

Analizując zrzut na którym przedstawiono przykładowy plik /etc/passwd można wyróżnić szereg kont nie będących przypisanych do konkretnych osób, konta te należą do tzw. użytkowników specjalnych. Konta te przynależne są usługom a także użytkownikom, którzy wymagają specjalnych uprawnień. Np. superużytkownik (root) identyfikator UID oraz GID zawsze ma zdefiniowany na wartość 0 zaś użytkownik nobody jest kontem, któremu odebrano prawo do zapisu. W literaturze można spotkać się z określeniem nazywającym takie konta jako pseudoużytkownicy. Z reguły za pomocą takich kont nie można zalogować się do systemu lecz sam system konta te może używać do uruchamiania procesów.

 

Plik /etc/shadow standardowo przechowuje informację na temat uwierzytelniania użytkowników tj. dane na temat hasła i jego ważności. Przykładowy plik /etc/shadow pokazano na rysunku poniżej.

 

 

Poszczególne pola pliku i ich opis:

 

1 - nazwa użytkownika - nazwa ta jest tożsama z nazwą w pliku /etc/passwd Nazwa łączy wpis hasła z polem użytkownika.

2 - zaszyfrowane hasło - skrót funkcji MD5,

3 - data ostatniej zmiany hasła - czas ostatniej modyfikacji hasła, pole to jest wypełniane przez polecenie passwd.

4 - minimalna liczba dni między zmianami hasła - określa liczbę dni, które muszą upłynąć między zmianami hasła

5 - maksymalna liczba dni między zmianami hasła - określa maksymalną liczbę dozwolonych dni między zmianami hasła. Rzeczywista maksymalna liczba dni jest sumą wartości tego pola oraz wartości z pola siódmego (tzw. okres łaski).

6 - liczba dni określającą komunikat o wygaśnięciu hasła,

7 - liczba dni definiowana od czasu wygaśnięcia hasła, po upływie których konto zostanie wyłączone,

8 - data ważności konta - dzień (liczony od 1 stycznia 1970 roku) wygaśnięcia konta użytkownika. Po przekroczeniu tej daty użytkownik traci możliwość logowania.

9 - pole zarezerwowane - do wykorzystania w przyszłości

 

 

Aby założyć konto nowemu użytkownikowi możemy wykorzystać polecenie: useradd Ogólna składnia polecenia wygląda następująco: useradd <opcje> nazwa_użytkownika Poniżej na listeningu przykład utworzenia konta dla użytkownika: jankow

 

1 - za pomocą polecenia: useradd jankow zostaje utworzone nowe konto,

2 - zmiana użytkownika,

3 - sprawdzenie za pomocą komendy: whoami nazwy aktualnego użytkownika.

 

 

Po utworzeniu nowego konta warto zadbać o przypisanie do niego hasła. Administrator systemu zmianę hasła pozostawił użytkownikowi jankow. Tak więc użytkownik za pomocą polecenia: passwd próbuje takową operację wykonać. Niestety po wydaniu polecenia napotykamy na nieoczekiwany problem a mianowicie system prosi nas o podanie aktualnego hasła. O jakie hasło chodzi? Przecież jedynie zostało utworzone tylko konto, hasło zaś nie było definiowane.

 

 

Utworzenie użytkownika w ten sposób powoduje wyłączenie konta poprzez wstawienie znaku x w polu przeznaczonym na hasło (plik /etc/passwd).

 

 

Jak już wiesz znak x celem identyfikacji hasła odsyła do pliku /etc/shadow lecz pole hasła zawiera znak ! którego obecność skutecznie blokuje zmianę hasła.

 

 

Aby użytkownik jankow mógł samemu zdefiniować hasło należy w pliku /etc/passwd w linii odpowiadającej danemu użytkownikowi w polu hasła wykasować znak x. Oczywiście zmianę tą musi wykonać użytkownik root.

 

 

Po przeprowadzonej modyfikacji i po ponownym wydaniu polecenia: passwd nie będziemy już proszeni o podanie aktualnego hasła lecz będziemy mogli od razu przypisać nowe hasło.

 

 

Znacznie lepszym rozwiązaniem jest utworzenie konta i przypisanie nowo utworzonemu kontu hasła. Poniżej na przykładzie utworzenie konta dla użytkownika tadnow (punkt 1) oraz przypisanie hasła (punkt 2). Wszystkie operację wykonał użytkownik root.

 

 

Oczywiście polecenie useradd pozwala na skonfigurowanie szerszej gamy opcji związanych z tworzonym kontem. W zależności od potrzeb możemy zdefiniować np. czas po którym konto zostanie wyłączone, do jakiej grupy podstawowej użytkownik ma należeć, czy określić lokalizację katalogu domowego.

 

Poniżej przedstawiono przykład utworzenia konta użytkownika sonkie przy czym dodatkowo za pomocą parametru -e zdefiniowano ważność konta tj. datę do kiedy konto jest aktywne.

 

 

Uruchomienie polecenia useradd z opcją -D, spowoduje wyświetlenie informacji o domyślnych ustawieniach. Ustawienia te są definiowane w pliku: /etc/default/useradd Modyfikacja i definicja tych parametrów pozwala nam na tworzenie kont z góry określonymi opcjami.

 

 

  • GROUP - nazwa lub ID grupy domyślnej,
  • HOME - katalog określający folder przechowywania katalogów domowych użytkowników,
  • INACTIVE – parametr określa liczbę dni od daty wygaśnięcia hasła po której następuje blokada konta. Wartość: -1 - opcja jest wyłączona, wartość: 0 – wygaśnięcie ważności hasła powoduje automatyczną blokadę konta, wartość: dodatnia (liczba) – ilość dni.
  • EXPIRE - data wyłączenia konta,
  • SHELL - nazwa powłoki systemowej użytkownika,
  • SKEL – lokalizacja katalogu z którego zostaną skopiowane pliki i foldery do katalogu domowego nowo utworzonego użytkownika.

 

Aby dokonać zmiany opcji domyślnych wykorzystujemy polecenie, którego ogólna składnia przedstawia się następująco: useradd -D <opcje> Tak więc np. chcąc ustalić datę wygaśnięcia konta na 2016-01-25 (patrz rysunek powyżej) należy użyć polecenia z opcją: -e po której określamy datę w formacie YYYY-MM-DD – useradd -D -e 2016-01-25

 

Opcje domyślne narzędzia useradd możemy również określić poprzez bezpośrednie edytowanie pliku - /etc/default/useradd

 

 

Inne przydatne opcje związane z poleceniem: useradd przedstawiono poniżej:

 

-s <powłoka> - określenie powłoki użytkownika,

-d <katalog_domowy> - określenie lokalizacji katalogu domowego użytkownika,

-u <wartość> - określenie identyfikatora UID,

-g <nazwa_grupy> - definicja grupy podstawowej użytkownika,

-G <nazwa_grupy>,<nazwa_grupy> - definicja grup, których członkiem stanie się użytkownik,

-m - zdefiniowanie ustawień konta poprzez skopiowanie plików z szablonu (katalog: /etc/skel>, gdy pliki konfiguracyjne znajdują się w innym katalogu należy użyć przełącznik -k.

 

Innym narzędziem, którym możemy posłużyć się aby utworzyć konto użytkownika jest adduser. Wykonanie operacji utworzenia konta sprowadza się do wydania polecenia: adduser <nazwa_konta> i po udzieleniu odpowiedzi na postawione pytania konto użytkownika zostaje założone. Poniżej na rysunku przykład wykorzystania narzędzia adduser do utworzenia konta użytkownika tomwal.

 

 

Aby danemu użytkownikowi zdefiniować hasło to jak już wiesz Czytelniku należy posłużyć się poleceniem passwd. Ale narzędzie oprócz zmiany/ustalenia hasła pozwala nam na wykonie jeszcze kilku czynności. Ogólna składnia polecenia jest następująca: passwd <opcje> <konto_użytkownika> Bez zdefiniowania parametrów, poprzez wydanie samej komendy: passwd następuje zmiana hasła użytkownika w kontekście, którego polecenie zostało wydane.

 

Aby poznać zdefiniowane opcje powiązane z naszym hasłem możemy posłużyć się poleceniem passwd z ustawioną flagą -S passwd -S Po wydaniu polecenia uzyskamy informację o:

 

  • login,
  • status hasła – L - hasło jest zablokowane, NP - brak ustalonego hasła, P – hasło jest ustawione,
  • data ostatniej zmiany hasła,
  • minimalny czas życia hasła,
  • maksymalny czas życia hasła
  • czas ostrzeżenia o zmianie hasła, oraz nieaktywny okres czasu hasła. Czas ten wyrażony jest w dniach.
  • liczba dni po której następuje blokada konta.

 

 

Zastosowanie flagi -e wraz w połączeniu z nazwą konta spowoduje wymuszenie zmiany hasła.

 

Poniżej przedstawiono przykład wymuszenia zmiany hasła na koncie beatry (punkt 1). Po zmianie konta jesteśmy poinformowani o potrzebie natychmiastowej zmiany hasła (punkt 2). Użytkownik za pomocą narzędzia passwd dokonuje próby jego zmiany (punkt 3). W pierwszym podejściu hasła nie udaje się zmienić z powodu zdefiniowania zbyt prostego hasła – hasło: qwerty (punkt 4). Drugie podejście również kończy się niepowodzeniem - powód - zdefiniowane hasło jest identyczne z poprzednim (punkt 5). Dopiero trzecia próba kończy się sukcesem (do trzech razy sztuka - punkt 6).

 

 

Ustalenie minimalnego czasu życia hasła dokonujemy za pomocą przełącznika -n zaś wartość maksymalną możemy określić poprzez zastosowanie flagi -x. Użycie któregokolwiek z przełączników wymusza na nas określenie wartości dni konfigurowanej opcji.

 

 

Czas ostrzeżenia o potrzebie dokonania zmiany hasła określimy z wykorzystaniem przełącznika -w.

 

 

Zaś hasło skasujemy z wykorzystaniem flagi -d.

 

 

Poleceniem, które pozwoli nam na zmodyfikowanie parametrów utworzonych kont jest usermod.

 

Poniżej przykład wykorzystania komendy usermod do odblokowania konta, które wygasło.

 

Po zmianie konta użytkownika na beatry uzyskujemy komunikat o wygaśnięciu konta (punkt 1). Aby konto znów stało się aktywne należy ustalić nową datę wygaśnięcia konta. Nowa data zostaje ustalona z wykorzystaniem komendy usermod oraz flagi -e (punkt 2 - data wygaśnięcie konta zostaje ustalona na 3 marca 2016). Po ponownej zmianie konta na beatry (punkt 3) jesteśmy poinformowani o zbliżającym się terminie wygaśnięcia hasła tak więc za pomocą już omówionego polecenia: passwd ustalamy nowe hasło.

 

 

Polecenie: usermod posiada przełącznik, który możemy wykorzystać do zablokowania dostępu do konta (brak możliwości zalogowania). Aby dane konto stało się nie aktywne wykorzystujemy do tego flagę: -L (po uaktywnieniu próba zalogowania się kończy się komunikatem o nieprawidłowym haśle).Poniżej na przykładzie wyłączenie konta alebin. Aby konto, znów działało należy wykorzystać opcję: -U.

 

 

Kasowanie konta odbywa się za pomocą polecenia: userdel. Na zrzucie poniżej przykład usunięcia konta użytkownika tomwal.

 

 

Wydanie polecenia kasowania konta usunie konto z systemu lecz zostaną pozostawione pliki użytkownika w jego katalogu domowym. Aby usunąć również pliki do polecenia userdel należy dodać parametr -r.

 

Z zasady użytkownicy swoje pliki powinni trzymać w swoim katalogu domowym lecz często zdarza się, że pliki są zapisywane w różnych lokalizacjach. Aby system po użytkowniku dokładnie posprzątać warto wyszukać i usunąć wszystkie pliki przynależne kasowanemu użytkownikowi. Aby odszukać takowe pliki należy skorzystać z polecenia: find / -user <nazwa_użytkownika>

 

Skryptem, który pozwoli nam na sprawdzenie integralność plików /etc/passwd oraz /etc/shadow jest: pwck Wydanie polecenia sprawi, że pliki zostaną sprawdzone pod kątem składni oraz zawartych odwołań. Aby wyświetlić same informacje (tryb tylko do odczytu) należy posłużyć się flagą -r Wydanie samego polecenia pwck w razie wykrycie problemu wyświetli komunikat z zapytaniem o potwierdzenie wykonania danej operacji.

 

 

Polecenie: logname odpowiedzialne jest za wyświetlenie nazwy logowania danego użytkownika.

 

 

Polecenie, które możemy wykorzystać aby poznać poświadczenia aktualnie aktywnego użytkownika jest komenda: whoami

 

Uzyskane wyniki mogą być różne od tych uzyskanych dzięki poleceniu: logname gdyż za pomocą komendy: su można zmienić kontekst wywoływanych poleceń (czytaj - wykonać polecenie z poświadczeniami innego użytkownika). Poniżej zaprezentowano różnicę pomiędzy tymi poleceniami.

 

 

Ktoś mógłby zapytać - Do czego użyć obie komendy? Przecież dane użytkownika widać w prompt-cie linii poleceń. Tak, zgadza się domyślnie skonfigurowany prompt zawiera informację o użytkowniku - ale przecież nie zawsze tak musi być.

 

 

Dodatkowo oba polecenia przydatne są podczas tworzenia skryptów.

 

Polecenie: who pozwala nam na poznanie użytkowników, którzy są aktualnie zalogowani.

 

 

Standardowo polecenie dane o użytkownikach pobiera z pliku /var/run/utmp W definicji wywołania polecenia można zmienić domyślną lokalizację pliku z danymi. I tak określając: /var/log/wtmp otrzymamy informację o poprzednich logowaniach, zaś gdy zdefiniujemy /var/log/btmp powinnyśmy uzyskać dane o nieudanych logowaniach (pod warunkiem, że system jest skonfigurowany do gromadzenia takich informacji). Poniżej przykład obrazujący informację o poprzednich logowaniach.

 

 

Z poleceniem: who możemy użyć dodatkowe przełączniki:

 

-a - wszystkie informacje,

-H - wypisanie nagłówka,

-q - wyświetlenie jedynie nazw i liczby użytkowników,

--lookup - rozwiązanie nazwy komputera (DNS) z którego nastąpiło logowanie, flaga dotyczy użytkowników zalogowanych zdalnie,

-T - sprawdza czy jest możliwość wysłania komunikatu (np. gdy użytkownik korzysta z terminalu). Znak: + oznacza możliwość komunikacji, znak: - brak możliwości wysłania komunikatu natomiast znak: ? oznacza brak możliwości określenia.

 

Poniżej przykład użycia flagi -T Po analizie uzyskanych wyników można stwierdzić, że istnieje możliwość wysłania komunikatu do użytkownika: alebin Tak więc spróbujmy tą informację wykorzystać. Lecz jeszcze jedna mała uwaga aby komunikacja zakończyła się sukcesem należy wydać polecenie: mesg y Wydanie polecenia zezwala na prowadzenie takiego typu komunikacji (polecenie: mesg n - zabrania, status poznamy po wydaniu komendy: mesg).

 

 

Aby móc wysłać informacje do użytkownika alebin należy skorzystać z polecenia: write Poniżej przykład użycia takiej formy komunikacji (po stronie użytkownika luk, kończenie komunikatu następuje po wciśnięciu kombinacji klawiszy ^D)

 

 

I ta sama wiadomość od strony użytkownika alebin.

 

 

Aby za jednym zamachem wysłać komunikat do wszystkich zalogowanych użytkowników należy skorzystać z polecenia: wall Po wydaniu polecenia, definiujemy komunikat, wysłanie informacji następuje po wybraniu ^D.

 

 

Komunikat został wysłany do wszystkich użytkowników mogących go otrzymać (czytaj korzystających z terminala) W przykładzie informacje otrzymuje dwóch użytkowników: alebin oraz tomwal

 

 

Aby uzyskać listę aktualnie zalogowanych użytkowników możemy również posłużyć się poleceniem: users Po wydaniu komendy zostanie wypisana lista zawierająca aktywne konta.

 

 

Finger jest jeszcze jednym poleceniem, po wydaniu, którego uzyskamy listę użytkowników korzystających z systemu. Wydanie samego polecenia bez żadnych opcji spowoduje uzyskanie listy zalogowanych użytkowników. Natomiast, gdy do polecenia finger zostanie dodana nazwa użytkownika dane zostaną poszerzone o dodatkowe informacje.

 

 

Z poleceniem finger dostępne są następujące opcje:

 

-s - wypisanie danych w formie skróconej,

-l - wypisanie danych w formie rozszerzonej.

 

Poleceniem, które jest powiązane z komendą finger jest chfn. Komenda ta pozwala nam na zmianę niektórych informacji, które są związane z użytkownikiem - prawdziwe imię i nazwisko, numery telefonów czy miejsce pracy. Zmianę informacji dokonujemy za pomocą polecenia: chfn <nazwa_użytkownika>

 

 

Ostatnim poleceniem, które chciałbym przedstawić a dotyczącym poznania użytkowników aktualnie zalogowanych jest komenda: w

 

 

Z wykorzystaniem polecenia: who mogliśmy poznać historię poprzednich logowań. Informację taką również uzyskamy dzięki poleceniu: last Dane są ułożone w kolejności chronologicznej od logowania bieżącego po logowania starsze.

 

 

Komenda last ma trochę więcej możliwości niż zaprezentowane wcześniej polecenie who. Dostępne są następujące przełączniki:

 

-f <nazwa_pliku> - określenie innego źródła informacji niż standardowy plik var/run/utemp,

-i - nazwy komputerów z których nastąpiło logowanie zostają zastąpione adresami IP,

-R - bez nazw komputerów,

-n <wartość> - wypisanie danych o logowaniach obejmujących ostatnie n wierszy (można użyć składni np. last -3),

<użytkownik> - wyświetlenie historii logowań dotyczących konkretnego użytkownika,

 

Aby poznać historię logowań dotyczących danego okresu można wykorzystać przełącznik -t Po zdefiniowaniu flagi określamy interesujący nas okres. Data jest definiowana za pomocą formatu: YYYYMMDDHHMMSS (w przypadku pominięcia, którejś z informacji uzupełniamy zerami).

 

 

Natomiast by poznać datę ostatniego restartu systemu należy skorzystać z przełącznika reboot - wydanie polecenia ukazuje datę i godzinę ostatniego restartu systemu.

 

 

Jeszcze kolejnym programem pozwalającym przejrzeć historię logowań ale w kontekście tych nieudanych jest: faillog Aby wyszukać błędne logowania konkretnego użytkownika należy w składni polecenia użyć przełącznik -u po którym definiujemy nazwę konta.

 

 

Aby odszukać nieudane logowanie w konkretnym okresie należy posłużyć się przełącznikiem -t Użycie flagi -a spowoduje wyświetlenie wszystkich informacji.

 

Jak już jesteśmy przy logowaniu to krótka porada pozwalająca nam podnieść poziom bezpieczeństwa naszego systemu na trochę wyższy pułap. Często przydaje się włączenie blokowania konta po wprowadzeniu określonej liczby błędnych haseł. Porada ta zabezpieczy nas przed sytuacją w której dany użytkownik poprzez zgadywanie próbuje uzyskać dostęp do konta.

 

Aby włączyć blokowanie konta po n razy błędnie wprowadzonym haśle należy edytować plik: /etc/pam.d/common-auth (w innych systemach Linux plik może przyjmować nazwę: /etc/pam.d/system-auth).

 

Po otwarciu pliku należy dodać linijkę:

auth required pam_tally.so onerr=fail deny=<ilość_dozwolonych_prób> unlock_time=<czas_odblokowania>

 

gdzie:

 

  • deny=<ilość_dozwolonych_prób> - ilość prób po których następuje blokada,
  • unlock_time=<czas_odblokowania> - czas automatycznego odblokowania konta, po tym czasie możliwe jest podjęcie zalogowania.

 

Informacja o podjętych próbach logowania jest przetrzymywana w pliku: /var/log/faillog

 

 

Po definicji wszystkich ustawień możemy przeprowadzić próbę logowania. W naszym teście użytkownik jankow trzy razy wpisuje błędne hasło.

 

 

Jak widać powyżej konto użytkownika: jankow zostało zablokowane. Aby ponowić próbę logowania musimy odczekać zdefiniowaną wartość czasu. Możliwe jest przez administratora ręczne wymuszenie zresetowania progu logowań.

 

Aby sprawdzić ilość błędnych prób logowań wydajemy polecenie: pam_tally --user <nazwa_użytkownika> aby zaś zresetować próg należy wprowadzić komendę: pam_tally --user <nazwa_użytkownika> --reset

 

Innym poleceniem, które pozwala nam na poznanie trochę więcej informacji o użytkowniku jest komenda: id Przyglądnijmy się więc wynikom uzyskanym po wydaniu polecenia. Wydanie komendy pozwala nam poznać numer UID (ang. user ID) oraz GID (ang. primary group ID). Numery te nadawane są kontu użytkownika w trakcie procesu tworzenia. Na zrzucie poniżej identyfikatory konta root oraz luk.

 

 

Przeglądając wyniki stwierdzamy, że użytkownik root ma przypisaną wartość 0 dla identyfikatora UID oraz GID natomiast użytkownik luk wartość 1000 (w systemie Ubuntu numerowanie kont użytkowników rozpoczyna się od 1000 w innych dystrybucjach wartość ta może być inna np. w Fedora numeracja rozpoczyna się od 500). Dodanie kolejnego użytkownika z reguły prowadzi do zwiększenia wartości identyfikatorów UID oraz GID o jeden. Poniżej przykład zdefiniowania nowego konta tadnow Jak widzimy wartości UID oraz GID wynoszą 1001 (wartości te poznajemy podczas procesu tworzenia konta oraz dzięki poleceniu id).

 

 

Dla naszej wygody, szczególnie ma to znaczenie w przypadku gdy zarządzamy dużą grupą użytkowników (ciężko by było te numery pamiętać) wartości UID i GID są mapowane na nazwę użytkownika bądź nazwę grupy. Informacje o mapowaniu dotyczące użytkownika pobierane są z opisanego już pliku /etc/passwd natomiast grupy - z pliku /etc/group. Poniżej na zrzucie zawartość pliku /etc/group

 

 

Dla małego przypomnienia celowość tworzenia grup i przypisywania do nich użytkowników jest związana z nadawaniem uprawnień. Ze względu na to, że grupa jest traktowana jako jednostka przypisane uprawnienia do grupy np. dostęp do określonego zasobu spowoduje nadanie uprawnienia wszystkim użytkownikom grupy.

 

W systemie Linux do zarządzania grupami można wykorzystać jedno z kilku poleceń a do najczęściej wykorzystywanych należy komenda: groupadd (analogicznie jak useradd) odpowiedzialna za utworzenie grupy. Składnia polecenia: groupadd <nazwa_grupy>

 

Poniżej przykład utworzenia dwóch grup: marketing oraz finanse Jak można zauważyć fakt utworzenia grup ma swoje odzwierciedlenie w pliku: /etc/group

 

 

Aby samemu określić identyfikator grupy GID należy do tego celu wykorzystać przełącznik -g.

 

Stan przynależności do grupy poszczególnego użytkownika można sprawdzić z wykorzystaniem polecenia: groups. Wydanie samego polecenia spowoduje wyświetlenie członkostwa w grupach użytkownika w kontekście, którego zostało wydane polecenie. Dołączenie nazwy użytkownika spowoduje wyświetlenie członkostwa zdefiniowanego użytkownika.

 

 

Zmianę członkostwa w grupie dokonamy za pomocą polecenia: usermod z parametrem -g bądź -G Dołączenie parametru -g i zdefiniowanie po nim nazwy grupy spowoduje zastąpienie początkowej grupy (taka sytuacja ma miejsce w Ubuntu w innych dystrybucjach nastąpi dopisanie użytkownika do zdefiniowanej w poleceniu grupy). Poniżej użytkownik tadnow zmienia członkostwo z grupy domyślnej tadnow na grupę finanse. Definicja grupy może nastąpić z wykorzystaniem identyfikatora GID (użycie w definicji identyfikatora powoduje dodanie użytkownika do danej grupy, bez zastąpienia) oraz co ważne definiowane grupy muszą istnieć.

 

 

Natomiast wybranie flagi -G spowoduje dodanie użytkownika do określnych grup. Poniżej przykład dodania użytkownika tadnow do grupy finanse oraz marketing. Po wydaniu polecenia użytkownik tadnow nadal jest członkiem domyślnej grupy tadnow.

 

 

Do modyfikacji parametrów grupy służy polecenie: groupmod Za pomocą komendy można dokonać modyfikacji nazwy grupy bądź jej identyfikatora GID. Niżej przykład zmiany nazwy grupy finanse na biznes. Jak widać po dokonanej zmianie automatycznie zmienia się członkostwo użytkownika tadnow. Aby dokonać zmiany nazwy należy w poleceniu groupmod użyć przełącznik -n natomiast gdy dokonujemy modyfikacji identyfikatora GID używamy flagi -g.

 

 

Aby usunąć grupę należy skorzystać z polecenia: groupdel Składnia polecenia jest następująca: groupdel <nazwa_grupy>

 

 

Przed skasowaniem grupy tak jak to miało miejsce w przypadku konta użytkownika warto zapoznać się z plikami, które do danej grupy należą, wyświetlenie plików przynależnych danej grupie uzyskamy za pomocą polecenia: find / -group <nazwa_grupy> -print Poniżej przykład z wykorzystaniem polecenia celem odnalezienia plików należących do grupy luk.

 

 

Podobnie działającym skryptem do przedstawionego już pwck, lecz tym razem sprawdzającym integralność pliku /etc/group jest grpck. Wywołanie skryptu spowoduje wykonanie sprawdzenia składni informacji zawartych w pliku.

 

 

I na tym chciałbym zakończyć w kolejnej odsłonie zajmiemy się poleceniami związanymi z urządzeniami.

 


BIBLIOGRAFIA:

 

http://www.tecmint.com/add-users-in-linux/

http://www.computerhope.com/unix/useradd.htm

http://www.cyberciti.biz/tips/lock-unlock-set-number-of-login-attempts.html

http://www.serverschool.com/server-configuration/how-to-lock-user-accounts-after-login-failure/

http://ubuntuforums.org/showthread.php?t=1024263

]]>
[email protected] (pikolo) Linux Thu, 04 Feb 2016 20:18:37 +0000
Dogadać się z Linuxem. Zarządzanie procesami. http://slow7.pl/linux/item/104-dogadac-sie-z-linuxem-zarzadzanie-procesami http://slow7.pl/linux/item/104-dogadac-sie-z-linuxem-zarzadzanie-procesami

W tym wpisie zajmiemy się narzędziami, które pozwolą nam na kontrolowaniem uruchamianych procesów w systemie Linux. Większość przedstawionych narzędzi będzie dotyczyć powłoki bash lecz pojawią się również aplikacje, które umożliwią nam zarządzanie zadaniami w trybie graficznym. Tak by nie przedłużać przechodzimy do tematu wpisu.

Narzędzie ps pozwala nam na wyświetlenie listy wszystkich procesów, które są aktualnie wykonywane przez system. Narzędzie te pobiera informacje z systemu plików /proc W bazie tej każdy proces ma swoje odzwierciedlenie. Aby wyświetlić wszystkie możliwe parametry narzędzia wydaj polecenie: ps --help all

Wydanie samego polecenia ps bez żadnego parametru uwidoczni nam tylko procesy skojarzone z danym terminalem (TTY - ang. TeleTYpewriter).

 

 

Jak widać powyżej nie uzyskaliśmy zbyt wielu informacji (tylko 3 procesy) tak więc by ten stan zmienić poniżej przedstawię kilka przykładów użycia narzędzia, które pozwolą nam na uzyskanie bardziej szczegółowych danych o tym co w danej chwili jest w systemie uruchomione. Lecz przed tym jeszcze krótkie wprowadzenie o tym jak narzędzie ps przedstawia nam dane (tak byśmy rozumieli to co nam na ekranie się pojawi).

Podczas korzystania z narzędzia ps przedstawiane dane (rodzaj prezentowanych danych zależy od użytych przełączników) będą zgrupowane w tabeli. Poniżej zestawienie nagłówków tabeli oznaczające parametry procesu:

      • USER - właściciel procesu,
      • PID – Process ID - identyfikator danego procesu, używany do jego identyfikacji co ważne w tym samym czasie PID nie może być przydzielony dwóm różnym procesom,
      • %CPU – procentowe użycie procesora
      • %MEM –procentowe użycie pamięci
      • VSZ – przydzielona pamięć wirtualna w kB,
      • RSS – przydzielona pamięć fizyczna w kB,
      • TTY - identyfikator terminala procesu. Zapis ? oznacza brak skojarzenia z terminalem.
      • STAT – status procesu. Oznaczenia statusu procesu:
        • R – proces jest aktualnie wykonywany (running),
        • S – proces uśpiony, oczekiwanie na jego uruchomienie (sleep),
        • T – proces zatrzymany (stopped, np. CTRL-Z)
        • Z – zombie process - proces niewłaściwie zamknięty przez proces nadrzędny (proces rodzica bądź proces macieżysty)
      • START – czas uruchomienia procesu,
      • TIME – użycie procesora wyrażona w czasie,
      • COMMAND – nazwa komendy/procesu oraz jego parametry,
      • NI – wartość priorytetu nice (o tym później).

 

Uzbrojeni w tą wiedzę możemy przejść do kilku przykładów.

Aby wyświetlić wszystkie procesy, które są powiązane z terminalami użyj komendy: ps a

 

 

Oczywiście w systemie istnieją procesy, które w żaden sposób z TTY nie są powiązane tak więc aby również uzyskać informację o tych procesach użyj polecenia: ps ax

 

 

Aby powyższe dane nieco wzbogacić użyj polecenia: ps auxw Dodanie przełącznika u spowoduje dodanie informacji na temat użytkownika z którym dany proces jest skojarzony natomiast przełącznik w jest odpowiedzialny za wyświetlenie parametrów linii poleceń procesu (do polowy linii). Aby wyświetlić pełne dane niezależnie od długości skorzystaj z flagi ww (polecenie przyjmie postać: ps auxww)

 

 

Aby zaś uzyskane wyniki procesów zawęzić do konkretnego użytkownika (w przykładzie użytkownik luk) skorzystaj z polecenia: ps u -U <nazwa_użytkownika>

 

 

Aby uzyskane wyniki posortować np. według użycia procesora można skorzystać z polecenia: axuk -pcpu dozwolona jest również komenda: ps aux --sort -pcpu Sortowanie jest wykonane malejąco aby uzyskać efekt odwrotny przed flagą pcpu zamiast znaku - (minus) użyj znak + (plus).

 

 

Oczywiście opcji sortowania jest bardzo wiele, wszystko zależy od informacji jakie chcemy uzyskać wszystkie dostępne opcje sortowania zostały umieszczone w linku poniżej (wersja angielska): http://www.freebsd.org/cgi/man.cgi?query=ps&manpath=SuSE+Linux/i386+11.3

Przeglądając wyniki uzyskane dzięki narzędziu ps dojdziemy do wniosku, że uruchomionych i działających procesów w systemie jest bardzo wiele aby odszukać tylko te, które w danej chwili nas interesują można skorzystać z poleceń przedstawionych na poniższym zrzucie. Przykład odnalezienia procesu przeglądarki Mozilla Firefox oraz edytora tekstu Libre Writer. Na zrzucie poniżej zostały ukazane również numer PID szukanych procesów - odpowiednio dla przeglądarki Mozilla Firefox - 2404 oraz Libre Writer - 2514 Numery tych procesów wykorzystamy za chwilkę przy opisie następnego narzędzia jakim jest program top.

 

 

Wiele z procesów w systemie Linux zresztą jak w każdym innym systemie jest uruchamiana przy starcie systemu inne zaś są uaktywniane już przez samych użytkowników w momencie pracy z systemem i uruchamiania kolejnych zadań czy programów. Uruchomiony proces może być odpowiedzialny za uruchamianie innych zadań, taki proces staje się wówczas procesem nadrzędnym bądź macierzystym dla procesów, które zostały uruchomione w wyniku jego działania. O procesach, które leżą niżej w hierarchii od procesu macierzystego mówimy, że są to procesy potomne. W systemie Linux takim najważniejszym procesem jest proces init, będący rodzicem wszystkich innych procesów. Proces ten ma zawsze przypisaną wartość PID równą 1. Aby przejrzeć całą hierarchię uruchomionych procesów i dodatkowo poznać, który proces jest nadrzędny a który potomny należy skorzystać z polecenia: pstree.

 

 

Narzędzie to dysponuje dodatkowymi przełącznikami, które pozwalają nam na definicję uzyskiwanych danych do najczęściej wykorzystywanych poleceń należą:

pstree <użytkownik> - wyświetla drzewo procesów danego użytkownika - przykład wyświetlenia procesów użytkownika luk

 

 

pstree <PID> - rozpoczyna budowanie drzewa od procesu z zdefiniowanym numerem PID - w przykładzie proces NetworkManager,

 

 

pstree -p - do informacji o nazwie procesów dołączane są informacje o numerach PID tychże procesów - ten sam przykład co powyżej,

 

 

pstree -H <PID> - użycie flagi H spowoduje podświetlenie procesu,

 

 

pstree -n - spowoduje włączenie sortowanie według numerów PID.

 

 

Dostępnych jest jeszcze parę przełączników działających z narzędziem pstree aby je poznać skorzystaj z pomocy programu: pstree --help.

Zadaniem aplikacji top tak samo jak omówionego narzędzia ps oraz pstree jest przedstawienie nam aktualnego stanu systemu. Stan ten w przeciwieństwie do programu ps jest aktualizowany na bieżąco. Oznacza to, że uruchamiając program top na żywo mamy podgląd na stan uruchamianych i działających już procesów. Działanie narzędzia kontrolujemy poprzez zastosowanie odpowiednich przełączników, które dodawane są podczas uruchamiania narzędzia lecz mamy również możliwość definiowania stanu wyświetlanych informacji poprzez dobór odpowiednich skrótów.

Poniżej przykład uruchomienia narzędzia top bez żadnych parametrów (opis wyświetlanych informacji za chwilę).

 

 

Sposób prezentacji danych uzyskanych dzięki narzędziu top możemy kontrolować jak już wspomniałem w dwojaki sposób. Tak więc w pierwszej kolejności przedstawię wykorzystanie narzędzia z parametrami dodawanymi podczas wywołania programu zaś w dalszej części opisu skupię się na skrótach.

Pierwszy przykład będzie dotyczył wykorzystania znanych nam już numerów PID procesów programów Mozilla Firefox oraz Libre Writer. Numery PID procesów poznaliśmy dzięki narzędziu ps. Aby mieć stały wgląd na to co dzieje się z uruchomionymi aplikacjami możemy włączyć monitorowanie ich stanu poprzez wykorzystanie polecenia: top -p <PID_procesu> Po wywołaniu polecenia zostaną wyświetlone tylko informacje odnoszące się do zdefiniowanych numerów PID procesów. W naszym przypadku chcemy monitorować stan dwóch aplikacji tak więc polecenie przyjmie postać: top -p 2404, 2514 (numery PID oddzielamy przecinkami). Wywołanie komendy spowoduje wyświetlenie stanu procesu przeglądarki Firefox oraz stanu procesu edytora tekstu Writer.

 

 

Aby włączyć monitorowanie procesów konkretnego użytkownika należy skorzystać z flagi -u po której to podajemy nazwę użytkownika. Wyświetlenie działających procesów użytkownika luk wywołamy po wydaniu komendy: top -u luk

 

 

Aby zaś stan procesów zapisać do zewnętrznego pliku by później zająć się ich analizą do polecenia top należy dodać parametr -b. Poniżej przykład polecenia nakazującego zapis stanu procesów użytkownika luk do zewnętrznego pliku procesy_user_luk.txt - polecenie: top -b -n 3 -u luk > procesy_user_luk.txt Użyty dodatkowy parametr -n nakazuje wykonanie zapisu trzech stanów.

 

 

Dodatkowy przełącznik -d pozwala na zdefiniowanie czasu odświeżania i tak aby np. odświeżyć widok co 2 sekundy 10 razy skorzystaj z polecenia: top -n 10 -d 2 Parametr -i odpowiedzialny jest za wyłączenie pokazywania nieaktywnych procesów zaś flaga -H umożliwia włączenia pokazywania wątków procesów.

Podczas pracy narzędzia top możliwe jest skorzystanie z skrótów, które pozwolą nam w sposób interakcyjny wpłynąć na wynik uzyskiwanych informacji. Co warto zaznaczyć podczas zabawy z programem top możemy spowodować, że system nasz zacznie pracować niestabilnie. Aby wykluczyć opcję takiego zachowania systemu narzędzie top możemy uruchomić w trybie bezpiecznym w którym to opcje potencjalnie niebezpieczne zostaną wyłączone. Aby uruchomić top w trybie secure wydaj polecenie: top -s

Podczas działania narzędzia top następujące skróty (klawisze) są aktywne:

h - wyświetla pomoc programu,

d (bądź s) - zmienia czas odświeżania,

spacja - natychmiastowe odświeżenie ekranu,

strzałki - przewijanie ekranu (dostępne są również klawisze: Page Up, Page Down, Home oraz End),

n - pozwala na zdefiniowanie ilości wyświetlanych procesów (0 - pokazuje wszystkie),

f - pozwala na zdefiniowanie wyświetlanych informacji oraz na sposobie ich reprezentacji. Po wciśnięciu f na nowo otwartym ekranie za pomocą spacji włączamy/wyłączamy określony parametr procesu zaś po wybraniu prawej strzałki dany element możemy przemieszczać definiując w ten sposób kolejność prezentowania danych (sortowanie wyłączamy lewą strzałką),

M - sortowanie procesów według zajmowanej pamięci,

N - sortowanie procesów według PID-u,

P - sortowanie procesów według użycia CPU (domyślne),

T - sortowanie procesów według czasu,

k - zabicie procesu. Po wciśnięciu klawisza zostaniemy poproszeni o podanie numeru PID interesującego nas procesu a w kroku kolejnym będziemy musieli określić sygnał jaki ma zostać wysłany by dany proces zamknąć. Domyślna wartość sygnału to 15 jeżeli użyjesz wartości 9 zabicie procesu będzie bardziej „brutalne”,

r - zmienia wartość priorytetu (nice) działającego procesu, ustalenie wartości poniżej 0 wymaga uruchomienia narzędzia przez użytkownika root (o priorytetach procesów dowiesz się więcej za chwilę),

W - zapisanie konfiguracji narzędzia top,

A - przełącza narzędzie top do widoku wielu okien (4) w każdym oknie możemy zdefiniować inne zasady wyświetlania informacji (okno wybieramy przy użyciu klawisza g).

 

Opisałem jak sterować wyświetlaniem informacji lecz nie powiedziałem nic o danych jakie informacje narzędzie top potrafi nam dostarczyć. Tak więc nadrabiam zaległości.

Wszystkie informacje pozyskane po uruchomieniu aplikacji są zgrupowane w kolumnach. Nad definicją nagłówków kolumn tabeli mamy ukazane informacje ogólne.

 

 

Wśród ukazanych danych możemy odszukać informację o:

Linia pierwsza: top - to informacja o aktualnej dacie i godzinie; czas uruchomienia systemu (up 14 min); liczbę użytkowników (2 users); średnie obciążenie (load average),

Linia druga: Tasks - to informacja o liczbie wszystkich zadań (160 total); zadań aktualnie uruchomionych (1 running); zadań uśpionych (159 sleeping); zadań zatrzymanych (0 stopped); zadań zombie - nieprawidłowo zamkniętych (0 zombie),

Linia trzecia: %Cpu(s) - to informacje odnoszące się do procesora: us - czas użytkownika; sy - czas systemu; ni - czas nice; id - czas bezczynności; wa - czas operacji wejścia/wyjścia; hi - czas obsługi przerywań sprzętowych; si - czas obsługi przerywań programowych,

Linia czwarta: Mem - to informacja o pamięci (jednostka kB): pamięć całkowita (total); pamięć wykorzystana (used); pamięć wolna (free); bufor (buffers),

Linia piąta: Swap - to informacja o pliku wymiany (jednostka kB): rozmiar całkowity (total); użycie (used); wolne (free); pamięć podręczna (cached Mem).

 

Natomiast nagłówki tabeli dostarczają nam następujących danych (informacje te odnoszą się do konkretnego zadania; część informacji domyślnie jest wyłączona aby włączyć ich wyświetlanie skorzystaj z klawisza f):

PID - identyfikator procesu,

PPID - identyfikator procesu rodzica,

USER - właściciel procesu/zadania,

UID - identyfikator właściciela procesu (0 oznacza użytkownika root),

PR - priorytet zadania,

NI - wartość parametru nice,

VIRT - wykorzystywany rozmiar pamięci wirtualnej,

RES - wykorzystywany rozmiar pamięci fizycznej,

SHR - wykorzystywany rozmiar pamięci współdzielonej,

S - stan procesu - poszczególne oznaczenia literowe (podobnie jak w przypadku narzędzia ps) oznaczają: S - proces uśpiony; Z - proces zombie; R - proces uruchomiony; T - proces zatrzymany,

%CPU - procent czasu procesora,

%MEM - procent wykorzystywanej przez proces pamięci fizycznej,

TIME+ - całkowity czas procesora poświęcony zadaniu,

COMMAND - polecenie uruchamiające dane zadanie bądź proces.

 

Narzędziem bardzo podobnym do aplikacji top jest program htop. Program również w czasie rzeczywistym pokazuje nam stan uruchomionych procesów.

 

 

Narzędzie to umożliwia nam sterowanie wyświetlanymi danymi za pomocą klawiszy funkcyjnych od F1 do F10. Program daje nam możliwość wyszukania danego procesu, użycia filtrów, ukazania drzewa procesów, sortowania, zmianę parametru nice a także zabicie danego procesu. Dodatkowo nad tabelą przedstawione są dane ogólne – tj.: użycie procesora; wykorzystanie pamięci i pliku wymiany; liczbę uruchomionych zadań; średnie obciążenie systemu po upływie 1, 5 i 15 minut; czas pracy systemu.

Uruchomienie narzędzia poprzez dodanie w wierszu poleceń odpowiednich parametrów umożliwia nam wstępne zdefiniowanie uzyskiwanych informacji:

-d <sekunda> - określenie czasu odświeżania,

-u <użytkownik> - wyświetlenie procesów zdefiniowanego użytkownika,

-p <PID> - wyświetlenie zadania o określonej wartości numeru PID (gdy chcesz wyświetlić więcej zadań PID-y oddziel od siebie przecinkami),

-s <rodzaj_sortowania> - wyświetlenie danych posortowanych według ustalonej kolumny, pełna nazwa kolumn dostępna po wydaniu polecenia: htop --sort-key=help

 

Dużą zaletą narzędzia (niż omówionego programu top) jest w pełni interaktywny sposób zarządzania procesami za pomocą klawiszy funkcyjnych.

Innymi programami, którymi możemy posłużyć się celem obserwacji uruchomionych procesów są programy ksysguard, który jest dedykowany dla środowiska KDE oraz gtop przeznaczony dla środowiska GNOM.

W wpisie tym kilka razy pojawił się termin nice, parametr ten określa z jaki priorytetem jest uruchomiony dany proces. Zakres tego priorytetu (ang. niceness level) rozciąga się od -20 do 19 przy czym wartość -20 oznacza priorytet najwyższy zaś wartość 19 priorytet najniższy. Aby zmodyfikować wartość z jakim dane zadanie jest uruchamiane możemy skorzystać z narzędzia nice.

Użycie narzędzia jest bardzo proste wystarczy wydać polecenie: nice <nazwa_zadania> Jako przykład niech posłuży nam takie polecenie: nice mcedit Wydanie komendy spowoduje uruchomienie programu mcedit. Sprawdźmy zatem wartość parametru nice z jakim to narzędzie zostało uruchomione.

W pierwszej kolejności za pomocą polecenia: ps auxw | grep mcedit zidentyfikujemy numer procesu PID uruchomionego programu mcedit. A następnie za pomocą komendy: top -p <numer_PID> -n 1 -b wyświetlimy dane dotyczące procesu o zadanym numerze PID (użyta flaga -b w narzędziu top spowoduje wyświetlenie informacji narzędzia top bez czyszczenia okna). Jak widać po poniższym zrzucie w poleceniu została użyta wartość 2754 ponieważ jest to PID zadania mcedit.

 

 

Z zrzutu tego uzyskamy również informację o poszukiwanym parametrze nice. Jak już pewnie Czytelniku zauważyłeś wartość parametru nice zadania mcedit wynosi 10. Wartość ta jest domyślną wartością z jaką będą uruchamiane programy z wykorzystaniem narzędzia nice.

Pytanie brzmi - Czy proces poznania wartości przypisanej do parametru nice musi być wykonany w ten sposób, czy nie można tego wykonać prościej? Odpowiedź na to pytanie brzmi – Można wykonać to łatwiej przy użyciu tylko jednego narzędzia jakim jest ps (wybacz Czytelniku, że trochę sprawę skomplikowałem ale zależało mi na tym byś poznał jak najwięcej zastosowań omawianych narzędzi). Tak więc ustalony parametr nice poznasz szybciej dołączając do narzędzia ps flagę -l Po wydaniu polecenia: ps -l a | grep mcedit stosowna informacja zostanie zawarta w wyświetlonych danych. Jak można zauważyć wartość parametru nice poznana po wydaniu polecenia pokrywa się z tą poznaną dzięki narzędziu top i wynosi 10.

 

 

Użycie przełącznika -l w narzędziu ps pozwala nam na dołączenie do już wyświetlanych danych informacji dodatkowych (bardziej szczegółowych). Dodatkowe kolumny, które zostaną zawarte po użyciu flagi -l to informacje o:

UID - identyfikator właściciela procesu,

PPID - identyfikator procesu macierzystego,

PRI i NI - priorytety procesów,

WCHAN - pozwala sprawdzić jaką funkcję systemowy jądra wywołał proces.

 

OK wiemy, że wywołanie narzędzia nice bez zdefiniowanie parametru procesu włącza dane zadanie z domyślnie zdefiniowaną wartością parametru nice ustawioną na 10. A co gdybyśmy dane zadanie chcieli uruchomić z wartością niższą bądź wyższą? A by wykonać to zadanie do składni polecenia wywołującego dany program musimy dołączyć parametr -n po którym to definiujemy wartość nice. Użycie np. takiej komendy: nice -n -20 mcedit spowoduje uruchomienie narzędzia mcedit z możliwie najwyższym do zdefiniowania priorytetem -20. Poniżej na zrzucie przedstawiono efekt wydanej komendy, jak widać sprawdzenie (oba wyżej opisane sposoby) tylko utwierdza nas w przekonaniu, że narzędzie mcedit zostało uruchomione z najwyższą wartością parametru nice.

 

 

Wiemy już jak uruchomić zadanie z żądanym priorytetem - A co w przypadku w którym chcemy zmienić priorytet już uruchomionego zadania?

Aby wykonać to zadanie musimy skorzystać z polecenia: renice <wartość_parametru_nice> <PID_procesu> Tak więc aby zmienić wartość parametru nice z -20 na 10 uruchomionego zadania mcedit (kontynuujemy przykład zaprezentowany wyżej) o numerze PID równym 2499 należy wydać polecenie: renice +10 2499 Po wydaniu komendy sprawdźmy efekt jej wydania.

 

 

Jak można zauważyć powyżej wydanie polecenia renice zmieniło priorytet zadania mcedit. Nowa wartość parametru nice wynosi 10.

To jeszcze jeden przykład – zmiana parametru nice z 10 na -5 (pamiętaj, że zmiana wartości poniżej 0 wymaga praw użytkownika root).

 

 

Uważny czytelnik na pewno zauważył, że nie jest to jedyny sposób dokonania modyfikacji parametru nice. Poznane narzędzia top oraz htop również oferują nam taką możliwość.

Aby zredukować ilość danych ograniczmy się do wyświetlenia informacji dotyczących tylko zadania mcedit. Aby to wykonać wydajmy polecenie: top -p 2499 Po wydaniu polecenia będziemy mieli wgląd w parametry tylko tego zadania.

Po uruchomieniu narzędzia top aby dokonać modyfikacji parametru nice wciskamy klawisz r. Na postawione pytanie – o numer procesu PID klikamy enter (numer PID zadania mcedit jest ustawiony domyślnie) gdyby tak się nie stało wprowadzamy go ręcznie.

 

 

Po podaniu informacji o numerze PID definiujemy wartość parametru nice. W naszym ćwiczeniu decydujemy się parametr ten ustawić na wartość 7.

 

 

Po zatwierdzeniu możemy sprawdzić stan parametru nice za pomocą znanych nam poleceń. Jak widać poniżej wartość nice wynosi 7.

 

 

Nieraz zdarza się, że na wskutek nieprawidłowego działania programu musimy zakończyć jego proces. Z reguły uruchamiając jakieś zadanie w terminalu aby je zakończyć należy posłużyć się kombinacją klawiszy Ctrl+C lecz w pewnych sytuacjach zabieg ten może okazać się niewystarczający. Wtedy musimy sięgnąć po bardziej drastyczne środki i proces zakończyć ręcznie. Aby zakończyć zadanie należy skorzystać z polecenia: kill <nazwa_bądź_numer_sygnału> PID

Z uruchomionymi zadaniami możemy porozumieć się poprzez wysłanie do nich odpowiedniego sygnału. Sygnały te są określone i zdefiniowane (nazwa + numer) a pełną ich listę do użycia z narzędziem kill poznamy po wydaniu polecenia: kill -l

 

 

Najczęściej używane sygnały to:

sygnał 2 - SIGINT - przerwanie wykonania procesu wywołane wciśnięciem klawiszy Ctrl + C,

Sygnał 3 - SIGQUIT - przerwanie wykonania procesu wywołane wciśnięciem klawiszy Ctrl + \ sygnał ten dodatkowo nakazuje wykonanie obrazu pamięci procesu,

sygnał 9 - SIGKILL - zabicie procesu,

sygnał 15 - SIGTERM - miękkie zakończenie procesu, sygnał ten jest domyślnie zdefiniowany gdy nie wskażemy w poleceniu innego,

sygnał 19 - SIGSTOP - zatrzymanie wykonywania procesu wywołane wciśnięciem klawiszy Ctrl + Z, tak zatrzymany proces możemy następnie wznowić wykorzystując do tego narzędzie fg bądź bg.

 

Tak więc aby zabić dany proces należy wydać polecenie: kill <PID> Poniżej przykład zabicia procesu przeglądarki Firefox.

 

 

Do zidentyfikowania numeru PID przeglądarki zostało wykorzystane narzędzie pgrep (jeszcze jeden dodatkowy sposób by poznać PID procesu). Narzędzie pgrep zostało wywołane z parametrem -l który jest odpowiedzialny za wyświetlenie pełnej nazwy procesu. Narzędzie to świetnie sprawdza się w sytuacji w której znamy nazwę uruchomionego procesu. Wywołanie polecenie bez flagi -l spowoduje wyświetlenie samej wartości numeru procesu.

Aby wysłać określony sygnał do procesu w poleceniu kill definiujemy jego wartość. Wartość ta może być podana w sposób numeryczny bądź słowny. Aby nakazać wysłanie sygnału SIGKILL, zabijając w ten sposób proces możemy skorzystać z polecenia przedstawionego na poniższym zrzucie (tradycyjnie już zabijamy proces przeglądarki).

 

 

Aby zakończyć wszystkie procesy o danej nazwie należy skorzystać z polecenia: killall <nazwa_procesu>. Narzędzie to posiada kilka przydatnych przełączników:

-u <użytkownik> <proces> - zabicie wszystkich procesów danego użytkownika, brak definicji procesu spowoduje zabicie wszystkich procesów zdefiniowanego użytkownika,

-o <czas> - zabicie procesów starszych niż zdefiniowany czas,

-y <czas> - zabicie procesów młodszych niż zdefiniowany czas. Czas określamy za pomocą następujących zmiennych: s dla sekund; m dla minut; h dla godzin; d dla dni; w dla tygodni; M dla miesięcy; y dla lat,

-s <sygnał> - określenie wysyłanego sygnału zamiast domyślnego SIGTERM,

-I - brak rozróżniania wielkości liter dla definiowanych procesów.

 

Narzędziem pozwalającym nam na zabicie procesu bez znajomości jego PID-u lecz z wykorzystaniem nazwy procesu jest program pkill. Zabicie danego programu odbywa się po wydaniu komendy: pkill <nazwa_procesu>

Zabicie danego procesu możemy również wykonać za pomocą omówionych narzędzi top oraz htop.

W systemie Linux występuje katalog /proc W katalogu tym zawarte są informacje o działających procesach. Reprezentacja danego procesu jest realizowana poprzez zapis katalogu. Nazwa katalogu odpowiada numerowi PID procesu. W danym katalogu są umieszczone pliki, które opisują status danego procesu, np.: plik cmdline zawiera polecenie uruchamiające dany proces a plik status informacje o stanie procesu.

Katalog /proc możemy przeglądać za pomocą opisanego w poprzednim wpisie dotyczącym powłoki bash polecenia ls . Jak widać poniżej proces przeglądarki Firefox o numerze PID 2445 ma swoje odzwierciedlenie w folderze /proc w formie katalogu o nazwie 2445.

 

 

System plików /proc jest całkowicie wirtualny co oznacza, że nie jest on nigdzie zapisany na dysku a istnieje tylko w pamięci. Za utworzenie i zapis informacji odpowiada jądro systemu a jego głównym zadaniem jest dostarczenie informacji o systemie.

Poniżej przedstawiam listę co ważniejszych pozycji znajdujących się w /proc.

/proc/cpuinfo - wykaz informacji o procesorze: model, wydajność, itp.,

/proc/consoles - informacja o terminalach,

/proc/crypto - zabezpieczenia kryptograficzne,

/proc/devices - lista urządzeń,

/proc/filesystems - informacja o dostępnych systemach plików,

/proc/interrupts - lista przerwań wykorzystywanych przez system,

/proc/ioports - porty wejścia/wyjścia,

/proc/kcore - obraz pamięci systemu,

/proc/meminfo - wykaz użycia pamięci fizycznej i swapu.

/proc/modules - lista modułów wykorzystywana przez system,

/proc/net - informacje o protokołach sieciowych,

/proc/partitions - lista partycji,

/proc/stat -statystyki systemu,

/proc/uptime - czas pracy systemu,

/proc/version - wersja jądra,

/proc/vmstat - statystyki użycia pamięci wirtualnej.

 

Informacje zawarte w tych plikach można oczywiście odczytywać np. przy pomocy narzędzia cat lecz nie należy ich edytować gdyż może to doprowadzić do niestabilnej pracy systemu.

Poniżej przykład użycia narzędzia cat celem uzyskania informacji o wykorzystaniu pamięci.

 

 

Co warto nadmienić szereg narzędzi korzysta z informacji zawartych w /proc. Przeglądając poszczególne pliki możemy uzyskać bardzo wiele informacji o naszym systemie choć co trzeba przyznać forma prezentacji tych danych jest czasem mało atrakcyjna.

To tej pory przedstawiłem narzędzia, które działają w konsoli systemu Linux jest również kilka programów, które potrafią zarządzać procesami w trybie graficznym. Ja bym chciał przedstawić dwa. Do takich standardowych programów należy: gnome-system monitor (by wywołać program w terminalu należy wpisać jego nazwę).

 

 

Monitor systemu pozwala nam na: zatrzymanie i wznowienie danego procesu, zatrzymanie procesu, zmianę jego priorytetu a także na uzyskanie podstawowych informacji o danym zadaniu (dostępne po kliknięciu na Właściwości).

Programem graficznym o podobnej funkcjonalności co systemowy Monitor systemu jest: lxtask

 

 

I na koniec jeszcze kilka prostych programów, które z procesami są powiązane bezpośrednio lub pośrednio a pozwalają na uzyskanie przydatnych informacji.

Pierwsze narzędzie to w, wydanie komendy pozwoli nam przejrzeć procesy każdej powłoki wszystkich zalogowanych użytkowników.

 

 

Narzędzie to podaje nam następujące informacje:

górny pierwszy wiersz (od lewej) - aktualny czas; czas pracy systemu; liczbę zalogowanych użytkowników oraz średnie obciążenie systemu - trzy wartości: ostatnia minuta, ostatnie pięć minut, ostatnie piętnaście minut,

kolumny to informacja o: użytkowniku; identyfikatorze terminala; komputerze z którego nastąpiło logowanie; czasie w którym nastąpiło logowanie; czasie bezczynności; czasie zużycia procesora (JCPU oraz PCPU) oraz uruchomionym zadaniu.

 

Narzędzie xload w sposób graficzny przedstawia nam obciążenie procesora (oś Y) w funkcji czasu (oś X). Użyta flaga -update ustawia odświeżanie (domyślnie 10 sekund).

 

 

Polecenie free poda nam zużycie pamięci (jednostka kB).

 

 

Opcje:

-s <sekunda> - ciągłe działanie programu, odświeżanie o ustaloną wartość,

-b - zmiana jednostki na bajty,

-m - zmiana jednostki na megabajty,

-t - podsumowanie.

 

Zadaniem narzędzia fuser jest wyświetlenie nazw procesów, które korzystają z podanych plików bądź katalogów. Po wywołaniu narzędzia z parametrem -v nakazującym wyświetlenie bardziej szczegółowych informacji i podaniu lokacji uzyskamy listę procesów korzystających z tejże lokacji. Poniżej w przykładzie ukazano procesy korzystające z katalogu domowego użytkownika luk.

 

 

Uzyskane dane dostarczają nam informacji o użytkowniku, PID-zie procesu, nazwie procesu a także rodzaju uzyskanego dostępu. Rodzaj ustanowionego dostępu jest określany za pomocą symboli literowych:

c - katalog bieżący,

e - uruchomiony plik wykonywalny,

f - otwarty plik, pomijane w   domyślnym   trybie wyświetlania,

r - katalog root,

m - mmap-owany plik lub biblioteka dzielona.

 

Wywołanie narzędzia bez flagi -v wyświetli tylko numer procesów PID i rodzaj ustanowionego dostępu.

Programu możemy również użyć do monitorowania otwartych połączeń sieciowych. Poniżej przykład sprawdzenia dostępności serwera FTP.

 

 

Programu możemy również użyć do zabicia procesów odnoszących się np. do danego katalogu. Wydanie polecenia: fuser -v -k -i . spowoduje zabicie wszystkich procesów odnoszących się do katalogu domowego użytkownika przy czym dołączenie flagi -i powoduje, że jesteśmy pytani o potwierdzenie wykonania wyłączenia każdego zadania z osobna. Pominięcie parametru -i spowoduje automatyczne zabicie wszystkich procesów.

 

 

I to by było na tyle jeśli chodzi o polecenia i narzędzia pozwalające nam kontrolować uruchomione zadania i procesy w systemie Linux. Jeśli Czytelniku znasz inne narzędzia i chciałbyś się tą wiedzą podzielić zapraszam do komentowania. A w kolejnym wpisie zajmiemy się użytkownikiem.

 


 

Bibliografia:

 

http://www.cyberciti.biz/faq/unix-linux-killall-command-examples-usage-syntax/

http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html

http://www.thegeekstuff.com/2012/02/linux-fuser-command/

http://www.computerhope.com/unix/ubash.htm

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html

]]>
[email protected] (pikolo) Linux Mon, 07 Sep 2015 12:14:13 +0000
Dogadać się z Linuxem. Powłoka systemu oraz operacje na plikach. http://slow7.pl/linux/item/101-dogadac-sie-z-linuxem-powloka-systemu-oraz-operacje-na-plikach http://slow7.pl/linux/item/101-dogadac-sie-z-linuxem-powloka-systemu-oraz-operacje-na-plikach

Terminal w systemie Linux jest tym samym co wiersz poleceń w systemach Windows. Konsola ta jak w przypadku cmd ma nam umożliwić zarządzanie komputerem. Pierwsze uruchomienie konsoli nie zachęca nas do dalszej pracy bo cóż ciekawego może być w oknie z migającym kursorem i czekającym na wpisanie polecenia. Ktoś mógłby zapytać - Po co mi ta umiejętność i po co mam uczyć się poleceń? Wszystko bowiem mogę sobie wyklinać w GUI. No niestety, nie zawsze wszystko znajdziemy w interfejsie graficznym a niektóre opcje, czasem są dość mocno zaszyte wewnątrz systemu. Tak więc umiejętne posługiwanie się konsolą znacznie zwiększa szybkość i skuteczność prowadzonej konfiguracji a także pozwala nam na zautomatyzowanie wykonywanych zadań. I to jest odpowiedź na postawione pytanie.

 

Artykuł jest częścią większą cyklu w którym będę chciał pokazać jak posłużyć się konsolą systemu Linux. W tym wpisie zajmiemy się poznaniem powłoki bash, która jest domyślną formą komunikacji w trybie tekstowym z systemami z rodziny Linux a także poznamy szereg poleceń związanych z obsługą plików.

 

Konsola pierwsze spojrzenie. Konfiguracja środowiska pracy.


 

Pierwsze spotkanie z konsolą systemu Linux w szczególności dla użytkownika, który dopiero co poznaje system Linux nie jest zachęcające ale wystarczy trochę samo zaparcia, ćwiczeń i obycia by stwierdzić, że korzystanie z tej formy komunikacji z systemem ma swoje zalety.

 

Po uruchomieniu konsoli system wita nas znakiem zachęty, zapraszającym do wydawania poleceń.

 

 

Znak zachęty w przypadku zwykłego użytkownika przyjmuje postać $ natomiast gdy użytkownikiem jest root (odpowiednik administratora w systemie Windows) znak zachęty zostaje zamieniony na #

 

Znak zachęty możemy modyfikować i ustalać jego wygląd w zależności od naszych potrzeb i upodobań. Aby wyświetlić wartość zmiennej środowiskowej PS1 odpowiedzialnej za budowę informacji pojawiających się w terminalu (ang. prompt) należy użyć polecenia: echo $PS1

 

 

Zmianę dokonujemy za pomocą komendy: export PS1='<opcje>'

 

Dostępne opcje to (więcej zobacz: man bash pod kątem zmiennej PS1):

 

\d - data w formacie: Dzień tygodnia Miesiąc Dzień,

\t - czas w formacie 24-godzinnym (HH:MM:SS),

\T - czas w formacie 12-godzinnym (HH:MM:SS),

\@ - czas w formacie 12-godzinnym (am/pm),

\A - czas w formacie 24-godzinnym (HH:MM),

\h - nazwa komputera (hostname) - do pierwszego znaku kropki,

\H - nazwa komputera (hostname),

\n - znak nowej linii,

\r - powrót karetki (ang. carriage return)

\e - znak ucieczki ASCII,

\u - nazwa użytkownika,

\w - ścieżka bieżącego katalogu (w przypadku katalogu $HOME nazwa jest skracana do tyldy (~),

\$ - jeśli numer UID jest 0 to znak: # (root), w przeciwnym wypadku znak: $,

\nnn - znak przedstawiony za pomocą liczby ósemkowej (np. 011),

\\ - backslash,

\[ - start sekwencji nie drukowalnych znaków,

\] - stop sekwencji nie drukowalnych znaków.

 

Do zbudowania promt-a możliwe jest również użycie kolorów. Składnia użycia koloru jest następująca: \[\e[ X;Y;Zm\] <opcja_kolor> \[\e[m\] np. export PS1='\[\e[0;34m\]\u\[\e[m\]'

 

gdzie:

 

X – kolor tekstu, Y – kolor tła, Z – efekt – przy czym gdy któregoś elementu nie używamy to go pomijamy.

 

 

Tabela opcji:

 

Kolor Tekst Tło Efekt Kod
czarny 30 40 Pogrubienie 1
czerwony 31 41 bez pogrubienia 22
zielony 32 42 podkreślenie 4
żółty 33 43 bez podkreślenia 24
niebieski 34 44 miganie 5
magenta 35 45 bez migania 25
cyjan 36 46    
biały 37 47    

 

 

Zmienne środowiskowe


 

Pierwszą zmienną już Czytelniku poznałeś (zmienna PS1) a nie jest to jedyna zmienna. W systemie Linux istnieje kilkadziesiąt różnych zmiennych. Wszystkich nie przedstawię ale na liście poniżej znajdziesz te zmienne, które wykorzystuje się najczęściej.

 

USER – nazwa aktywnego użytkownika,

HOSTNAME – nazwa hosta,

HOME – katalog domowy aktywnego użytkownika,

TZ – ustawiona strefa czasowa,

EDITOR – zmienna odpowiedzialna za określenie używanego edytora,

PATH – definiuje katalogi, które są przeszukiwane pod kątem wywoływanych poleceń, dzięki tej zmiennej nie musimy wpisywać pełnej ścieżki dostępu do programu,

SHELL – powłoka w której jest uruchomiony terminal,

TERM – rodzaj użytego terminala,

UID – identyfikator zalogowanego użytkownika,

OSTYPE – rodzaj systemu operacyjnego,

LANG – ustawienia językowe,

PWD – katalog roboczy w którym się znajdujemy,

HISTSIZE – rozmiar bufora historii.

 

 

Część dostępnych zmiennych można wyświetlić za pomocą polecenia: printenv | more (użycie more powoduje zatrzymanie wyświetlania po zapełnieniu ekranu).

 

 

Część zmiennych jest jednoznacznie określona lecz dwie z nich wymagają szerszego omówienia mowa tu o zmiennej PATH oraz EDITOR.

 

Zmienna PATH jak już zostało wspominane odpowiedzialna jest za odnalezienie programów, które są wywoływane w terminalu poprzez polecenia.

 

Gdy chcemy aby wyszukiwanie polecenia rozpoczęło się od aktualnego katalogu roboczego trzeba na początku zmiennej PATH wstawić znak kropki (.) – polecenie: export PATH=".:$PATH" Gdybyśmy chcieli do zmiennej PATH dodać katalog możemy skorzystać z polecenia: PATH=$PATH':<lokalizacja_katalogu>'

 

 

1. Sprawdzenie zmiennej PATH,

2. Dodanie do zmiennej PATH znaku kropki (znak nakazuje rozpoczęcie wyszukiwania programu/skryptu od bieżącej lokalizacji),

3. Sprawdzenie faktu przypisania,

4. Dodanie katalogu: /usr/lokal/samba/sbin do zmiennej PATH,

5. Sprawdzenie faktu przypisania.

 

Natomiast do zmiennej EDITOR można przypisać swój ulubiony edytor tekstowy. Poniżej przykład przypisania do zmiennej EDITOR programu mcedit (jakoś wole używać tego edytora niż domyślnie zainstalowanego vi czy nano). Mcedit dostępny jest po zainstalowaniu pakietu Midnight Commander, program ten jest menedżerem plików (jak ktoś pamięta Norton Commander to się nie zawiedzie). Program instalujemy za pomocą polecenia: sudo apt-get install mc

 

1. Zlokalizowanie programu mcedit,

2. Sprawdzenie aktualnej wartości zmiennej EDITOR,

3. Przypisanie do zmiennej EDITOR ścieżki katalogu w której znajduje się program,

4. Sprawdzenie faktu przypisania.

 

 

 

 

Kontrola uruchamianych procesów


 

Każde wydane polecenie w powłoce systemu Linux powoduje wykonanie jakiegoś zadania. By móc pracować efektywnie z powłoką trzeba umieć zarządzać uruchomionymi zadaniami. Podczas pracy z powłoką mamy wpływ na sposób zachowania się zadań, możemy wykonać następujące operacje wobec uruchamianych zadań:

 

uruchomić zadanie na pierwszym planie - tj. wydana komenda powoduje uruchomienie zadania przez powłokę a zadanie te działa w powłoce tak że niemożliwe jest wydanie kolejnych komend,

uruchomić zadanie w tle - tj. wydana komenda powoduje uruchomienie zadania przez powłokę a zadanie te działa nie zajmując jej, mamy możliwość wykonywania kolejnych poleceń,

zawieszenie zadania - wstrzymanie pracy zadania,

wznowienie - powoduje kontynuację pracy wcześniej zawieszonego zadania.

 

Z każdą z tych czynności związane jest odpowiednie polecenie, aby wyświetlić listę aktualnie uruchomionych zadań, skorzystaj z polecenia: jobs

 

 

Liczba w nawiasie oznacza numer zadania znak + oraz - zadania wywołane po wydaniu poleceń fg oraz bg.

 

Aby uruchomić zadanie w tle na końcu polecenia umieszczamy znak: &

 

Gdy uruchomione jest zadanie a my wciśniemy Ctrl+Z (można też użyć polecenia: suspend) zadanie to zostaje wstrzymane lecz zapamiętywany jest stan zadania.

 

Tak wstrzymane zadanie możemy ponownie uruchomić przy czym mamy dwie możliwości: gdy wykorzystamy polecenie: fg zadanie to zostanie uruchomione na pierwszym planie; gdy zaś zdecydujemy się użyć polecenia: bg zadanie to również zostanie wznowione lecz tym razem w tle.

 

Za pomocą tych dwóch komend możliwe jest wznawianie różnych zadań, domyślnie wydanie samego polecenia fg bądź bg bez żadnych parametrów spowoduje uruchomienie ostatnio wstrzymanego zadania. Gdy zaś chcemy uruchomić, wznowić konkretne zadanie możemy użyć np. komendy: bg %<numer_zadania> Numer zadania poznamy dzięki poznanemu już poleceniu: jobs

 

 

Historia poleceń


 

Wszystkie polecenia, które wpisujemy do konsoli są zapamiętywane tak więc istniej możliwość odwołania się do już wydanego polecenia. Aby wyświetlić listę wydanych poleceń użyj polecenia: history

 

 

Po wydaniu polecenia wyświetli się lista ponumerowanych komend, które w powłoce wydaliśmy. Poniżej przedstawiam kilka przykładów wykorzystania listy komend.

 

history <liczba> - wyświetlenie zdefiniowanej liczby ostatnio wydanych poleceń,

history -c – wyczyszczenie historii,

!! – ostatnio wydane polecenie,

!<liczba> - wywołanie polecenia o danym numerze,

!-<liczba> - wywołanie polecenia minus zdefiniowana liczba

 

 

Aliasy


 

System Linux umożliwia tworzenia tzw. aliasów czyli skrótów, które realizują jakieś konkretne polecenie bez konieczności wpisania całej składni polecenia wraz z parametrami.

 

W trakcie poznawania systemu Linux bardzo często miałem nawyk czyszczenia ekranu za pomocą windowsowego polecenia cls a jak wiadomo w powłoce bash te polecenie nie występuje, bo do czyszczenia okna terminala używa się komendy clear bądź tput clear. Aby móc jednak czyścić ekran terminala z wykorzystaniem komendy cls należy stworzyć alias, który będzie łączył ciąg cls z poleceniem clear. Od tej pory wpisanie w oknie polecenia cls wywoła nam komendę clear. Alias tworzymy za pomocą ogólnej składni: alias <nazwa_aliasu>= "<polecenie>" Tak więc chcąc przypisać linuxowe polecenie clear tak aby by było wykonane po wpisaniu cls należy wydać polecenie: alias cls="clear"

 

 

Aliasy dodatkowo mogą być wykorzystane do poruszania się po systemie plików. Gdy bardzo często odwołujemy się do jakiegoś miejsca na dysku możemy stworzyć alias, który będzie łączył nam dany folder z przyjazną dla nas nazwą. Poniżej przykład uworzena aliasu dok po wywołaniu, którego będziemy przeniesieni do lokalizacji: /home/luk/Dokumenty

 

 

Ciekawe efekty uzyskamy gdy alias połączymy z zmienną.

 

 

Połączyliśmy alias dok z zmienną DOK, po wydaniu polecenia dok jesteśmy przekierowani do zmiennej, która powoduje przejście do zdefiniowanego katalogu. Dodatkowo utworzoną zmienną możemy wykorzystać w poleceniach np. kopiowanie plików. Poniżej przykład skopiowania pliku: plik1 do lokalizacji /home/luk/Dokumenty która to lokalizacja została powiązana z zmienną DOK.

 

 

Aby przejrzeć listę utworzonych aliasów wydaj komendę: alias

 

 

Aby usunąć alias należy skorzystać z polecenia: unalias <nazwa_aliasu>

 

Wszystkie zmienne i aliasy, które utworzyliśmy mają „cykl życia” ustawiony do czasu w którym system operacyjny działa czyli po wykonaniu restartu systemu utworzone definicje zmiennych i aliasów już nie obowiązują. A dodatkowo zmienne i aliasy nie są dostępne dla innych wywołań konsoli. Aby uniknąć konfiguracji tych parametrów po każdorazowym uruchomieniu systemu należy definicje te umieścić w pliku: .bashrc W pliku tym zapisane są Twoje ustawienia a plik ten zlokalizowany jest w katalogu domowym (w przypadku użytkownika root plik znajduje się w /root)

 

Gdy skończymy edytować plik .bashrc należy go przeładować za pomocą polecenia: ..bashrc.

 

Po wprowadzeniu zmian (dodanie kropki do już istniejącej zmiennej PATH, dodanie nowej zmiennej DOK oraz utworzenie aliasu cls) i zapisaniu pliku, plik ten należy przeładować za pomocą polecenia: ..bashrc Po przeładowaniu wszystkie wpisy, których dokonaliśmy znajdują swoje odzwierciedlenie w użytych w terminalu poleceniach.

 

 

 

Polecenia związane z plikami.


 

Zanim Czytelniku będziesz próbował testować opisane polecenia należy jeszcze chwilkę zatrzymać się i wyjaśnić zasady jakie obowiązują przy stosowaniu znaku spacji i znaków specjalnych. Praca z plikami, które wykorzystują te znaki powoduje pewne problemy gdyż znaki te i występujące po nich ciągi tekstu, często są traktowane jako parametr lub definicja osobnego pliku.

 

W przypadku pliku, który w nazwie zawiera spację oraz znak specjalny by odwołanie do tego pliku zakończyło się sukcesem wystarczy, że nazwę pliku obejmiemy cudzysłowem. Poniżej przykład w którym utworzyłem dwa pliki: pierwszy plik zawiera spacje - nazwa pliku: plik ze spacjami; drugi zaś plik w swojej nazwie zawiera znak specjalny > - nazwa pliku: plikiznanspecjalny> Jak widać tradycyjne odwołanie do obu plików (wykorzystano polecenie: ls - pokaż pliki w katalog) kończy się niepowodzeniem, gdy zaś nazwy plików obejmiemy cudzysłowami wydana komenda kończy się sukcesem.

 

 

W przypadku pliku, zaczynającego się od minusa objęcie nazwy pliku cudzysłowem nie wystarczy, gdyż w poleceniu w którym do takiego pliku będziemy próbowali się odwołać uzyskamy informację o błędnej opcji. By udało się zbudować komendę z nazwą pliku rozpoczynającą się od minusa, nazwę tego pliku musimy poprzedzić operatorem: ./

 

 

Każde polecenie a raczej wynik uzyskany dzięki wydaniu komendy można zapisać do pliku. Przypuśćmy, że okresowo badamy dostępność jakiegoś hosta i wyniki te chcemy mieć w zewnętrznym pliku. Aby uzyskać nasz cel należy użyć symbolu przekierowania. Są trzy główne symbole przekierowania >,>>,<

 

Aby zrozumieć sposób ich wykorzystania symbole >,>>, połączymy z poleceniem ping, które będzie skanować nam witrynę wp.pl

 

Po wydaniu polecenia: ping -c 3 wp.pl > testwp nie uzyskamy informacji w terminalu, ponieważ zostają one przekierowane do pliku testwp

 

 

Użycie polecenia jeszcze raz spowoduje nadpisanie (zastąpienie) już istniejących danych, aby wymusić dopisanie do już istniejącego pliku należy użyć symbolu >> - ping -c 3 wp.pl >> testwp

 

 

Operatora przekazania > można również użyć aby wyniki uzyskane dzięki wydaniu dowolnego polecenia przekierować do innego terminala.

 

W tym celu należy poznać nazwę terminala z którego korzystamy. Nazwę tą poznamy za pomocą polecenia: tty

 

Po otworzeniu kolejnych sesji konsoli możemy za pomocą poznanej nazwy przekierowywać wyniki wydawanych poleceń. Poniżej przykład przekierowania wyników uzyskanych dzięki poleceniu ifconfig – polecenie: ifconfig > /dev/pts/25

 

 

Użyte polecenia przekierowania > oraz >> wymuszały zapisanie wyników wydanych poleceń do pliku, natomiast symbol < spowoduje pobranie danych z istniejącego pliku.

 

Poniżej przykład pobrania wyrazów z pliku dane wraz z ułożeniem ich w kolejności alfabetycznej. Dane pobrane z zewnętrznego pliku dzięki użyciu polecenia sort zostają ułożone w kolejności rosnącej tj. od a do z.

 

 

Oczywiście nic nie stoi na przeszkodzie aby symbolów przekierowania w jednym poleceniu użyć kilkakrotnie. Spróbujmy więc posortowane wyrazy z przykładu powyżej zapisać do pliku. Zadanie to wykonamy po użyciu komendy: sort < dane > posortowane

 

 

Istnieje jeszcze jeden symbol a mianowicie pionowa kreska (Shift+"\"). Symbol ten pozwala nam na utworzenie tzw. potoku (ang. pipe). Potok pozwala nam na połączenie kilku poleceń tak by stanowiły one jedność, bądź bardziej fachowo aby dane wyjściowe jednego programu były danymi wejściowymi dla innego.

 

Taki standardowym przykładem użycia potoku jest sytuacja w której wydajemy polecenia a informacje, które uzyskujemy dzięki wydanej komendzie nie mieszczą się w jednym oknie terminala. Informacji jest tak dużo, że kolejna porcja wypisywanych danych zastępuje te bieżące a my nie mamy możliwości zapoznania się z nim. Natomiast gdy wydamy np. komendę: ls -l | more wyniki uzyskane dzięki poleceniu ls (pokaż pliki w katalogu) zostaną przekazane do aplikacji more powodującej zatrzymanie wyświetlania po zapełnieniu ekranu terminala. Kolejna porcja informacji zostanie wyświetlona po wciśnięciu dowolnego klawisza. Wydane polecenie: ls -l | more jest potokiem ponieważ polecenie to zostało zbudowane z dwóch odrębnych komend a połączonych ze sobą operatorem potoku.

 

 

Operatory przekierowania i operator potoku można łączyć tak naprawdę z wszystkimi poleceniami używanymi w powłoce wszystko zależy od celu jaki chcemy osiągnąć. Poniżej jeszcze dwa przykłady w których wykorzystano te operatory.

 

Pierwszy przykład pokazuje wykorzystanie operatorów do zapisu w pliku tekstowym nazw plików (w kolejności alfabetycznej) znajdujących się w danym katalogu (w przykładzie katalog /bin/ - polecenie: ls /bin/ | sort > pliki)

 

 

Drugi zaś przykład wyszukuje nam wszystkie pliki z rozszerzeniem jpg a wyniki wraz z sortowaniem zostają zapisane do pliku – polecenie: find / -name *.jpg | sort > zdjęcia

 

 

 

Dir i ls – zawartość katalogu


 

Wyświetlenie plików i katalogów znajdujących się w bieżącej lokalizacji następuje po wydaniu polecenia: dir (podobnie jak w systemie Windows).

 

 

Wyświetlenie zawartości katalogu może również odbyć się z wykorzystaniem polecenia: ls

 

 

Polecenia dir i ls zawierają szereg opcji (zobacz pomoc) lecz te najczęściej używane przełączniki to:

 

ls plik1 plik2 plik3 – listuje tylko wymienione pliki,

ls *.doc – pokaże wszystkie pliki o rozszerzeniu *.doc,

ls katalog1 katalog2 – listuje wymienione katalogi,

ls -l – szczegółowa lista plików wraz z atrybutami,

ls -a – pokaż pliki ukryte (czyli te których nazwa zaczyna się kropką),

ls -R – pokaż dodatkowo zawartość podkatalogów.

 

Dodatkowo fajnym poleceniem by wyświetlić drzewo katalogów i plików jest komenda: tree (w niektórych systemach trzeba doinstalować niezbędne pakiety – sudo apt-get install tree)

 

 

Dodatkowe parametry do polecenia tree:

 

-d – pokaż tylko katalogi,

-f – pokaż ścieżkę dostępu,

-a – pokaż wszystko,

-L <poziom> - poziom listowania katalogów,

-H – eksport do HTML-a,

-X – eksport do XML-a.

 

 

Cd oraz pwd – poruszanie się pomiędzy katalogami


 

Przejście pomiędzy katalogami realizujemy za pomocą polecenia: cd <nazwa_katalogu> możliwe jest wpisanie tylko pierwszych liter katalogu i dopełnienie nazwy za pomocą klawisza TAB (wielkość liter ma znaczenie). Przejście do katalogu wyżej następuje po wydaniu polecenia: cd ..

 

 

Użycie samego polecenia cd przeniesie nas do katalogu aktualnie zalogowanego użytkownika.

 

 

Mkdir – tworzenie folderu


 

Aby utworzyć katalog/katalogi należy wykorzystać polecenie: mkdir <nazwa_katalogu> Jak widać poniżej można za pomocą polecenia utworzyć wiele katalogów (nazwy katalogów po spacji).

 

 

Aby zaś utworzyć katalog w nazwie którego zawarta jest spacja należy nazwę umieścić w cudzysłowie.

 

 

Do utworzenia pliku/plików należy wykorzystać polecenie: ls > <nazwa_pliku> (symbol > - znak przekierowania). Podobnie jak w przypadku polecenia tworzenia katalogu, nazwę pliku zawierającego spację umieszczamy w cudzysłowie.

 

 

 

Cp – kopiowanie plików


 

Kopiowanie plików pomiędzy katalogami następuje z wykorzystaniem komendy: cp <element_kopiowany> <lokalizacja> Na przykładzie poniżej, utworzony wcześniej plik o nazwie plik1 został skopiowany do katalogu o nazwie katalog2 (symbol .. nakazuje przejście w strukturze katalogów o jeden poziom wyżej, ponieważ kopiowanie następowało bezpośrednio z folderu katalog1)

 

 

Wydanie komendy: cp <nazwa_pliku> <nazwa_pliku> spowoduje utworzenie kopii danego pliku.

 

 

Inne przydatne wariacje polecenia cp poniżej:

 

cp tes* podkatalog/ – skopiuje wszystkie pliki zaczynające się na tes do ./podkatalog/

cp -r katalog1 ~ - wydanie polecenia spowoduje skopiowanie katalogu wraz z całą zawartością do katalogu domowego (home/nazwa użytkownika)

cp * katalog1 – kopiowanie wszystkich plików z bieżącej lokalizacji do folderu katalog1 (dodanie -r skopiuje również podkatalogi)

 

 

Mv – przenoszenie plików


 

Za pomocą polecenia: mv przeniesiemy plik bądź zmienimy jego nazwę. Wydanie komendy: mv <bieżąca_nazwa_pliku> <nowa_nazwa_pliku> zmieni nam nazwę pliku. Polecenia możemy również używać do operacji, które odnoszą się do katalogów.

 

 

Użycie następującej składni: mv <przenoszone_pliki> <miejsce_docelowe> zmieni nam lokalizację plików/katalogów. Poniżej przeniesienie pliku: plik1 z folderu katalog1 do folderu katalog2

 

 

Przy przenoszeniu plików często przydatny okazuje się parametr -u, który to jest odpowiedzialny za przeniesienie plików gdy źródło jest nowsze od celu albo nie ma celu.

 

 

Rm – kasowanie plików/katalogów


 

Aby skasować pliki należy posłużyć się poleceniem: rm <nazwa_pliku>

 

 

Dostępne są również przełączniki:

 

rm -r katalog – kasuje wszystko w zdefiniowanym katalogu tj. wszystkie pliki wraz z podkatalogami (--recursive)

rm -f plik – brak pytania o potwierdzenie kasowanych danych (--force)

 

Aby usunąć pusty katalog należy skorzystać z komendy: rmdir <nazwa_katalogu>

 

 

 

Chmod – prawa dostępu do plików


 

W systemie Linux każdy plik jak także katalog ma swoje określone prawa dostępu. Prawa te określają, kto i jaką czynność może z danym plikiem/katalogiem wykonać. Mamy do czynienia z prawem do odczytu, zapisu i wykonania. Oczywiście dany plik/katalog może mieć nałożoną różną kombinacje praw. Aby wykonać sprawdzenie praw dostępu posłuż się Czytelniku znanym już Tobie poleceniem: ls -l Na rysunku poniżej zostały przedstawione prawa dostępu do dwóch plików i jednego katalogu.

 

Po wyświetleniu praw dostępu do plików i katalogu (to ten pierwszy ciąg znaków od lewej) możemy przejść do analizy obowiązujących praw.

 

Każdy element (tutaj pliki i katalog) posiada zdefiniowane uprawnienia dla trzech grup: prawa dostępu właściciela pliku, prawa dostępu grupy, oraz prawa dostępu pozostałych. Prawa te przybierają formę zapisu dziesięcio elementowego ciągu znaków. Określone znaki na poszczególnych miejscach tego ciągu będą nas informowały o możliwości wykonania na pliku danych operacji. Już wiesz czytelniku, że prawa nakładane są trzem odrębnym grupom i do określenia tych praw zostało zarezerwowane 9 znaków (po trzy znaki na każdą grupę) zaś 10 znak lecz pierwszy w kolejności będzie nam mówił z jakim elementem będziemy mieli do czynienia. Poniżej lista wartości jaka może wystąpić na pierwszym miejscu wraz z opisem:

 

- – zwykły plik,

d – katalog/folder,

l – symlink czyli dowiązanie symboliczne,

s – gniazdo,

f – FIFO,

c – urządzenie znakowe,

b – urządzenie blokowe.

Natomiast prawa są określane za pomocą następujących symboli:

r – prawo do odczytu (wartość 4),

w – prawo do zapisu (wartość 2),

x – prawo do wykonania (wartość 1).

 

Tak więc uzbrojeni w tą wiedzę spróbujmy rozszyfrować prawa elementów zaprezentowanych na rysunku powyżej (wartości podane w nawiasach zostaną omówione za chwilę).

-rw-rw-r-- prawo właściciela do odczytu i zapisu lecz nie do wykonania (ciąg: rw-), prawo grupy do odczytu i zapisu lecz nie do wykonania (ciąg: rw-), pozostali tylko prawo do odczytu (ciąg: r--),

-rw-r--r-- prawo właściciela do odczytu i zapisu lecz nie do wykonania (ciąg: rw-), prawo grupy do odczytu lecz nie do zapisu i wykonania (ciąg: r--), pozostali tylko prawo do odczytu (ciąg: r--),

drwxrwxr-x prawo właściciela do odczytu, zapisu i wykonania (ciąg: rwx), prawo grupy do odczytu, zapisu i wykonania (ciąg: rwx), pozostali prawo do odczytu i wykonania lecz brak praw do zapisu (ciąg: r-x), symbol d oznacza, że mamy do czynienia z katalogiem.

 

Tak więc chcąc zmienić prawa do danego pliku bądź katalogu musimy posłużyć się poleceniem: chmod Ogólna składnia użycia polecenia wygląda następująco: chmod <opcje> <grupa> <uprawnienia> <plik/katalog> bądź chmod <opcje> <wartość_liczbowa> <plik/katalog>

 

W poleceniu stosujemy następujące symbole:

 

grupa docelowa co do których praw mają obowiązywać: u - user, g - group, o - others, a – all

uprawnienia: r - read, w - write, x – execute

+ - dodanie uprawnień, - - odebranie uprawnień

 

Tak więc wykonajmy mały przykład. Naszym zadaniem będzie odebranie prawa odczytu i wykonania grupie pozostali. Jak widzimy poniżej grupa pozostali ma prawo wykonania tych operacji odnośnie folderu katalog1 By odebrać im te uprawnienia należy wydać polecenie: chmod o-r-x katalog1 Po ponownym sprawdzeniu uprawnień można zauważyć, że poszczególne prawa zostały odebrane.

 

 

Aby zaś nadać praw odczytu, zapisu i wykonania dla wszystkich grup możemy użyć komendy: chmod a+r+w+x katalog 1 bądź krócej: chmod a+rwx katalog1

 

 

Aby odebrać grupie prawo do zapisu i jednocześnie pozostałym odebrać wszystkie prawa skorzystaj z komendy: chmod g-w,o-rwx katalog1

 

 

Wcześniej w opisie przy każdym z praw podałem pewne wartości liczbowe, skorzystanie z tych wartości jest znacznie wygodniejszym sposobem nadawania i odbierania praw. Aby zbudować polecenie posłuż się tabelą i przykładem zamieszczonym poniżej. Naszym celem jest nadanie następujących praw do folderu katalog1: prawa użytkownika - wszystkie, prawa grupy - odczyt i wykonanie a dla pozostałych tylko odczyt. By wykonać to zadanie możemy posłużyć się poleceniem: chmod 754 katalog1

 

 

Efekt wydania polecenia.

 

 

Skąd ta liczba i jak ją obliczyć? Cyfry w prawach dostępu to:

 

pierwsza cyfra to prawa właściciela do pliku;

druga – grupy właściciela;

trzecia – wszystkich innych.

 

Jeżeli chcemy wykonać nasz zadanie otrzymujemy:

 

prawa właściciela: odczyt+zapis+wykonanie czyli 4+2+1=7,

prawa grupy: odczyt+wykonanie czyli 4+1=5

prawa pozostałych: odczyt czyli 4

 

Tak więc za pomocą tak obliczonego kodu liczbowego możemy przeprowadzić ustawienie uprawnień do plików i katalogów.

 

I na koniec warto wspomnieć jeszcze o jednym parametrze a mianowicie opcji: -R, która pozwala nam ustalić prawa dla wszystkich plików/katalogów znajdujących się np. w katalogu.

 

Na sytuacji przedstawionej na rysunku poniżej wszystkie pliki i podkatalogi znajdujące się w folderze katalog1 mają ustawione wszystkie prawa (sam folder również – pkt 1 oraz pkt 2) Za pomocą komendy: chmod -R 707 katalog1 zostały odebrane wszelkie prawa dla grupy (pkt 3) Po sprawdzeniu praw dla folderu i plików znajdujących się w tym folderze widać, że prawa mają zastosowanie (pkt 5 i pkt 6) z wyjątkiem jednego pliku – plik2 (pkt 7), zmiana praw nie mogła być zastosowana (pkt 4) ponieważ plik ten należy do użytkownika root.

 

 

 

Chown, chgrp - zmiana właściciela pliku/katalogu


 

Czasem istnieje potrzeba zmiany właściciela pliku, bądź przypisania do praw pliku danej grupy. Operację tą możemy wykonać za pomocą polecenia: chown. Ogólna składnia polecenia jest następująca: chown <opcje> <użytkownik/grupa> <plik/katalog>

 

Poniżej przykład zmiany właściciela pliku: plik2 Plik ten należy do użytkownika root, po wydaniu polecenia: chown luk plik2 nowym właścicielem pliku staje się użytkownik luk.

 

 

Zmiana przynależności do pliku jest również możliwa z użyciem UID użytkownika. Identyfikator UID jest przyznawany każdemu nowemu użytkownikowi i jest on niepowtarzalny. Aby poznać identyfikator użytkownika wydaj polecenie: id <nazwa_użytkownika> Naszym celem będzie ponowne przypisanie praw właściciela użytkownika root do pliku: plik2 UID użytkownika root to 0. Wydanie komendy: chown 0 plik2 spowoduje ustawienie właściciela pliku: plik2 na użytkownika root.

 

 

Wprawne oko co niektórych czytelników na pewno zauważyło, że po wydaniu przedstawionych powyżej komend chown zmieniła się tylko przynależność właściciela pliku a nie grupy. By zmienić właściciela pliku odnośnie grupy po zdefiniowaniu nazwy użytkownika podajemy nazwę grupy. Nazwa użytkownika i nazwa grupy są oddzielone dwukropkiem.

 

Poniżej ponownie przykład zmiany właściciela pliku: plik2 tym razem zmianie ulega właściciel i grupa. Gdy nazwa grupy i użytkownika jest taka sam wystarczy, że po definicji użytkownika wstawimy sam dwukropek. Czyli zmianę przynależności dla przykładu poniżej można by było zrealizować za pomocą polecenia: chown luk: plik2

 

 

I tu również można wykorzystać identyfikator użytkownika i identyfikator grupy.

 

 

Zmiana przynależności samej grupy odbywa się za pomocą przykładowego polecenia: chown :luk plik2 (opuszczamy definicję użytkownika i po dwukropku podajemy nazwę grupy).

 

 

Aby zmienić właściciela wszystkich plików i podkatalogów skorzystaj z przełącznika -R.

 

 

Innym sposobem zmiany przynależności pliku/katalogu do grupy jest skorzystanie z polecenia: chgrp <nazwa_grupy> <plik/katalog> Poniżej na zrzucie został przedstawiony przykład zmiany grupy dla pliku: plik2 Grupa z root została zmieniona na luk.

 

 

 

Find, Locate, Which – wyszukiwanie plików


 

Aby wyszukać dany plik bądź katalog należy użyć polecenia: find -name <nazwa_szukanego elementu> Poniżej przykład odszukania elementów zawierających ciąg tmp.

 

 

Użycie znaku gwiazdki powoduje wyszukanie plików pasujących do danego wzorca np. polecenie: find -name temp* spowoduje wyszukanie wszystkich plików zaczynających się od słowa temp

 

Aby znaleźć pliki ze względu na ich rozmiar możemy posłużyć się np. poleceniem find -size 5k – wyszukanie plików, których rozmiar wynosi 5 kB, aby wyszukać pliki o rozmiarze większym niż 5 kB dodajemy znak plus natomiast o rozmiarze mniejszym znak minus np. find -size +5k

 

 

Aby odszukać pliki ze względu na uprawnienia do plików możemy posłużyć się poleceniem: find <uprawnienie> Polecenie ukaże pliki o określonym stanie w kontekście użytkownika wydającego polecenie. Uprawnienia jakie możemy wyszukiwać to:

 

-readable – prawo do odczytu,

-writable – prawo do zapisu,

-executable – prawo do wykonania.

 

Jak można zauważyć poniżej użytkownik luk wydaje polecenie odszukania wszystkich plików, które ma prawo czytać a następnie wszystkich plików, które może zapisywać. Dwa pliki: plik2 i plik3 które należą do użytkownika root w wynikach wyszukiwania plików do odczytu pojawiają się lecz w wynikach do zapisu już nie. Użytkownik luk może te pliki przeglądać ponieważ atrybut dla pozostałych ustawiony jest na read dając tym samym prawo do przeglądania wszystkim.

 

 

Do wyszukiwania plików pod kątem uprawnień możemy również użyć przełącznika: -perm <kod_chmode> Tworzenie kodu chmod zostało opisane wyżej tak więc chcąc odnaleźć pliki do których użytkownik ma prawo odczytu (bo atrybut odczytu jest ustawiony w sekcji pozostali) można użyć polecenia: find -perm -004 Opcja -type f nakazuje wyświetlenie tylko plików.

 

 

Polecenie: find -perm -004 wyświetla te pliki, które mają ustawiony atrybut read w sekcji pozostali, reszta pól nie jest brana pod uwagę, ważne jest by ten konkretny atrybut był zdefiniowany (dlatego w wyniku wyszukiwania zostały umieszczone oba pliki).

 

Aby odnaleźć plik z konkretnie ustawionym atrybutem chmod należy podać samą wartość atrybutu (dlatego tylko jeden plik został umieszczony w wyniku wydania drugiego polecenia, ponieważ tylko ten jeden plik spełnia warunek).

 

Użycie znaku / spowoduje wyszukanie wszystkich plików do których zdefiniowana wartość chmod pasuje. Na rysunku poniżej użytkownik do jednego pliku ma dostęp poprzez to że jest ich właścicielem a do drugiego poprzez członkostwo w grupie pozostali.

 

 

Polecenie: find -perm 400 wyszuka tylko te pliki którem mają ustawiony kod chmod na 400 (czyli plik: plik1), drugie polecenie: find -perm 004 pokaże pliki z atrybutem 004 (czyli plik: plik2) natomiast komenda: find -perm /404 wszystkie pliki z ustawionymi atrybutami: 400, 004 oraz 404

 

Poleceniem find oprócz znajdowania plików z określonymi atrybutami może zostać wykorzystane również do odnalezienia plików konkretnego użytkownika bądź grupy.

 

Aby wyszukać pliki, konkretnego użytkownika należy skorzystać z flagi -user bądź -uid. Opcja user jest łączona z nazwą użytkownika ale także jego numerem uid natomiast flaga uid tylko z identyfikatorem użytkownika. Aby poznać numer użytkownika posłuż się poleceniem: id -u <nazwa_użytkownika> bądź echo $UID

 

 

Innym poleceniem pozwalającym nam na zlokalizowanie plików jest komenda: locate <nazwa_szukanego_elementu> Aby zignorować wielkość znaków użyj przełącznika -i.

 

 

Szybsze wyszukanie plików zapewnia nam polecenie: locate ponieważ polecenie to korzysta z bazy danych, która to przechowuje informacje o położeniu plików. Baza ta co jakiś czas jest aktualizowana przez jedno z zadań programu cron. Manualne odświeżenie bazy następuje po wydaniu komendy: updatedb

 

Do lokalizacji plików wykonywalnych możemy użyć polecenia: which <nazwa_programu> Poniżej jako przykład lokalizacja programu firefox oraz vim.

 

 

 

File – informacja o typie pliku


 

Narzędzie file dostarcza nam informacji o tym z jakim plikiem mamy do czynienia. Składnia polecenia: file <nazwa_pliku> Jak można zauważyć na rysunku poniżej wydanie polecenia odnośnie plików: plik, plik2 oraz bash zwróciło nam informację iż pierwszy jest dokumentem XML, drugi plikiem HTML a ostatni zaś plikiem binarnym.

 

 

Polecenie: grep jest wykorzystywane do odszukania danej wartości, lub danych które będą pasować do wzorca. Ogólna składnia polecenia jest następująca: grep <opcje> <wzorzec> <przeszukiwany_plik>

 

Poniżej został utworzony plik, który zawiera listę załadowanych modułów i w pliku tym poszukujemy informacji na temat modułu Bluetooth. Po wpisaniu polecenia: grep Bluetooth plik3 nakazującego przeszukanie w plik3 wystąpienia słowa Bluetooth nie uzyskujemy żadnej informacji gdyż szukany ciąg nie wystąpił w przeszukiwanym pliku. A może problemem jest wielkość liter? Aby to sprawdzić w kolejnym poleceniu został dodany przełączki -i który każe poleceniu grep zignorować wielkość liter. Tym razem uzyskujemy informację, że poszukiwany ciąg został odnaleziony.

 

 

Wzorce poszukiwanych ciągów tekstowych możemy budować w zależności od kryteriów jakie muszą spełniać. Poniżej na rysunku wzorzec, który każe wyszukać ciągi znaków w których znajdują się litery xyz – polecenie: grep [xyz] plik3

 

 

Jeszcze jeden przykład, który szuka tekstu snd_ przy czym tekst ten musi wystąpić a po nim może znajdować się dowolna mała litera od a do z – polecenie: grep snd_[a-z] plik3

 

 

Przykładów wykorzystania polecenia grep można podać bardzo wiele, wszystko zależy od tego co tak naprawdę szukamy. A na pewno pomocne będą poniższe wyrażenia, które pozwolą nam na zbudowanie kryteriów, przeszukujących plik pod kątem naszych oczekiwań:

 

[xyz] – pasuje do x lub do y lub do z,

[a-z] – pasuje do wszystkich liter od a do z

[A-Za-z] – pasuje do dowolnej dużej i małej litery,

[0-9] – pasuje do dowolnej z cyfr,

[^xy] – pasuje do wszystkich znaków za wyjątkiem x i y,

. – dowolny znak,

^ – pusty łańcuch na początku linii,

$ – pusty łańcuch na końcu linii,

\< – pusty łańcuch na początku słowa,

\> – pusty łańcuch na końcu słowa.

Oprócz wyrażeń do dyspozycji mamy również opcje:

-i – zignoruj wielkość liter,

-v – wypisz te wiersze, które nie pasują do zbudowanego wzorca,

-f – porównaj wiersze wg wzorców zapisanych w pliku,

-c – zwróć liczbę wierszy pasujących do wzorca,

-n – wypisz numer wiersza, w którym zostało odnalezione dopasowanie,

-l – wypisz tylko nazwy plików w których znajduje się poszukiwany tekst,

-w – wyszukuje konkretny ciąg wyrazowy oznacza to że jeżeli szukany tekst to np. ta to zwrócone zostaną tylko te wartości w których ten tekst wystąpi, nie zostanie zwrócone np. słowo tata

-r – szukanie rekursywnie tzn. przeszukiwane są również podkatalogi,

-E – interpretuje wzorzec jako wyrażenie regularne.

 

Przy używaniu grep należy pamiętać, że aby znaleźć wyrazy zawierające następujące znaki: + | { } ( ) ? . znaki te trzeba zamaskować – maskujemy wykorzystując do tego prawy ukośnik \

To na koniec jeszcze parę przykładów:

 

grep zdjecie\.jpg plik.txt – gdy w poszukiwanym wyrazie chcemy odnaleźć kropkę wówczas znak kropki musimy zamaskować używając do tego prawego ukośnika, szukany ciąg to zdjecie.jpg

grep joan*a plik.txt – użycie * oznacza, że poprzedzający gwiazdkę element będzie dopasowany zero lub dowolną ilość razy, wydanie polecenia zwróci tekst: joana a także joanna czy joannna

grep komputer * – polecenie wyszuka wyraz komputer we wszystkich plikach bieżącego katalogu

grep ka$ plik.txt – wyrazy kończące się na ka czyli np. pralka, walka itd.

grep -E "^a|^b" plik.txt – zostaną wybrane wiersze zaczynające się znakiem a lub b (znak | oznacza lub)

 

 

Kompresja plików – narzędzia ZIP, TAR i RAR


 

W każdym szanującym się systemie istnieje możliwość utworzenia plików archiwum, zawierających skompresowane dane. W systemie Linux najpopularniejszymi narzędziami są programy ZIP i TAR. Programy te pozwalają nam na „pakowanie” wielu plików do jednego archiwum jak i na późniejsze wyodrębnienie tych plików z archiwum.

 

Aby utworzyć plik archiwum ZIP możemy posłużyć się poleceniem: zip <nazwa_archiwum> <pliki> Poniżej zostało utworzone archiwum spakowane.zip zawierające trzy pliki: plik, testwp, zdjecia

 

 

Aby spakować cały katalog można posłużyć się symbolem wieloznacznym *.* bądź gdy chcemy dodać pliki określonego rodzaju np. pliki tekstowe - *.txt

 

Dodanie plików do archiwum odbywa się poprzez odwołanie się do wcześniej utworzonego pliku archiwum wraz z nazwą plików, które chcemy dodać. Odwołując się do przykładu powyżej aby do archiwum spakowane.zip dodać plik dane należałoby posłużyć się poleceniem: zip spakowane.zip dane

 

Sprawdzenie zawartości archiwum bez jego rozpakowania możemy wykonać za pomocą komendy: unzip -l <archiwum> Jak można zauważyć plik dane został dodany do pliku archiwum spakowane.zip.

 

 

Aby z pliku spakowane.zip wyodrębnić „spakowane” pliki, plik archiwum został przekopiowany do katalogu: /home/Dokumenty/katalog2 a następnie została wydana komenda: unzip <plik_archiwum> nakazująca wyodrębnienie plików.

 

 

Narzędzie ZIP jest używane z reguły do kompresji plików, które np. mają zostać wysłane do osoby nie korzystającej z systemu Linux natomiast w przypadku osób posiadających system Linux bardziej odpowiednią opcją wydaje się wybranie drugiego narzędzia a mianowicie TAR.

 

Opis narzędzia wykonam na tym samy zestawie danych jakie zostały wykorzystane do omówienia programu ZIP.

 

Aby użyć narzędzia TAR celem skompresowania plików należy wydać komendę: tar cvzf <nazwa_archiwum> <pliki>

 

 

Aby podejrzeć pliki znajdujące się w archiwum skorzystaj z polecenia: tar tvzf spakowane.tar.gz

 

 

Aby zaś rozpakować pliki należy użyć komendy: tar xvzf <skapowane_archuwum> Na przykładzie poniżej spakowane archiwum zostało skopiowane do folderu katalog2 i następnie wyodrębniono pliki.

 

 

W przypadku plików RAR należy w pierwszej kolejności doinstalować aplikacje odpowiedzialne za obsługę tego typu plików: sudo apt-get install rar unrar (rar potrafi nam kompresować i dekompresować pliki, natomiast unrar tylko dekompresować).

 

 

Kompresja plików odbywa się za pomocą polecenia: rar a <nazwa_pliku_rar> <pliki/katalogi> Po wydaniu polecenia następuje kompresja plików.

 

 

Test archiwum odbywa się poprzez użycie przełącznika: t

 

 

Dodanie pliku do archiwum odbywa się również dzięki ustawionej fladze a z zdefiniowanymi plikami, które chcemy do archiwum dodać (w przykładzie poniżej do wcześniej utworzonego archiwum spakowane.rar został dodany plik dane)

 

 

Kasowanie pliku z archiwum możemy wykonać za pomocą przełącznika d (wcześniej dodany plik dane został z archiwum usunięty)

 

 

Dekompresja archiwum odbywa się za pomocą polecenia: rar e <plik_rar>

 

 

Inne przydatne opcje:

 

-u – aktualizacja plików w archiwum,

-p – ustawienie hasła,

-r – kompresja wraz z podkatalogami,

-c – komentarz do archiwum.

 

 

Stat informacje o stanie pliku bądź sytemu plików.


 

Wydając polecenie stat <nazwa_pliku/katalogu> uzyskamy podstawowe informacje dotyczące danego pliku a także dane o operacjach wykonywanych na pliku (prawa dostępu, właściciel, czasy zmiany, modyfikacji itd.) natomiast dodając przełącznik -f uzyskamy informacje o pliku w kontekście systemu plików.

 

 

Dane uzyskane dzięki poleceniu możemy sformatować według własnego uznania poprzez zastosowanie przełączników podanych poniżej. Np. chcąc uzyskać informacje o prawach dostępu do plików w postaci ósemkowej i tradycyjnej należy wydać polecenie: stat -c %a%A <nazwa_pliku>

 

 

Prawidłowe specyfikacje formatu dla plików (bez opcji --file-system):

 

%a – prawa dostępu ósemkowo,

%A – prawa dostępu w postaci czytelnej dla człowieka,

%b – liczba zajętych bloków (zobacz %B),

%B – rozmiar w bajtach każdego bloku podanego przez %b,

%C – kontekst bezpieczeństwa,

%d – numer urządzenia dziesiętnie,

%D – numer urządzenia szesnastkowo,

%f – tryb surowy, szesnastkowo,

%F – typ pliku,

%g – numer grupy właściciela pliku,

%G – nazwa grupy właściciela pliku,

%h – liczba dowiązań zwykłych,

%i – numer i-węzła,

%m – miejsce zamontowania,

%n – nazwa pliku,

%N – nazwa pliku w cudzysłowach, rozwiązana jeżeli dowiązanie symboliczne,

%o – optymalny rozmiar wielkości transferu wejścia/wyjścia,

%s – całkowity rozmiar w bajtach,

%t – większy numer urządzenia szesnastkowo,

%T – mniejszy numer urządzenia szesnastkowo,

%u – identyfikator właściciela,

%U – nazwa właściciela,

%w – czytelny dla człowieka czas utworzenia pliku albo - jeżeli nieznany,

%W – czas utworzenia pliku w sekundach albo - jeżeli nieznany,

%x – czytelny dla człowieka czas ostatniego czytania,

%X – czas ostatniego czytania w sekundach,

%y – czytelny dla człowieka czas ostatniej modyfikacji,

%Y – czas ostatniej modyfikacji w sekundach

%z – czytelny dla człowieka czas ostatniej zmiany czasu,

%Z – czas ostatniej zmiany czasu w sekundach.

 

Prawidłowe specyfikacje formatu dla systemów plików:

 

%a – liczba wolnych bloków dostępnych dla zwykłego użytkownika,

%b – całkowita liczba bloków danych w systemie plików,

%c – całkowita liczba i-węzłów w systemie plików,

%d – liczba wolnych i-węzłów w systemie plików,

%f – liczba wolnych bloków w systemie plików,

%i – identyfikator systemu plików szesnastkowo,

%l – maksymalna długość nazw plików,

%n – nazwa pliku,

%s – optymalny rozmiar bloku przy zapisie/odczycie,

%S – podstawowy rozmiar bloku (dla zliczeń bloków),

%t – rodzaj systemu plików szesnastkowo,

%T – rodzaj systemu plików w formie czytelnej dla człowieka.

 

 

Du – wielkość plików/katalogów


 

Aby poznać wielkość jaką pliki bądź katalogi zajmują na dysku możemy skorzystać z polecenia: du Domyślnie wydanie polecenia powoduje wyświetlenie objętości plików i podkatalogów odnośnie katalogu w którym się znajdujemy. Dodanie do polecenia nazwy pliku bądź katalogu spowoduje wyświetlenie objętości pliku/katalogu.

 

 

Przydatne opcje:

 

-b – wielkość pliku podawana w bajtach,

-k – wielkość pliku podawana w kilobajtach,

-m – wielkość pliku podawana w megabajtach,

-h – automatyczny dobór wyświetlanej jednostki,

-c – podsumowanie na końcu,

-s – jedynie całkowita wielkość.

 

 

Zawartość pliku


 

W systemie Linux istnieje szereg poleceń pozwalających nam na podejrzenie zawartości interesującego nas pliku. Poniżej przedstawię kilka przykładów, choć zaprezentowaną przeze mnie gamę poleceń pewnie można jeszcze uzupełnić o dodatkowe.

 

Pierwsza polecenie, które chciałbym przedstawić jest to komenda: less Polecenie to umożliwi nam zajrzenie do pliku, przy czym prezentowana wartość wyświetlana jest kolejno po jednej stronie. Wydanie np. polecenia: less /var/log/syslog.1 wyświetli nam zawartość pliku syslog.1

 

 

Po wciśnięciu klawisza: h w trakcie działania polecenia zostanie wyświetlona pomoc programu. W pomocy zawarte są informacje dotyczące działania programu dotyczące np. sposobu wyświetlania zawartości pliku.

 

Dodatkowo podczas wywołania programu można skorzystać z szeregu opcji pozwalających nam na określenie sposobu działania programu. Przydatne flagi to:

 

-N – numeracja wyświetlanych wierszy,

-c – wyczyszczenie ekranu, przed wyświetleniem następnego,

-m – informacja o procencie wyświetlonego pliku,

-s – puste wiersze są redukowane do jednego,

-S – wyłączenie zawijania wierszy, teks jest przycięty do szerokości ekranu.

 

Użycie polecenia: head spowoduje wypisanie pierwszych dziesięciu wierszy pliku. Polecenia można używać by szybko zorientować się co w danym pliku się znajduje.

 

 

Parametry na, które mamy wpływ to:

 

-<liczba> - wyświetlenie zdefiniowanej liczby wierszy,

-c <liczba> - wyświetlenie zdefiniowanej liczby bajtów pliku,

-q - tryb cichy, polecenie head przy większej ilości zdefiniowanych do wyświetlenia plików nie wyświetla nagłówka pliku zawierającego jego nazwę.

 

Podobnym poleceniem, które możemy użyć do szybkiego zbadania zawartości pliku jest polecenie: tail tylko w przeciwieństwie do head wydanie komendy spowoduje wyświetlenie ostatnich dziesięciu wierszy.

 

 

Parametry na, które mamy wpływ to:

 

-<liczba> - wyświetlenie zdefiniowanej liczby wierszy,

-c <liczba> - wyświetlenie zdefiniowanej liczby bajtów pliku,

-q - tryb cichy, polecenie tail przy większej ilości zdefiniowanych do wyświetlenia plików nie wyświetla nagłówka pliku zawierającego jego nazwę,

-f - użycie tej flagi spowoduje otwarcie pliku i jego ciągłe monitorowanie, nowe wiersze będą się pojawiać w miarę dodawania nowych informacji do otwartego pliku. Użycie tego parametru świetnie nadaje się do przeglądania wszelkiego rodzajów logów monitorujących stan systemu.

 

Innym programem, który pozwoli nam na podejrzenie zawartości pliku jest: cat

 

 

Niektóre parametry programu to:

 

-s - użycie flagi spowoduje połączenie pustych następujących po sobie wierszy w jeden,

-b - numerowanie nie pustych wierszy,

-n - numerowanie wierszy

 

Gdy istnieje potrzeba numeracji wierszy w danym pliku możemy do tego celu użyć komendy: nl

 

 

Parametry:

 

-v <liczba> - rozpoczęcie numeracji od zdefiniowanej liczby,

-i <liczba> - zdefiniowanie licznika numeracji czyli wartość o jaką będą się zmieniały kolejne numerowane wiersze,

-b <a><t><n><pW> - określenie sposobu numerowania: -ba numeracja wszystkich wierszy; -bt numeracja niepustych wierszy; -bn brak numerowania; -pW numerowanie tylko tych wierszy, które zawierają zdefiniowane wyrażenie W,

-n <ln><rn> - wyrównanie numeracji: -nln wyrównanie do lewej strony, -nrn wyrównanie do prawej strony,

-w <liczba> - ustalenie szerokości przeznaczonej na numerację,

-s <znak> - ustalenie znaku, który zostanie wstawiony pomiędzy numerację a tekst (domyślnie jest to znak tabulacji).

 

Aby wydobyć ciągi tekstowe z blików binarnych możemy posłużyć się poleceniem: strings Polecenie przydatne, gdy chcemy poznać wersję czy autora danego programu.

 

 

W przypadku potrzeby przeglądnięcia pliku binarnego możemy skorzystać z dwóch programów: pierwszy z nich to od drugi to zaś xxd.

 

W przypadku pierwszego mamy możliwość wyświetlenia zawartości pliku w postaci ósemkowej (domyślna wartość), dziesiętnej (flaga: -Ad) lub heksadecymalnej (flaga: -Ax).

 

 

Drugi program dane prezentuje w formie heksadecymalnej bądź binarnej (flaga: -b)

 

 

Aby przeglądać pliki PDF możemy skorzystać z programu xpdf lub gv.

 

 

I tu chciałbym zakończyć, mam nadzieję, że nie zraziłeś się Czytelniku do takiej formy komunikacji z systemem i że dalej będziesz chciał odkrywać tajniki tej formy dogadania się z Linuxem. W kolejnym wpisie zajmiemy się kontrolą procesów oraz użytkownikami.

 


 

Bibliografia:

 

http://www.computerhope.com/unix/uchmod.htm

http://krnlpanic.com/wp/linux-file-and-directory-permissions-explained/

http://rtfq.net/linux/linux-single-user/permissions-basic-command-line-tutorial/

]]>
[email protected] (pikolo) Linux Fri, 10 Jul 2015 20:52:24 +0000
FTP w wydaniu Linux Ubuntu http://slow7.pl/linux/item/96-ftp-w-wydaniu-linux-ubuntu http://slow7.pl/linux/item/96-ftp-w-wydaniu-linux-ubuntu

Protokół FTP pomimo już sędziwego wieku (bo data powstania to 1973r.) do tej pory jest używany aby w łatwy sposób wysłać bądź ściągnąć pliki z serwera. Ci co prowadzą strony internetowe nieodzownie się z nim spotykają gdyż jest to najprostszy sposób aby wgrać bądź uaktualnić stronę internetową. Firmy (np. drukarnie) bardzo często udostępniają swoim klientom możliwość przesłania plików właśnie z wykorzystaniem protokołu FTP. Uruchomienie swojego własnego serwera FTP (bądź jego bezpiecznej wersji FTPS czy też nazywanej SFTP) nie jest trudnym zadaniem i w tym wpisie się tym zajmiemy. Naszym celem jest skonfigurowanie serwera FTP wykorzystując do tego system Linux Ubuntu 14.04 oraz oprogramowanie vsftpd.

Instalację serwera FTP zaczynamy od pobrania pakietu vsftpd. Pakiet ten zawiera serwer FTP dla systemów uniksowych. Zapewnia obsługę standardowego protokołu FTP jak i jego zabezpieczonej wersji FTPS a dodatkowo również ma wsparcie dla IPv6.

Po wydaniu komendy: apt-get install vsftpd następuje proces instalacji serwera FTP.

 

 

Serwer uruchamiamy poleceniem: sudo service vsftpd start a działanie (nasłuchiwanie) możemy sprawdzić za pomocą komendy: netstat -a | grep ftp Jak widać poniżej serwer został uruchomiony i czeka na połączenia.

 

 

Aby sprawdzić działanie serwera możemy spróbować połączyć się za pomocą poświadczeń konta, które mamy już w systemie utworzone. Poniżej udało się nawiązać połączenie z wykorzystaniem wcześniej założonego konta luk, dostęp do katalogu domowego poprzez FTP jest możliwy.

 

 

Aby założyć nowe konto możemy do tego celu wykorzystać panel Konta użytkowników dostępny poprzez Ustawienia systemu.

 

 

Konto (użytkownik john) tworzymy poprzez kliknięcie w prawym górnym oknie na opcję Odblokuj i po podaniu hasła poprzez przycisk plus (+) mamy możliwość dodania nowego użytkownika. Hasło ustalamy poprzez kliknięcie na pole Hasło

Po utworzeniu w ten sposób nowego konta z wykorzystaniem skonfigurowanych poświadczeń będziemy mogli uzyskać dostęp do katalogu domowego poprzez serwer FTP.

 

 

Po zalogowaniu się na serwerze FTP do dyspozycji mamy tylko operacje: przeglądania katalogów oraz kopiowania plików z serwera na host lokalny. Zabronione jest możliwość wysyłania plików. Poniżej przykład utworzenia katalogu test (polecenie: mkdir test), wydanie polecenia kończy się niepowodzeniem.

 

 

Natomiast operacja w drugą stronę jest jak najbardziej możliwa. Aby skopiować plik z serwera za pomocą polecenia: lcd <katalog_lokalny> ustawiamy lokalizację (folder) do której mają zostać przekopiowane pliki a następnie przy użyciu komendy: get <nazwa_pliku> wskazujemy na plik, który ma zostać skopiowany. Możliwe jest również użycie polecenia: mget <plik1> <plik2> <itd.> gdy chcemy przetransferować większa liczbę plików. W poniższym przykładzie z serwera został skopiowany plik 1.pdf do lokalizacji /home/luk/Pulpit

 

 

Domyślna zmiana ustawień serwera następuje poprzez edycję pliku vsftpd.conf zapisanego w katalogu /etc

Pierwszą czynnością jaką wykonamy będzie danie użytkownikom możliwości zapisu. Po otwarciu pliku vsftpd.conf (np. vi /etc/vsftpd.conf lub nano vi /etc/vsftpd.conf ) należy odszukać linię: write_enable=YES i z początku linii usunąć znak komentarza: #

 

 

Po wprowadzeniu zmian i zapisie pliku będzie dana możliwość wysyłania danych na serwer FTP. Lecz by wprowadzone przez nas zmiany doszły do skutku serwer FTP należy za pomocą polecenia: sudo service vsftpd restart zrestartować.

 

 

Po wykonaniu restartu i ponownym zalogowaniu się spróbujmy utworzyć katalog test. Jak widać poniżej bez żadnych przeszkód udało nam się wykonać tę operację.

Tworzenie katalogu następuje po wydaniu polecenia: mkdir <nazwa_katalogu> natomiast kasowanie odbywa się przy użyciu komendy: rmdir <nazwa_katalogu>

Sprawdźmy jeszcze jak odbywa się proces przesyłu pliku. Po poprawnym zalogowaniu się i po przejściu do katalogu test (polecenie: cd test) następuje ustawienie katalogu roboczego (polecenie: lcd) i przy użyciu komend: put <nazwa_pliku> bądź opcjonalnie send <nazwa_pliku> pliki 1.pdf oraz 2.pdf zostają wysłane na serwer.

 

 

W przypadku użycia polecenia put możliwe jest zapisanie pliku pod zmienioną nazwą: put <plik_kopiowany> <nowa_nazwa_pliku> Aby wysłać wiele plików należy do tego celu użyć polecenia: mput <plik1> <plik2> <itd.> Kasowanie plików odbywa się z wykorzystaniem polecenia: delete <nazwa_pliku> i tradycyjnie już gdy chcemy skasować wiele plików należy posłużyć się poleceniem: mdelete <plik1> <plik2> <itd.>

Do rozwiązania ewentualnych problemów oraz do kontroli kto, kiedy łączył się z naszym serwerem FTP może posłużyć nam log programu vsftpd. Oprócz wspomnianych informacji log dostarcza nam również dane o plikach, które zostały pobrane lub wgrane na nasz serwer. Log dostępny jest w lokalizacji: /var/log/vsftpd.log

 

 

Do naszego serwera dostęp mogą mieć użytkownicy anonimowi, którzy nie mają założonego konta w systemie. Wystarczy, że w pliku vsftpd.conf włączymy takowy dostęp za pomocą polecenia: anonymous_enable=YES

 

 

Domyślnym katalogiem dla użytkowników domowych jest folder /srv/ftp aby zmienić tę lokalizację należy dodać linię: anon_root=<lokalizacja> np. anon_root=/pub/ftp

Po zresetowaniu serwera dostęp dla użytkownika anonimowego powinien być dostępny.

 

 

Podstawowe pojęcia mamy omówione spróbujmy więc wykonać trochę bardziej zaawansowane zadanie a mianowicie założenia zadania są następujące:

      • mamy dwie grupy użytkowników: marketing i reklama
      • do grupy marketing należy użytkownik jan.kowalski a do grupy reklama użytkownik tadeusz.nowak
      • na serwerze FTP znajdują się trzy katalogi: rekfol, marfol, i wszyscy. Do katalogu rekfol dostęp mają tylko członkowie grupy reklama (zapis i odczyt), do katalogu marfol dostęp mają tylko członkowie grupy marketing (zapis i odczyt) natomiast do folderu wszyscy członkowie obu grup.

Zadanie zaczniemy od utworzenia katalogów rekfol oraz marfol.

 

 

Następnie utworzymy dwie grupy: marketing i reklama. Grupę można stworzyć za pomocą komendy: groupadd <nazwa_grupy>

 

 

A następnie tworzymy konta użytkowników. Do utworzenia konta użytkownika wykorzystujemy polecenie useradd W poleceniu zostały użyte dodatkowe flagi a mianowicie:

-g – dodanie użytkownika do grupy,

-d – przypisanie użytkownikowi katalogu domowego,

-s – ustawienie powłoki systemowej.

 

 

Do utworzonych w poprzednim kroku kont definiujemy hasła. Do przypisania hasła użytkownikowi służy polecenie: passwd <nazwa_użytkownika>

 

 

Spróbujmy się zalogować. Jak widać poniżej nie udało się zalogować z poświadczeniami użytkownika jan.kowalski

 

 

By logowanie stało się możliwe i dostęp do powłoki został uzyskany musimy do pliku /etc/shells dodać linię: /usr/sbin/nologin gdyż taką ścieżkę podaliśmy przy poleceniu utworzenia konta użytkownika.

 

 

Po wprowadzonych zmianach dostęp do serwera FTP jest możliwy ale jak widać poniżej niemożliwe jest kopiowanie plików. Wydana komenda: put 1.pdf nakazująca wysłanie pliku kończy się niepowodzeniem.

 

 

Kopiowanie plików jest niemożliwe (lokacja /ftp) gdyż nie mamy przyznanych praw zapisu do katalogów w których pliki te mają zostać zapisane. Katalog został utworzony z poziomu użytkownika root i tylko on ma możliwość dokonania zapisu my tylko mamy prawo do odczytu i wykonania (zapis r-x, trzy ostatnie symbole). Zapis drwxr-xr-x oznacza że:

drwxr-xr-x – do czynienia mamy z katalogiem,

drwxr-xr-x – trzy pierwsze symbole oznaczają prawa użytkownika w tym przypadku odnoszą się do użytkownika root, symbol: r (ang. read) oznacza prawo do czytania, symbol: w (ang. write) prawo do zapisu zaś symbol: x (ang. execute) prawo do wykonania,

drwxr-xr-x – kolejne trzy symbole odnoszą się do praw grupy; grupa root prawo do czytania i prawo do wykonania,

drwxr-xr-x – ostatnie symbole odzwierciedlają prawa pozostałych grup czyli w naszym przypadku prawo do czytania i prawo do wykonania.

 

 

Zalogowany użytkownik jan.kowalski należy do grupy marketing więc jego prawa zawarte są w zapisie: drwxr-xr-x (grupy pozostałe) i jak widać dla grup tych prawo zapisu nie zostało przyznane.

Odmowa zapisu dotyczy również katalogów marfol i rekfol.

Aby osiągnąć nasz cel musimy zmienić właściciela utworzonych katalogów gdyż katalogi te są przypisane grupie root.

 

 

Zgodnie z scenariuszem folder rekfol przypiszemy grupie reklama zaś folder marfol grupie marketing. Zmieńmy więc właścicieli katalogów. Zmiana właściciela katalogu odbywa się za pomocą polecenia: chown <użytkownik>:<grupa_nowa> <katalog>

 

 

Po wydaniu komendy chown właścicielem katalogu marfol staje się grupa marketing zaś właścicielem folderu rekfol jest grupa reklama.

Po zmianie właściciela katalogów trzeba jeszcze grupie przyznać prawo zapisu. Do zmiany praw (dodanie bądź odjęcie) wykorzystujemy polecenie: chmod <prawa> <folder> Zostało wydane polecenie chmod z flagą 775 ponieważ liczba ta oznacza:

7prawa użytkownika – prawo do odczytu wartość: 4 + prawo do zapisu wartość: 2 + prawo do wykonania wartość: 1 co po zsumowaniu daje nam liczbę 7,

7 prawa grupy – ten sam zestaw praw co powyżej,

5prawa dla pozostałych - prawo do odczytu wartość: 4 + prawo do zapisu nie zostaje przyznane wartość: 0 + prawo do wykonania wartość: 1 co po zsumowaniu daje nam liczbę 5.

Po wydaniu komendy: ls -l możemy sprawdzić stan nadanych uprawnień

 

 

Tak więc sprawdźmy jak teraz wygląda efekt przeprowadzonych przez nas operacji. Czy skonfigurowani przez nas użytkownicy mogą wykonać zdefiniowane przez nas czynności.

Na pierwszy ogień weźmiemy użytkownika jan.kowalski

Po nawiązaniu sesji FTP (pkt. 1) następuje ustawienie katalogu roboczego na folder /home/luk/Pulpit (pkt. 2) i następnie przejście do folderu marfol (pkt. 3) Do lokalizacji tej zostaje wysłany plik 1.pdf (pkt. 4) a operacja ta kończy się sukcesem (pkt. 5). W następnej kolejności przechodzimy do katalogu rekfol (pkt. 6) i tu ponownie następuje próba skopiowania pliku 1.pdf lecz tym razem próba ta kończy się niepowodzeniem (pkt. 7).

Czyli przeprowadzona konfiguracja spełnia założenia naszego scenariusza. Użytkownik jan.kowalski jako członek grupy marketing w swoim folderze może wykonać zapis lecz w folderze rekfol który należy do grupy reklama operacja zapisu jest zablokowana.

 

 

W przypadku użytkownika tadeusz.nowak mamy do czynienia z sytuacją odwrotną. Użytkownik ten jako członek grupy reklama nie może wykonać operacji zapisu do folderu marfol (pkt. 1) gdyż nie jest członkiem grupy marketing natomiast do folderu rekfol tak (pkt. 2) gdyż pozwala mu na to przynależność do grupy reklama.

 

 

Efekt naszych prób możemy również zaobserwować przeglądając log serwera.

 

 

Jakbyśmy chcieli np. zablokować dostęp do katalogu danej grupy należy tylko odpowiednio dobrać uprawnienia do katalogu. Teraz członek grupy reklama może prowadzić zapis do katalogu rekfol natomiast odmowa następuje w przypadku folderu marfol. Aby zablokować wejście użytkownikowi grupy reklama do folderu marfol należącego do grupy marketing na folder ten należy nałożyć uprawnienie 770

Ostatnim zadaniem, które na nas czeka jest danie uprawnienia obu grupom do prowadzenia zapisu w wspólnym folderze wszyscy. Zaczniemy od utworzenia katalogu wszyscy i utworzenia nowej grupy razem.

 

 

Kolejnym naszym krokiem będzie do nowo utworzonej grupy dodanie użytkowników jan.kowalski oraz tadeusz.nowak. Dodanie do grupy realizujemy za pomocą polecenia usermod z opcją G Gdybyśmy popełnili błąd za pomocą polecenia: deluser <użytkownik> <grupa> możemy danego użytkownika wykluczyć z grupy. Aby sprawdzić prawidłowość dodania użytkownika do grupy wykorzystaj polecenie: groups <użytkownik>

 

 

Po wykonaniu operacji oba konta będą należeć do swoich grup podstawowych a zarazem do wspólnej grupy razem.

Aby zapis był możliwy musimy zmienić właściciela katalogu wszyscy. Nowym właścicielem katalogu staje się grupa razem (polecenie: chown)

 

 

Ostatnią czynnością jest ustalenie uprawnień do katalogu. Zostaje nadane uprawnienie 770 - użytkownik root może wykonać wszystkie operacje, członek grupy razem może wykonać wszystkie operacje natomiast pozostali nie mogą zrobić nic.

 

 

Po dokonaniu konfiguracji sprawdźmy efekt naszych działań. Użytkownik jan.kowalski uzyskuje dostęp do serwera (pkt.1). Próba zapisu pliku 2.pdf do katalogu marfol, kończy się sukcesem (pkt.2), zapis do katalogu rekfol kończy się niepowodzeniem (pkt.3) natomiast zapis do folderu wszyscy zgodnie z oczekiwaniami jest możliwy (pkt.4).

 

 

Tak więc osiągnęliśmy nasz cel. Zadanie zostało wykonane.

Jak wiadomo protokół FTP do zbyt bezpiecznych nie należy gdyż dane uwierzytelniające (login i hasło) są przesyłane tekstem otwartym. Spróbujmy więc podnieść poziom bezpieczeństwa i spróbujmy skonfigurować nasz serwer aby korzystał z szyfrowania.

Naszym zadaniem będzie uruchomienie serwera FTPS (znany także jako FTP Secure i FTP-SSL) czyli serwera FTP który to umożliwia wsparcie dla szyfrowanych protokołów Transport Layer Security (TLS) oraz Secure Sockets Layer (SSL).

Zaczniemy od utworzenia certyfikatu SSL, który to w kolejnym kroku powiążemy z vsftpd. Aby utworzyć certyfikat CA skorzystamy z polecenia: openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

Po wydaniu polecenia możemy odpowiedzieć na pojawiające się pytania (dane wystawcy certyfikatu) lub pola pozostawić puste zatwierdzając każde pytanie enterem.

 

 

Po poprawnym utworzeniu certyfikatu czas by wygenerowane pliki powiązać z naszym serwerem FTP.

Aby skonfigurować serwer do korzystania z bezpiecznego połączenia w pierwszej kolejności dodajemy do pliku vsftpd.conf wpisy wskazujące na lokalizację klucza oraz certyfikatu utworzonego przez narzędzie openssl. Dodajemy wpisy: rsa_cert_file=/etc/ssl/private/vsftpd.pem oraz rsa_private_key_file=/etc/ssl/private/vsftpd.pem

W kolejnym kroku włączamy korzystanie z SSL:

ssl_enable=YES

allow_anon_ssl=NO

force_local_data_ssl=YES

force_local_logins_ssl=YES

Umieszczenie tych wpisów w pliku vsftpd.conf spowoduje, że łączność z naszym serwerem będzie mogła odbywać się tylko z wykorzystaniem protokołu SSL. Gdy chcemy użytkownikowi dać wybór i pozostawić mu możliwość nawiązania połączenia w tradycyjny sposób parametry force_local_data_ssl oraz force_local_logins_ssl zamieniamy na NO

Za pomocą wpisów poniżej określamy preferencję używanej wersji protokołu:

ssl_tlsv1=YES

ssl_sslv2=NO

ssl_sslv3=NO

i na koniec do naszego pliku dodajemy jeszcze dwa wpisy:

require_ssl_reuse=NO

ssl_ciphers=HIGH

 

 

Po tak przeprowadzonej konfiguracji powinno nam się udać połączyć z naszym serwerem z wykorzystaniem protokołu SSL. Przy pierwszym połączeniu będziemy proszeni o zaakceptowanie certyfikatu, reszta czynności przebiega identycznie jak w przypadku korzystania z tradycyjnej wersji FTP.

 

 

Poniżej argument, który powinien przekonać cię Czytelniku, że jednak warto zdecydować się na wdrożenie wersji zabezpieczonej naszego serwera. Na dwóch zrzutach poniżej przedstawiam screeny z przechwyconych sesji nawiązywania połączenia z serwerem FTP. Pierwszy screen dotyczy tradycyjnego serwera FTP (bez SSL) natomiast drugi jego bezpieczniejszej odmiany.

Wersja tradycyjna

 

 

oraz wersja z wdrożonym szyfrowaniem

 

 

Analiza zrzutów mam nadzieje, że mówi sama za siebie (jak prosto jest odczytać login i hasło podłączającego się użytkownika).

Poniżej prezentuję jeszcze krótki opis wpisów zawartych w pliku /etc/vsftpd.conf odpowiedzialnych za konfigurację serwera FTP.

Opcje:

nopriv_user= - określa poziom z którego zostaje uruchomiony serwer

listen= - uruchomienie serwera

listen_port= - określenie portu nasłuchiwania, można zmienić domyślny port 21 wykorzystywany przez większość serwerów FTP na dowolny. Przy zmianie tego parametru należy pamiętać, że w trakcie nawiązywania połączenia trzeba w adresie serwera do tego portu nawiązać np. mojserwer.pl:<numer_portu>

ascii_download_enable= - włączenie metody ASCI, pobieranie plików,

ascii_upload_enable= - włączenie metody ASCI, wysyłanie plików,

connect_from_port_20= - włączenie trybu aktywnego (YES) bądź pasywnego (NO),

port_enable= - wpisanie YES aktywuje tryb pasywny,

local_enable= - włączenie możliwości połączenia dla użytkowników lokalnych

write_enable= - włączenie możliwości zapisu dla połączeń nawiązywanych przez użytkowników lokalnych

local_umask= - umask (domyślnie 022) tzw. maska użytkownika bądź maska uprawnień. Czyli zestaw wartości, który jest wykorzystywany do przypisania uprawnień dla nowych plików

anon_umask= - maska dotycząca użytkowników anonimowych

no_anon_password= - pytanie o hasło, dotyczy użytkownika anonimowego,

anon_world_readable_only= - włączenie możliwości pobierania plików, atrybut pliku musi być ustawiony na read, dotyczy użytkownika anonimowego,

anon_upload_enable= - włączenie możliwości zapisu plików na serwerze, dotyczy użytkownika anonimowego,

anon_mkdir_write_enable= - włączenie możliwości tworzenia nowych katalogów, dotyczy użytkownika anonimowego,

anon_other_write_enable= - włączenie kasowana katalogów, lub zmiany ich nazwy, dotyczy użytkownika anonimowego,

anon_max_rate= - limit prędkości, jednostka bajty na sekundę, zapis 0 oznacza prędkość maksymalną, dotyczy użytkownika anonimowego,

local_max_rate= - limit prędkości, jednostka bajty na sekundę, zapis 0 oznacza prędkość maksymalną

xferlog_enable= - włączenie logowania,

xferlog_file=/var/log/vsftpd.log - ścieżka do pliku loga,

log_ftp_protocol= - włączenie zapisu loga odnośnie poleceń wydawanych przez użytkowników,

max_clients= - maksymalna liczba jedoczesnych połączeń,

max_per_ip= - maksymalna liczba jedoczesnych połączeń w zależności od adresu IP,

banner_file=/etc/vsftpd/vsftpd.banner - ścieżka do pliku definiującego banner, który wyświetlany jest podczas łączenia się z serwerem,

ftpd_banner= - definicja tekstu bannera, który wyświetlany jest podczas łączenia się z serwerem,

idle_session_timeout= - czas bezczynności, jednostka sekundy,

chroot_local_user= - definicja pozwolenia poruszania się po całej strukturze plików serwera FTP. Domyślnie użytkownik łączy się z swoim katalogiem domowym, poprzez to ustawienie możemy znieść to ograniczenia. Poniżej przykład w którym użytkownik luk może przejść do katalogu głównego systemu Linux.

 

 

chroot_list_enable= - stosowane gdy chcemy zdefiniować listę uprawnionych użytkowników, którzy mogą poruszać się poza obrębem swojego katalogu domowego. Listę użytkowników tworzymy bp. w pliku /etc/vsftpd/chroot.list dodając ścieżkę do pliku w definicji chroot_list_file=<ścieżka_do_pliku>

 

Opcji konfigurujących nasz serwer jest znacznie więcej, przedstawiłem te które konfiguruje się najczęściej. Jeśli Czytelniku nie znalazłeś tych, które są Ci potrzebne odsyłam do bibliografii.

I na tym chciałbym zakończyć myślę, że po lekturze tego wpisu nie będzie już problemu by serwer FTP postawić w własnym zakresie. Gdyby coś jednak było nie jasne zapraszam do oglądnięcia filmiku w którym pokazałem wszystkie czynności opisane w tym artykule.

 

{mp4}ftplinux/ftplinux{/mp4}

 


 

Bibliografia:

https://security.appspot.com/vsftpd/vsftpd_conf.html

http://retheesh.blogspot.com/2009/09/change-vsftpd-anonymous-login-default.html

https://bbs.archlinux.org/viewtopic.php?id=140802

http://www.krizna.com/ubuntu/setup-ftp-server-on-ubuntu-14-04-vsftpd/

https://www.youtube.com/watch?v=SiiFFy1M4jU

http://www.wikihow.com/Set-up-an-FTP-Server-in-Ubuntu-Linux

https://help.ubuntu.com/community/vsftpd

http://ubuntuforums.org/showthread.php?t=518293

]]>
[email protected] (pikolo) Linux Mon, 11 May 2015 18:03:14 +0000
Active Directory w wydaniu Linux http://slow7.pl/linux/item/74-active-directory-w-wydaniu-linux http://slow7.pl/linux/item/74-active-directory-w-wydaniu-linux

 

Projekt Samba działa już od wielu lat a swoje początki sięga roku 1991 kiedy to Andrew Tridgell na potrzeby swojej lokalnej sieci napisał program serwera plików. Po kilku latach Tridgell rozwinął swój serwer nazywając go Sambą a efekty swojej pracy udostępnił w Internecie. Do niedawna główne zadanie Samby sprowadzało się do umożliwenia komputerom działającym pod kontrolą systemu Linux (lecz nie tylko) na łączenie się z sieciami opartmi na sytemie Windows. Serwer Samba dodatkowo umożliwiał wzajemną wymianę plików a także dostęp do drukarek. Wszak Samba pozwalała na uzyskanie połączenia z domeną opartą o Active Directory, lecz nie oferowała usługi samodzielnego kontrolera usługi katalogowej Active Directory. Wszystko zmieniło się od wydania czwartej odsłony Samby. Udostępnione oprogramowanie jest opensource'owym zamiennikiem oprogramowania zawartego w Windows Server (przynajmniej jeśli chodzi o świadczenie usług domenowych opartych o AD). Serwery oparte o Sambą nie tylko oferują wszystkie funkcjonalności Active Directory, lecz także pozwalają na łączność z już istniejącym i działającym schematem AD a dodatkowo pozwalają na odwrócenie roli czyli utworzenie domeny opartej o Sambę i późniejsze dołączenie kontrolerów, których pracą steruje system Windows. Działanie Samby w oparciu o usługę Active Directory możliwe jest dzięki zintegrowaniu z oprogramowaniem serwera katalogowego LDAP, serwera uwierzytelnienia Kerberos, usługi rozwiązywania adresów domenowych (DNS) oraz pakietu wywołań zdalnych procedur.

 

Nasze rozważania na temat Samby, Active Directory i tematów pokrewnych skoncentrujemy na następujących zagadnieniach:

      • instalacja systemu Linux Debian w wersji 7.7,
      • konfiguracja i przygotowanie systemu Linux do instalacji serwera Samba,
      • instalacja serwera Samba 4.1.13,
      • weryfikacja przeprowadzonej konfiguracj,
      • podstawowe zarządzanie kontrolerem domeny.

 


 

Instalację systemu Debian rozpoczynamy od pobrania interesującego nas obrazu sytemu ze strony projektu - https://www.debian.org/CD/http-ftp/ bądź https://www.debian.org/releases/wheezy/debian-installer/index.pl.html

Po wypaleniu płyty (a raczej płyt, a dokładnie trzech – wersja DVD) możemy pierwszy nośnik umieścić w napędzie. Po chwili instalator powinien zgłosić gotowość do pracy.

Proces instalacji możemy przeprowadzić korzystając z instalatora tekstowego bądź instalatora opartego na grafice. Instalator graficzny od instalatora tekstowego różni się tylko obsługą myszki, oraz wyglądem menu, pytania na które musimy odpowiedzieć podczas prowadzonego procesu instalacji są takie same. My skorzystamy z drugiego rozwiązania tak więc z listy wybieramy Graphical install. Gdy chcemy skorzystać z innego środowiska graficznego niż domyślne instalowane Gnome 3 wybierz Advanced options (do wyboru KDE, LXDE, Xfce).

 

 

Na pierwszym ekranie czeka nas wybór języka. Wybieramy język polski.

 

 

Kolejny krok to wybór lokalizacji – wybieramy Polska. Wybór ten ma wpływ na ustawienie strefy czasowej oraz parametrów regionalnych.

 

 

Na kolejnym ekranie wybieramy układ klawiatury.

 

 

Po kliknięciu na Dalej zostają załadowane składniki instalatora.

 

 

Ekran Konfiguruj sieć umożliwia nam wybranie interfejsu sieciowego, który zostanie użyty podczas instalacji systemu. Wybieramy interfejs z dostępem do Internetu tak aby instalator mógł pobrać pakiety aktualizacji.

 

 

Następuje konfiguracja sieci. W przypadku niepowodzenia będziemy mogli sami dokonać ustawień adresów IP. Konfiguracja ręczna wiąże się z podaniem następujących danych: adres IP twojego komputera, maskę sieci, bramę sieciową, adresy serwerów nazw (serwery DNS).

 

 

Na kolejnym ekranie Konfiguruj sieć dokonujemy konfiguracji nazwy naszego komputera/hosta. W naszym przypadku pozostawiam wartość domyślną – debian, choć ty czytelniku możesz oczywiście wpisać swoją dowolną wymyśloną wartość.

 

 

Kolejny ekran to podanie nazwy domeny do której należy host. Komputer nie przynależy do żadnej domeny a więc pole pozostawiamy puste (domenę będziemy dopiero tworzyć).

 

 

Przyszła pora na konfigurację użytkowników i haseł. Tak więc pierwszą czynnością jest ustalenie hasła dla konta root – administratora systemu. Hasło wpisujemy dwukrotnie.

 

 

Kolejny krok to podanie nazwy konta –najczęściej podajemy imię i nazwisko . Podawana nazwa będzie używana przez programy, które używają prawdziwej nazwy użytkownika np. programy pocztowe do uzupełnienia pola nadawca. Konto to jest kontem do użytku programów nie związane z celami administracyjnymi.

 

 

Kolejny ekran służy do zdefiniowania nazwy konta w systemie (konta systemowego).

 

 

Ostatnią czynności jest podanie hasła do nowo utworzonego konta.

 

 

Po przejściu opcji związanych z użytkownikiem, przyszedł czas by określić strukturę partycji na naszym dysku. My decydujemy się na ustawienia standardowe, tak więc będziemy partycjonować cały dysk.

 

 

Wybieramy dysk na którym zostanie utworzona partycja bądź partycje i dalsza instalacja systemu. Proces spowoduje usunięcie wszystkich danych znajdujących się na dysku.

 

 

Kolejna decyzja wiąże się z wyborem schematu partycji.

 

 

Na kolejnym ekranie mamy podgląd aktualnie skonfigurowanych partycji i punktów montowania a także mamy możliwość dokonania ewentualnych poprawek.

 

 

Ostatni ekran podsumowujący wprowadzone ustawienia do schematu partycji. Kliknięcie na Tak spowoduje zatwierdzenie wszystkich ustawień.

 

 

Następuje tworzenie partycji.

 

 

Po wykonaniu partycjonowania dysku, instalator systemu Debian pyta się o istnienie innych nośników zawierających pliki instalatora systemu. Jeśli posiadamy takowe płyty umieszczamy je w napędzie i wybieramy Tak. W przeciwnym wypadku pomijamy ten krok.

 

 

Skanowanie nośników ma na celu wyeliminowanie pobierania plików instalatora z Internetu. Potrzebne pakiety zamiast być pobierane będą dostarczone z zeskanowanych nośników.

 image21

 

Kolejny krok to pytanie o możliwość uczestnictwa w programie zbierania statystyk.

 

 

Przed rozpoczęciem kopiowania plików mamy jeszcze możliwość wybrania zestawu usług jakie ma nam oferować system. My decydujemy się na wybór tylko podstawowych składników gdyż potrzebne nam usługi skonfigurujemy sami.

 

 

Następuje proces instalacji i kopiowania niezbędnych pakietów.

 

 

Ostatnia decyzja wiąże się z instalacją programu rozruchowego GRUB. W tym momencie gdy na naszym komputerze mamy zainstalowane inne systemy operacyjne powinny one być uwidocznione. Program rozruchowy jest odpowiedzialny za wybór uruchamianego systemu.

 

 

Poprawnie przeprowadzona instalacja systemu kończy się komunikatem podsumowującym.

 

 


 

Po poprawnej instalacji systemu warto na początek wykonać aktualizację całego systemu. Aby aktualizacja powiodła się jako użytkownik root wydajemy polecenie: apt-get update && apt-get upgrade Następuje aktualizacja systemu.

 

 

Zanim przejdę dalej jeszcze jedno słowo wytłumaczenia. Wszystkie prezentowane przeze mnie czynności są wykonywane w symulowanym środowisku opierającym się na VirtualBox. Tak aby sobie ułatwić pracę z wirtualnymi maszynami warto zainstalować na każdym wirtualnym systemie zestaw narzędzi Guest Additions. O ile instalacja tych narzędzi w systemach z rodziny Windows nie nastręcza żadnych problemów (gdy maszyna wirtualna jest uruchomiona z menu wybieramy Devices i następnie Insert Guest Additions CD Image, po tej operacji powinien pojawić się instalator dodatku, który instalujemy jak każdy inny program) to już w systemach pokroju Linux sprawa wygląda bardzo różnie. Tak więc jakbyś czytelniku sam chciał przeprowadzić wszystkie opisane czynności zainstalowanie dodatku Guest Additions wykonajwg. punktów poniżej:

1. zaloguj się jako root, bądź włącz konsolę z uprawnieniami administratora,

2. zainstaluj pakiety build-essential module-assistant (polecenie: apt-get install build-essential module-assistant);

3. wydaj polecenie: m-a prepare,

4. kliknij Install Guest Additions z menu Devices menu,

5. wydaj polecenie: sh /media/cdrom/VBoxLinuxAdditions.run (pamiętaj, że ścieżka może się różnić)

Kolejnym nieudogodnieniem z którym możemy się spotkać to jest niemożliwość uruchomienia danego polecenia z uprawnieniami administratora z konta które takowych uprawnień nie posiada. Przykład poniżej - z konta luk zostało uruchomione polecenie nakazujące aktualizację systemu, lecz polecenie to zostaje przerwane komunikatem: luk nie występuje w pliku sudoers. Ten incydent zostanie zgłoszony.

 

 

Aby możliwe było wykonanie poleceń z podwyższonymi uprawnieniami należy konto luk dodać do pliku sudoers. Aby dodać użytkownika do pliku sudoers należy:

1. zalogować się  na konto root'a,

2. włączyć edycję pliku wydając polecenie: gedit /etc/sudoers bądź nano /etc/sudoers (wszystko zależy od naszych preferencji edytora),

3. w sekcji:   # User privilege specificationroot dodać wpis: <nazwa_konta> ALL=(ALL:ALL) ALL czyli w moim przypadku: luk ALL=(ALL:ALL) ALL

 

 

Zapisujemy plik. Od teraz powinno wszystko działać jak należy i jak widać poniżej tak jest.

 

 

Chwilkę temu wspomniałem o edytorze zawartości plików. Linux jest systemem w którym edycję plików możemy przeprowadzać za pomocą wielu narzędzi a że edycję plików będziemy przeprowadzać bardzo często ważne jest aby wybrać edytor, który będzie dla nas wygodny. Na samym początku można spróbować korzystać z edytorów dostępnych wraz z systemem czyli gedit bądź nano. Oczywiście możliwa jest instalacja produktów alternatywnych. Bardzo często wykorzystywanym edytorem jest pakiet Midnight Commander. Pakiet ten tak naprawdę zainstaluje menadżer plików lecz także edytor tekstowy. Aby zainstalować aplikację wydaj polecenie: apt-get install mc

Od tej pory możemy korzystać z menadżera plików (aż się łezka kręci, jakie to podobne do Norton Commander) lecz także edytora zawartości plików.

 

 

Edycja plików sprowadza się do wykonania jeszcze jednego ustawienia. Poniżej przedstawiono zrzut ekranu w którym edycja pliku następuje za pomocą edytora nano (edytor ustawiony jako domyślny).

 

 

Aby zmienić ustawienie domyślnie wykorzystywanego edytora należy wydać polecenie: update-alternatives --config editor a następnie podać numer przypisany do edytora, którego chcemy używać (w naszym przypadku edytor mcedit ma przypisany numer 2).

 

 

Od tej pory mcedit będzie wykorzystywany jako domyślny edytor.

 

 

OK mamy przygotowane środowisko do zainstalowania serwera Samba oraz dokonaliśmy niezbędnych ustawień komputera do pełnienia roli kontrolera domeny. Zanim przejdziemy dalej jeszcze chwilkę się zatrzymamy i dopowiemy parę słów, tak aby wszystko było jasne.

Pierwszą sprawą jest użyta topologia sieci i przyjęta adresacja. Drugą zaś osobną kwestią jest lista usług jakie będziemy chcieli uruchomić na serwerze. Myślę, że wszystkie wątpliwości rozwieje poniższy rysunek.

 

 

Tak więc analizując powyższy schemat dochodzimy do wniosku, że czeka nas trochę roboty, gdyż oprócz konfiguracji i instalacji samej Samby będziemy musieli uruchomić i skonfigurować usługę DNS i DHCP oraz włączyć przekazywanie pakietów pomiędzy dwoma sieciami (NAT). Serwer jest zaopatrzony w dwie karty sieciowe i stanowi bramę dla sieci 10.0.0.0/24.

Aby móc przystąpić do instalacji Samby należy zainstalować dodatkowe funkcje i pakiety. Do najważniejszych z nich należą:

      • python-dev - rozszerzenie interpretera języka Python,
      • libacl1-dev - pakiet zawiera biblioteki i pliki nagłówkowe potrzebne do tworzenia programów,
      • resolvconf - pakiet wspomaga wymianę informacji oraz służy do utrzymywania aktualności informacji systemu o serwerach nazw,
      • libldap2-dev - OpenLDAP, implementacja protokołu LDAP, protokół przeznaczony do korzystania z usług katalogowych,
      • build-essential - pakiet jest wymagany do budowania pakietów Debiana,
      • libgnutls-dev - biblioteka, która implementuje protokół Transport Layer Security (TLS) 1.0 oraz Secure Sockets Layer (SSL) 3.0,
      • pkg-config - pakiet, który pozwala na kompilację i konsolidację bibliotek,
      • cups - Common UNIX Printing System (CUPS(tm)) - serwer wydruku,
      • libcups2-dev - wspomaga serwer wydruku CUPS,
      • krb5-user - implementacja protokołu Kerberos. Protokół ten odpowiedzialny jest za uwierzytelnienie (weryfikacja tożsamości) w domenach Windows,
      • docbook-xsl - arkuszy stylów XSL,
      • attr - narzędzia do obsługi systemu plików,
      • libbsd-dev - funkcje użytkowe systemów BSD,
      • python-dnspython - zestaw narzędzi DNS dla Pythona. Pakiet obsługuje prawie wszystkie typy rekordów. Może być używany do tworzenia zapytań, transferów strefy i dynamicznych aktualizacji,
      • libattr1-dev - zawiera biblioteki i pliki nagłówkowe potrzebne do działania programów,
      • git - system kontroli wersji, który śledzi wszystkie zmiany dokonywane na pliku (lub plikach) i umożliwia przywołanie dowolnej wcześniejszej wersji,
      • gdb - GDB to debuger plików źródłowych, pozwalający na zatrzymanie programu w konkretnym miejscu, wyświetlanie wartości zmiennych oraz określenie gdzie wystąpił błąd. Debuger współpracuje z programami napisanymi w językach C, C++, Fortran, Modula 2 i Java,
      • xsltproc - pakiet umożliwia konwersję plików XML na inne, dowolne formaty takie jak: HTML, zwykły tekst itp.,
      • libsasl2-dev - pakiet umożliwia wykorzystanie metody SASL (Simple Authentication Security Layer) celem uwierzytelnienai użytkownika,
      • libaio-dev - biblioteka wykorzystywana przy korzystaniu z baz danych,
      • isc-dhcp-server - pakiet instaluje serwer DHCP.
      • acl – pakiet niezbędny do manipulowania listami kontroli dostępu,
      • libreadline-dev - biblioteki GNU obsługujące interfejs użytkownika,
      • valgrind - aplikacja na licencji GPL, narzędzie, które wspomaga zarządzanie pamięcią,
      • ldap-utils - pakiet zawiera narzędzia pakietu OpenLDAP (Lightweight Directory Access Protocol). Narzędzia te pozwalają uzyskać dostęp do lokalnego lub zdalnego serwera LDAP,
      • ntp - implementacja protokołu synchronizacji czasu.

Tak więc aby zainstalować wszystkie powyższe pakiety (i jeszcze parę dodatkowych) wydaj polecenie: apt-get install python-dev autoconf pkg-config libcups2-dev git build-essential xsltproc cups krb5-user docbook-xsl libsasl2-dev libacl1-dev libgnutls-dev libattr1-dev python-dnspython libreadline-dev libbsd-dev libldap2-dev libblkid-dev valgrind attr libpopt-dev acl gdb libaio-dev libpam-dev resolvconf ldap-utils ntp isc-dhcp-server

Wydanie polecenia spowoduje instalację dodatkowych aplikacji i komponentów (CUPS, DHCP, Kerberos), bibliotek niezbędnych do przeprowadzenia komplikacji Samby a także zostaną zainstalowane wszystkie pakiety zależne (pakiety, które są wymagane aby aplikacje działały prawidłowo).

Proces instalacji powinien przebiec bez żadnych komplikacji, jedyne co będzie trzeba podać to informacje, które są niezbędne do implementacji mechanizmu Kerberos. Tak więc w pierwszym oknie podajemy nazwę domeny (koniecznie wielkie litery).

 

 

Drugie okno to adres IP serwera (bądź serwerów), wskazujemy na komputer lokalny a więc wpisanym adresem będzie adres 127.0.0.1 (można zamiast adresu IP zdecydować się na zdefiniowaną nazwę hosta – w naszym scenariuszu należałoby by wpisać: debian).

 

 

W trzecim ostatnim oknie również należy użyć adresu IP wskazującego na komputer lokalny (również możemy wykorzystać nazwę hosta).

 

 

Serwer Samba a także usługa Active Directory korzysta z pewnych funkcji systemu plików ext4. Aby przejść dalej należy się upewnić, że funkcje te są włączone (system instalowaliśmy z opcjami domyślnymi a więc funkcje te powinny być skonfigurowane poprawnie). Tak więc wydaj polecenie: grep CONFIG_EXT4_FS /boot/config-`uname -r`

 

 

Po wydaniu polecenia powinniśmy uzyskać dane takie jak na rysunku powyżej. Poszczególne wpisy informują nas o:

1 - system plików ext4 działa jako moduł,

2 - obsługiwana jest funkcja xattr (rozszerzone atrybuty pliku),

3 - obsługiwane są listy kontroli dostępu (posix_acl),

4 - obsługa mechanizmów zabezpieczeń.

Fakt włączenia funkcji możemy również sprawdzić poprzez ręczny podgląd pliku config-<wersja_systemu_linux>

 

 

Kolejnym krokiem, który musimy wykonać jest wprowadzenie zmian w pliku fstab, plik ten jest odpowiedzialny m.in. za konfigurację systemu plików ext4. Warto nadmienić, że nieprawidłowo przeprowadzona edycja pliku może doprowadzić do nie uruchomienia się systemu. Tak więc aby zabezpieczyć się przed ewentualnymi problemami za pomocą polecenia cp wykonujemy kopie pliku – polecenie: cp -pR /etc/fstab /etc/fstab_backup

 

 

Po wykonaniu kopii pliku przechodzimy do jego edycji. Wprowadzone zmiany włączą funkcje systemu plików ext4, które są potrzebne aby serwer Samba działał prawidłowo (funkcja xattr oraz listy kontroli dostępu). Edycja pliku sprowadza się do dodania wpisu: user_xattr,acl,barrier=1 przy wpisie każdej z partycji (w scenariuszu został użyta tylko jedna partycja).

 

 

Po przygotowaniu systemu plików czas aby skonfigurować interfejsy sieciowe komputera. Przedstawiony kilka rysunków wyżej schemat naszej testowej sieci ułatwi nam to zadanie. Jak widać po rysunku interfejs eth1 jest interfejsem, który ma połączenie z siecią Internet i ten interfejs domyślnie skonfigurowany jest do korzystania z serwera DHCP. Ustawienie to pozostawiamy bez zmian. Stały adres IP 192.168.0.11 jest przyznawany zawsze dzięki rezerwacji tegoż adresu w puli serwera DHCP (powiązanie adresu IP z adresem MAC interfejsu eth1).

Odrębną sprawą jest już przyjęta adresacja interfejsu eth0. Adresację tą wykonujemy statycznie czyli sami powiążemy niezbędne adresy IP z interfejsem eth0. Jak można zauważyć poniżej po wydaniu polecenia: ifconfig eth0 żaden adres IPv4 nie został przyznany interfejsowi.

 

 

Aby zmiana interfejsu była stała, należy odpowiednie dane wprowadzić do pliku /etc/network/interfaces odpowiedzialnego za konfigurację interfejsów sieciowych komputera. Wprowadzone zmiany zostały ujęte na rysunku poniżej.

auto eth0
iface eth0 inet static
address 10.0.0.2
netmask 255.255.255.0
dns-search firma.local
dns-domain firma.local
dns-nameservers 10.0.0.2

 

 

Wpisy te tworzą statyczny interfejs sieciowy eth0 z adresem IP 10.0.0.2 i maską 255.255.255.0 oraz konfigurują domenę. Funkcję serwera DNS będzie pełnił serwer zainstalowany lokalnie wraz z instalacją Samby.

Po wprowadzeniu zmian i ponownym uruchomieniu komputera (można zamiast restartować wydać polecenie: /etc/init.d/networking restart) ponowne wydanie polecenia: ifconfig eth0 uwidoczni wprowadzone zmiany. Jak widać poniżej interfejs eth0 został skonfigurowany poprawnie i działa prawidłowo.

 

 

Kolejną czynnością jest konfiguracja serwera czasu NTP (ang. Network Time Protocol). Odpowiednie pakiety zostały zainstalowane wcześniej. Usługa czasu ma znaczenie krytyczne podczas działania serwera Samba. Nasz komputer po konfiguracji dodatkowo będzie pełnił rolę serwera czasu dla komputerów znajdujących się w naszej sieci. Cała konfiguracja sprowadza się do dopisania dwóch dodatkowych wierszy do pliku konfigurującego serwer. Zmiany dokonujemy w pliku /etc/ntp.conf

ntpsigndsocket /usr/local/samba/var/lib/ntp_signd/
restrict default mssntp

 

 

Sprawdzenie statusu serwera NTP możemy dokonać po wpisaniu polecenia: service ntp status

 

 

Dodatkowo sprawdzenie serwera NTP dokonamy na kliencie za pomocą programu NTPTool. Jak widać poniżej po wpisaniu adresu naszego serwera i wysłaniu zapytania, serwer NTP odsyła nam odpowiedź.

 

 

i dokonamy przechwycenia pakietów

 

 

Jak widać powyżej wszystko jest w porządku. Uważnego czytelnika może zaabsorbować fakt różnicy czasu (dokładnie 1 godzina) pomiędzy wynikami programu NTPTool a przechwyconymi pakietami. Stało się tak ponieważ serwer przesyła czas UTC (zob. rysunek przechwycone pakiety) a w systemie strefa czasowa jest ustawiona jako UTC+01:00 (zob. wyniki reprezentowane przez program NTPTool)

Nasz komputer oprócz pełnienia roli serwera czasu będzie pełnił jeszcze jedną dodatkową funkcję a mianowicie będzie również serwerem DHCP. Oczywiście jeżeli w swojej sieci masz już serwer DHCP to krok ten możesz pominąć oraz podczas instalacji dodatkowych pakietów zrezygnuj z pakietu: isc-dhcp-server

Konfiguracja serwera DHCP sprowadza się do wprowadzenia odpowiednich informacji do pliku /etc/dhcp/dhcpd.conf odpowiedzialnego za działanie serwera DHCP. Wprowadzone informacje to m.in.:

1 - nazwa domeny,

2 - adresy serwerów DNS,

3 - serwer NetBIOS,

4 - serwer NTP,

5 - czas dzierżawy adresu IP w sekundach,

6 - obsługiwana sieć,

7 - pula adresów IP serwera DHCP,

8 - adres IP routera/bramy.

 

 

ddns-updates on;
option domain-name "firma.local";
option domain-name-servers 10.0.0.2, 10.0.0.2;
option netbios-name-servers 10.0.0.2;
option ntp-servers 10.0.0.2;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 10.0.0.0
netmask 255.255.255.0 {
range 10.0.0.10 10.0.0.100;
option routers 10.0.0.2; }

Dodatkowo w pliku /etc/default/isc-dhcp-server w sekcji INTERFACES należy określić interfejs sieciowy, który ma zostać powiązany z serwerem DHCP (ten interfejs będzie obsługiwany prze serwer DHCP).

 

 

Po wprowadzeniu wszystkich zmian przyszedł czas na uruchomienie i przetestowanie wprowadzonych ustawień serwera DHCP. Serwer uruchamiamy poleceniem: /etc/init.d/isc-dhcp-server start

 

 

Status serwera sprawdzamy poleceniem: /etc/init.d/isc-dhcp-server status

 

 

Serwer DHCP pracuje a więc podłączmy klienta. Klient został podłączony jak widać poniżej wszystkie dane konfigurujące interfejs sieciowy zostały prawidłowo klientowi dostarczone. Klient otrzymał pierwszy adres IP z puli czyli 10.0.0.10 z maską 255.255.255.0 i komunikacja z serwerem jest zapewniona.

 

 

Przechwycony ruch pakietów pomiędzy klientem a serwerem również jest prawidłowy.

 

 

Stan dzierżaw adresów IP na serwerze DHCP można sprawdzić za pomocą polecenia: more /var/lib/dhcp/dhcpd.leases

 

 

Zakończyliśmy wszystkie czynności przygotowawcze a więc najwyższy czas aby wykonać instalację serwera Samba 4.

 


 

Do instalacji serwera wykorzystamy repozytoria git (za przeprowadzenie tej operacji będzie odpowiedzialny pakiet git, który zainstalowaliśmy w fazie przygotowania systemu).

Tak więc pierwszą naszą czynnością będzie sklonowanie stabilnej wersji Samby 4 z oficjalnej strony projektu a następnie kompilacja oprogramowania. Tu troszeczkę pójdziemy dłuższą drogą ponieważ oczywiście możliwa jest bezpośrednia instalacja pakietów Samby lecz dzięki wybraniu tej metody możemy przeprowadzić dodatkowe testy przed instalacyjne tak aby mieć pewność, że po instalacji będzie nam wszystko działać.

Klonowanie przeprowadzamy za pomocą polecenia: git clone -b <wersja_serwera_Samba> git://git.sama.org/samba.git <katalog>

Ostatnią aktualną wersję serwera sprawdzisz na stronie https://git.samba.org/ wybierając samba.git

 

 

Tak więc chcąc sklonować Sambę z oficjalnego repozytorium wydaj polecenie: git clone -b samba-4.1.13 git://git.samba.org/samba.git samba4 bądź git clone -b v4-1-13-stable git://repo.or.cz/samba.git samba4 Repo.or.cz jest serwisem, który oferują podobną funkcjonalność, co samba.org (adres przydatny w przypadku awarii).

Po wydaniu polecenia następuje kopiowanie serwera do katalogu samba4 z zdalnej lokacji. Szybkość wykonywania polecenia zależy od prędkości naszego łącza internetowego.

 

 

Po wykonaniu kopiowanie przyszedł czas by wykonać kompilację oprogramowania. Kompilację wykonujemy za pomocą polecenia: ./configure --enable-debug --enable-selftest Dodatkowy parametr selftest spowoduje dodanie opcji wykonania testu przed próbą podjęcia instalacji.

 

 

Po wydaniu polecenia następuje proces kompilacji, który uzależniony jest od posiadanego przez nasz sprzętu. Proces ten powinien zakończyć się wypisaniem komunikatu o pozytywnym zakończeniu operacji.

 

 

Po prawidłowo zakończonym procesie kompilacji tak naprawdę moglibyśmy już przejść do instalacji serwera Samba ale zanim to zrobimy wykonamy jeszcze jeden test, który przeprowadzi weryfikację środowiska w którym będzie pracował serwer Samba. Aby wykonać test wydaj polecenie: make quicktest Polecenie uruchomi szereg procedur sprawdzających, które powinny zakończyć się komunikatem: ALL OK

 

 

Gdyby z jakiś powodów test zakończył się niepowodzeniem to podsumowanie testu możesz przejrzeć tutaj: .st/summary

Ostatnim naszym krokiem jest instalacja serwera, instalację rozpoczniemy po wydaniu polecenia: make install

 

 

Po kliknięciu Enter rozpoczyna się proces instalacji.

 

 

Serwer Samba 4 został zainstalowany poprawnie.

Gdyby z jakiś powodów niemożliwe było ściągnięcie repozytorium zawsze można posłużyć się innym sposobem a mianowicie wykorzystać do tego serwer FTP. Paczki wszystkich dystrybucji Samba znajdziemy np. pod adresem: http://ftp.samba.org/pub/samba/

 

 

Po odnalezieniu interesującej nas wersji (w naszym przypadku samba-4.1.13.tar.gz) przechodzimy do konsoli i wydajemy polecenie: wget http://ftp.samba.org/pub/samba/samba-4.1.13.tar.gz Po wydaniu polecenia następuje ściągnięcie pliku i zapisaniu go w bieżącym katalogu.

 

 

Rozpakowanie pakietu dokonujemy za pomocą polecenia: tar zxvf <nazwa_ściągniętego_pliku> czyli w naszym przypadku: tar zxvf samba-4.1.13.tar.gz Wszystkie pliki zostają zapisane do katalogu: samba-4.1.13

 

 

Proces instalacji kontynuujemy zgodnie z instrukcjami odnoszącymi się do procesu wykorzystującego repozytorium git.

Po zakończonej sukcesem instalacji serwera Samba 4 przechodzimy do konfiguracji domeny.

 


 

Bardzo często będziemy odwoływali się do poleceń serwera Samba a więc aby móc polecenia związane z zarządzaniem serwerem wpisywać bezpośrednio w konsoli bez odwoływania się za każdym razem do ścieżki, katalog instalacji Samby dodamy do zmiennej PATH. Zmienna ta jest odpowiedzialna za ustawienia katalogów które będą przeszukiwane celem znalezienia wpisywanych komend/programów. Po wydaniu polecenia: echo $PATH możemy sprawdzić jakie aktualne katalogi są do tej zmiennej przypisane.

 

 

Naszym celem jest dodanie dwóch katalogów instalacyjnych serwera Samba do zmiennej PATH: katalog /usr/local/samba/bin oraz katalog /usr/local/samba/sbin.

Aby po każdym zalogowaniu mieć ustawione konkretne zmienne środowiskowe, należy je umieścić w pliku ~/.bash_profile. Zmienne te możemy po prostu wpisać do wyżej wymienionego pliku bądź wykorzystać do tego polecenie set (ustawienie zmiennej) oraz polecenie export (zapis zmiennej). Tak więc przypisanie dwóch interesujących nas katalogów do zmiennej PATH sprowadza się do wydania następujących poleceń:

set PATH=$PATH':/usr/local/samba/bin'
set PATH=$PATH':/usr/local/samba/sbin'
export PATH=/usr/local/samba/bin:$PATH >> ~/.bash_profile
export PATH=/usr/local/samba/sbin:$PATH >> ~/.bash_profil

 

 

Ponowne wydanie polecenia: echo $PATH uwidoczni wprowadzone zmiany.

Serwer Samba został zainstalowany pora aby nasz serwer wypromować do pełnienia roli kontrolera domeny firma.local. Aby zacząć cały proces wydajemy polecenie: samba-tool domain provision --realm=firma.local --domain=firma --adminpass='B@rdzotajnehaslo1' --server-role='domain controller' – polecenie samba-tool jest odpowiednikiem windowsowego polecenia dcpromo

gdzie:

      • domain provision -ozn. konfigurację domeny,
      • realm - pełna nazwa domeny,
      • domain - nazwa domeny,
      • adminpass - hasło administratora domeny, hasło musi spełniać wymogi silnego hasła stawiane przez system Windows tj. min długość hasła 8 znaków + użycie wielkiej litery + użycie cyfry + użycie znaków specjalnych,
      • server-role - rola serwera.

 

 

Serwer od teraz chwili jest już prawie gotowy do pełnienia roli kontrolera domeny Active Directory. Pozostało nam do wykonani kilka czynności zanim serwer zostanie w pełni uruchomiony.

Pierwszą czynnością jest skopiowanie pliku krb5.conf wygenerowanego podczas promowania do roli serwera AD do katalogu /etc/

Kopiowanie pliku możemy zrealizować za pomocą polecenia: cp -pRf /usr/local/samba/private/krb5.conf /etc/

 

 

Po skopiowaniu pliku należy do niego wprowadzić dane według poniższego schematu (zanim zaczniesz wprowadzać zmiany wykonaj kopię pliku - tak na wszelki wypadek) :

[libdefaults]
default_realm = pełna_nazwa_domeny
dns lookup_realm = false
dns_lookup_kdc = true
[realms]
pełna_nazwa_domeny = {
kdc = nazwa_komputera.pełna_nazwa_domeny
admin_server = nazwa_komputera.pełna_nazwa_domeny
default_domain = pełna_nazwa_domeny
}

 

 

Drugą bardzo ważną zmianą jest skonfigurowanie serwera DNS tak aby wszystkie zapytania, które serwer nie może rozwiązać przekazywał dalej. W tym celu musimy przejść do edycji pliku /usr/local/samba/etc/smb.conf i w sekcji dns forwarder wpisać adres serwera DNS (w scenariuszu został użyty ogólnie dostępny serwer Google ale nic nie stoi na przeszkodzie aby wskazać na własny serwer DNS)

 

 

Tak więc po wszystkich trudach, przyszła pora aby uruchomić serwer i sprawdzić czy działa on prawidłowo. Uruchomimy serwer w trybie jednowątkowym. By serwer zaczął działać wydaj polecenie: samba -i -M single wydanie polecenia powinno skutkować otrzymaniem ekranu podobnego jak na poniższym zrzucie.

 

 

Jak widać powyżej nie otrzymaliśmy żadnych komunikatów o błędach, serwer powinien działać prawidłowo ale (czy zawsze musi być jakieś ALE???) by mieć pewność przeprowadzimy dodatkową weryfikację.

Kluczowym zagadnieniem świadczenia przez serwer usług opartych o Active Directory jest prawidłowe działanie serwera DNS tak więc proces sprawdzania zaczniemy właśnie od serwera DNS. Do zlokalizowania kontrolerów domeny usługa Active Directory używa rekordów SRV, krytyczne są rekordy, które pozwalają na zlokalizowanie komputerów, które świadczą usługi związane z obsługą protokołu LDAP i Kerberos. Aby możliwa była lokalizacja tych hostów odpowiednie rekordy SRV muszą zostać umieszczone w konfiguracji serwera DNS. Naszym celem będzie sprawdzenie czy wyżej wymienione rekordy istnieją.

Aby dokonać sprawdzenia rekordu usługi Kerberos wydaj polecenie: host -t SRV _kerberos._udp.firma.local Jak widać poniżej rekord taki istnieje a rozwiązana nazwa wskazuje na host debian.firma.local

 

 

Aby dokonać sprawdzenia rekordu usługi LDAP wydaj polecenie: host -t SRV _ldap._tcp.firma.local Jak widać poniżej rekord taki istnieje a rozwiązana nazwa wskazuje na host debian.firma.local

 

 

Dodatkowo możemy sprawdzić rozwiązywanie nazw serwisów dostępnych w Internecie.

 

 

Sprawdzenie poprawności działania serwera LDAP możemy dokonać za pomocą polecenia: ldapsearch -x -h localhost -s base -D cn=administrator,cn=Users,dc=firma,dc=local -W

gdzie:

-x wykorzystanie protokołu Simple Authentication and Security Layer, SASL (protokół wykorzystywany celem udostępnienia zasobów katalogu w zależności od przydzielonych uprawnień)

-h zdefiniowanie adresu hosta,

-s <zasięg> parametr określa zasięg wyszukiwania. Zasięg może przybierać wartość base, one lub sub. Użyta wartość base określa wyszukiwanie podstawowe,

-D <szukana_nazwa/kontener> określa poszukiwaną nazwę, szukany kontener,

-W włączenie monitu podania hasła.

Po wydaniu polecenia będziemy poproszeni o podanie hasła administratora domeny, podanie hasła spowoduje odszukanie i podanie informacji o kontenerze.

 

 

Sprawdzanie poprawności udostępniania udziałów możemy dokonać za pomocą polecenia: /usr/local/samba/bin/smbclient -L localhost -U% Jak widać poniżej udziały zostały udostępnione prawidłowo.

 

 

I ostatnim testem jakim wykonamy jest sprawdzenie dostępności serwera Kerberos. Dostępność sprawdzimy za pomocą polecenia: kinit administrator(małpa)FIRMA.LOCAL Po wywołaniu polecenia zostaniemy poproszeni o podanie hasła administratora domeny Active Directory. Po poprawnym podaniu hasła zostaniemy poinformowani o długości ważności naszego hasła.

 

 

Instalacja kontrolera domeny przebiegła prawidłowo, nowo postawiony DC działa a przeprowadzone testy zakończyły się powodzeniem.

 


 

Przyszła pora aby do naszej domeny podłączyć pierwszego klienta. Na komputerze, który stanie się częścią domeny przed samym dołączeniem do domeny warto sprawdzić czy wszystkie ustawienia sieciowe są prawidłowe i co najważniejsze czy jest zachowana komunikacja pomiędzy komputerami.

Jak widać poniżej wszystko wydaje się być ustawione prawidłowo.

 

 

Aby dołączyć komputer do domeny w oknie System wybieramy Menedżer urządzeń i następnie na karcie Nazwa komputera klikamy na Zmień. W oknie Zmiany nazwy komputera/domeny w sekcji Członkostwo wybieramy Domena i następnie wypisujemy nazwę domeny.

 

 

Po wpisaniu nazwy domeny i kliknięciu na OK celem włączenia komputera do domeny trzeba będzie podać dane uwierzytelniające użytkownika mającego prawo do wykonania tej operacji.

 

 

Po wpisaniu hasła powinien pojawić się komunikat powitalny informujący nas o poprawnie przeprowadzonym procesie.

 

 

Po wykonaniu restartu maszyny komputer staje się pełnoprawnym członkiem domeny firma.local. Celem weryfikacji ustawień komputera i sprawdzenia funkcjonalności domeny możemy zalogować się na konto użytkownika domeny (w naszym przypadku mamy aktywne tylko jedno konto a mianowicie konto administratora domeny i te konto wykorzystamy do logowania).

 

 

Proces logowania przebiegł prawidłowo, na karcie System komputera możemy zweryfikować wprowadzone ustawienia.

 

 

Weryfikację usługi Active Directory możemy przeprowadzić za pomocą programu AdExplorer, który to program jest zaawansowaną przeglądarką a także edytorem informacji zawartych w bazie Active Directory. Aplikacja jest darmowa i jest częścią pakietu Sysinternals - http://technet.microsoft.com/pl-pl/sysinternals/bb963907.aspx

 

 

Zarządzanie naszą domeną będziemy przeprowadzać za pomocą oprogramowania Microsoftu. Wybór padł na to oprogramowanie z jednej tylko przyczyny ponieważ tak jest znacznie wygodniej. Konfigurację domeny wykonamy z już przyłączonego komputera. Jak pewnie zauważyłeś czytelniku przyłączony komputer pracuje pod kontrolą systemu Windows 7, ten system niestety nie ma żadnych narzędzi, które by pozwalały na wyżej wymienioną konfigurację. Gdybyśmy do domeny podłączyli system serwerowy np. Windows Server 2008 to sprawa by była prostsza gdyż system ten już na starcie zawiera wiele narzędzi gotowych do natychmiastowego użycia . Na szczęście sytuacja nie jest beznadziejna bo z pomocą przychodzi nam Microsoft. Możliwe jest wykorzystanie systemu Windows 7 do zdalnej administracji serwerem AD trzeba tylko zaopatrzyć się w odpowiednia narzędzia a tak naprawdę trzeba tylko pobrać i zainstalować dodatkowe funkcje systemu Windows. Narzędzia administracji zdalnej serwera dla systemu Windows umożliwiają administratorom zarządzanie usługą Active Directory z poziomu komputera zdalnego. Narzędzia te dobieramy ze względu na zainstalowany system i do naszej dyspozycji przygotowane są następujące zestawy:

 

Po pobraniu odpowiedniej wersji oprogramowania przystępujemy do instalacji. Instalacja sprowadza się do zaakceptowania postanowień licencyjnych gdzie po akceptacji następuje kopiowanie plików.

 

 

Zainstalowane narzędzia powinny być dostępne w Narzędziach administracyjnych.

 

 

Gdyby tak się nie stało (rysunek powyżej) należy przejść do Panelu Sterowania i dalej wybrać Programy i funkcje a następnie Włącz lub wyłącz funkcje systemu Windows. Z dostępnej listy wybieramy te narzędzia, które nas interesują – gałąź Narzędzia administracji zdalnej serwera (najważniejsze są te funkcje, które dotyczą usługi Active Directory).

 

 

Po wybraniu funkcji odpowiednie skróty zostaną umieszczone w Narzędziach administracyjnych.

 

 

Zainstalowane narzędzia dostępne są zarówno z poziomu narzędzi administracyjnych jak i konsoli MMC. Poniżej na rysunku pokazane narzędzia: Użytkownicy i komputery usługi Active Directory; Menedżer DNS; Zarządzanie zasadami grupy.

 

 

Tak więc spróbujmy wykorzystać zainstalowane narzędzia do przeprowadzenia typowej czynności jaką jest założenie nowego konta dla użytkownika. Po wybraniu Użytkownicy i komputery usługi Active Directory i kliknięciu kontenera Users inastępnym wybraniu z menu kontekstowego NowyUżytkownik możemy przeprowadzić proces dodania nowego użytkownika.

 

 

Po uzupełnieniu wszystkich danych i ustaleniu hasła (hasło przynajmniej 7 liter i hasło musi być złożone z małych liter + dużych liter + cyfr + znaków specjalnych) będzie można utworzyć konto. W przypadku nie spełnienia warunku złożoności hasła konta nie będzie można utworzyć.

 

 

Po utworzeniu konta oczywiście możliwe jest wykorzystanie konta do uzyskania dostępu do komputera. Jak widać poniżej udało nam się uzyskać dostęp do konta, które należy do Jana Kowalskiego.

 

 

 

Więcej informacji na temat kont użytkowników oraz grup znajdziesz w poniższych artykułach:

  • http://slow7.pl/item/86-usluga-katalogowa-active-directory-zarzadzanie
  • http://slow7.pl/item/85-czym-jest-grupa-w-usludze-activedirectory-tworzenie-modyfikacja-i-zarzadzanie

Oczywiście dodanie konta użytkownika do bazy AD można zrealizować bez pomocy oprogramowania Microsoftu tylko bezpośrednio na serwerze Samba.

Dodanie nowego konta można zrealizować za pomocą następującego polecenia: samba-tool user add tadnow tajnehaslo --given-name=Tadeusz --surname=Nowak Wydanie komendy powinno spowodować utworzenie konta tadnow z hasłem tajnehaslo i dodatkowo zostało zdefiniowane pole imię oraz nazwisko.

 

 

Jak można zauważyć po powyższym zrzucie, że jednak operacja dodania konta zakończyła się niepowodzeniem (stąd w apapicie powyżej słowo powinno). Nowe konto nie zostało utworzone ponieważ wybrane hasło nie spełnia wymogów silnego hasła.

Reguły tworzenia haseł sprawdzimy po wydaniu polecenia: samba-tool domain passwordsettings show Jak widać poniżej za hasło silne jest uznawane hasło przynajmniej 7 literowe i zawierające małe litery + duże litery + liczby +znaki specjalne (opcja complexity ustawiona na on).

 

 

Po wyłączeniu opcji wymuszającej utworzenie złożonego hasła za pomocą polecenia: samba-tool domain passwordsettings set --complexity=off

 

 

Ponowne wydanie komendy nakazującej utworzenie konta tadnow kończy się sukcesem.

 

 

Dodatkowe opcje związane z ustaleniem zasad tworzonych haseł możemy zdefiniować za pomocą następujących przełączników:

      • Wymagania co do złożoności hasła (domyślnie on) - password complexity: --complexity=<on/off>
      • Przechowywania haseł w postaci zwykłego tekstu - store plaintext passwords: --store-plaintext=<on/off>
      • Wymuszaj tworzenie historii haseł - password history length: --history-length=<wartość>
      • Minimalna długość hasła - minimum password length: --min-pwd-length=<wartość>
      • Minimalny okres ważności hasła (dni) -minimum password age (days): --min-pwd-age=<wartość>
      • Maksymalny okres ważności hasła (dni) - maximum password age (days): -max-pwd-age=<wartość>

 

Dodatkowe dostępne parametry związane z tworzeniem i definiowaniem nowego konta użytkownika pokazano na poniższym zrzucie.

 

 

Po utworzeniu konta użytkownika można przeprowadzić weryfikację wykonanych operacji poprzez wykonanie próby logowania do domeny. Logowanie zakończyło się sukcesem (rysunek niżej).

 

 

Zarządzanie sporą ilością użytkowników staje się bardzie efektywne gdy skorzystamy z zasad grup. O wiele łatwiej jest przypisać konkretne zasady do grupy w której znajdują się użytkownicy (robimy to tylko raz) niż do każdego użytkownika z osobna. Dlatego warto jest łączyć konta użytkowników o podobnych uprawnieniach i wymaganiach w grupy. Utworzenie grupy zrealizujemy za pomocą polecenia: samba-tool group add biuro --group-scope=Domain --group-type=Security Polecenie tworzy grupę biuro, grupa jest typu zabezpieczenia a zakres grupy obejmuje domenę.

 

 

Do sprawdzenia poprawności utworzenia danej grupy możemy również wykorzystać narzędzia windowsowe.

 

 

Weryfikację utworzonych użytkowników możemy dokonać wydając polecenie: samba-tool user list i analogicznie utworzonych grup: samba-tool group list

 

 

Sprawdzenie członków danej grupy wykonujemy za pomocą polecenia: samba-tool group listmembers <nazwa_grupy> Poniżej sprawdzenie członków grupy biuro oraz domain admins.

 

 

Jak widać powyżej do grupy biuro nie jest przypisany żaden użytkownik natomiast w grupie domain admins znajduje się jeden użytkownik administrator. Przypisanie użytkownika do danej grupy dokonujemy za pomocą komendy: samba-tool group addmembers <nazwa_grupy> <użykownik> tak więc aby dodać użytkownika tadnow do grupy biuro wydaj polecenie: samba-tool group addmembers biuro tadnow Po dodaniu użytkownika do grupy dokonujemy weryfikacji wykonanej operacji.

 

 

Przynależność danego użytkownika do grupy możemy również zweryfikować za pomocą przystawki Użytkownicy i komputery usługi Active Directory.

 

 

Ostatnią naszą czynnością jest włączenie funkcji translacji adresów pomiędzy siecią LAN (10.0.0.0/24) a siecią mającą dostęp do Internetu (192.168.0.0/24). Włączenie funkcji pozwoli na uzyskanie dostępu do sieci Internet dla komputerów znajdujących się po stronie sieci lokalnej.

Usługę przekazywania pakietów pomiędzy sieciami włączymy wydając następujące polecenia:

sysctl -w net.ipv4.conf.all.forwarding=1
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE
iptables -A FORWARD -s 10.0.0.0/24 -i eth0 -j ACCEPT

gdzie:

      • eth0 – interfejs po stronie sieci LAN,
      • eth1 – interfejs z dostepem do Internetu,
      • 10.0.0.0/24 0 - sieć lokalna, która ma uzyskać dostęp do Internetu.

 

 

Po wprowadzeniu wszystkich poleceń komputery znajdujące się w sieci 10.0.0.0/24 uzyskują dostęp do sieci Internet.

 

 

I na tym etapie chciałbym zakończyć swój wpis. Przedstawiony przeze mnie sposób konfiguracji serwera Samba 4 do korzystania z usługi Active Directory można oczywiście rozwinąć o dodatkową konfigurację, bo serwer Samba to nie tylko użytkownicy, grupy czy jednostki organizacyjne ale to też usługi współdzielenia plików czy usługi drukowania. Ale te dodatkowe usługi to już temat na kolejny wpis.

 

{mp4}debian/debian_ad{/mp4}

 


 

BIBLIOGRAFIA

https://git.wiki.kernel.org/index.php/GitHosting

http://repo.or.cz/w/Samba.git

http://ubuntuforums.org/showthread.php?t=2146198

http://crunchbang.org/forums/viewtopic.php?pid=400466

https://www.youtube.com/watch?v=OVrRK8oACBI

http://www.samba.org.pl/2013/09/active-directory-na-linuxie-kompletny.html

https://wiki.samba.org/index.php/Samba_4/OS_Requirements

http://jakilinux.org/linux/debian/instalacja-i-konfiguracja-domowego-serwera-plikow/

http://www.samba.org.pl/2013/03/samba4-jako-podstawowy-kontroler-domeny.html

http://emarcel.com/kurs-bash/

http://opentodo.net/2013/01/samba4-as-ad-domain-controller-on-centos-6/

 

]]>
[email protected] (pikolo) Linux Fri, 28 Nov 2014 14:06:47 +0000
WiFi a'la Linux http://slow7.pl/linux/item/75-wifi-a-la-linux http://slow7.pl/linux/item/75-wifi-a-la-linux

Artykuł jest uzupełnieniem wpisu WiFi bez tajemnic a mówiący o konfiguracji sieci bezprzewodowych lecz tym razem z punktu widzenia systemu Linux.

 

Konfiguracja związana z obsługą sieci WiFi w systemie Linux sprowadza się do wykorzystania kilku poleceń konsoli. Polecenia te to:

      • ifconfig – narzędzie służące do zmiany ustawień interfejsów sieciowych zainstalowanych w systemie,
      • iwconfig – główne narzędzie służące do konfiguracji kart bezprzewodowych,
      • iwlist – narzędzie informacyjne dostarcza nam dane na temat wykorzystywanego interfejsu,
      • iwgetid – narzędzie informacyjne,
      • iwevent – narzędzie, które dostarcza nam informacje generowane przez sterownik karty WiFi np. zmiana ustawień karty sieciowej.

Polecenie ifconfig wydane bez parametrów wyświetla listę wszystkich interfejsów.

 

 

Włączenie interfejsu następuje po wydaniu polecenia ifconfig <nazwa_interfejsu> up natomiast jego wyłączenie po wydaniu ifconfig <nazwa_interfejsu> down Jeśli podczas testowania poniższych komend, któreś z poleceń Ci nie zadziała spróbuj wyłączyć dany interfejs do, którego polecenie się odnosi. Również trzeba mieć na uwadze, że niektóre komendy będą działać tylko z określonymi urządzeniami. Więc bardzo często dojdzie do sytuacji w której otrzymasz informacje, że dane polecenie jest nieobsługiwane i nie może być wykonane.

Warto wiedzieć, że podczas wydawania poleceń nie musimy ich kończyć ponieważ gdy istnieje tylko jedyne dopasowanie do określonej komendy system uzna je jako napisane do końca. A dodatkowo komendy możemy dopełniać poprzez używanie klawisza TAB. Czyli np. polecenie iwlist wlan0 scannning (jako te poprawne) jest tożsame z poleceniem iwlist wlan0 scan ponieważ scan jest jedynym pasującym dopasowaniem do scannning. Powyższe zasady nie są jakąś ogólnie przyjętą wykładnią i mogą nie mieć zastosowania we wszystkich wersjach systemu Linux.

 

 

Pierwszą grupą poleceń są komendy iwlist. Polecenie iwlist używane jest do uzyskania informacji na temat podstawowych parametrów naszej karty bezprzewodowej wraz z niektórymi informacjami na temat dostępnych sieci bezprzewodowych. Polecenie iwlist dopełnia informacje uzyskane dzięki komendzie iwconfig.

 

 

Podstawowym poleceniem z którym będziemy mieli najczęściej do czynienia jest polecenie iwlist służące do wykrycia sieci bezprzewodowych. A więc by uzyskać listę wszystkich dostępnych sieci bezprzewodowych wydajemy polecenie iwlist <nazwa_interfejsu> scannning

 

 

Wydanie polecenia iwlist <nazwa_interfejsu> channel wyświetli nam listę dostępnych częstotliwości i kanałów obsługiwanych przez kartę WiFi.

 

 

Wydanie polecenia iwlist <nazwa_interfejsu> frequency będzie skutkowało wynikiem podobnym do poprzedniego.

Komenda iwlist <nazwa_interfejsu> rate podaje dostępne prędkości transmisji, razem z obecnie używaną prędkością. Taki sam efekt można uzyskać wpisując polecenie iwlist <nazwa_interfejsu> bitrate.

Polecenie iwlist <nazwa_interfejsu> encryption powoduje wyświetlenie informacji na temat obecnie używanego klucza, trybie bezpieczeństwa – czy sposobach weryfikacji użytkownika.

 

 

Informację na temat użytych kluczy (rodzaj, długość) uzyskasz po wydaniu komendy iwlist <nazwa_interfejsu> keys a także iwlist <nazwa_interfejsu> wpakeys

 

 

Podstawowym poleceniem służącym do konfiguracji bezprzewodowego interfejsu jest iwconfig.

Wydanie polecenia iwconfig <nazwa_interfejsu> mode master powoduje ustawienie karty w trybie master. Natomiast polecenie iwconfig <nazwa_interfejsu> mode monitor nakazuje karcie przejście w tryb nasłuch (tryb RFMON) umożliwiając tym samym sniffing (przechwytywanie) pakietów sieci 802.11. Jak widać na poniższym rysunku ustawienie karty w tryb master nie powiodło się natomiast włączenie trybu monitor przebiegło bez najmniejszych problemów.

Te dwa tryby działania kart WiFi są najbardziej problematyczne i niestety niewiele kart potrafi je obsłużyć. Listę kart obsługujących tryb RFMON znajdziesz tutaj: http://www.aircrack-ng.org/doku.php?id=compatibility_drivers natomiast listę kart wspierające tryb master tutaj: https://help.ubuntu.com/community/WifiDocs/MasterMode

 

 

Inne tryby w które możemy przestawić kartę to domyślny tryb managed (tryb klienta)ustawiany za pomocą polecenia iwconfig <nazwa_interfejsu> mode manager czy ustawienie wymuszający na karcie włączenie trybu adhoc - iwconfig <nazwa_interfejsu> mode ad-hoc

Przećwiczmy komendy iwconfig próbując uruchomić połączenie adhoc pomiędzy dwoma komputerami a także próbując zestawić połączenie z punktem dostępowym (AP).

Otwieramy terminal i uruchamiamy go w trybie root - sudo su. Przejście w ten tryb nastąpi po podaniu hasła.

Następnie wyłączamy interfejs bezprzewodowy - ifconfig <nazwa_interfejsu> down (nazwy interfejsów poznasz po wydaniu komendy ifconfig).

 

 

i przestawiamy naszą kartę do pracy w trybie adhoc - iwconfig <nazwa_interfejsu> mode ad-hoc

 

 

Wybieramy kanał pracy naszej sieci - iwconfig <nazwa_interfejsu> channel 1

 

 

Ustawiamy nazwę tworzonej sieci bezprzewodowej - iwconfig <nazwa_interfejsu> essid <"nazwa_sieci"> W naszym scenariuszu przyjęto nazwę sieci adhocTest.

 

 

By zabezpieczyć naszą sieć możemy ustawić hasło - iwconfig <nazwa_interfejsu> key s:<hasło> klucz jest ustawiany jako ciąg znaków ASCII. Możemy również zdecydować się na użycie 64-bitowego klucza WEP - iwconfig <nazwa_interfejsu> key 11111111 bądź wybrać klucz 128-bitowy iwconfig <nazwa_interfejsu> key 1111-1111-1111-1111 By nie komplikować sobie życia, ponieważ tryb adhoc ustawia się najczęściej by komuś na szybko udostępnić połączenie internetowe lub przesłać określone pliki najlepiej wybrać iwconfig <nazwa_interfejsu> key off by wyłączyć szyfrowanie WEP oraz iwconfig <nazwa_interfejsu> key open by włączyć tryb otwarty.

 

 

 

Aktywacja tak utworzonej sieci następuje po podniesieniu interfejsu WiFi - ifconfig <nazwa_interfejsu> up

 

 

Ostatnim krokiem jest przypisanie adresu IP komputerowi na którym jest tworzona sieć, następuje to po wydaniu polecenia - ifconfig <nazwa_interfejsu> <adres_IP> netmask <adres_maski> Komputerowi rozgłaszającemu sieć adhoc został przypisany adres IP 10.0.0.1

 

 

Od tego momentu sieć powinna być dostępna i rozgłaszana, sprawdźmy to. Jak widać poniżej sieć jest widoczna a więc spróbujmy podłączyć się do niej. Proces podłączenia przebiega prawidłowo, następuje uzyskanie dostępu do sieci. Żeby było ciekawiej sieć adhoc jest tworzona na systemie Linux Kali natomiast klientem jest Windows 7.

 

 

Sprawdzenie dostępnych sieci możemy również wykonać z poziomu command line wydając polecenie netsh wlan show networks mode=bssid jak widać uzyskane parametry są zgodne z tymi, które wybraliśmy podczas tworzenia sieci (nazwa sieci, uwierzytelnienie czy wybrany kanał).

 

 

Ostatnim krokiem jest przypisanie adresu IP zgodnego z adresacją sieci przyjętą podczas tworzenia sieci adhoc. W naszym scenariuszu adres IP może zostać wybrany z przedziału 10.0.0.2 do 10.0.0.254. Klientowi korzystającemu z Windows 7 zostaje przypisany adres IP 10.0.0.2

 

 

Po operacji przypisania adresu nie pozostaje nam nic innego jak tylko sprawdzenie poprawności komunikacji. Sprawdźmy czy uda nam się skomunikować z komputerem hosta sieci adhoc. Wysłanie pakietu ICMP (ping do 10.0.0.1) kończy się sukcesem.

 

 

Również możliwa jest komunikacja z komputerem klientem. W tym przypadku uzyskujemy dostęp do folderów udostępnionych na maszynie z zainstalowanym Windows 7.

 

 

Znacznie częściej będziemy jednak łączyli się z punktami dostępowymi niż tworzyli sieć typu adhoc. A więc po niżej przedstawiam trzy możliwe scenariusz z jakimi będziemy mogli się spotkać.

      1. połączenie z siecią WiFi bez zabezpieczeń – sieć otwarta,
      2. połączenie z siecią WiFi zabezpieczoną kluczem WEP,
      3. oraz połączenie z siecią zabezpieczoną kluczem WEP2

Pierwszym krokiem do ustanowienia połączenia z siecią bezprzewodową jest sprawdzenie nazwy szukanej sieci Wifi, czyli wykorzystujemy już znane nam polecanie iwlist <nazwa_interfejsu> scan.

 

 

Ustanowienia połączenia z AP następuje po wydaniu polecenia iwconfig <nazwa_interfejsu> essid <nazwa_sieci> W przedstawianym scenariuszu następuje połączenie z siecią bezprzewodową Temp za pomocą interfejsu wlan0. Jak widać sieć jest otwarta ponieważ nie podajemy żadnego klucza (uwidocznione jest to również na rysunku powyżej – sekcja: Encryption key: off).

 

 

Po połączeniu z siecią co obrazuje nam uruchomiona usługa zdarzeń – iwevent należy usyskać adres IP.

 

 

Adres ten możemy przypisać statycznie za pomocą polecenia ifconfig <nazwa_interfejsu> <adres_IP> netmask <adres_maski> bądź skorzystać z DHCP. My decydujemy się na to drugie rozwiązanie a więc by uzyskać adres IP wydajemy polecenie dhclient <nazwa_interfejsu>.

 

 

Po wydaniu polecenia nasz host uzyskał dostęp do Internetu.

 

 

Drugim omawianym przypadkiem jest podłączenie do sieci, która jest zabezpieczona kluczem WEP. W naszym scenariuszu również dokonujemy podłączenia do sieci Temp przy czym hasło tej sieci stanowi klucz: 9999999999.

 

 

Po wydaniu polecenia iwlist <nazwa_interfejsu> scan ukazuje się nam lista dostępnych sieci bezprzewodowych, jak widać sieć TEMP jest zabezpieczona – encryption key: on

 

 

Podłączenia do sieci dokonujemy bardzo podobnie jak to było w przypadku sieci otwartej lecz dodajemy dodatkowy parametr key. Czyli w naszym przypadku polecenie będzie miało postać iwconfig <nazwa_interfejsu> essid <nazwa_sieci> key <hasło_sieci>. W przypadku korzystania z klucza w formacie ASCI nasze polecenie przyjmie postać iwconfig <nazwa_interfejsu> essid <nazwa_sieci> key s:<hasło_sieci

I na koniec przypisanie adresu IP do interfejsu by po chwili móc się cieszyć połączeniem z Internetem.

 

 

 

Ostatnią sytuacją jest scenariusz z którym będziemy spotykać się najczęściej czyli łączność z tą siecią w której zastosowano mechanizm WPA2. Niestety połączenie z siecią bezprzewodową, która korzysta z zabezpieczeń w standardach IEEE 802.1X oraz IEEE 802.11i wiąże się z instalacją tzw. wpa_supplicant. Ale wszystko po kolei.

Zaczynamy od instalacji pakietu wpasupplicant. W oknie terminalu wydajemy komendę sudo aptitude install wpasupplicant (dla wiersza poleceń) dla GUI - sudo aptitude install wpasupplicant wpagui

Po poprawnej instalacji możemy przejść do zestawienia połączenia z siecią WiFi. Jak w poprzednich przypadkach wykrywamy dostępne na danym obszarze sieci bezprzewodowe. Siecią do której będziemy się podłączać jest tradycyjnie sieć Temp. Jak widać poniżej korzysta ona z zabezpieczenia opartego na WPA2.

 

 

Zaczynamy od utworzenia pliku konfiguracyjnego w którym to będą zapisane informacje niezbędne do uzyskania uwierzytelnienia. Plik ten tworzy się za pomocą komendy wpa_passphrase <nazwa_sieci> <hasło>. Dodatkowo został użyty symbol przekierowania >, który to spowoduje zapisanie wygenerowanych informacji do pliku wpa.conf (katalog użytkownika) Dozwolone jest również wydanie samego polecenia wpa_passphrase <nazwa_sieci> wtedy program czekana wprowadzenie hasła.

 

 

Nie pozostało nam nic innego jak użyć tak przygotowany plik do zestawienia połączenia z siecią bezprzewodową. Aplikacja wpa_supplicant korzysta z następujących przełączników:

 

 

By połączyć się z siecią WiFi musimy wydać polecenie: wpa_supplicant -D<wybrane_sterowniki> –i<interfejs> –c<ścieżka_do_pliku_conf> czyli w naszym przypadku polecenie przyjmie postać - wpa_supplicant -Dwext –iwlan0 –c/root/wpa.conf

 

 

Tradycyjnie już ostatnią czynnością jest uzyskanie adresu IP, by po jej wykonaniu

 

 

móc cieszyć się połączeniem z Internetem.

 

 

Gdyby z jakiś powodów połączenie nie doszło do skutku by zresetować ustawienia należy posłużyć się komendami: ifconfig <interfejs> down (wyłączenie interfejsu sieciowego) oraz killall wpa_supplicant dhclient (wyłączenie aplikacji wpa_supplicant wraz z klientem DHCP).

 

 

By adresy IP przypisać statycznie musimy wykonać następujące czynności:

1. Przypisać adres IP do interfejsu sieciowego za pomocą polecenia ifconfig <nazwa_interfejsu> <adres_IP> netmask <adres_maski> - oczywiście adres musi być zgodny z przyjętą adresacją sieci

 

 

2. Ustalić adres bramy domyślnej za pomocą komendy:

route add default gw <adres_IP_bramy> <nazwa_interfejsu>

Poprawność dodania trasy do tablicy routingu możemy sprawdzić wykorzystując do tego polecenie: route i jak widać została dodana trasa 0.0.0.0, która cały ruch (bo wszystkie pakiety pasują do tego wpisu), kieruje poprzez interfejs wlan0 na adres 192.168.0.1

 

 

3. Adresy DNS dodajemy/zmieniamy poprzez edycję pliku /etc/resolf.conf, serwer DNS dodajemy za pomocą wpisu nameserver <adres_serwera_DNS>

 

 

Po wykonaniu tych wszystkich czynności uzyskamy dostęp do Internetu.

 


 

Bibliografia:

  1. http://www.wirelessdefence.org/Contents/LinuxWirelessCommands.htm
  2. http://hxr99.blogspot.com/2011/10/how-to-set-wireless-ad-hoc-in-linux.html
  3. http://www.linuxcommand.org/man_pages/iwconfig8.html
  4. http://linux.die.net/man/5/wpa_supplicant.conf
  5. http://linux.icydog.net/wpa.php
  6. http://www.pantz.org/software/wpa_supplicant/wirelesswpa2andlinux.html
  7. http://www.nibyblog.pl/wszystkie-przydatne-komendy-wifi-w-linuksie-66.html
  8. http://www.cyberciti.biz/faq/howto-debian-ubutnu-set-default-gateway-ipaddress/
]]>
[email protected] (pikolo) Linux Mon, 09 Dec 2013 21:25:41 +0000