K.inc Tec Blog

Mein kleines EDV Logbuch

Docker

Installation unter Debian

Voraussetzungen schaffen

sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

Keyring zu APT hinzufügen

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Repository einbinden und installieren

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

User zur Docker Gruppe hinzufügen. Damit der Benutzer nicht immer sudo vor den docker Befehl schreiben muss.

sudo usermod -aG docker $USER

Docker Compose.yml

Docker ist installiert. Nun bauen wir die nötigen Container. In diesem Fall als Beispiel 2 Container, einer enthält eine WordPress Instanz, der andere eine Datenbank. Die WordPress Instanz greift über das interne Docker Netzwerk auf den Datenbankcontainer zu. Speziell an dieser Konfiguration ist, dass eine alte PHP-Version genutzt wird und somit eine veraltete WordPress-Instanz im Docker Container isoliert wird.

Wozu braucht man die docker-compose.yml?

Die docker-compose.yml ist eine wichtige Steuerungsdatei und gehört zu dem Projekt. Man kann sie sich als Baukasten für die Dockerumgebung vorstellen. Für Updates und Änderungen wird darauf zugegriffen. Daher legt man normalerweise zu jedem Projekt einen Hauptordner an. In den Ordner kommt die Datei. Docker legt alle weiteren benötigten Dateien auch in diesem Ordner ab. Man kann den Container somit einfach kopieren und in einer neuen Umgebung starten. Unter Debian legt man die Projektordner normalerweise unter /opt oder /srv ab. Ich wähle immer /srv. Generell ist der Ort im Dateisystem jedoch egal.

Die Datei:

version: '3.8'

services:
  wordpress:
    image: wordpress:php7.4-apache
    container_name: wp_container
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: secret
      WORDPRESS_DB_NAME: wpdb
    volumes:
      - ./wp-data:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:5.7
    container_name: wp_db
    restart: always
    environment:
      MYSQL_DATABASE: wpdb
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: rootsecret
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Wer sich die Datei aufmerksam ansieht, wird sich fragen, wieso das Volume db_data ganz unten nochmal explizit angegeben wird, das Volume wp-data jedoch nicht. Der Unterschied liegt in sogenannten Named Volumes vs. Bind Mounts. Siehe weiter unten.

Container initialisieren und starten. Im Stammverzeichnis des Projektordners ausführen.

docker compose up -d

Befehlsreferenz

BefehlBedeutung
docker compose psZeigt den Status aller Container in diesem Projekt an.
docker compose logs -fZeigt die Live-Ausgaben (Logs) der Anwendung an.
docker compose stopHält die Container an, löscht sie aber nicht.
docker compose downStoppt die Container und entfernt sie (Daten in „Volumes“ bleiben erhalten).

Named Volumes vs. Bind Mounts

db_data – ein Docker Named Volume

volumes:
db_data:
  • Das ist ein Docker-namensgebendes Volume, das Docker selbst verwaltet.
  • Docker legt den Speicherort automatisch irgendwo in /var/lib/docker/volumes/... an.
  • Vorteil:
    • Container-Updates oder Neustarts verändern das Volume nicht.
    • Ideal für Datenbanken, die persistent bleiben müssen.
  • Wir brauchen es hier explizit in volumes:, damit Docker weiß: „Das ist ein Named Volume, verwalte es!“

./wp-data:/var/www/html – ein Bind Mount

volumes:
- ./wp-data:/var/www/html
  • Das ist kein Named Volume, sondern ein Bind Mount:
    • Ordner ./wp-data auf dem Host wird direkt in den Container gemountet. Also beispielsweise /srv/projekt1/wp-data.
    • Alle Daten in dem Ordner werden gespiegelt. Änderungen im Container und Änderungen aus dem Hostsystem wirken sich daraus aus.
    • Docker verwaltet diesen Ordner nicht, es bleibt ein normaler Ordner auf dem Host.
  • Vorteil:
    • Einfach zu editieren, z. B. Plugins, Themes oder WordPress-Dateien auf dem Host.
    • Änderungen auf dem Host erscheinen sofort im Container.
  • Man muss diesen Mount nicht explizit unter volumes: am Ende der Datei deklarieren, weil er direkt im Service definiert ist.

MediaTek USB WLAN unter Debian

USB WLAN-Adapter haben unter Linux oft Probleme mit den Energieeinstellungen.

Zuerst prüfen, ob die Treiber geladen sind:

sudo lsmod | grep mt76
mt76x0u                20480  0
mt76x0_common          49152  1 mt76x0u
mt76x02_usb            24576  1 mt76x0u
mt76_usb               49152  2 mt76x02_usb,mt76x0u
mt76x02_lib           102400  3 mt76x02_usb,mt76x0_common,mt76x0u
mt76                  139264  5 mt76_usb,mt76x02_lib,mt76x02_usb,mt76x0_common,mt76x0u
mac80211             1454080  5 mt76,mt76x02_lib,mt76x02_usb,mt76x0_common,mt76x0u
cfg80211             1404928  5 mt76,mt76x02_lib,mac80211,mt76x02_usb,mt76x0_common
usbcore               409600  9 xhci_hcd,ehci_pci,mt76_usb,usb_storage,ehci_hcd,xhci_pci,mt76x02_usb,uas,mt76x0u

Passt so.
Bei meinem Adapter kam es zu folgendem Fehler:

sudo dmesg | grep mt76
[   10.554910] mt76x0u 3-10:1.0: ASIC revision: 76100002 MAC revision: 76502000
[   11.656688] mt76x0u 3-10:1.0: EEPROM ver:02 fae:04
[   11.675365] usbcore: registered new interface driver mt76x0u
[   11.707733] mt76x0u 3-10:1.0 wlx00c0cababac5: renamed from wlan0
[11268.427437] mt76x0u 3-10:1.0: timed out waiting for pending tx
[11273.106872] mt76x0u 3-10:1.0: ASIC revision: 76100002 MAC revision: 76502000
[11274.067163] mt76x0u 3-10:1.0: EEPROM ver:02 fae:04
[11274.092906] mt76x0u 3-10:1.0 wlx00c0cababac5: renamed from wlan0

Die Meldung „timed out waiting for pending tx“ ist auf das USB-Autosuspend zurückzuführen.

Zum Testen kann folgende Befehl ausgeführt werden, dann das USB-Gerät raus ziehen und neu einstecken.

sudo sh -c 'echo -1 > /sys/module/usbcore/parameters/autosuspend'

Das Setting bleibt bis zum Neustart aktiv.

Bei mir stand vorher eine 2 drin. Das bedeutet USB-Autosuspend ist aktiv und Geräte dürfen nach 2 Sekunden Inaktivität in den Energiesparmodus gehen.

Permanent kann man die Sache machen, indem man in der Grub-Konfig den entsprechenden Eintrag setzt (usbcore.autosuspend=-1):

GRUB_CMDLINE_LINUX_DEFAULT="quiet usbcore.autosuspend=-1"

Dann Grub updaten und rebooten:

sudo update-grub
sudo reboot

BSI-Grundschutz Kompendium

https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Grundschutz/Kompendium/IT_Grundschutz_Kompendium_Edition2023.pdf?__blob=publicationFile&v=4#download=1

Ermittlung Personalaufwand für BSI-Grundschutz und ISO/IEC 27001

Mit folgendem Excel-Berechnungstool des BSI kann der Personalaufwand für ein Informationssicherheitsmanagementsystem nach BSI-Grundschutz und ISO/IEC 27001 berechnet werden.

Achtung! Enthält Makros. Nutzung auf eigene Gefahr.

Den Originallink des BSI habe ich nicht mehr gefunden. Sollte den jemand kennen, bitte melden (wer dieses Blog liest, kennt mich in der Regel und hat meine Kontaktdaten).

Ich referenziere dann gerne auf die Seiten des BSI.

MS Exchange – Freigegebenes Postfach – Kopie einer Nachricht im Gesendet-Ordner speichern

https://learn.microsoft.com/de-de/exchange/troubleshoot/user-and-shared-mailboxes/sent-mail-is-not-saved

Führen Sie mit Exchange PowerShell für E-Mails, die mit dem freigegebenen Postfach als Absender gesendet werden, das folgende Cmdlet aus:
PowerShell

set-mailbox <mailboxname> -MessageCopyForSentAsEnabled $True

Führen Sie mit Exchange PowerShell für E-Mails, die im Namen des freigegebenen Postfachs gesendet werden, das folgende Cmdlet aus:
PowerShell

set-mailbox <mailboxname> -MessageCopyForSendOnBehalfEnabled $True

Windows 10 Debloater

https://github.com/Sycnex/Windows10Debloater

Tail -f Powershell equivalent

Get-Content -Path "C:\bla.txt" -Wait

Microsoft Office 365 Update per CMD erzwingen

Mit GUI:

"C:\Program Files\Common Files\microsoft shared\ClickToRun\OfficeC2RClient.exe" /update user

Ohen GUI:

"C:\Program Files\Common Files\microsoft shared\ClickToRun\OfficeC2RClient.exe" /update user displaylevel=false forceappshutdown=true

Outlook / Exchange Postfach – Private Mails bei Vollzugriff anzeigen

Wird ein Exchange Postfach einem anderen Benutzer per Vollzugriff freigegeben, zeigt Outlook trotzdem als privat gekennzeichnete Mails nicht an. Das macht Sinn, da oft die Postfächer der Vorgesetzten für Mitarbeiter freigegeben werden. Die Vorgesetzten erhalten somit die Möglichkeit den Mitarbeitern bestimmten Mailverkehr vorzuenthalten.

Allerdings muss gesagt werden, dass nur Outlook diese Anzeige unterbeindet. Über OWA und bei anderen Mailclients werden auch die privaten Mails angezeigt. Man sollte sich also nicht blind auf diese Funktion verlassen.

Nun gibt es Fälle, in denen auch die als privat gekennzeichneten Mails eines Postfachs angezeigt werden sollen. Z.B. bei einem zentralen Postfach für die Personalabteilung, in der Bewerbungen eingehen. Diese gehen oft als privat gekennzeichnet ein.

Hierzu muss ein sogenanntes Delegate für einen Benutzer definiert werden. Das geht am besten mit einem PowerShell Script. Besonders, wenn das Delegate für mehere Benutzer eingerichtet werden soll.

Dazu habe ich 2 Blogeinträge gefunden. In folgendem Post muss zuvor die EWS Managed API auf einem Client installiert werden.

https://gsexdev.blogspot.com/2009/04/add-delegates-to-mailbox-with.html

In diesem Blog ist das Beispiel abgeändert und kann direkt auf dem Exchange Server über die Exchange Console ausgeführt werden:

https://www.windowspro.de/tipp/exchange-private-nachrichten-freigabepostfach-sichtbar-machen

Hier das Script:

ACHTUNG: in dem Skript wird versucht die Mailadresse des angemeldeten Benutzers auszulesen und damit ein autodiscover durchzuführen. Sollte der Admin, mit dem das Skript ausgeführt wird, keine Mailadresse haben, kann man irgendeine existierende Mailadresse aus dem Unternehmen nutzen: $service.AutodiscoverUrl(„irgendwas@domain.de“).

$mbtoDelegate = "sharedMailbox@domain.de"
$delegatetoAdd = "delegateMailbox@domain.de"

# ACHTUNG!!! Je nachdem, auf welchem Laufwerk der Exchange installiert wurde,
# muss der Pfad zur DLL angepasst werden!!!

$dllpath = "D:\exchange\Bin\Microsoft.Exchange.WebServices.dll"

[void][Reflection.Assembly]::LoadFile($dllpath)

$service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
$windowsIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$sidbind = "LDAP://<SID=" + $windowsIdentity.user.Value.ToString() + ">"
$aceuser = [ADSI]$sidbind

$service.AutodiscoverUrl($aceuser.mail.ToString())
$service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $mbtoDelegate);

$mbMailbox = new-object Microsoft.Exchange.WebServices.Data.Mailbox($mbtoDelegate)
$dgUser = new-object Microsoft.Exchange.WebServices.Data.DelegateUser($delegatetoAdd)
$dgUser.ViewPrivateItems = $true
$dgUser.ReceiveCopiesOfMeetingMessages = $false
$dgUser.Permissions.CalendarFolderPermissionLevel = [Microsoft.Exchange.WebServices.Data.DelegateFolderPermissionLevel]::Editor
$dgUser.Permissions.InboxFolderPermissionLevel = [Microsoft.Exchange.WebServices.Data.DelegateFolderPermissionLevel]::Reviewer

$dgArray = new-object Microsoft.Exchange.WebServices.Data.DelegateUser[] 1
$dgArray[0] = $dgUser

$service.AddDelegates($mbMailbox, [Microsoft.Exchange.WebServices.Data.MeetingRequestsDeliveryScope]::DelegatesAndMe, $dgArray);


Windows Dienste mit Benutzerrechten starten und stoppen

Gunnar Haslinger hat dazu einen guten Beitrag, der keine Fragen offen lässt:

https://hitco.at/blog/windows-dienste-mit-benutzer-rechten-starten-und-stoppen/

Seite 1 von 24

Präsentiert von WordPress & Theme erstellt von Anders Norén