1. Trochę o aktualizacji systemu.
Najważniejszą wręcz kwestią w większości systemów operacyjnych jest dokonywanie ich aktualizacji. Każdy się
zgodzi, że aktualne programy i funkcje, to przede wszystkim bezpieczeństwo. Szczególnie, nabiera to znaczenia
na serwerze, który zwykle wystawiony jest do Internetu i jest podatny na ataki. System Windows posiada swoje
mechanizmy aktualizacji, które wymagają zwykle zaznaczenia odpowiedniej opcji tak aby system samodzielnie
pobierał potrzebne mu aktualizacje. Jednak w przypadku programów zewnętrznych to sami musimy dbać o ich
aktualność. Linux trochę rozwiązuje ten problem.
W każdym Linuksie znajduje się specjalny komponent nazywany systemem zarządzania pakietami.
Dlaczego pakietami? Otóż oprócz paru wyjątków, Linux głównie się opiera na pakietach, w których znajdują się
programy, elementy systemu itd. Taki pakiet to plik, którego rozszerzenie zależy od systemu zarządzania pakietami. Plik ten prócz
skompilowanego programu, może też zawierać instrukcje do niego i kod źródłowy. Każdy pakiet zawiera również
plik z metadanymi na temat danego programu. Wszystkie pakiety znajdują się w repozytoriach, czyli
zbiorach pakietów. Takie repozytoria są zwykle prowadzone przez producentów danej dystrybucji. I tak Canonical –
twórca Ubuntu, posiada własne repozytoria. Ubuntu jest systemem opartym na innej dystrybucji – Debianie
i to właśnie z niego pochodzi system zarządzania pakietami, z jakiego korzysta Ubuntu. System ten nazywa się
Advanced Packaging Tool, w skrócie APT. Za jego pomocą użytkownik może aktualizować,
instalować i usuwać programy z systemu. APT wykorzystuje pliki o rozszerzeniu ".deb".
Mówiąc już tak bardziej praktycznie to będziemy wykorzystywać polecenie apt. Można również
używać starszej wersji tego polecenia, czyli apt-get, jednak ta nowsza w zupełności wystarczy.
Polecenia te różnią się od siebie złożonością, apt łączy w sobie część z poleceniem
apt-get i apt-cache.
APT jest narzędziem, które z wiadomych względów działa na prawach administratora. Tak więc jego
wpisanie w konsolę, wyświetli komunikat, że nie mamy uprawnień. W przypadku systemu Windows,
najprawdopodobniej wyświetliło by się okienko UAC z zapytaniem czy chcemy pozwolić temu programowi wprowadzać
zmiany w systemie. Linux nie posiada takich mechanizmów. Musimy mu ręcznie przekazać, że chcemy wykonać dane
polecenie na podwyższonych prawach. Służy do tego drugie już polecenie, czyli sudo. Stało się
ono swoistym memem internetowym. Sudo to skrót od Super User Do, czyli "Super
użytkownik robi". Należy je umieścić przed każdym poleceniem jakie chcemy wykonać na prawach roota.
Kiedy to zrobimy system poprosi nas o hasło i jeżeli jesteśmy w odpowiedniej grupie – wykona polecenie.
Pierwsze co zrobimy to zaktualizujemy nasze repozytoria, tak aby system miał listę najnowszego, dostępnego
oprogramowania. Służy do tego parametr update. Ostatecznie cała składnia wygląda następująco:
$ sudo apt update
Po wpisaniu polecenia (żółty kolor) system poprosi nas o wpisanie hasła (żółty kolor), warto
mieć na uwadze, że hasło również jest tutaj niewidoczne. Po uwierzytelnieniu się sudo zapamiętuje
nas, więc przez jakiś czas nie będziemy musieli podawać hasła. Uruchomi się polecenie
apt i zacznie pobierać potrzebne pakiety. Na koniec poinformuje nas, że "X"
pakietów może zostać zaktualizowanych i proponuje nam wylistowanie sobie ich, podpowiadając nawet
jakim poleceniem (zielony kolor).
Polecenie to jednak nie zaktualizuje nam systemu. Do tego służy
inny parametr, a mianowicie upgrade. On już dokona potrzebnych aktualizacji. Wpisujemy polecenie:
$ sudo apt upgrade
Po jego wprowadzeniu, apt wylistuje nam pakiety jakie chce zaktualizować, napisze ile ich jest,
ile musi pobrać danych z Internetu i ile ostatecznie miejsca
na dysku to zajmie. Później zostajemy zapytani o kontynuację, Y jest od
Yes, a n jest od no. My oczywiście
wpisujemy Y i naciskamy Enter.
Podczas aktualizacji, apt najpierw pobierze potrzebne pakiety deb, później je rozpakuje, a na samym końcu zacznie aplikować zmiany do systemu operacyjnego. Kiedy wyświetli nam się znak zachęty, to będziemy mogli kontynuować pracę z systemem. W większości przypadków nie będzie wymagany restart. Jednak przy cięższych aktualizacjach, może się tak zdarzyć, że Linux będzie chciał dokonać rebootu (należy wpisać polecenie reboot). W naszym przypadku nie jest to konieczne.
Z konta root w środowisku produkcyjnym nie należy
korzystać. Jest ono używane tylko w razie cięższych awarii. My w ramach ćwiczeń sobie go oczywiście
aktywujemy, korzystając z polecenia passwd. Domyślnie root nie ma hasła, przez co
jest nieaktywny. Polecenie to pozwala na zmianę hasła danego użytkownika. W przypadku jego wpisania
bez sudo, będziemy musieli podać stare hasło. Jeżeli wykonamy je na prawach administratora, to będzie
można od razu wpisać nowe hasło. Działa to jednak tylko w przypadku zwykłych użytkowników. Zmiana
hasła na koncie roota zawsze wymaga podwyższonych praw. Wpisujemy, więc:
$ sudo passwd root
I podajemy nowe hasło. Operację, tę musimy wykonać dwa razy, czyli raz wpisać hasło, zaakceptować
Enterem, a potem jeszcze raz. Dopiero wtedy system je zmieni.
Teraz możemy sprawdzić, czy aktywacja się pomyślnie powiodła.
Zalogujemy się na nasze konto root'a. Do tego celu możemy wykorzystać dwie metody. Pierwszą jest wpisanie
polecenia exit. Wyloguje nas ono, dzięki czemu będziemy mogli zalogować się ponownie
już z konta root'a. Inną opcją jest użycie polecenia login, które zaloguje nas do root'a,
bez wcześniejszego wylogowywania. Musimy ją wykonać na prawach administratora, z podaniem konta docelowego.
Cała składnia wygląda następująco:
$ sudo login root
System poprosi nas o hasło najpierw do konta bieżącego, potem do konta root, a po jego podaniu będziemy już zalogowani. Poznać to można po tym, że
przed znakiem "@" (kolor zielony), jest napisane root, a także znak zachęty
zmienił się z dolara "$" na hasha "#".
Wyjść z tego konta można za pomocą polecenia exit.
Wpisanie go wyświetli wiadomość logout i przywróci nam poprzednie konto. Zmieni się również znak
zachęty. Wpisujemy więc:
# exit
I już jesteśmy na poprzednim koncie.
Znak "#" w poleceniu będzie oznaczał w dalszej części tych materiałów, komendy
wydawane z konta root'a.
Kolejną rzeczą jaką sobie zrobimy na naszym serwerze, będzie utworzenie nowego użytkownika. W każdym
systemie serwerowym, zawsze jest większa ilość użytkowników. I nie mówię tutaj o Active Directory, a o
usługach, które bardzo często wymagają usera, tylko dla siebie. W systemach linuksowych istnieje wiele
poleceń na dodanie użytkownika. My użyjemy tego najnowszego jakim jest adduser.
Wykonujemy to na prawach administratora, podając do tego nazwę
użytkownika, naszego usera. U nas będzie to admin01. Składnia będzie wyglądać następująco:
$ sudo adduser admin01
System rozpocznie dodawanie nowego użytkownika – stworzy go, stworzy też mu grupę oraz katalog
domowy. Później poprosi nas o podanie hasła (kolor niebieski), a na końcu będzie chciał abyśmy
uzupełnili parę danych. Oczywiście nie musimy tego robić, wystarczy to przeklikać
Enterem. Na koniec spyta się czy informacje są poprawne, potwierdzamy
odpowiednią literką i nasz użytkownik zostanie utworzony.
Teraz możemy sprawdzić działanie naszego konta. Do tego
wykorzystamy inne polecenie niż ostatnim razem, a mianowicie su. Polecenie to pozwala na
wykonywanie innych poleceń jako dany użytkownik. Ale przy nie podawaniu żadnych dodatkowych
poleceń, pozwala się zalogować do shella jako dany user. Wpisujemy, więc:
$ su admin01
Następnie hasło i od tego momentu jesteśmy zalogowani jako admin01.
Sprawdźmy sobie poziom uprawnień naszego użytkownika.
Spróbujemy z jego poziomu zmienić hasło do konta root. Używamy, więc wcześniej omawianego
polecenia:
$ sudo passwd root
Wpisujemy hasło i… klops. Nie pozwala nam. Stwierdza, że nie jesteśmy w odpowiedniej grupie.
Jednak my to zmienimy. Przede wszystkim należy wyjść z konta używając polecenia exit.
Dodamy teraz naszego użytkownika do grupy sudo, gdyż możliwość używania polecenia
sudo, determinuje przynależność do tej grupy. Systemy z rodziny Linux przechowują informacje o grupach
w pliku group, który znajduje się w katalogu etc (przechowuje on
różne pliki konfiguracyjne), w głównym katalogu systemowym. Do edycji tego pliku, będziemy wykorzystywać
edytor tekstowy nano. Jednak jak ktoś chce to może skorzystać z innego np.
vim lub mcedit. Nano jest według mnie najprostszym edytorem i to z niego
będziemy korzystać.
Aby edytować plik systemowy, będziemy potrzebowali praw
administratora. Tak więc wpisujemy:
$ sudo nano /etc/group
Uruchomi nam się prosty program nazywany GNU nano. U góry na
screenie zaznaczyłem obszar programu, który informuje nas o obecnie otwartym pliku.
Niżej mamy pole, w którym mieści się zawartość pliku tekstowego. Na samym dole na pomarańczowo
zaznaczyłem najważniejsze polecenia, jakie możemy wykonać w tym edytorze. Znak "^",
który się tam znajduje oznacza klawisz Control. Tak, więc aby wyjść w programu
naciskamy Ctrl+X. Zapis pliku jest ukryty pod pozycją Write Out i obsługuje
się go kombinacją Ctrl+O. Program sam nas informuje w dolnym polu co teraz robi i co jako
użytkownik możemy z tym zrobić. W przypadku zapisywania pliku poinformuje nas, że zapisuje plik i jaką nazwę
chcemy mu nadać. Na zielono zaznaczyłem pozycję, która nas interesuje. To tutaj po przecinku dopisujemy
naszego użytkownika.
Po dopisaniu naszego użytkownika ostatecznie wszystko powinno wyglądać tak jak na powyższym zdjęciu. Na niebiesko zaznaczyłem polecenie, którym będziemy zapisywać plik. Naciskamy więc Ctrl+O.
Program nas poinformuje, że chce zapisać plik group do katalogu etc. Oczywiście zgadzamy się na to naciskając klawisz Enter.
Na sam koniec, zostaniemy poinformowani, że program zapisał określoną ilość linii. W tym przypadku jest to 58. Oznacza to, że operacja zapisu powiodła się pomyślnie. Jeżeli wystąpiłyby jakieś problemy z zapisem to edytor nano poinformował by nas o tym.
Następnie możemy sprawdzić czy operacja się udała. Logujemy się na nasze drugie konto i dokonujemy zmiany hasła. Jak widać tym razem system pozwala nam to zrobić. Oznacza to, że użytkownik ma już uprawnienia sudo. Jeżeli system dalej nie pozwalałby wykonać polecenia to należy sprawdzić jeszcze raz plik group.
W tym punkcie skonfigurujemy sobie adresację IP na naszym serwerze. Ubuntu 20.04 wprowadza na stałe taką
nowość, stworzoną przez Canonical, jaką jest program Netplan. Można go lubić, a można
też nienawidzić. Nie zmienia to faktu, że w Ubuntu 20.04 czy też 22.04 jest to już standard. W przypadku 18.04 Netplan
działał korzystając z innych usług tego typu jak NetworkManager czy systemd.network. Teraz już tak nie
jest i netplan działa samodzielnie. Tak, więc większość poleceń znanych ze starszych wersji Ubuntu jak
ifconfig itd. już nie działa. Netplan wykorzystuje język formalny, który nazywa się YAML.
Jest o skrót od YAML Ain’t Markup Language. I tak jest to akronim rekurencyjny. Język ten
jest jednym z najprostszych bo taki jest też jego cel. Nie posiada żadnej składni ani nic podobnego. To
dany program definiuje sobie składnię. YAML definiuje jedynie takie elementy jak listy czy słowniki oraz
jak oddzielać od siebie dane. I to tyle. Pisząc w tym języku należy odpowiednio uważać, aby nie dać gdzieś
za dużo spacji itp. Tak w YAML wcięcia robi się spacją. Nie tabulatorem. Zanim jednak przejdziemy do
konfiguracji networkingu w Ubuntu, powiemy sobie jak wyświetlać dane na temat interfejsów w konsoli.
Dawniej służyło do tego polecenie ifconfig wchodzące w skład NetworkManager. Obecnie w
systemie Ubuntu z racji wprowadzenia Netplan na stałe korzysta się z polecenia ip, które
wchodzi w skład pakietu iproute2, który zawiera narzędzia do konfiguracji networkingu,
interfejsów itd.
Aby więc wylistować wszystkie interfejsy wpisujemy:
$ ip a
Dostaniemy dużą garść informacji na temat naszych interfejsów. Najważniejsze pola zaznaczyłem
kolorami. Jasnym zielonym zaznaczone są nazwy interfejsów fizycznych. Widać tutaj interfejs
enp0s3 oraz enp0s8. Interfejs lo to pętla zwrotna i tym się nie przejmujemy. Na ciemno zielono
zaznaczyłem status działania karty sieciowej. State UP oznacza, że karta działa. Gdyby nie
działała to napisane byłoby State DOWN. Na fioletowo oznaczyłem adres MAC naszej karty
sieciowej. Na niebiesko widać adres IP karty wraz z maską. Zaś na pomarańczowo adres
rozgłoszeniowy. Te elementy są według mnie najistotniejszymi informacjami, które ukazuje nam to polecenie.
Oczywiście w każdej chwili nasz interfejs możemy wyłączyć odpowiednim poleceniem:
$ sudo ip l set dev enp0s8 down
I już widzimy, że nasza karta sieciowa enp0s8 ma status state DOWN.
Oczywiście nasz interfejs możemy włączyć niemal idnetycznych poleceniem, używając
zamiast down opcji up:
$ sudo ip l set dev enp0s8 up
I już widzimy, że nasza karta sieciowa enp0s8 ma status state UP.
"Poza kamerami" usunąłem statyczną adresację IP i przywróciłem
DHCP aby pokazać w jaki sposób można dodawać adresy IP z konsoli. Służy do tego
polecenie ip z parametrem a add. Pokażę gotowe polecenie dla
karty enp0s8 (tej usunąłem adresację):
$ sudo ip a add 192.168.10.11/24 dev enp0s8
Najpierw piszemy ip a add, następnie wybrany adres IP ze skróconą maską. Później
określamy nasz interfejs za pomocą parametru dev i gotowe. Celowo ustawiłem 11 na
ostatnim bajcie żeby była widoczna różnica.
Możemy również sprawdzić pingi do naszej karty sieciowej czy działają:
$ ping 192.168.10.11
Jak widać wszystko właściwie funkcjonuje.
Niestety, albo stety, wadą tego rozwiązania jest to, że nie jest ono
trwałe. Po restarcie serwera lub wyłączeniu karty, interfejs wróci na poprzednią adresację. Ten sposób
jest dobry, ale jedynie do testowania doraźnych rozwiązań. Gdyby coś poszło nie tak, to istnieje
szybka droga aby powrócić do poprzednich ustawień. Aby zapisać zmiany na stałe to należy edytować
odpowiedni plik, który zawiera konfigurację sieciową. Dawniej był to plik interfaces,
znajdujący się w katalogu etc. Netplan jednak wykorzystuje plik o
rozszerzeniu yaml, który znajduje się w katalogu /etc/netplan.
Plik ten dość często zmienia nazwę, więc warto najpierw sprawdzić jak on się nazywa. Wystarczy, więc wylistować katalog
netplan, poleceniem ls:
$ ls /etc/netplan/
Teraz już wiemy, że ten plik nazywa się 00-installer-config.yaml. Począwszy od wersji
Ubuntu Server 22.04.5 LTS możemy spotkać nazwę 50-cloud-init.yaml, ale
jego zawartość będzie bez zmian.
Teraz wystarczy go wyedytować korzystając z wybranego edytora np. nano, wpisując:
$ sudo nano /etc/netplan/00-installer-config.yaml
lub w wersji 22.04.5 LTS:
$ sudo nano /etc/netplan/50-cloud-init.yaml
Ukazuje się nam w miarę czytelny plik, zawierający wszelkie potrzebne informacje na temat
konfiguracji interfejsów sieciowych. Nas będzie interesować enp0s8. Jak widać po lewej stronie
aktywowany jest DHCP, a "zahaszowane" są parametry, które podawaliśmy podczas instalacji
systemu. W pliku po prawej jest oryginalna wersja po instalacji. Na uwagę zasługuje fakt, że w nowszej wersji parametr
odpowiedzialny za bramę domyślną składa się z trzech linijek:
routes:
- to: default
via: 192.168.10.1
w wersji starszej wystarczyło wpisać gateway4: 192.168.10.1
Niemniej jednak ten starszy wpis możemy także stosować w nowszej wersji, ale podczas zatwierdzania zmian zostaniemy ostrzeżeni
o stosowaniu takiego rozwiązania. My sobie to teraz oczywiście trochę pozmieniamy.
I jeszcze jedna ważna rzecz. Od wersji 22.04.5, żeby jakiekolwiek zmiany
w pliku *.yaml działały (ten po prawej na rys. 5.7), musimy wprowadzić zmianę w innym pliku
(lub go stworzyć) o nazwie 99-disable-network-config.cfg z zawartością widoczną powyżej. Wykorzystamy do tego metodę stdout.
Musimy wykonać to z uprawnieniami root'a. Polecenia, które należy wprowadzić są następujące:
$ su
$ echo "network: {config: disabled}" > /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
Polecenie to stworzy nam plik (lub nadpisze istniejący) o podanej nazwie z zawartością
network: {config: disbaled}
Na koniec sprawdzimy, jeszcze czy nasz zplik ma odpowienią zawartość poleceniem:
$ nano /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
Jak widać wszystko się zgadza.
Teraz możemy już modyfikować nasz plik *.yaml. Kasujemy klamerki z pozycji addresses.
Dajemy Enter i w nowej linii spacją ustawiamy kursor w odpowiednim miejscu. Następnie
dajemy myślnik "-" spację i piszemy nasz docelowy adres IP ze skróconą maską.
Następnie "haszujemy" lub kasujemy całkowicie pozycję dhcp4: true,
zostawiamy nameservers, ponieważ nam się przyda później pod adresy DNS. Następnie
robimy wcięcia tak jak na screenie i piszemy addresses: []. Pod tym
search: [], możemy zostawić opcję optional: true, która skróci nam czas wykrywania interfejsu podczas startu
systemu. I tak utworzony plik możemy już zapisać.
UWAGA! JAK JUŻ WSPOMINAŁEM YAML JEST WYCZULONY NA WSZELKIE WCIĘCIA I ZMIANY. NALEŻY
PAMIĘTAĆ O TYM ABY WCIĘCIA ROBIĆ SPACJĄ, A NIE TABULATOREM.
Dzięki odpowiednim poleceniom Netplan sprawdzi nam poprawność
zmodyfikowanego pliku:
$ sudo netplan try
Spyta się czy chcemy go zatwierdzić, a my oczywiście zgadzamy się na to i dla pewności możemy jeszcze
użyć polecenia:
$ sudo netplan apply
Od tego momentu mamy już właściwą adresację, co widać po wpisaniu polecenia:
$ ip a
Tak wygląda podstawowa konfiguracja Netplanu, ale można jeszcze zmienić nazwy
interfejsów sieciowych. Aby to zrobić, należy dodać trzy następujące linijki, zaczynając tuż pod opcją
optional: true. Mają one postać:
match:
macaddress: 08:00:27:90:a5:bb
set-name: NIC
Oczywiście zapisujemy zmiany w pliku, zatwierdzamy je odpowiednimi poleceniami:
$ sudo netplan try
$ sudo netplan apply
I obowiązkowo restartujemy system poleceniem:
$ reboot
Po restarcie systemu wpisujemy polecenie:
$ ip a
I widzimy, że nasze nazwy interfejsów są już odpowiednio powiązane z adresami MAC.
Aby sprawdzić jak nazywa się nasz serwer, wystarczy spojrzeć
w konsoli jaka nazwa figuruje po znaku "@". Niemniej jednak można użyć też
polecenia hostname lub z nazwą domenową hostname -f:
$ hostname
$ hostname -f
U nas nie ma wprowadzonej nazwy domeny, więc oba polecenia zwracają to samo.
Aby zmienić nazwę serwera należy edytować dwa pliki i tam dokonać zmian. Pierwszym
z nich jest hostname, a drugi to hosts. Obydwa znajdują się w katalogu etc.
Najpierw dokonamy zmiany w tym pierwszym. Wpisujemy więc:
$ sudo nano /etc/hostname
I wprowadzamy sobie roboczą nazwę ubserver00. Oczywiście później będziemy używać
poprzedniej nazwy serwera.
Następnie edytujemy drugi plik poleceniem:
$ sudo nano /etc/hosts
I także zmieniamy nazwę na ubserver00 dodając nazwę domeny egzamin.local.
Ostatecznie powinno to wyglądać tak jak na screenie.
Aby nasze zmiany zostały wprowadzone to musimy zrestartować
system polecneiem:
$ reboot
Po restarcie wszystko powinno być OK. Użyjemy ponownie znanych już nam poleceń oraz dodamy trzecie:
$ hostname
$ hostname -f
$ hostname -d
I widzimy, że po wpisaniu tego drugiego i trzeciego polecenia, nasza nazwa zawiera już domenę.