04.03.2022
Instalacja i konfiguracja systemu NethServer 7 na IBM System x3550 M4
Bazy danychBezpieczeństwoKonfiguracjaLinux | UnixMicrosoftSprzętWirtualizacja
nethserver7naibmsystemx3550m4

Ostatnia aktualizacja: 07.06.2023 r.

IBM System x3550 M4 to już dość leciwa maszyna, która miała swoją premierę w 2013 roku. Jednak mimo swojego wieku wciąż można znaleźć dla niej zastosowanie. W moim przypadku pierwotnie działała ona jako baza sprzętowa pod Microsoft Hyper-V Server 2012 R2. Wraz ze wzrostem firmy sprzęt zaczął być niewystarczający. Mimo to postanowiłem zaadoptować go do pracy przy innym projekcie, przy którym sprawdzi się idealnie.

Spróbowałem czegoś nowego i całość skonfigurowałem na systemie NethServer 7. Jest to dystrybucja Linux bazująca na CentOS 7, przeznaczona dla entuzjastów oraz dla małych i średnich przedsiębiorstw. System posiada modułową budowę, dzięki czemu w bardzo prosty sposób możemy dostosować go pod konkretne potrzeby jak np. serwer poczty e-mail, serwer www, zaporę sieciową, serwer IPS/IDS, serwer VPN czy prosty wirtualizator. Cała obsługa systemu odbywa się przez interfejs przeglądarkowy oparty o Cockpit firmy Red Hat, dzięki któremu możemy zarządzać systemem, usługami oraz instalować dodatkowe moduły. Ktoś powie, że słabo jest teraz instalować CentOS 7, który na początku 2021 roku został ubity przez Red Hat`a. To prawda, jednak system wsparcie ma do 30 czerwca 2024 roku oraz będzie wykorzystywany na bardzo podstawowym poziomie więc nie jest to problem.

Parametry serwera

  • Intel® Xeon® E5-2620 v2 (pamięć podręczna 15 MB, 2,10 GHz) - 6 rdzeni / 12 wątków
  • 88 GB RAM EEC DDR3 PC3L-12800 1600MHz CL11
  • 8 szt. HDD 2,5" SAS 6 Gbps 10k 300 GB
  • 4 szt. Intel I350AM4 (1 GbE)

Ustawienie RAID 50

W tym projekcie postanowiłem przygotować jedną dużą przestrzeń dyskową z wszystkich ośmiu dysków.

  1. System Settings ➔ Storage ➔ LSI MegaRaid Configuration Utility – 03.02.02.00 ➔ Configuration Management ➔ Create Virtual Drive ➔ Advanced
  2. Select RAID Level ➔ RAID50
  3. Wybieram dyski do pierwszej grupy - Span 1 ➔ Select Drivers 0 do 3 ➔ Apply Changes

  4. Dodaję dyski do drugiej grupy - Add More Spans ➔ Span 2 ➔ Select Drives 4 do 7 ➔ Apply Changes

  5. Default Initialization ➔ Full ➔ Save Configuration

  6. Potwierdzam operację, która spowoduje usunięcie wszystkich danych na wskazanych dyskach, po której rozpocznie się inicjalizacja dysków. W moim przypadku ustawienie macierzy trwało 4 godziny i 17 minut.

Konfiguracja NethServer

Jak napisałem na początku, system bazuje na CentOS 7 więc instalacja wygląda tak samo jak w przypadku instalacji "gołego" CentOS`a. Poniższe zrzuty ekranowe zrobiłem na maszynie wirtualnej w Hyper-V, jednak na fizycznym serwerze postępowałem identycznie.

  1. Po instalacji i uruchomieniu systemu, na ekranie wyświetli się adres IP do zalogowania się do systemu.

  2. Wpisuję go do przeglądarki i loguję się kontem root wraz z hasłem wprowadzonym podczas instalacji systemu operacyjnego.

  3. Po pomyślnym zalogowaniu się do systemu w pierwszej kolejności system prosi o nadanie mu nazwy. Osobiście korzystam z tego sposobu przy generowaniu nazw serwerów lub wymyślam coś innego. 😉

  4. Po kliknięciu przycisku 

    Zapisz

     czekam na wprowadzenie zmian do systemu.

  5. Następnie wprowadzam dane firmy, klikając w link Example Org. na głównym pulpicie, a po kliknięciu przycisku 

    Zapisz

     czekam na zaaplikowanie zmian.

  6. Dalej z pionowego menu wchodzę w Ustawienia, a następnie w sekcji Server Manager wyłączam opcję Grant access from Wan (Red) i klikam przycisk 

    Zapisz

    .

  7. W pionowym menu przechodzę w SSH i zmieniam domyślny port 22 na inny. Dodatkowo w celu zwiększenia bezpieczeństwa możesz zabronić bezpośredniego logowania do konta root, jeśli np. dostęp do serwera będzie wystawiony na świat. W moim przypadku tak nie było więc zostawiłem tę opcję nietkniętą, jednak to nie jest dobra praktyka. 😅

  8. Następnie w pionowym menu przechodzę na Sieć, klikam przycisk 

    Konfiguruj

     przy odpowiednim interfejsie sieciowym (w moim przypadku LAN (green)), aby ustawić stały adres IP. Osobiście preferuję statyczne adresy ustawiać bezpośrednio na zaporze sieciowej w celu łatwiejszego zarządzania, jednak niektóre systemy mają problem z tym, że nie są one ustawione bezpośrednio na nich i NS7 jest jednym z nich. 😜

  9. W kolejnym kroku przechodzę na zakładkę Software Center, klikam w przyciski 

    Update all

     i 

    Odśwież

    , w celu aktualizacji pakietów do najnowszych dostępnych wersji.

  10. Z listy aplikacji zaznaczam File serverOpenVPN oraz phpVirtualBox-5.2 i u góry okna klikam w przycisk 

    Zainstaluj 3 applications

    , a następnie 

    Zainstaluj

    . Jeśli po zakończonej aktualizacji system zasygnalizuje dostępność aktualizacji, to je instaluję.

  11. Uruchamiam ponownie system.

Konfiguracja Active Directory

  1. Po ponownym uruchomieniu serwera, z pionowego menu wybieram Users & Groups w celu utworzenia nowej domeny Active Directory (to nie jest to samo co Windows AD).

  2. W moim przypadku serwer będzie działał jako samodzielny AD, więc wybieram opcję Create domain and become DC.

  3. W ostatnim kroku mogę zmienić nazwę domeny oraz NetBIOS (zostawiłem wartości zaproponowane przez kreator) oraz wprowadzam nowy adres IP dla DC zgodnie z informacją wyświetlaną na ekranie.

  4. Po instalacji DC przystępuję do utworzenia dwóch grup.

  5. Teraz tworzę konta użytkowników i przypisuję ich do odpowiednich grup.

  6. Z bocznego menu przechodzę na zakładkę Applications, klikam przycisk 

    Ustawienia

     przy pozycji File server. Z pionowego menu wybieram pozycję Współdzielone foldery, następnie klikam w przycisk 

    Create a shared folder

     w celu utworzenia dwóch udziałów sieciowych.

  7. Restartuję serwer. Po ponownym zalogowaniu się do serwera, z bocznego menu przechodzę na zakładkę Terminal i aktualizuję konfigurację SMB.
    vi /etc/e-smith/templates/etc/samba/smb.conf/70shares
    ;
    [udzial1]
    path = /var/lib/nethserver/ibay/udzial1
    browseable = no
    ea support = no
    read only = no
    vfs objects = streams_xattr acl_xattr
    inherit permissions = yes
    inherit acls = yes
    hide unreadable = yes
    ;
    ;
    [udzial2]
    path = /var/lib/nethserver/ibay/udzial2
    browseable = no
    ea support = no
    read only = no
    vfs objects = streams_xattr acl_xattr
    inherit permissions = yes
    inherit acls = yes
    hide unreadable = yes
    ;

  8. Wykonuję poniższe polecenia (z tymże pierwsze polecenie wykonuję dla każdego udziału).
    signal-event ibay-modify nazwa_udziału
    config setprop smb Libwbclient sssd
    signal-event nethserver-samba-update
  9. W tym momencie migruję udziały z innego serwera, najlepiej z poziomu swojego konta.

Virtualbox

  1. Panel administracyjny phpvirtualbox dostępny jest pod adresem https://adres.serwera/phpvirtualbox, natomiast domyślne dane logowania to admin | admin.

  2. Po zalogowaniu się klikam w przycisk 

    New

     aby uruchomić kreator tworzenia maszyny wirtualnej. W moim przypadku ustawiam parametry pod system Windows 10 64-bit, którego przenoszę z wirtualizatora Proxmox.

  3. Jako dysk twardy wykorzystałem plik maszyny wirtualnej pierwotnie działającej na systemie Proxmox. Aby działał on poprawnie, musiałem go przekonwertować do odpowiedniego formatu (zachowując nomenklaturę w nazewnictwie czyli admin_moja-nazwa.rozszerzenie):
    VBoxManage convertdd sdb.raw sdb.vdi --format VDI --variant Fixed
    
    Jeśli natomiast zdecydujesz się przygotować maszynę wirtualną "z pustym" dyskiem twardym, aby później podmienić plik VDI, to natrafisz na błędy UUID dysku twardego podczas uruchomienia maszyny wirtualnej. Rozwiązaniem tego problemu jest sczytanie UUID dysku twardego z pliku konfiguracyjnego VBOX, a następnie nadpisanie go w pliku VDI:
    VBoxManage internalcommands sethduuid admin_nazwa.vdi UUID
    
    Oczywiście możliwa jest odwrotna operacja (linia Header: uuidCreation=) i podmiana numeru w pliku VBOX w sekcji <StorageControllers>, przy odpowiednim dysku twardy (jeśli oczywiście masz ich więcej niż jeden):
    VBoxManage internalcommands dumphdinfo admin_nazwa.vdi
    
    Jeśli dodatkowo masz takie szczęście jak ja i jeszcze wyskoczy Ci błąd VD: error VERR_ACCESS_DENIED opening image file, to wykonaj poniższe polecenia, aby się go pozbyć:
    chgrp vboxweb admin_nazwa.vdi
    
    chown vboxweb admin_nazwa.vdi
    

  4. Po utworzeniu maszyny wirtualnej zaznaczam ją i klikam w przycisk 

    Settings

     i w oknie, które pojawi się na ekranie, przechodzę na zakładkę System w celu ustawienia w niej odpowiednich opcji. Jeśli przenosisz inne systemy (np. Linux`y) z innych wirtualizatorów (np. Proxmox, XCP-ng, VMware, Hyper-V) lub wirtualizujesz fizyczny system to wtedy ustawiasz poniższe opcje pod swoje systemy.

  5. Po poprawnym uruchomieniu maszyny wirtualnej usuwam z niej poprzednie sterowniki integracyjne poprzedniego wirtualizatora i dodaję nowe od VirtualBoxa - zaznaczam na liście maszynę wirtualną, klikam przycisk 

    Settings

     i z listy wybieram Install Guest Additions.... Oczywiście jeśli usunąłeś(-aś) napęd CD z ustawień maszyny wirtualnej, to wtedy na ekranie pojawi Ci się błąd.
  6. W przypadku problemów (np. Windows będzie wyrzucał BSOD`a przy starcie) można awaryjnie uruchomić "zdalny monitor" poprzez zaznaczenie VM, kliknięcie w przycisk 

    Settings

     i wybranie z listy Remote Display. W oknie ustawień VM w sekcji Display w linii Remote Desktop Server Port: pojawi się numer portu i adres (domyślnie jest Disabled), który należy wpisać w oknie Podłączanie pulpitu zdalnego w Windows. Wyłączenie tej funkcji odbywa się w ten sam sposób jak jej włączenie. Wydajność tego rozwiązania jest bardzo zła, ale dobrze, że jest. 😋

Netdata

NS7 posiada wbudowane narzędzie Netdata do zbierania mnóstwa wskaźników w czasie rzeczywistym odnośnie pracy serwera. Poniższymi poleceniami ustawiam dostęp po moim interfejsie LAN i dostęp do danych będzie pod adresem http://adres.serwera:19999.

config setprop netdata Bind 0.0.0.0 access green
signal-event nethserver-netdata-update
signal-event firewall-adjust

OpenVPN

Poniższa konfiguracja nie należy do najbezpieczniejszych (tj. nie jest przygotowana zgodnie z dobrymi praktykami OpenVPN), jednak będzie działała. Niestety kreator jest mocno uproszczony więc część konfiguracji wykonuję z jego poziomu a część z poziomu terminala.

  1. Z pionowego menu wchodzę w Applications, następnie klikam przycisk 

    Ustawienia

     przy pozycji VPN i dalej klikam przycisk 

    Enable OpenVPN RoadWarrior server

    .

  2. W oknie konfiguracji tryb autoryzacji ustawiam na Certyfikat, typ połączenia na Zroutowany oraz wprowadzam adres wraz z maską sieci OpenVPN. Serwer automatycznie pobierze zewnętrzny adres IP.

  3. W opcjach zaawansowanych dostrajam konfigurację. Na koniec klikam w przycisk 

    Zapisz

     i czekam na zapisanie zmian.

  4. Kolejny krok to kliknięcie w przycisk 

    Add account

     w celu przygotowania profili dla użytkowników. Tryb ustawiłem na VPN Only oraz każdemu tworzonemu użytkownikowi przypisałem statyczny adres IP.

  5. Po kliknięciu przycisku 

    Zapisz

     usługa poprosi o kliknięcie w przycisk 

    Apply

     w celu aktywacji ustawień.

  6. Na kolejnym komunikacie ponownie klikam w przycisk 

    Apply

     i czekam na zapisanie ustawień.

  7. Następnie przy każdym użytkowniku klikając w "" mogę pobrać profil OpenVPN (tj. OpenVPN configuration). Nie robię tego, gdyż pliki będę tworzył od zera i po swojemu.

    Powyższa konfiguracja mogłaby zostać w takiej postaci ponieważ będzie ona działać, jednak w oknie połączenia programu OpenVPN będą wyświetlały się ostrzeżenia oraz niekiedy błędy:

    a) "WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this".
    Moja konfiguracja co prawda nie ma w sobie żadnych loginów i hasłem, więc pierwszy komunikat jest nieco mylący i może powodować nerwowość wsród użytkowników. W celu rozwiązania tego problemu wystarczy dodać na końcu klienckiego pliku konfiguracyjnego parametr auth-nocache.

    b) "WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.".
    W moim przypadku na internecie mobilnym PLAY (co ciekawe przez kilka miesięcy konfiguracja działała bez problemów, a później nagle przestała) w/w komunikat dodatkowo wygenerował błędy:
    "TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)"
    "TLS Error: TLS handshake failed"
    Kumulacja ich trzech uniemożliwiła zestawienie połączenia i stąd kolejne kroki.

  8. Instaluję pakiet EasyRSA3.
    sudo yum install easy-rsa
  9. Przenoszę odpowiednie pliki do katalogu easy-rsa serwera OpenVPN i przechodzę do niego.
    cp -rf /usr/share/easy-rsa/3.0.8/ /etc/openvpn/easy-rsa
    cd /etc/openvpn/easy-rsa/
  10. Przygotowuję plik vars, który jest potrzeby do zbudowania katalogu PKI na serwerze OpenVPN. Poniższa konfiguracja zapewnia, że generowane pliki będą wykorzystywać Elliptic Curve Cryptography (ECC). Wybór algorytmów zależy od zainstalowanej wersji OpenVPN (sprawdzenie: openvpn --show-curves oraz openvpn --show-tls). Ilość parametrów jest w zupełności wystarczająca, gdyż nie będę wykorzystywał serwera jak Urzędu Certyfikacji.
    vi vars
    set_var EASYRSA_DIGEST       "sha512"
    set_var EASYRSA_ALGO         ec
    set_var EASYRSA_CURVE        secp521r1
    set_var EASYRSA_KEY_SIZE     2048
    set_var EASYRSA_CA_EXPIRE    3650
    set_var EASYRSA_CERT_EXPIRE  3650
    set_var EASYRSA_CRL_DAYS     3650
    
  11. Nadaję uprawnienia do w/w pliku, aby uczynić do wykonywalnym.
    chmod +x vars
  12. Ustawiam zmienną środowiskową dla pliku vars.
    export EASY_VARS_FILE=/etc/openvpn/easy-rsa/vars
  13. Tworzę lokalny katalog Public Key Infrastructure na serwerze OpenVPN, który będzie wykorzystywany do zarządzania certyfikatami dla serwera oraz klientów.
    ./easyrsa init-pki
  14. Generuję certyfikat dla "Urzędu Certyfikacji" (CA) o odpowiedniej nazwie CN.
    ./easyrsa build-ca nopass
  15. Generuję bez hasła certyfikat oraz klucz prywatny dla serwera o nazwie OpenVPN. Poniższe polecenie robi to samo co polecenia ./easyrsa gen-req OpenVPN oraz ./easyrsa sign-req server OpenVPN.
    ./easyrsa build-server-full OpenVPN nopass
  16. Generuję klucz CRL (Certificate Revoking List), który będzie wykorzystywany do unieważniana certyfikatów klienta poleceniem ./easyrsa revoke nazwa_certyfikatu.
    ./easyrsa gen-crl
  17. Generuję zgodnie z wartością z pliku vars klucz Diffie-Hellman`a na potrzeby lepszego zabezpieczenia.
    ./easyrsa gen-dh
  18. Generuję klucz HMAC (Hash-based Message Authentication Code), który będzie wykorzystywany jako dodatkowy podpis HMAC dla wszystkich uzgadnianych pakietów SSL/TLS. Dodatkowo każdy pakiet UDP nieposiadający poprawnej sygnatury HMAC będzie natychmiast odrzucany, dzięki czemu serwer jest chroniony przed:
    - skanowaniem portów
    - atakami DOS na port UDP serwera OpenVPN
    - inicjalizacji połączenia SSL/TLS z nieautoryzowanych urządzeń
    - ewentualnymi lukami w zabezpieczeniach związanych z przepełnieniem bufora w implementacji SSL/TLS
    openvpn --genkey --secret /etc/openvpn/server/ta.key
  19. Generuję bez hasła certyfikat oraz klucz prywatny dla klienta o nazwie grzegorz_wita. Poniższe polecenie robi to samo co polecenia ./easyrsa gen-req grzegorz_wita oraz ./easyrsa sign-req client grzegorz_wita.
    ./easyrsa build-client-full grzegorz_wita nopass
  20. Profilaktycznie sprawdzam poprawność wygenerowanych certyfikatów.
    openssl verify -CAfile pki/ca.crt pki/issued/OpenVPN.crt
  21. Przenoszę wygenerowane pliki do katalogu serwera OpenVPN.
    cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server
    cp /etc/openvpn/easy-rsa/pki/issued/OpenVPN.crt /etc/openvpn/server/
    cp /etc/openvpn/easy-rsa/pki/private/OpenVPN.key /etc/openvpn/server/
    cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/server/
    cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server/
  22. Modyfikuję domyślną wartość szablonu dla OpenVPN (wartości z tego pliku znajdą się w pliku konfiguracyjnym serwera OpenVPN - /etc/openvpn/host-to-net.conf).
    vi /etc/e-smith/templates/etc/openvpn/host-to-net.conf/20certificates
    #dh /var/lib/nethserver/certs/dh1024.pem
    #ca /etc/pki/tls/certs/NSRV.crt
    #cert /etc/pki/tls/certs/NSRV.crt
    #key /etc/pki/tls/private/NSRV.key
    #crl-verify /var/lib/nethserver/certs/crl.pem
    
    dh /etc/openvpn/server/dh.pem
    ca /etc/openvpn/server/ca.crt
    cert /etc/openvpn/server/OpenVPN.crt
    key /etc/openvpn/server/OpenVPN.key
    crl-verify /etc/openvpn/server/crl.pem
    tls-auth /etc/openvpn/server/ta.key 0
    
  23. Jeśli wcześniej dodałem konta klienckie z poziomu kreatora, to zostawiam je jako wpisy rezerwujące stałe adresy IP, jednak profile nie będę mógł pobierać bezpośrednio z poziomu panelu WWW tylko będę musiał je przygotowywać ręcznie. Zaletą tego rozwiązania jest to, że wpisy dodane przez panel WWW pozostają zapisane na stałe i nie ulegają usunięciu podczas rekonfiguracji serwera, co niestety dzieje się przy zastosowaniu poniższej metody gdzie każda zmiana konfiguracji będzie czyściła zawartość folderu ccd. Jeśli rekonfigurację będziesz robił(-a) bardzo rzadko, to wtedy obejściem problemu jest poprostu restartowanie usługi OpenVPN w celu zaaplikowania zmian, a to nie czyści plików katalogu ccd.
    vi /etc/openvpn/ccd/grzegorz_wita
    ifconfig-push 10.68.126.2 255.255.255.0
  24. Przygotowuję pliki profili OpenVPN i w odpowiednich miejscach wpisuję adres IP i certyfikat CA serwera oraz unikatowe dla każdego użytkownika certyfikaty i klucze. Plików tworzę tyle ile profili muszę przygotować.
    dev tun
    client
    remote xxx.xxx.xxx.xxx
    port 1194
    proto udp
    explicit-exit-notify 1
    float
    # Authentication: certificate
    <cert>
    #certyfikat klienta
    </cert>
    <key>
    #klucz prywatny klienta
    </key>
    <ca>
    #certyfikat CA
    </ca>
    <tls-auth>
    #klucz TLS
    </tls-auth>
    auth SHA384
    cipher AES-256-GCM
    verb 3
    persist-key
    persist-tun
    nobind
    passtos
    
    tls-client
    key-direction 1
    verify-x509-name "OpenVPN" name
    remote-cert-tls server
    auth-nocache
    

Na koniec kilka uwag:

  1. W/w konfiguracja OpenVPN będzie powodować problemy na systemie Windows, jeśli będziemy łączyć się do udziałów sieciowych oraz do pulpitu zdalnego korzystając z różnych kont. W moim przypadku konta SMB oraz konta systemowe na VM to dwa różne konta z różnymi loginami i hasłami. W celu obejścia tego problemu wystarczy w pliku hosts Windows wpisać adres IP serwera i nazwę VM (ale nie tą z phpvirtualbox tylko nazwę komputera z Windows) oraz przygotować skrypt BAT i przez niego się łączyć:
    @echo off
    chcp 65001 > nul
    cmdkey /generic:"nazwa" /user:"" /pass:""
    mstsc /v:nazwa
    cmdkey /delete:"nazwa"
  2. Drugim problemem, na jaki możesz natrafić to problem z połączeniem do SMB i RDP. Będąc podłączonym do tej samej sieci lokalnej co serwer, działało mi SMB, ale RDP już nie. Natomiast po VPN`ie działały obydwie usługi. Poniższa drobna korekta ustawień w sekcji RDP port for phpvirtualbox w domyślnej zaporze sieciowej rozwiązuje ten problem.
    vi /etc/shorewall/rules
    ACCEPT  loc     $FW     tcp     3389

    shorewall restart
0 komentarzy

Szybki kontakt

Masz pytania? Napisz