Egy régi Samba 4.2.4 AD kiszolgáló és Zentyal DC-k migrálása a legfrissebb Zentyal környezetbe. A virtuális környezetet Proxmox, a hálózati háttértárat GlusterFS biztosítja.

Célszerű azt az elvet betartani, hogy a régi és az új AD-ban lévő felhasználók, csoportok is mind ékezet nélküliek legyenek, ugyanis az export és import során belefuthatunk némi kellemetlenségbe.

A környezet kialakításához ansible-t használtam, minimálisra csökkentve a manuális munkát.

Az új környezetet biztosító VM-ek elszeparáltan egy router-en keresztül, vlan tag-gel ellátott hálózatban kommunikálnak, így használható a korábban használt IP cím, egyedüli beállítást az új VM-ek elérése a router mögött igényel, a szükséges portátirányítások után már nincs gond.

Github: zentyal-migration

A megoldásban használt technológiák:

  • cloud-init
  • Ansible
  • Docker

Az Ansible control node egy Docker image lesz.

Az új környezet előkészítése

Az alábbi lépések megkezdése előtt szükséges lesz egy ansible collection telepítésére:

Ansible Collection telepítése

./run.sh galaxy collection install community.general -p ./collections

Az alábbi sorrendet figyelembe véve hozható létre az új Zentyal környezet.

1. Control node docker image létrehozása

Az image Jamal jóvoltából készült, de ArchLinux image-t használva.

Image létrehozás

docker/build.sh

Ansible playbook futtatás az image-n belül

Jogosultságoktól függően, a lenti script alapértelmezetten sudo-n keresztül fut, amennyiben erre nincs szükség, mert rendelkezünk olyan jogokkal, akkor a parancs előtt használjuk NO_SUDO=1

./run.sh playbook <any other options> <any.yml>

2. Inventory fájlok beállítása

inventory/hosts

Régi DC és AD kiszolgálók beállítása az alábbi csoportokban

  • [dc_old]
  • [ad_old]

inventory/besenyoi.proxmox.yml

Ansible-el lekérdezzük a proxmox-ban futó gépeket, adott tag (dc) alapján csoportosítjuk, hozzáférést a Datacenter alatt állítottam, PVEAuditor jogosultsággal (info@pve).

3. Változók, jogosultságok beállítása

group_vars/all/vars

Ebben a fájlban állítom be:

  • az ansible-nek szükséges adatokat:
    • felhasználói név
    • jelszó
    • milyen módon szerzünk root jogot
    • a root jog megszerzéséhez szükséges jelszót
  • a proxmox környezet elérési és működtetési adatokat:
    • felhasználói név
    • jelszó
    • hol érhető el a proxmox környezet
    • alapértelmezetten használt VM template nevét
    • egy dinamikusan generált VM template nevet (év, hónap alapján)
    • a proxmox hoszt nevét
  • a létrehozandó VM-ek neveit
    • néhány egyedi elérési adatot
      • vlan tag
      • átirányított ssh port
  • a környezet előkészítésekor használt
    • suffix
    • az új környezett előtt lévő router IP címe
  • zentyal hálózati backup fájlokat
    • alapértelmezett (dhcp)
    • éles környezet (éles hálózati beállítások)
  • tartományra vonatkozó beállításokat
    • tartomány neve
    • annak a kiszolgálónak a neve, amiből kimentjük az AD felhasználókat és csoportokat

group_vars/all/vault

Ebben a fájlban az érzékeny információt titkosítva tároljuk. Megtekintéshez, szerkesztéshez az alábbi parancsot használjuk.

./run vault edit group_vars/all/vault

4. Zentyal sablon létrehozása

create_zentyal_template.yml

A 3. pontban jelzett változókkal kapcsolatos beállításról már szó esett, ebben a playbook-ban a pve_base_zentyal_image változó értékét használva készül egy teljes VM másolat, amin használjuk a soros port kimenetet a bootolási folyamat SSH kapcsolaton keresztül történő felügyeletére.

Ennek a lehetőségnek a használatához be kell jelentkeznünk SSH-n keresztül a Proxmox cluster azon node gépére ahol a VM fut és rácsatlakozni az érintett VM-re az alábbi paranccsal:

111 - a VM azonosítója, cseréld le a nálad aktuálisra

qm terminal 111

További műveletek:

  • grub soros porti beállítások.
  • rendszer csomagok frissítése, (dependency cycle miatt dpkg futtatása…).
  • cloud-init telepítés.
  • a fenti csomag telepítése miatt lepucoljuk a korábbi zentyal-network csomagot hogy ne kérjen a rendszer duplán IP címet, mert lefut a netplan, és a régi interfaces címkérés is.
  • dhclient config módosítás
  • dhclient lease állományának törlése
  • cloud-config létrehozása
  • machine-id törtlése
  • netplan config módosítása
  • VM leállítása

Ne felejtsük el a létrejött VM-et VM sablonná alakítani (Convert to template).

Valamint adjunk a Hardware fül alatt hozzá egy CloudInit Drive elemet.

./run playbook --ask-vault-pass create_zentyal_template.yml

Alternatívaként használható a cloud-init-env.yml playbook adott IP használatával.

./run.sh playbook -i <IP>, cloud-init-env.yml --ask-vault-pass

5. Zentyal tartomány létrehozása

zentyal_iac.yml

A teljes Zentyal infrastruktúra kialakításához használandó.

Végrehajtott műveletek:

  • Zentyal kiszolgálók létrehozása
    • a Zentyal VM sablon felhasználásával elkészül a vm_list változóban jelzett mennyiségű gép
    • dc tag-el megjelöljük ezeket a gépeket, ezt az információt a dinamikus inventory során használjuk, hogy tudjuk melyik új VM-el van dolgunk
    • VM-ek indítása
  • Zentyal kiszolgálók beállítása
    • rendszer csomagok frissítése, szükség szerint VM-ek újraindítása
    • a korábban eltávolított zentyal-network csomag visszatelepítése, egyúttal a cloud-init csomag törlődik
    • hostname és ssl kulcsok beállítása
    • az alapértelmezett hálózati beállítás élesítése (alapértelmezetten DHCP címe lesz a VM-nek), újraindítás
    • felkerülnek a tartomány kiszolgálásához szükséges csomagok, valamint az éles környezetben használt hálózati beállítások, ezek után a VM rövid ideig nem lesz elérhető, mert megváltozik az elérés módja ezekkel a beállításokkal
  • VM-ek hálózati elérésének előkészítése
    • VM-ek leállítása
    • hálózati beállítások, vlan jellegű beállítások, mert az új környezetet elszeparáltan, a régi mellett indítjuk, elésére csak egy közbeiktatott router-en keresztül lehetséges
    • VM-ek indítása, korábbi dc tag eltávolítása
  • AD felhasználók és csoportok exportálásának előkészítése
    • egyik meglévő DC-n hajtjuk végre a felhasználók és csoportok exportálását
    • letöltés
  • Zentyal által biztosított mentés készítése
    • mentés készítése, ha a korábbi mentés egy napnál régebbi
    • a biztonsági mentésből kivesszük a megosztásokra vonatkozó adatokat
  • Az új kiszolgálók elérésének ellenőrzése

Amennyiben a fenti lépések lefutottak, elkészíthetjük az AD kiszolgálónkat a már ismert Zentyal webes felületen.

./run playbook --ask-vault-pass zentyal_iac.yml

6. AD felhasználók, csoportok, jelszavak beállítása

csv.yml

A Zentyal által készített felhasználók és csoportok mentés, egy adott logika szerint tagolt CSV fájl.

Ennek mintájára létrehoztam egy kurtított, szintén CSV állományt, amiben jelezni tudom, mely felhasználókra van az új környezetben szükség, ki az, akire már nincs.

Alapértelmezetten a Zentyal mentés a jelszavakat nem tudja kimenteni az AD-ból, password értékkel helyettesíti azokat.

Az általunk létrehozott CSV állományba ezeket ki tudjuk tölteni és a playbook összefésüli a két állományt egy Zentyal által használható mentéssé, amit egyszerűen webes felületről, vagy parancssorból importálhatunk később.

Az állomány létrehozásakor az alábbi oszlop tagolást használjuk:

id;userName;name;password;status;comment;remove;extra

Példa:

a status mezőben jelzem magamnak, hogy az AD-ban a felhasználó letiltott állapotú

a remove mezőben a generálásnál jelzem a sablonban, hogy a felhasználót már nem akarom felvenni az új környezetbe

1;user;User;Jelszavam;disabled;;Remove;

files/csv/ …

Bemeneti értékek:

  • felhasználók mentés állomány
  • az általunk létrehozott jelszó állomány
  • csoportok mentés állomány

Ha friss mentést (mai nap készült) használunk, akkor alapértelmezetten csak entert nyomva adhatjuk meg a felhasználók és csoport mentés állományát, a másodjára kért jelszó állományt, amennyiben eltér a mai nap dátumától, akkor be kell gépelni.

./run playbook --ask-vault-pass csv.yml

Az import állományok létrehozása után célszerű elkészíteni a tartomány kiszolgálót, élesíteni az AD-t, hogy legyen hova beimportálni a felhasználóinkat!

7. Csoport, felhasználó importálás

setup_users_groups.yml

Az előző lépésben létrejött felhasználó és csoport CSV állományokat felhasználva először a csoportotkat, majd a felhasználókat importálja.

Egyik lépés során vizsgáljuk, hogy van-e olyan felhasználónk, akinek nincs jelszava, vagyis az AD-ban szerepelt, de a mi állományunkban nem. Ennek eredménye visszakereshető a kimeneti képernyőn.

Importálás után böngéssz el a további tartomány kiszolgálóidhoz és léptetsd be azokat is az új tartományodba.

./run playbook --ask-vault-pass setup_users_groups.yml

8. Megosztások, jogosultságok importálása

setup_shares.yml

Futtatás előtt, ha szükséges további diszkek hozzáadása, beállítása.

./run playbook --ask-vault-pass setup_shares.yml

9. AD környezet törlése

stop_and_remove.yml

Amennyiben elölről kell kezdenünk a környezet létrehozását…

NO_SUDO=1 ./run.sh playbook stop_and_remove.yml --ask-vault-pass

Felhasznált eszközök, megoldások, tények:

  • a Zentyal mentések a /var/lib/zentyal/conf/backups/ alá készülnek
  • mentést manuálisan, parancssorból is készíthetünk

    /usr/share/zentyal/make-backup <backup file neve>

  • egy meglévő Zentyal AD/DC-ből exportálhatóak a felhasználók, csoportok

    /usr/share/zentyal-samba/users-export.pl <mentési útvonal…>

    /usr/share/zentyal-samba/groups-export.pl <mentési útvonal…>

  • Zentyal mentésből adott modul mentésének kimásolása

    • Samba modul mentésének kimásolásához az alábbit használtam, csak a megosztások miatt.
      tar --occurrence=1 \
      -xf zentyal_2021-06-23-115205.tar eboxbackup/files.tgz \
      --to-command='tar -O -xvzf - ./samba.bak/samba.bak' | tail -n +13 > samba.bak
      
    • Hálózati modul mentés kimásolásához.
      tar --occurrence=1 \
      -xf zentyal_2021-06-23-115205.tar eboxbackup/files.tgz \
      --to-command='tar -O -xvzf - ./network.bak/network.bak' > network.bak
      tar --occurrence=1 \
      -xf zentyal_2021-06-23-115205.tar eboxbackup/files.tgz \
      --to-command='tar -O -xvzf - ./network.bak/network.state' > network.state
      
  • Zentyal modul visszatöltése az alábbi Perl metódus felhasználásával, files/redis.pl <redis file>

    /usr/share/perl5/EBox/Config/Redis.pm

    EBox::Config::Redis import_dir_from_file
    
  • samba-tool domain passwordsettings

    change policy for password probe…

    samba-tool domain passwordsettings set --account-lockout-duration=5
    samba-tool domain passwordsettings set --reset-account-lockout-after=5
    samba-tool domain passwordsettings set --account-lockout-threshold=0
    

    show password policy settings

    samba-tool domain passwordsettings show