Archiv nach Kategorien: Linux

phpMyAdmin „token mismatch“

Ich schreibe den Artikel nur, weil mich das Thema knapp 2 Wochen verfolgt hat und ich im Internet einfach keine Lösung finden konnte …

Zum Hintergrund: Im Zuge einer voll-Automatisierung mit Puppet bin ich dabei alle Server mit Puppet und Debian 11 neu aufzubauen.

Warum zum Teufel, bekommt man bei einer FRISCHEN Installation von phpmyadmin 5.1.3 (neueste zum Zeitpunkt des Artikels) und einer FRISCHEN Installation von MariaDB einen „Token mismatch“? Anmeldung klappt 1A aber benutzbar ist die Installation nicht …

Ich habe „tolle“ Tipps gefunden wie:

  • Festplatte voll
  • Cookies löschen (okay lass ich durchgehen)
  • session.save_path nach /tmp legen (Stand 2009!)
  • von Cookie-Auth auf http-Auth umzustellen – das hatte ich von Anfang an gemacht

Ihr werdet lachen – dass war es alles nicht! Dass Problem sitzt – zumindest bei mir – viel tiefer in der Infrastruktur! In meinem Fall war es der Apache-Reverse Proxy! SSL wird hier terminiert, dahinter wird http gesprochen…

Es gibt 2 Lösungsmöglichkeiten:

1.) Die Elegantere:
Im vHost hart mitgeben, dass https benutzt wird
RequestHeader set X-Forwarded-Proto „https“

2.) PmaAbsoluteUri in der config.inc.php von phpMyAdmin deklarieren
$cfg[‚PmaAbsoluteUri‘] = ‚https://www.ichalsroot.de:2000/phpmyadmin‘;

Proxmox/LXC Mount lokale Ordner in Unprivileged Container

Es gibt mehrere Gründe, warum man lokale Ordner in einen LXC Container mounten muss. Zb:

  • Im Backup ausschließen
  • zwischen LXC teilen

Ich habe keine offizielle oder inoffizielle Dokumentation gefunden welche meinen Vorgehensweise dokumentiert (Stand: 09/2019), daher unter Vorbehalt behandeln!

Umsetzung

Proxmox # pct stop 100

Proxmox # mkdir /opt/mountdir
Proxmox # pct set 100 -mp0 /opt/lxc/100/mountdir,mp=/opt/mountdir
Proxmox # pct start 100

LXC # ls -la /opt/mountdir
      drwxr-xr-x  9 nobody nogroup  4096 Sep 20 20:01 /opt/mountdir

Proxmox # chown -R 100000:100000 /opt/lxc/100/mountdir/

LXC # ls -la /opt/mountdir
      drwxr-xr-x  9 root root  4096 Sep 20 20:01 /opt/mountdir

Hinweise

  • Das Ganze funktioniert auch mit anderen UID/GID. Im Grunde 100000+UID/GID. Also UID 1001 wäre dann 101001.
  • Die UID/GID müssen nicht im Host-System vorhanden sein! LXC mappt die intern korrekt.
  • Ab diesem Moment kann man die Berechtigung auch innerhalb der VM korrekt setzen!

Relevante Host Konfiguration

Die folgenden Einstellungen im Proxmox-Linux dürften relevant sein, diese sollten aber von Proxmox bei der Installation vorgenommen worden sein!

cat /etc/subuid<br>root:100000:65536<br><br>cat /etc/subgid<br>root:100000:65536

Weiterführende Literatur

Die Lösungsansätze sind anders wie bei mir!
Aber als weiterführende Literatur hilfreich.

https://wiki.archlinux.org/index.php/Linux_Containers#Enable_support_to_run_unprivileged_containers_(optional)

https://pve.proxmox.com/wiki/Unprivileged_LXC_containers

[ansible] Mit dictonaries arbeiten

Wichtig: getestet mit Ansible 2.4.2.0

Wenn man in Ansible Variablen deklarieren möchte, kann es der Übersichtlichkeit halber interessant sein, diese in Dictionaries anzulegen. Beispielsweise wenn man mit mehreren Umgebungen arbeitet  – Test/vProd/Prod – und Fachanwendungen auf Server „taggen“ möchte. Sprich eine List wo steht auf welchen Server die einzelnen Fachanwendungen installiert sind.

Deklaration

Ort der „vars“-Datei

wir deklarieren eine neue Variablen-Datei
<ansible-root>/vars/main.yml
oder mit Rollen
<ansible-root>/roles/<role-name>/vars/main.yml

Alternativ:

## include <meinVarName> 2 host vars (host tagging)
- name: include <meinVarName> vars
  include_vars: "vars/<meinVarName>.yml"

Inhalt der Datei

anwendung_a:
&nbsp;- port: 8563
   hosts:
   - host_a
   - host_b
   - host_c

anwendung_b:
&nbsp;- port: 8565
   hosts:
   - host_a
   - host_c
   - host_d

Auf diese Weise kann man ein „Host-Tagging“ bewerkstelligen.
Sprich man deklariert, auf welchen Servern eine bestimmte Anwendung installiert ist, und führt hier entsprechende Task’s aus.

Anwendung

Einen Parameter abfragen

- shell: echo "{{ item.port }}" > /tmp/test
  with_items:
  - "{{ anwendung_a }}"

Ergebnis:

cat /tmp/test
8563

Parameter und Host abfragen

Jetzt wird es ein wenig komplizierter, wir wollen einen Parameter und einen bestimmten Server abfragen.
Achtung! Eignet sich nur wenn man einen bestimmten Server sucht! Nicht für eine Gruppe von Servern.

- shell: echo "{{ item.hosts | select("match", "dbserver01") | first }} {{ item.port }}" > /tmp/test 
  with_items: 
  - "{{ anwendung_a }}"

Tipp: Variablen werden ohne Klammern deklariert

- vars:
  - mysearchstring: dbserver0

- shell: echo "{{ item.hosts | select("match", mysearchstring.*) | first }} {{ item.port }}" > /tmp/test 
  with_items: 
  - "{{ anwendung_a }}"

Alle hosts ausgeben

- shell: echo "{{ item.1 }}" >> /tmp/test
  with_subelements:
  - "{{ anwendung_a }}"
  - hosts

Ergebnis:

cat /tmp/test
host_a 
host_b
host_c

 

Loop over dictonary

Um mit allen Werten zu arbeiten bietet sich folgende Vorgehensweise an:

- shell: echo "{{ item.1 }} {{ item.0.port }}" >> /tmp/test
  with_subelements:
  - "{{ anwendung_a }}"
  - hosts

Ergebnis:

cat /tmp/test
host_a 8563 
host_b 8563
host_c 8563

 

Task auf host „taggen“

Auf diese Weise kann man deklarieren, dass ein Task auf dem aktuellem Server nur ausgeführt wird, wenn er in einer entsprechenden Liste deklariert wurde.

Oder auf Klardeutsch:
Wenn host_a NICHT in den hosts von anwendung_a aufgelistet ist, würde der Task nicht auf diesem Host ausgeführt werden.

- include_tasks: install_webserver.yml
  with_subelements:
  - "{{ anwendung_a }}"
  - hosts
  when: 'inventory_hostname in item'

Zum nachlesen:

Hier wird das gut erklärt finde ich:
https://stackoverflow.com/questions/31566568/double-loop-ansible

Apache Wartungsseite schalten

Die (perfekte) Wartungsseite zu schalten ist eine Kunst für sich. zB wenn man verhindern möchte, dass die URL umgeschrieben wird oder das der Browser die Wartungsseite cacht.

Hier ein Beispiel, wo per per Datei die Wartungsseite aktiviert/deaktiviert werden kann:

# Wartung
RewriteCond /var/www/maintenance.enable -f
RewriteCond %{REQUEST_URI} !^/(wartung)/
RewriteRule ^.*$ /wartung/index.html [R=503,L]
ErrorDocument 503 /wartung/index.html
Header Set Cache-Control „max-age=0, no-store“

Proxmox: LXC – Container Speicherplatz verkleinern

Wer schon einmal versucht hat, den Speicherplatz eines LXC-Containers unter Proxmox zu verändern, wird überrascht feststellen, dass man zwar Speicherplatz hinzufügen, jedoch nicht entfernen kann.
Beispiel: 50GB root-Partition soll auf 30GB verringert werden ..

Das klappt tatsächlich nur über ein löschen und neu anlegen des Containers!

Hier ein Einzeiler dafür:


pct stop 244 \
; vzdump 244 -storage local -compress lzo \
&& pct destroy 244 \
&& pct restore 244 $(ls -tr /var/lib/vz/dump/vzdump-*-244-*.tar.lzo | tail -n1) --rootfs local:8 \
&& pct start 244

mit „–rootfs local:8“ gibt man die neue Größe in GB an.

Entfernte CheckMK-Agents überwachen (ssh/tls)

UPDATE 09.01.2021: Fix für „curl: Argument list too long“
Details: https://git.ichalsroot.de/erdo/Check_MK/commit/4640354834f6db445a9ec150e49ec1bdeb8fc268


CheckMK-Agents sind auf Pull ausgelegt, sprich der CheckMK-Server baut eine Verbindung zum Client auf und fragt die Daten ab. Dies geschieht unter Linux traditionell per xinetd oder ssh.

Das Verfahren funktioniert aber nicht, wenn der Agent nicht im Intranet hängt und keine SSH-Verbindung hergestellt werden kann/soll. (oftmals. aus Security-Gründen).

check_mk_remote

Hierfür wurde die Community-Erweiterung „check_mk_remote“ entwickelt, welche den Agent-Output in eine Datei umleitet und diese per scp auf den CheckMK Server überträgt. Die Auswertung erfolgt dann durch einen Host-spezifischen Datasource.

https://github.com/FlorianHeigl/nagios/tree/master/check_mk/check_mk_remote

Für das Verfahren von check_mk_remote ist eine passwortlose Authentifizierung, sowie ein öffentlich zugängiger SSH-Server erforderlich. Beides kann sicher betrieben werden, jedoch ist der Konfigurationsaufwand nicht zu unterschätzen und sicherheitstechnisch bedenklich, vor allem weil es 100 Kleinigkeiten zu bedenken gibt.

check_mk_push

Als Alternative habe ich eine Methode entwickelt, um den Agent-Output per https statt ssh zu übertragen.
Das Prinzip ist identisch, nur der Übertragungsweg ein ganz anderer.

Vorteile gegenüber check_mk_remote

  1. Keine aufwendige SSH-Konfiguration.
  2. keine spezielle Firewall-Freischaltung (es wird nur Port 443 benötigt, ssh ist oftmals gesperrt)
  3. Firmeninterner Web-Proxy kann benutzt werden (inkl. Authentifizierung)

Weiterlesen »

Google Drive als Backup-Lösung

Ich suche seit einiger Zeit einen günstigen Web-Storage um externe Backups meiner zahlosen Projekte  anzulegen. Hat mich selbst überrascht, aber Google ist hier mit ABSTAND! der billigste Anbieter, bei 3$/Monat für 100GB kann man echt nicht meckern ..

Ich bin bei weitem kein Freund von der Datenkrake Google, trotzdem ist google.de meine Standart-Suchmaschine und Android mein Pflicht-OS für’s Smartphone …

Trotzdem schaufel ich meine Backups nur PGP-verschlüsselt in die Google-Cloud!

Installation unter Debian 8

Zum synchronisieren mit google-drive benutze ich „drive“ von twodopeshaggy.
https://launchpad.net/~twodopeshaggy

Weiterlesen »

[Proxmox] V4 – Befehl in jedem LXC-Container ausführen

Ich habe einen Quick-and-Dirty Weg gefunden, einen Befehl in sämtlichen (laufenden!) LXC-Container auszuführen.

Auf dem Proxmox-Host-System:

cd /etc/pve/lxc
for host in $(ls | cut -d "." -f 1); do echo -n "$host : "; pct exec $host MEINBEFEHL; done

Beispiel: (in einer Zeile, zur lesbarkeit untereinander)
for host in $(ls | cut -d "." -f 1); do\
    echo -n "$host : "; \
    pct exec $host mv /usr/lib/check_mk_agent/plugins/apt /usr/lib/check_mk_agent/plugins/14400/;\
done

In meinem Beispiel würde das check-mk Plugin apt auf in allen Containern in das (bestehende) Unterverzeichnis 14400 verschoben werden.

Tipp: Falls ihr einen Befehl mit Parametern ausführen wollt müsst ihr das mitteilen!

for host in $(ls | cut -d "." -f 1); do echo -n "$host : "; pct exec $host -- MEINBEFEHL; done

Beachtet das „–„

Neue ssh-Session immer im Screen öffnen

Jeder (Informatiker) kennt das Problem von Verbindungsabrüche, ob VNC, Telnet, SSH, …

Zumindest bei der Linux-Administration per SSH gibt es die Möglichkeit eine screen-Session zu erstellen um bei Verbindungsabruch dort weitermachen zu können wo man aufgehört hat.

Hier eine Lösung um JEDE neue (ssh-)Verbindung in einem Screen zu starten:

Achtung! Alle Einstellungen sind Server-seitig durchzuführen!

aptitude show screen

ACHTUNG! Anmeldung nicht mehr möglich falls screen nicht installiert wurde!
-bash: /usr/bin/screen: Datei oder Verzeichnis nicht gefunden
Connection to www.ichalsroot.de closed.
test -s /etc/profile.screen && . /etc/profile.screen
localtty=`tty 2> /dev/null`
if test -O "$localtty" -a -n "$PS1"; then
  if [ "$USER" != "root" -a ! -f ~/.noscreen ]; then
        if [ "$TERM" = "screen.linux" ]; then
         export TERM=screen
        fi

        if [ "$TERM" != "screen" ]; then
          exec /usr/bin/screen -x  -R
        fi
  fi
fi
########################################################################
#
# ~/.screenrc
# Konfigurationsdatei fuer screen
#
########################################################################

########################################################################
# Variabeln
#setenv FOO bar

########################################################################
# Allgemein
startup_message  off   # Keine Willkommensnachricht
vbell            off   # Kein visuelles Blinken
msgwait          1     # Nachrichten für 1 Sekunden anzeigen
defutf8          on    # utf8 bei neuen fenstern
autodetach       on    # on = default
#shelltitle   '] | bash'    # Fenstertitel
hardcopydir      $HOME      # Screenshots ins Homeverzeichnis
defscrollback     10000    # Buffer
defmonitor        off         # Aktivitäten nicht in Fenstertitel schreiben

# buffer emulator enables scrollback with PAGE-UP/DOWN (with some drawbacks, all windows share the same buffer)
termcapinfo xterm|xterms|xs|rxvt ti@:te=\E[2J

########################################################################
# Meine Fenster
screen -t bash
screen -t bash
screen -t bash
# screen -t irssi irssi
# screen -t syslog sudo tail -f /var/log/everything.log
# screen -t ncmpcpp ncmpcpp
select 1
select 0

########################################################################
# Statuszeile
#caption always "%{= wk} %-w%{= KW} [%n %t] %{-}%+w %= | @%H | %l | %Y-%m-%d %c "
caption always "%{rw} * %H * | $LOGNAME | %{= wk} %-w%{= KW} [%n %t] %{-}%+w %= | %l | %Y-%m-%d %c "

# EOF

screenshot-window-2015-09-03-144806

[Bash] Codeschnippsel

Eine Sammlung von hilfreichen Bash-Codeschnippseln

#!/bin/bash
dirname $(readlink -f ${0})

#Beispiel:
#/tmp