Przygotowanie do upgrade Windows 10 do 11 na Proxmox

Aby można było wykonać upgrade VM Windows do wersji 11 musimy odpowiednio przygotować VM. Do VM Windows musimy dodać TPM2 oraz przestawić z Bios na UEFI.

Dodanie TPM2

VM > Hardware > Add > TPM State

Zmina BIOS na UEFI

Microsoft w Win10 udostępnił narzędzie do zmiany z mbr na efi.

Dla bezpieczeństwa w Proxmox robimy snapshot dla VM, którą będziemy modyfikować.

W cmd z prawmi admina(niektóre polecenia nie będa działały w powershell prawidłowo) uruchamiamy sprawdzanie możliwości konwersji

mbr2gpt /validate /allowFullOS

Na tym etapie możemy napotkać błąd:
Cannot find OS partition(s) for disk 0

Częstą przyczyną tego problemu są błądne wpisy w bcd odnośnie partycji recovery.
Przyczynę problemu możemy zidentyfikować w logach c:\windows\setuperr.log oraz c:\windows\setupact.log. Mogą być tam wpisy podobne do „FindOSPartitions: Cannot get volume name for the recovery boot entry”
Polecenie bcedit /enum all pokaże ramdisk=[unknown]

Możemy usunąć ten wpis jeżeli nie potrzebujemy recovery w naszym Windows

Poleceniem bcdedit bez parametrów pobieramy identyfikator „recoverysequence” z sekcji Windows „Boot Loader”

Teraz możemy usunąć wpis, który powoduje problemy

bcedit /delete {recoverysequence}

po tej operacji polecenie bcedit /enum all nie powinno pokazać już wpisu zawierającego ramdisk=[unknown]

możemy ponownie uruchomić walidację przed zmianą mbr2gpt /validate /allowFullOS

Jeżeli polecenie z mbr2gpt z parametrem validate nie pokazuje błędu to możemu zacząć konwersję, jako disk:x podajemy dysk zidentyfikowany w poleceniu validate np disk:0

mbr2gpt /convert /disk:x /allowFullOS

Możesz natknąć się na komunikat błedu. Failed to update ReAgent.xml, ja go zignorowałem bez dalszych konsekwencji.

Wyłączamy maszynę i w Proxmox Dodajemy EFI Disk z zaznaczona opcją Pre-Enroll Keys, partycję EFI dodaję zawsze na tym samym zasobie co główny dysk VM’ki.
VM > Hardware > Add > EFI Disk oraz opcję BIOS zmieniamy na OVMF (UEFI).
Uruchamiamy VM.

Gdy Windows się uruchomił możemy usunąć snapshota

Na VM możemy sprawdzić czy wszystkie wymagania do aktualizacji są spełnione programem od Microsoft PC Health Check App

Uruchomienie programu lub skryptu w kontekście użytkownika SYSTEM

Pobieramy z SysInternals program PsTools i z tego pakietu uruchamiamy 'psexec’ z uprawnieniami administratora.

psexec -s -i cmd.exe

Teraz w nowej konsoli możemy uruchomić dowolny program w kontekście uprzywilejowanego użytkownika SYSTEM. Dzięki temu możemy np. przetestować skrypt, który ma być uruchomiony z polityki GPO na wszystkich komputerach w domenie.

ADCS – Sprawdzanie podatności

W Kali linux uruchamiamy polecenie:

certipy-ad find -stdout -vulnerable -dc-ip <ip domain controller> -target <domena windows> -u <domain user>

domain user to zwykły użytkownik domeny bez praw admina
W odpowiedzi na dole ekranu w sekcji „[!] Vulnerabilities” zobaczymy podatności naszego serwera ADCS np:
ESC8 : Web Enrollment is enabled and Request Disposition is set to Issue

A w sekcji „Certificate Templates” podatne szablony certfikatów, jeżeli istnieją.

FortiClient – Linux – problem z połączeniem VPN

Przy próbie połączenia za pomocą FortiClient z VPN w Ubuntu 24.04 wyświetla się komunikat „config DNS failed”.

Problem wydaje się występować jeżeli w systemie mamy zainstalowane interfejsy sieciowe z Vmware Workstion lub Docker. Aby rozwiązać problem, należy w konfiguracji wykluczyć te interfejsy z zarządzania przez NetworkManager.

Edytujemy plik /etc/NetworkManager/NetworkManager.conf i dodajemy interfejsy, które chcemy wykluczyć:

$ sudo nano /etc/NetworkManager/NetworkManager.conf
[keyfile]
unmanaged-devices=interface-name:docker0;interface-name:br-*;interface-name:vmnet*

W mim przypadku docker0 i br-* to interfejsy Docker a vmnet* to maska interfejsów Vmware

Restarujemy NetworkManager i Docker jeżeli go używamy:

sudo systemctl restart NetworkManager
sudo systemctl restart docker

Bacula – Restore kopii z kopii

W Baculi możemy dodać Job: Type = Copy. Dzięki temu uzyskamy możliwość robienia kopii z kopii czyli np mamy backup na SD = Storage1 a chcemy aby Bacula robiła nam kopię puli Pool = pool1 z Storage1 na Storage2 Pool=pool1B. Bacula nie będzie łączyła się z klientem aby wykonać nową kopię tylko pobierze dane z pool1 i zrobi kopię na pool1B który znajduje się na Storage2.

Aby odzyskać dane z tak powstałej puli musimy dokładnie wskazać jobid, Jobu typu COPY.

Nie udało mi się tego zrobić za pomocą GUI Bacularis. Aby odzyskać te dane musimy skorzystać z „bconsole”

# bconsole

* list jobs jobtype=C
. . . . . . .
| 3,181 | BackupCatalog | 2025-02-13 23:10:16 | C | F | 1 | 1,052,475,090 | T |
| 3,182 | BackupCatalog | 2025-02-14 23:10:15 | C | F | 1 | 1,062,885,117 | T |

* restore jobid=3182 where="/tmp/restore"
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
You have selected the following JobId: 3182

Building directory tree for JobId(s) 3182 ...  
1 files inserted into the tree.

You are now entering file selection mode where you add (mark) and
remove (unmark) files to be restored. No files are initially added, unless
you used the "all" keyword on the command line.
Enter "done" to leave this mode.

cwd is: /
$ mark *
1 file marked.
$ done
Bootstrap records written to /opt/bacula/working/bacula-dir.restore.53.bsr

The Job will require the following (*=>InChanger):
   Volume(s)                 Storage(s)                SD Device(s)
===========================================================================
   
    Vol-0183                  Storage2                StorageChgr2                

Volumes marked with "*" are in the Autochanger.


1 file selected to be restored.

Defined Clients:
     1: bacula-fd
     2: None
Select the Client (1-6): 1
Using Catalog "MyCatalog"
Run Restore job
JobName:         RestoreFiles
Bootstrap:       /opt/bacula/working/bacula-dir.restore.53.bsr
Where:           /tmp/restore
Replace:         Always
FileSet:         Full Set
Backup Client:   bacula-fd
Restore Client:  bacula-fd
Storage:         Storage2
When:            2025-02-15 13:22:03
Catalog:         MyCatalog
Priority:        10
Plugin Options:  *None*
OK to run? (yes/mod/no): yes
Job queued. JobId=3275

ZFS -Zbiorcze usuwanie snapshotów

Chcemy usunąć snapshoty, które w nazwie mają „test” z sierpnia 2024

Listujemy, które snapshoty zostaną usunięte:
# zfs list -t snapshot -H -o name | grep "test.*2024-08" | xargs -n1 echo
Usuwamy
# zfs list -t snapshot -H -o name | grep "test.*2024-08" | xargs -n1 zfs destroy

DNS – Konfiguracja gdy domena nie używana do wysyłania poczty

You need to add a widget, row, or prebuilt layout before you’ll see anything here. 🙂

Gdy nasza domena nie jest używana do rozsyłania poczty, możemy dodać do dnsu wpisy, które będa utrudniać przyjmowanie poczty z naszej domeny przez inne serwery.

SPF – nie zgadzamy się na wysyłanie poczty z żadnego adresu IP

nasza.domena.pl    TXT      v=spf1 -all

DMARC – Informujemy odbiorcze serwery poczty, aby w przypadku nie zgodności polityk DMARC odrzucały maile

_dmarc.nasza.domena.pl    TXT      v=DMARC1;p=reject;

K3s – Wygaśnięte certyfikaty

Wygasłe certyfikaty powinny się odnowić przy ponownym uruchomieniu k3s:

# systemctl restart k3s

Jeżeli certyfikaty się nie odnowią i widzimy komunikat:

# kubectl get nodes
Unable to connect to the server: x509: certificate has expired or is not yet valid

Możemy wymusić wygenerowanie nowych.
Zabezpieczamy katalog z dotychczasowymi sekretami TLS

# tar -czvf /var/lib/rancher/k3s/server/apphost-cert.tar.gz /var/lib/rancher/k3s/server/tls

Usuwamy plik

# rm /var/lib/rancher/k3s/server/tls/dynamic-cert.json

Usuwamy zbuforowany certyfikat z sekretów kubernetes

# kubectl --insecure-skip-tls-verify=true delete secret -n kube-system k3s-serving

Uruchamiamy ponownie usługę K3s, aby odnowić certyfikaty

# systemctl restart k3s

Zabbix zgłasza problemy z usługami GoogleUpdater w Windows

Usługa GoogleUpdater często zmiania swoją nazwę a Zabbix nas o tym informuje. Zmienimy ustawienia Zabbixa aby nie monitorował tej usługi.

  • Data Collection -> Templates -> Windows by Zabbix agent -> Macros
  • Do macra {$SERVICE.NAME.NOT_MATCHES} na końcu przed ’)$’ dodajemy '|GoogleUpdater.*’
  • Wyłączamy tiggery na które wskazują bierzące alarmy GoogleUpdater. (Na liście problemów lewy przycisk myszy na nazwie problemu nastepnie wybieramy z menu Tigger. W okienku na dole odznaczamy Enabled i zatwierdzamy zmiany)

Kubernetes – Tworzenie obiektu configmap na podstawie dowolnego pliku

Możemy stworzyć configmapę na podstawie dowolnego pliku. W naszym przypadku bedzie to plik appsettings.json.

$ kubectl create configmap ares-api-config --from-file=Configuration/appsettings.json -n test

Ta metoda nie pozwoli nam zaktualizować configmapy bez jej usunięcia z klastra. Aby rozwiązać ten problem możemy najpierw utworzyć na podstawie naszego pliku appsettings.json plik yaml, następnie go zaaplikować. Gdy będziemy chcieli zmienić obiekt configmap w klastrze to powtarzamy ten proces.

$ kubectl create configmap ares-api-config --from-file=Configuration/appsettings.json -n test --dry-run=client -o yaml > configmap.yaml
$ kubectl apply -f configmap.yaml -n test