Apache mit unterschiedlichen Benutzerrechten

Bei Debian Derivaten läuft der Apache in der Regel mit www-data Benutzerrechten. Will man aber, dass der Apache unter verschiedenen Benutzern läuft wird es schon schwieriger. Da gibt es Lösungen wie zum Beispiel  mod_fcgid, PHP-FPM oder mpm-itk. Besonders das itk Modul fand ich im Vergleich zu PHP-FPM, sehr einfach zu konfigurieren. Getestet mit Debian 8 und Ubuntu 14.04.
Ein kleiness Beispiel:

apt-get install libapache2-mpm-itk

und in der jeweiligen Vhost Konfiguration trägt man folgendes ein:

<IfModule mpm_itk_module>
AssignUserId henry www-data
</IfModule>

Wobei henry der Benutzer und www-data die Gruppe ist.

Will man testen ob alles funktioniert, kann man einfach folgendes Skript ausprobieren:

<?php
$processUser = posix_getpwuid(posix_geteuid());
print $processUser['name'];
?>

Da sollte dann bei meinem Beispiel „henry“ angezeigt werden. Ansonsten einfach mal eine Datei via Webinterface hochladen und schauen wem Sie gehört.

Wichtig dabei ist, dass die jeweiligen Benutzer und Gruppen existieren müssen. Existiert z .B. kein henry oder keine Gruppe www-data, startet auch der Apache nicht. Bedeutet auch, falls man mit einer LDAP Benutzerverwaltung arbeitet und der LDAP läuft nicht stabil, sollte man die Benutzer aus dem LDAP auf den jeweiligen Webserver syncen. Auf der MPM ITK Seite findet man noch diverse andere Parameter wie z.B. MaxClientsVHost, AssignUserIDExpr, LimitUIDRange usw.

Die Anpassungen am System sind minimal, daher kann man das ITK Modul ohne großen Aufwand testen. Hat man sehr viele Vhost und arbeitet nicht mit Puppet&Co kann man auch  mit Apache Macros arbeiten, dann würde der Eintrag in etwa so aussehen:

in der vhost.conf:

Use itkmodul henry www-data

in der jeweiligen macro.conf

<Macro itkmodul $username $group>
<IfModule mpm_itk_module>
AssignUserID $username $group
</IfModule>
</Macro> 

Inwieweit das ITK Modul zusätzliche Sicherheitsprobleme mit sich bringen kann, hängt vom jeweiligen System ab und wie es konfiguriert ist. Da kann man sicherlich schnell etwas konstruieren.

Update: Anscheinend funktioniert das Modul nur für userids < 65535. (link). Eventuell besteht das Problem bei Ubuntu 16.04 nicht mehr (Test folgt).

Kurztipp: Tab Completion funktioniert nicht bei vnc+xfce

Ich nutze aus diversen Gründen ab und an XFCE in einer VNC Session unter Debian 8. Dabei fehlte mir aber die Tab Completion, was extrem nervig sein kann. Die Lösung für mein Problem war:

in der

~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml

folgendes editieren

<property name="&lt;Super&gt;Tab" type="string" value="switch_window_key"/>

wird zu

<property name="&lt;Super&gt;Tab" type="empty"/>

danach die VNC Session killen und neu starten.

Kein häufiges Problem nehme ich mal an ;-).

Kurztipp: Nextcloud for Filelink

Ein tolles Plugin für Thunderbird um größere Dateien nicht via email verschicken zu müssen, sondern direkt über Nextcloud bereitzustellen zu können. Funktioniert auf den ersten Blick relativ problemlos. Man kann leider nicht pro mail ein neues Passwort definieren, ansonsten aber eine feine Sache.

https://addons.mozilla.org/de/thunderbird/addon/nextcloud-filelink/

Gibt es auch für Outlook. Kann ich aber  mangels Outlook nicht testen.

 

Kurztipp: syncen mit lsyncd

Lsyncd hatte ich mir schon mal vor Jahren angeschaut. Damals wurde aber ssh als Transport noch nicht unterstützt.  Nun habe ich mir das nochmal kurz (wirklich kurz) unter Debian 8 angeschaut (Version 2.1.5). Lsyncd überwacht Verzeichnisse via inotify und überträgt alle geänderten Dateien automatisch auf die angegebenen Zielhosts.  Lsyncd bietet eine große Anzahl an Optionen, daher schadet ein Blick auf die Homepage nicht. Zum schnellen testen kann man einfach folgendes ausprobieren:

apt install lsyncd

Auf der Konsole:

lsyncd -rsyncssh /home/thomas/hallo zielhost /home/thomas/test

Dabei wird der Inhalt des Ordners hallo in den Zielordner test Übertragen. Default werden Änderungen alle 15 Sekunden übertragen. Der Zielordner wird dabei automatisch angelegt.

Konfigurationsdateien lassen sich auch „problemlos“ nutzen, z.B.:

$ cat /etc/lsyncd/lsyncd.conf.lua                                                                       
settings  {
        logfile = "/var/log/lsyncd/lsyncd.log",
                statusFile = "/var/log/lsyncd/lsyncd.status"
                }

sync {
        default.rsyncssh,
        source = "/home/thomas/hallo",
        host = "thomas@zielhost",
        targetdir = "/home/thomas/test",
      }

und mit

service lsyncd start

den daemon starten. Danach eventuell noch ein

update-rc.d lsyncd defaults

für den Autostart des daemons.

Dabei muss auf dem Zielhost ssh login ohne Passwort erlaubt sein. Man kann aber auch rsyncd zur Übertragung nutzen. Zu beachten ist das lsyncd default „delete“ als Option hat. Das merkst Du daran, dass plötzlich vielleicht Dein gesamtes home directory gelöscht wurde…nicht das es mir passiert wäre. Die Syntax im Bezug auf „/“ bei Verzeichnissen ist anders als bei rsync.

Lsyncd ist eventuell  interessant wenn man einfach nur ein paar Konfigurationen, ohne Puppet & Co zu nutzen, syncen will oder  man eine überschaubare Menge an Dateien auf verschiedenen hosts verteilen will. Ab einer gewissen Anzahl von Dateien stößt man an auf diverse Probleme (inotify&co). Am besten man testet lsyncd auf Testmaschinen bevor man es produktiv einsetzt.

Kurztipp: tmux Session beim login starten bzw. attachen

Um beim Login via ssh sofort in einer tmux Session zu landen habe ich folgendes in meine .bashrc auf dem Zielhost eingefügt:

case $- in
    *i*)
    if command -v tmux>/dev/null; then
        if [[ ! $TERM =~ screen ]] && [[ -z $TMUX ]]; then
          if tmux ls 2> /dev/null | grep -q -v attached; then
            exec tmux attach -t $(tmux ls 2> /dev/null | grep -v attached | head -1 | cut -d : -f 1)
          else
            exec tmux
          fi
        fi
    fi
    ;;
esac

Sehr praktisch falls die Verbindung nicht stabil oder die bash_history deaktiviert ist.

Man kann auch

ssh 123.123.123.123 -t tmux a

nutzen, falls eine tmux Session vorhanden ist bzw. „tmux“ falls keine.
Die .bashrc Lösung ist aber natürlich etwas eleganter.

Link:  https://stackoverflow.com/a/42351698

 

Notiz: Calibre 3.0 ist veröffentlicht

Jeder der sich irgendwie für ebooks interessiert kommt eigentlich nicht an Calibre vorbei. Die Software ist mittlerweile in der der 3.0er Version erschienen. Der „Content server“ ist deutlich performanter und bietet nun endlich auch eine Funktion zum online lesen an.
Bisher, dank Cops und Bicbucstriim, zwar von mir kaum genutzt, aber dennoch eine sehr praktische Funktion. Dabei hat Cops, dank des integrierten Readers, aber die Nase vorn.

Kurztipp: PHP Shells mit maldet finden

Maldet ist ein Malware Scanner. Ideal für jegliche Art von Webhosting.

Maldet legt automatisch einen cronjob an und verschickt je nach Wunsch täglich mails.

Mails sehen dann in etwa so aus:

HOST:      web01
SCAN ID:   170610-0654.14910
STARTED:   Jun 10 2017 06:54:15 +0200
COMPLETED: Jun 10 2017 07:07:34 +0200
ELAPSED:   799s [find: 450s]

PATH:          
RANGE:         1 days
TOTAL FILES:   24202
TOTAL HITS:    2
TOTAL CLEANED: 0

WARNING: Automatic quarantine is currently disabled, detected threats are still accessible to users!
To enable, set quarantine_hits=1 and/or to quarantine hits from this scan run:
/usr/local/sbin/maldet -q 170610-0654.14910

FILE HIT LIST:
{HEX}php.cmdshell.unclassed.365 : /pfad/zum/docroot/phpshells/844-4873-1-SM.phtml
{HEX}gzbase64.inject.unclassed.15 : /pfad/zum/docroot2/c.php

Maldet bietet etliche Einstellungsmöglichkeiten.  Man kann es auch in Echtzeit im monitoring mode laufen lassen. Je nach Umfang der docroots stößt man dabei aber an diverse Limits (ulimit &co).

Auf Github findet man Maldet unter https://github.com/rfxn/linux-malware-detect. Debian Pakete gibt es unter https://github.com/waja/maldetect.

Fotogalerie selbst hosten

Da gibt es einige Angebote an Open Source Softwarelösungen. Früher hatte ich  gallery im Einsatz, dass wurde dann irgendwann mal gehackt und wird auch seit einigen Jahren nicht mehr weiter entwickelt. Generell scheinen Webgalerien ein beliebtes Ziel für Einbrüche zu sein. Als Ablösung kam dann ganz einfach google Fotos bei mir/uns.  Das funktioniert, ist extrem praktisch wenn man eh 99,9% der Fotos mit dem Handy macht. Da aber Fotos von Handys immer noch schrottig gegenüber Fotos einer richtigen Kamera aussehen, haben wir uns eine Systemkamera zugelegt. Erst etwas skeptisch ob das Geld auch gut angelegt ist,  war ich bereits nach dem ersten Spaziergang mit Kamera & Co vom Nutzen der Kamera überzeugt.  Mit einer Kamera hat man halt Fotos und mit einem Handy Schnappschüsse. Nun stellte sich die Frage wohin mit den Fotos? Irgendwo auf Platte, Dropbox, Nextcloud, Google Photos?

Google Photos ist ungünstig, weil bei Bildern über 16 MP die Qualität auf 16 MP reduziert wird, jedenfalls wenn man unbegrenzt Bilder ablegen will und die Daten nicht auf den Quota angerechnet werden sollen. Da ich eh schon immer ein Freund von Wasduselbsthostenkannsthosteselbst bin, habe ich mir piwigo angeschaut. Vorher noch kurz nextcloud als Galerie ausprobiert, das ist aber leider komplett unbrauchbar dafür. Erst hatte ich die Daten noch via nextcloud client gesynct und einfach einen symlink in den galleries Ordner von piwigo gelegt. Fand ich aber nervig und ist überflüssig. Einfach die Fotodaten via rsync in den galleries Ordner und via Webinterface syncen lassen und fertig. Natürlich liegen die Fotos nochmal auf dem NAS.

Die Lösung gefällt mir ausgesprochen gut und funktioniert wunderbar. Sollte jemand eine gute andere  Webgalerie Software kennen, immer her damit.  Optimal wäre es natürlich wenn die Kamera (die natürlich heute alle WLAN haben) direkt syncen könnte, ohne den Weg über den PC  zu gehen.

Kurztipp: eine Datei leeren

Wir haben eine Datei, die wir einfach nur leeren wollen. Die Dateirechte sollen so bleiben und wir wollen nicht mit rm&touch&chown&chmod arbeiten.

$ l machmichleer.txt
-rw-rw-r-- 1 thomas thomas 27K Apr 21 10:06 machmichleer.txt

$ > machmichleer.txt

$ l machmichleer.txt
-rw-rw-r-- 1 thomas thomas 0 Apr 21 10:07 machmichleer.txt

mod_macro mit Apache 2.4

mod_macro ist dufte, besonders wenn man nicht nur Apache Vhosts für 10-20 Leute verwaltet.  Da gibt es etliche sinnvolle Einsätze für.

Das Modul mod_macro ist default bei apache 2.4 dabei.

$a2enmod macro

Nun kann man sich eine einfache macro.conf anlegen:

<Macro VHost $name $domain>
<VirtualHost *:80>
    ServerName $domain
    ServerAlias www.$domain
    DocumentRoot "/var/www/vhosts/$name"
    ErrorLog "/var/log/httpd/$name.error_log"
    CustomLog "/var/log/httpd/$name.access_log" combined
</VirtualHost>
</Macro>

Wir haben damit ein Macro namens VHost angelegt. Dieses Macro kann mit folgenden Werten gefüttert werden:

$name $domain

Wollen wir das Nacro nun in unserer vhost.conf nutzen, schreiben wir dort einfach nur:

Use VHost example example.com
...
Use VHost montag baldistfruehling.org

Wir übergeben also den Wert example und example.com an das Macro mit dem Namen VHost. Dabei ist die Reihenfolge der Werte durch das Macro vorgegeben. Der Apache baut uns damit unsere Vhost.conf zusammen.

Fertig  sind unsere Vhosts. Einfach den Apache neu starten und das war es.  In der Dokumentation wird aus verständlichen Gründen noch vorgeschlagen die Macro Definition wieder zu entfernen wenn sie nicht mehr gebraucht wird.
Dies geschieht einfach  mit

UndefMacro VHost

Besonders bei größere Konfigurationen, vermeidet man damit Konflikte.

Will man mehrere Werte übergeben z. B.  IP Listen, kann man einfach diese einfach in Anführungszeichen setzen.

Use RestrictedAccessPolicy "192.54.172.0/24 192.54.148.0/24"

Hinweise:

Die macro.conf kann natürlich in beliebig viele Dateien auf gesplittet werden. Optimalerweise sollten die Namen der Macro Dateien Aufschluss über deren Funktion geben.  Das Include  der macro.conf muss vor dem Include der vhost.conf stehen.

Eine Dokumentation zu mod_macro findet man unter

https://httpd.apache.org/docs/2.4/mod/mod_macro.html

Die ist sehr gut, daher habe ich auch auf eigene Beispiele verzichtet.

 

Kurztipp: ProxySQL…missed 3 heartbeats

Tauchen bei ProxySQL in der Logdatei immer wieder Einträge in der Art

...MySQL_Monitor.cpp:1126:monitor_ping(): [ERROR] Server db7:3306 missed 3 heartbeats, shunning it and killing all the connections

auf, liegt es eventuell daran, dass kein mysql-monitor_username mit dem mysql-monitor_password auf den Nodes eingerichtet ist.  Als Folge davon unterbricht ProxySQL die Verbindung zu den Nodes. Einfach mal bei ProxySQL schauen was dort eingetragen ist. Default ist monitor/monitor (jedenfalls in der 1.3.3er).

mysql> SELECT * FROM global_variables WHERE variable_name IN ('mysql-monitor_username','mysql-monitor_password','mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_history');

+--------------------------------+------------------+
| variable_name                  | variable_value   |
+--------------------------------+------------------+
| mysql-monitor_connect_interval | 60000            |
| mysql-monitor_history          | 600000           |
| mysql-monitor_password         | monitor          |
| mysql-monitor_ping_interval    | 10000            |
| mysql-monitor_username         | monitor          |
+--------------------------------+------------------+
5 rows in set (0.01 sec)


Ändern kann man das Passwort einfach mit

mysql> UPDATE global_variables SET variable_value="GEHIRNSABOTAGE" WHERE variable_name="mysql-monitor_password";
Query OK, 1 row affected (0.00 sec)

mysql> LOAD MYSQL VARIABLES TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

mysql> SAVE MYSQL VARIABLES TO DISK;
Query OK, 46 rows affected (0.00 sec)

und fertig. Der Monitoraccount muss natürlich auch auf den Nodes eingetragen werden. Dann sollten auch Tests mit Sysbench & Co funktionieren.

Über

http://proxysql.blogspot.de/2015/09/proxysql-tutorial-setup-in-mysql.html

bin ich drauf gekommen.

Kurztipp: Die IP bei ausgehenden Mails entfernen

Um die Sender-IP bei ausgehen mails zu entfernen nutze ich folgendes unter Postfix:

In die /etc/postfix/master.cf

submission inet n - - - - smtpd

...

-o cleanup_service_name=subcleanup

subcleanup unix n - - - 0 cleanup
-o header_checks=regexp:/etc/postfix/submission_header_checks

Und in der /etc/postfix/submission_header_checks


/^Received: .*/ IGNORE
/^X-Originating-IP:/ IGNORE

 

Ich versende über den Submission Port 587.  DKIM, SPF & Co sind davon unbeeinflusst und tun weiter ihr Werk.