Kategorien
Betriebssystem Code Werkzeuge

PHP, Docker, SELinux

When you try to use the PHP Docker Script from my previous post on a Linux distribution that uses SELinux (like Fedora), you might experience some problems.

Basically the Container will not have access to any of the required volumes like:

  • your project files
  • /etc/passwd
  • /etc/group
  • ~/.cache/composer
  • ~/.config/composer
  • ~/.ssh
  • the SSH agent socket

Is SELinux to blame?

To find out if your permission problems are really caused by SELinux you can temporarily disable access blocking:

sudo setenforce 0

When the files are accessible now, you know it’s SELinux. Make sure you turn on enforcing after you’re done testing:

sudo setenforce 1

The Z-flag

You could try to add the Z flag to the volume mapping but this is not recommended!

With the Z-flag set Docker will change the SELinux context of the files inside that volume (similar to a chcon call).

This might be OK for your project files but is highly discouraged for system files like /etc/passwd.

Detecting the problems

SELinux has a very extensive log at /var/log/audit/audit.log. It will log most of the time to this file when access was denied or granted.

In the case of my Docker container some of the problems did not show up in the audit log. To make sure all problems are logged you can use this command:

sudo semodule --disable_dontaudit --build

-D –disable_dontaudit
Temporarily remove dontaudits from policy. Reverts whenever policy is rebuilt

semodule man page

Analyse the log

The log entries you are interested in look like this:

type=AVC msg=audit(1573154170.047:519): avc: denied { read } for pid=37461 comm=„bash“ name=„passwd“ dev=„dm-1“ ino=1879487 scontext=system_u:system_r:container_t:s0:c61,c1013 tcontext=system_u:object_r:passwd_file_t:s0 tclass=file permissive=0

Excerpt from the audit.log

Important here are these parts:

  • the request was denied
  • scontext contains container_t
  • a request was made to a file Composer needs to access

audit2allow to the rescue!

Now we can start fixing the problems using audit2allow.

This tool analyses all failed entries of the SELinux audit log and generates a configuration that allows them.

First you copy all related audit log lines into a new file (let’s call it allow.log).

After that you pass the contents of the file to audit2allow and let it build a module:

cat allow.log | audit2allow -M containermods

Finally you need to load active the build module.

sudo semodule -i containermods.pp

This change is permanent and will survive reboots.

And repeat and repeat and…

You will most likely have to repeat the steps described above multiple times until everything is working smoothly. This means:

  • watch the audit log
  • try running the Composer command
  • append the related denied lines to allow.log
  • call audit2allow and load the module
  • repeat
Kategorien
Betriebssystem

Linux und Steuersoftware – keine Liebe

Für alle Linux-User, die noch vor der Steuererklärung stehen und wie jedes Jahr wieder hoffen, dass jemand die Software auch für Linux veröffentlicht: Kauf eine beliebige Steuersoftware für Windows, Installier Virtualbox und klick auf modern.ie die Windows-10 VM, die kann man auch auf Deutsch umstellen.

Die VMs laufen ohne Snapshotting 90 Tage, so lange solltet ihr mit einer Erklärung nicht brauchen, oder?

Kategorien
Betriebssystem Code Webentwicklung

Generische URLs für lokale Entwicklungsumgebungen

Als Webentwickler kennt man das vielleicht: Für das x-te Kundenprojekt legt man eine neuen Ordner in seinem WWW-Root an und fängt an, entweder „localhost/kundenprojekt.de“ zu nutzen oder lustige Spielereien mit VirtualHost-Konfigurationen und der Hosts-Datei zu veranstalten („127.0.0.1 kundenprojekt.de“).

Das muss nicht mehr sein! Zumindest unter Linux, BSD und vermutlich Mac OSX.

Der Apache-Part funktioniert ohne Probleme auch unter Windows, das Problem ist hier das generische Domain-Auflösen. Wenn jemand dafür eine Lösung hat, her damit!

Was brauchen wir?

  • Linux, BSD, Mac OSX, Windows
  • Als Entwicklungswebserver benutzen wir den Apachen
  • Unter Linux/Unix/BSD/OSX wird Dnsmasq installiert
    Unter Ubuntu oder Debian mit „apt-get install dnsmasq“ bzw. „aptitude install dnsmasq
  • Unter Windows gibt es das Tool „Acrylic DNS Proxy
  • Dnsmasq / Acrylic ist als primärer DNS-Server eingetragen.

Was macht dieses Dnsmasq eigentlich?

Dnsmasq is a lightweight, easy to configure DNS forwarder and DHCP server.

So weit, so gut. Dnsmasq kann einiges mehr und besonders interessieren wir uns für die Funktion, die in der Manpage mit „–address“ beschrieben ist. Sehr unscheinbar, aber das ElDorado für uns. Die Option besagt, dass jede Domain, die in das Muster passt, mit der definierten IP aufgelöst wird.

Dafür legen wir unter Debian/Ubuntu die Datei /etc/dnsmasq.d/localdev.conf an. In diese kommt folgender Inhalt:
address=/localdev/127.0.0.1

Unter Windows bearbeitet man die Datei „AcrylicHosts“ und fügt dort die Zeile „127.0.0.1 *.localdev“ ein.

Man könnte auch eine beliebige andere TLD nehmen („erfinden“), z.b. „.dev“ oder „.locales-netz-von-chris“.

Damit werden alle Domains, die auf „localdev“ enden, auf die lokale IP aufgelöst.

Okay, jetzt kann ich alles mit einer bestimmten Domain auf meinen Server umleiten. Und nun?

Dnsmasq löst nun Domains wie „kunde.localdev“ und „kunde2.localdev“, alle auf den lokalen Webserver um.

Normalerweise hätte man dann ja immer noch das Problem, dass man mit den VirtualHost-Konfigs basteln müsste. Hierfür hat Uberspace eine super Lösung präsentiert:

Die Apache-Config wird in der VirtualHost-Direktive erweitert. XAMPP/LAMPP/MAMPP-User müssen diese erst erzeugen.

RewriteEngine On

# If there is a host-specific pseudo-DocumentRoot, use it instead of the default one
RewriteCond %{REQUEST_URI} !^/f?cgi-bin/
RewriteCond /var/www/%{HTTP_HOST} -d
RewriteRule (.*) /var/www/%{HTTP_HOST}/$1

Dieser nette Trick erlaubt folgendes: Wenn ein Verzeichnis existiert, welches den gleichen Namen hat, wie die URL, die aufgerufen wird, wird es als „DocumentRoot“ verwendet. Bei der Verwendung von .htaccess-Rewrites innerhalb des Verzeichnisses muss allerdings ein „RewriteBase /“ stehen.

Was bedeutet das für die Praxis?

Ich muss in Zukunft nur noch ein Verzeichnis „kunde123.localdev“ anlegen und schon kann ich darin loslegen. Ich habe eine Top-Level-Domain und muss am Ende beim Umzug auf die Live-Seite nicht mehr soviel ändern. Im Falle von WordPress muss ich nur beispielsweise noch in der Datenbank das „.localdev“ durch „.de“ ersetzen und schon kann das Projekt live gehen.

Außerdem ist mein /var/www/ -Verzeichnis dann auch zwangsläufig gut organisiert.

Im Übrigen: eine spezifische Auflösung in der resolv.conf oder der Hosts-Datei hat Vorrang vor der Dnsmasq-Auflösung.

[green_box] Update

Ein Tool für Windows wurde nachgetragen

[/green_box]

[grey_box]
Dieser Eintrag entstand durch eine Verkettung von Inspirationen: Ich habe Alex zum testen von Uberspace inspiriert, deren VirtualHost-Konfiguration hat Alex zum testen von Dnsmasq (Wikipedia) auf seinem Notebook inspiriert und seine Demonstation davon hat mich zu diesem Eintrag inspiriert. Soviel zum Thema „geistiges Eigentum“.
[/grey_box]

Kategorien
Betriebssystem

Spaß auf der Konsole

Eben habe ich aus versehen bei Uberspace in der Konsole ein „sudo apt-get upgrade“ eingehackt. Folgende Meldung ist mir dabei angezeigt worden:

[%USER%@lupus ~]$ sudo apt get upgrade

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for %USER%:

Hihi.

Kategorien
Betriebssystem

Platte meldet sich voll, obwohl noch genug Platz ist?

Solltet ihr unter Linux mal das Problem haben, dass euch euer Sytem sagt, ihr hättet keinen freien Speicherplatz mehr, obwohl die Platte noch lange nicht voll ist, dann versucht es mal mit folgendem Befehl:

df -i

Damit werden euch die noch verfügbaren Inodes eures Dateisystems angezeigt. Sollte das ganze dann ungefähr so aussehen, habt ihr das Problem erkannt. Ihr habt zu viele Dateien:

Dateisystem   Inodes   IBenutzt   IFrei   IUse%   Eingehängt auf
/dev/sda1       510048  509886     162    100%     /

Kurze Erklärung: für jede Datei, die auf euer Platte liegt, wird eine Inode benötigt, in der Sachen wie Zugriffsrechte, Eigentümer und Dateigröße gespeichert werden. Wenn alle belegt sind, kann das System keine weiteren Dateien anlegen und meckert dann zum Beispiel mit folgender Meldung rum: „Auf dem Gerät ist kein Speicherplatz mehr verfügbar“.

Eine beliebte Quelle für jede Menge Dateien sind die_linux-headers_ Pakete. Schaut einfach mal in das Verzeichnis /usr/src. Sollten dort jede Menge Verzeichnisse liegen, die linux-headers-X.Y.Z heißen, dann ist das eine gute Stelle um mit dem Aufräumen anzufangen.

Es gibt meinen Befehl, mit dem ihr alle alten Kernel und alle Kernel-Header Pakete aus eurem System entfernen könnt. WICHTIG! Bevor ihr diesen Befehl ausführt, solltet ihr sicher sein, dass euer System bereits mit dem aktuellsten Kernel gebootet wurde. Im Zweifelsfall einfach nochmal neu starten! Den Befehl findet ihr unter http://goo.gl/yyCyW.

Falls Ihr eine Übersicht über die Anzahl der Dateien in euren Verzeichnissen benötigt, versucht es mal mit folgendem Shell Script:

cd /
for i in *; do
  echo -n "$i: "
  find $i -print | wc -l
done