Ubuntu 20.04 : zweite Festplatte verschlüsseln

Ich habe in meinem Laptop mehrere Festplatten und möchte nun auch die zweite Festplatte über LUKS verschlüsseln. Die erste Festplatte habe ich bereits bei der Installation verschlüsselt. Die Benutzung soll aber recht einfach sein. Es gibt bestimmt mehrere Wege das zu erreichen, ich zeige hier meinen ;-)

Als erstes legt man mal mit fdisk eine neue Partition an. Hierzu möchte ich mich an dieser Stelle nicht weiter auslassen. Diese verschlüsselt man dann mit cryptsetup.
cryptsetup -y -s 512 luksFormat /dev/sda1
/dev/sda1 ist hier die neu angelegt Partition (ALLE DATEN WERDEN GELÖSCHT !)
LUKS - Step 1
Als erstes müssen wir die verschlüsselte Partition mit cryptsetup mounten
cryptsetup luksOpen /dev/sda1 lvmsda1
dann muss ein volume initialisiert werden , eine volume group erstellt werden und ein logical volume angelegt werden. Das erledigen wir so
pvcreate /dev/mapper/lvmsda1
vgcreate -s64M vgdata /dev/mapper/lvmsda1
lvcreate -n DATA -L 1.8TB vgdata
LUKS - Step 2
Jetzt bekommt unser lv noch ein Dateisystem
mkfs.ext4 /dev/vgdata/DATA
LUKS - Step 3
Jetzt tragen wir die neue HDD in der crypttab ein und in der fstab
vi /etc/crypttab
vi /etc/fstab
die jeweiligen Werte könnte ihr aus dem Screenshot entnehmenLUKS - Step 4

Linux : ~/ sichern mit Borgbackup

Ich habe hier einiges an sensible Daten in meinem Homeverzeichnis die ich nicht verlieren möchte. Deswegen habe ich mir ein borgbackup eingerichtet das mir alle 30 Minuten ein Backup auf meine zweite HDD schiebt. Da beide HDD bei mir mit LUKS verschlüsselt sind ist das Repo nicht gesondert gesichert.

Sollte man hier auf ein NFS oder ein anderes unverschlüsseltes Ziel sichern rate ich zu einer encryption !

Installieren von borgbackup
sudo apt install borgbackup
dann richten wir auf der zweiten HDD ein Repo ein. Das hab ich dann so gemacht
mkdir -p /media/chris/hdd2/backup
cd /media/chris/hdd2/backup
natürlich muss der mountpoint eurer Umgebung angepasst werden. Jetzt initialisieren wir das REPO für das Backup
borg init -e none /media/chris/hdd2/backup
Nochmal der Hinweis -e none kommt bei mir nur zum Einsatz da ALLE HDDs in meinem Notebook mit LUKS verschlüsselt sind
Ab jetzt kann man Backups in das Verzeichnis machen. Ich hab mir hier das ein Script zusammengebaut
!/bin/bash
_bbin=$(which borg)
_tbin=$(which tee)
# -----------------------------------------------------------------
# VARs
# -----------------------------------------------------------------
_own_path=$(dirname $(readlink -f ${0}))
_mnt_path="" # mount point 2 hdd
_src_path="" # was soll gesichert werden ? z.B. /home/test sichert das komplette Homeverzeichniss
_exclude="" # welche Verzeichnisse sollten nicht gesichert werden ? z.B. /home/test/Downloads
_tar_path="" # Wohin wird gesichert
_repo_name="HOME-$(date '+%Y%m%d-%H%M%S')" # Name der Sicherung
_borg_para="-v --stats -C lz4" # Parameter für das Borgbackup
_borg_log="${_own_path}/logs/borg.log" # wo liegt das log
# -----------------------------------------------------------------
# parameter for borg prune
# https://borgbackup.readthedocs.io/en/stable/usage/prune.html
KH=2    # keep hourly
KD=2    # keep daily
KW=4    # keep weekly
KM=3    # keep monthly
# create prune parameter
_borg_prune=""
if [ ${KH} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-hourly=${KH}"
fi

if [ ${KD} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-daily=${KD}"
fi

if [ ${KW} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-weekly=${KW}"
fi

if [ ${KM} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-monthly=${KM}"
fi
# -----------------------------------------------------------------
# check folders
if [ ! -d "${_own_path}/logs" ]; then
    mkdir -p "${_own_path}/logs"
fi
# -----------------------------------------------------------------
# write all to logfile
exec > >(${_tbin} -i ${_borg_log})
exec 2>&1
# -----------------------------------------------------------------
_chk_mnt=$(mount | grep -iq "${_mnt_path}")
if [ $? -eq 0 ]; then
    echo -e "\n#----------------------------------------------------------------------------------------------#"
    echo "############### borg create ####################################################################"
    echo -e "#----------------------------------------------------------------------------------------------#\n"
    ${_bbin} create ${_borg_para} ${_tar_path}::${_repo_name} ${_src_path}
    if [ $? -eq 0 ]; then
        echo -e "\n#----------------------------------------------------------------------------------------------#"
        echo "############### borg prune #####################################################################"
        echo -e "#----------------------------------------------------------------------------------------------#\n"
        ${_bbin} prune --list ${_tar_path} ${_borg_prune}
        echo -e "\n#----------------------------------------------------------------------------------------------#"
        echo "############### borg list ######################################################################"
        echo -e "#----------------------------------------------------------------------------------------------#\n"
        ${_bbin} list ${_tar_path}
        echo -e "\n#----------------------------------------------------------------------------------------------#"
        echo "############### borg info ######################################################################"
        echo -e "#----------------------------------------------------------------------------------------------#\n"
        ${_bbin} info ${_tar_path}
    fi
    exit 0
else
    echo "$(date '%Y%m%d %H:%M') - ${_mnt_path} is not mounted exited" >> ${_borg_log}
    exit 1
fi
diese Script legt man sich jetzt irgendwo auf die Platte und ruft es in crontab auf z.B. alle 30 Minuten
*/30 * * * * /scripts/create_borg_backup.sh

terraform & timestamp

ich möchte in unseren automatisch Deployments immer das Datum des Vorgang in der virtuellen Kiste haben. Ich hab das erreicht indem ich Funktionen timestamp und formatdate von terraform verwende.

In den Variablen für cloud-init verwende ich :
vars = {
                hostname = "${var.vsphere_name}${var.vsphere_dom}"
                deploy_date = formatdate ("DD'.'MM'.'YYYY hh:mm ZZZ",timestamp())
        }
weiterführender Link : terraform & cloud-init & vmware
Quelle :
https://www.terraform.io/docs/configuration/functions/timestamp.html
https://www.terraform.io/docs/configuration/functions/formatdate.html

terraform & cloud-init : change root password

um bei einem automatischen deployment mit terraform & cloud-init das root passwort zu ändern einfach im cloud-init bereich chpasswd einfügen.

chpasswd:
  list: |
     root:$6$hNnmxD4HhIeX4IlB$pLkby1WsEbTIRnA9hg8UtSAhoG0Gd4eFF5HUxam8x5O4Ch4KgA62lW/4Ora12fkczq3OCXzMHdj7jnpzUTJDb/

zuvor den password hash mit python erstellen.
python3 -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'
Password:
$6$hNnmxD4HhIeX4IlB$pLkby1WsEbTIRnA9hg8UtSAhoG0Gd4eFF5HUxam8x5O4Ch4KgA62lW/4Ora12fkczq3OCXzMHdj7jnpzUTJDb/
weiterführender Link : terraform & cloud-init & vmware
Quelle : Red Hat - setting up cloud-init

Proxmox / Qemu konvertieren einer HDD

Unser Azubi hat hier zum spielen ein Proxmox aufgebaut. Den Server den er hier installiert hatte muss ich jetzt in unsere VM-Ware Umgebung übernehmen. Da ich jetzt den Weg Proxmox -> VMware benötige konvertiere ich das alles mit qemu-img in das vmdk Format.

1.) Schauen wir uns die Konfiguration der VM an.
cat /etc/pve/nodes/xxx/qemu-server/100.conf 

bootdisk: scsi0
cores: 2
ide2: local:iso/14393.0.161119-1705.RS1_REFRESH_SERVER_EVAL_X64FRE_DE-
DE.ISO,media=cdrom
memory: 12288
name: servername.home.box
net0: e1000=1A:AF:17:D8:B0:44,bridge=vmbr0,firewall=1
numa: 0
ostype: l26
sata0: local-lvm:vm-100-disk-0,size=80G
sata1: zfs-storage:vm-100-disk-0,size=800G
scsihw: virtio-scsi-pci
smbios1: uuid=5c3fa82f-83a6-4206-92e7-34ac8fa38100
sockets: 1
vmgenid: c399e3ee-37c9-4b48-bb3b-585905633f84
BEVOR man an den HDDs rumspielt ein Backup erstellen !

2.) jetzt schauen wir uns mal an was so an Platten rumliegt und suchen uns die richtige raus
pvesm list local-lvm

local-lvm:vm-100-disk-0   raw 85899345920 100
local-lvm:vm-101-disk-0   raw 17179869184 101
local-lvm:vm-102-disk-0   raw 12884901888 102
local-lvm:vm-103-disk-0   raw 34359738368 103
local-lvm:vm-104-disk-0   raw 34359738368 104
wir brauchen hier die vm-100-disk-0 dafür lesen wir jetzt mal den Speicherort aus.
pvesm path local-lvm:vm-100-disk-0

/dev/pve/vm-100-disk-0
mit folgenden Befehl konvertiere ich die erste hdd in vmdk
qemu-img convert -f raw -O vmdk /dev/pve/vm-100-disk-0 ~/root_c.vmdk

3.) jetzt machen wir das selbe für die 2. hdd die liegt allerdings im zfs-storage ab
pvesm list zfs-storage

zfs-storage:vm-100-disk-0   raw 858993459200 100

4.) Naja ich hab keinen Bock 800G zu konvertieren deswegen shrink ich das Teil einfach mal ein wenig.

Wenn ihr die HDD zu weit verkleinert sind alle Daten verschwunden ! ZUERST PRÜFEN WIEVIEL GB an DATEN auf der HDD liegt !!


4.1.) Erstmal müsste ihr im installierten System sicherstellen wieviele GB ihr braucht
4.2.) Dann im System die Partition verkleinern (bei mir waren das 40G)
4.3.) Nun kann man die HDD auf die gewünscht Größe shrinken ich hab mich für 50G entschieden.
zfs set volsize=50G zfs-storage/vm-100-disk-0
nachdem das durchgelaufen ist muss der Eintrag in der Konfigurationsdatei noch angepasst werden.
aus sata1: zfs-storage:vm-100-disk-0,size=800G wird sata1: zfs-storage:vm-100-disk-0,size=50G

5.) wir lesen wieder den Speicherort aus
pvesm path zfs-storage:vm-100-disk-0

/dev/zvol/servername/vm-100-disk-0

6.) und konvertieren wieder
qemu-img convert -f raw -O vmdk /dev/zvol/servername/vm-100-disk-0 ~/hdd_d.vmdk

7.) naja ich konvertiere das nochmal über die vmkfstools
vmkfstools -i root_c.vmdk system.vmdk -d thin -a buslogic
Destination disk format: VMFS thin-provisioned
Cloning disk 'root_c.vmdk'...
Clone: 52% done.

vmkfstools -i hdd_d.vmdk data.vmdk -d thin -a buslogic
Destination disk format: VMFS thin-provisioned
Cloning disk 'hdd_d.vmdk'...
Clone: 36% done.

Quellen :
https://forum.proxmox.com/threads/shrink-zfs-disk.45835/
https://kb.vmware.com/s/article/1028042

SSH : Keine Verbindung auf altes NAS möglich

Ich habe neulich einem Kumpel geholfen der auf sein altes NAS über SSH zugreifen wollte. Leider ist die Firmware von diesem NAS etwas älter und er bekam immer nur diese Fehler Meldung
Unable to negotiate with X.X.X.X port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
nachdem ich den Host auf diffie konfiguriert hatte erhielt ich diese Fehler Meldung
Unable to negotiate with X.X.X.X port 22: no matching cipher found. Their offer: aes128-cbc,3des-cbc,aes256-cbc,twofish256-cbc,twofish-cbc,twofish128-cbc,blowfish-cbc
man das nervt dann auch die Cipher konfiguriert und schon konnten wir über ssh zugreifen.

Hier der Auszug aus der Datei ~/.ssh/config
Host X.X.X.X
    KexAlgorithms +diffie-hellman-group1-sha1
    Ciphers +aes128-cbc
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)