[gelöst]Mounten von $USER/.cache nach /tmp via systemd

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von JTH » 14.01.2020 13:16:59

Artim hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 11:41:45
Und JTH meinte ja dass das Paket das selbst machen würde.
Ja, das tut es (zumindest in meiner VM), war mir vorher nicht bewusst:

Code: Alles auswählen

$ grep -r pam_mount /etc/pam.d
/etc/pam.d/common-session:session	optional	pam_mount.so 
/etc/pam.d/common-password:password	optional	pam_mount.so disable_interactive
/etc/pam.d/common-auth:auth	optional	pam_mount.so
Artim hat geschrieben: ↑ zum Beitrag ↑
13.01.2020 22:40:24
Mein Eintrag sieht zwar etwas anders aus, sollte aber eigentlich seinen Zweck erfüllen, k.a. ob dein Ansatz das gleiche bewirkt, aber ich wäre zumindest nicht scharf drauf ein zweites tmpfs aufzumachen, wir haben "nur" 8 GB RAM:

Code: Alles auswählen

<volume path="/home/%(USER)/.cache" mountpoint="/tmp/" options="bind" />
Das habe ich einfach unter <!-- Volume definitions --> gesetzt.
Okay, dann passt ja der Bind-Mount. Die Stelle in der pam_mount.xml passt.

Du hast allerdings die Argumente verdreht: Mountpoint sollte ~/.cache sein, zu mountender Pfad /tmp/…. So wie du geschrieben hast, würdest du allerdings das komplette /tmp bind-mounten. Ist das wirklich gewollt? Das dürfte ziemlich leicht zu Datenleaks und -konflikten führen, wenn mehr als ein Benutzer gleichzeitig oder nacheinander angemeldet sind.

Ich denke, ein Unterordner in /tmp ist sinnvoller:

Code: Alles auswählen

<volume path="/tmp/user-%(USER).cache" mountpoint="~/.cache" options="bind" />

pam_mount legt den Ordner in /tmp allerdings nicht an. Das könnte man über ein kleines Skript lösen:

Code: Alles auswählen

$ cat /usr/local/bin/pam-mkusercache
#!/bin/sh
set -eu

user_cache_dir="/tmp/user-${PAM_USER}.cache"

case "$PAM_TYPE" in
	open_session)
		/bin/mkdir -m0700 -p "$user_cache_dir"
		/bin/chown "${PAM_USER}:${PAM_USER}" "$user_cache_dir"
		;;
	close_session)
		# Optional: Cache leeren, wenn Benutzer *komplett* abgemeldet.
		login_count="$(/usr/sbin/pmvarrun -u "$PAM_USER" -o 0)"
		if [ "$login_count" -eq 1 ]; then
			/bin/rm -fr "$user_cache_dir/"*
		fi
		;;
esac
plus die Zeile

Code: Alles auswählen

session	optional	pam_exec.so /usr/local/bin/pam-mkusercache
session	optional	pam_mount.so
über der pam_mount-Zeile in /etc/pam.d/common-session.

Das ganze gilt auch für /root/.cache – falls das ausgenommen sein soll, kann man das in pam_mount.conf.xml und im Skript ergänzen.
Manchmal bekannt als Just (another) Terminal Hacker.

TomL

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von TomL » 14.01.2020 15:30:47

JTH hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 13:16:59
Ich denke, ein Unterordner in /tmp ist sinnvoller:

Code: Alles auswählen

<volume path="/tmp/user-%(USER).cache" mountpoint="~/.cache" options="bind" />
Obwohl das eigentlich richtig ist, ist imho trotzdem noch ein Flüchtigkeitsfehler enthalten.... und zwar sind an dieser Stelle relative Pfade nicht die sichere Methode, weil man davon ausgehen kann, dass hier noch kein Kontextwechsel auf den User durchgeführt ist, sondern "root" am werkeln ist.

Code: Alles auswählen

    <volume path="/tmp/%(USER)"   mountpoint="/home/%(USER)/.cache"   options="bind" />
Ich würde ja gerne mal die ganze pam_mount.conf.xml sehen, um zu prüfen, ob die tatsächlich korrekt ist... hier funktioniert das mit dem Bind des User-.cache-Dirs nach /tmp wirklich tadellos.

Artim
Beiträge: 86
Registriert: 22.11.2019 11:33:28

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von Artim » 14.01.2020 15:48:30

TomL hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 15:30:47
JTH hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 13:16:59
Ich denke, ein Unterordner in /tmp ist sinnvoller:

Code: Alles auswählen

<volume path="/tmp/user-%(USER).cache" mountpoint="~/.cache" options="bind" />
Obwohl das eigentlich richtig ist, ist imho trotzdem noch ein Flüchtigkeitsfehler enthalten.... und zwar sind an dieser Stelle relative Pfade nicht die sichere Methode, weil man davon ausgehen kann, dass hier noch kein Kontextwechsel auf den User durchgeführt ist, sondern "root" am werkeln ist.

Code: Alles auswählen

    <volume path="/tmp/%(USER)"   mountpoint="/home/%(USER)/.cache"   options="bind" />
Ich würde ja gerne mal die ganze pam_mount.conf.xml sehen, um zu prüfen, ob die tatsächlich korrekt ist... hier funktioniert das mit dem Bind des User-.cache-Dirs nach /tmp wirklich tadellos.
Wie genau stelle ich den Kontextwechsel her?

https://pastebin.com/Gkq4ksbc
Hier die gewünschte Datei mit den Anmerkungen von JTH

TomL

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von TomL » 14.01.2020 16:41:46

Artim hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 15:48:30
https://pastebin.com/Gkq4ksbc
Ich hatte mir den Grund schon gedacht, warum das so nicht funktioniert. Vergleich einfach mal das, was an "mntoptions allow" erlaubt ist und was Du tatsächlich verwendest.
Artim hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 15:48:30
Wie genau stelle ich den Kontextwechsel her?
Das ist überhaupt nicht notwendig und ich würde das auch nicht so kompliziert angehen. Das geht imho einfacher, ohne erst noch sinnlos einen Mountpoint einzurichten... den gibt es doch bereits bei bestehenden Usern... und wenn nicht, sollte der eigentlich laut conf automatisch angelegt und auch wieder entfernt werden.

So sieht das hier im Test aus, allerdings nur an den User "inet" als Testuser gebunden... aber das kann man ja entfernen:

Code: Alles auswählen

# ls -lah /etc/security/pam_mount.conf.xml
    -rw-r--r-- 1 root root 532 2020-01-14 16:27 /etc/security/pam_mount.conf.xml

# cat /etc/security/pam_mount.conf.xml
    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">

    <pam_mount>
        <debug enable="0" />
        <volume user="inet" fstype="tmpfs" mountpoint="/home/%(USER)/.cache"   options="mode=700,uid=%(USER),strictatime,noexec,nosuid,nodev" />

        <mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other,bind,mode,strictatime" />
        <mntoptions require="" />
        <logout wait="0" hup="no" term="no" kill="no" />

        <mkmountpoint enable="1" remove="true" />
    </pam_mount>

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von JTH » 14.01.2020 17:07:24

TomL hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 15:30:47
Obwohl das eigentlich richtig ist, ist imho trotzdem noch ein Flüchtigkeitsfehler enthalten.... und zwar sind an dieser Stelle relative Pfade nicht die sichere Methode, weil man davon ausgehen kann, dass hier noch kein Kontextwechsel auf den User durchgeführt ist, sondern "root" am werkeln ist.
~ verhält sich in der pam_mount.conf.xml wie mans naiv erwarten würde:
man pam_mount.conf hat geschrieben: "~" expands to the user's home directory as present in the passwd database, according to sh semantics.

pam_mount legt, falls nicht vorhanden, den mit mountpoint="…" angegebenen Pfad an. Was es nicht anlegt, ist der Pfad unter /tmp der dahin ge-bind-mountet werden soll. Deshalb mein obiger Vorschlag mit pam_exec, um ein mkdir /tmp/… aufrufen zu können. Der hat, ohne weitere Änderungen, in einer sauberen VM-Spielwiese so funktioniert:

Debianlibpam-mount installiert, eine Zeile extra in /e/s/pam_mount.conf.xml und eine in /e/p.d/common-session und nen ausführbares Skript nach /usr/local/bin/pam-mkusercache.
Manchmal bekannt als Just (another) Terminal Hacker.

Artim
Beiträge: 86
Registriert: 22.11.2019 11:33:28

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von Artim » 14.01.2020 17:16:43

TomL hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 16:41:46
Artim hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 15:48:30
https://pastebin.com/Gkq4ksbc
Ich hatte mir den Grund schon gedacht, warum das so nicht funktioniert. Vergleich einfach mal das, was an "mntoptions allow" erlaubt ist und was Du tatsächlich verwendest.
Artim hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 15:48:30
Wie genau stelle ich den Kontextwechsel her?
Das ist überhaupt nicht notwendig und ich würde das auch nicht so kompliziert angehen. Das geht imho einfacher, ohne erst noch sinnlos einen Mountpoint einzurichten... den gibt es doch bereits bei bestehenden Usern... und wenn nicht, sollte der eigentlich laut conf automatisch angelegt und auch wieder entfernt werden.

So sieht das hier im Test aus, allerdings nur an den User "inet" als Testuser gebunden... aber das kann man ja entfernen:

Code: Alles auswählen

# ls -lah /etc/security/pam_mount.conf.xml
    -rw-r--r-- 1 root root 532 2020-01-14 16:27 /etc/security/pam_mount.conf.xml

# cat /etc/security/pam_mount.conf.xml
    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">

    <pam_mount>
        <debug enable="0" />
        <volume user="inet" fstype="tmpfs" mountpoint="/home/%(USER)/.cache"   options="mode=700,uid=%(USER),strictatime,noexec,nosuid,nodev" />

        <mntoptions allow="nosuid,nodev,loop,encryption,fsck,nonempty,allow_root,allow_other,bind,mode,strictatime" />
        <mntoptions require="" />
        <logout wait="0" hup="no" term="no" kill="no" />

        <mkmountpoint enable="1" remove="true" />
    </pam_mount>
Danke das läuft jetzt. Hab halt noch eine Größenbegrenzung eingefügt und die bereits vorhandene ramdisk auf 128M begrenzt. Habe nicht das gefühl dass in /tmp je mehr als ein paar kB liegen

PS: kann man Themen hier auch als gelöst markieren?

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von JTH » 14.01.2020 17:20:03

Okay, das ist dasselbe, was ich vor 5 Tagen mal vorgeschlagen hatte ;)

Artim hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 17:16:43
PS: kann man Themen hier auch als gelöst markieren?
Du kannst den ersten Beitrag bearbeiten und ein „[gelöst]“ im Titel anhängen.
Manchmal bekannt als Just (another) Terminal Hacker.

Artim
Beiträge: 86
Registriert: 22.11.2019 11:33:28

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von Artim » 14.01.2020 17:21:32

JTH hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 17:20:03
Okay, das ist dasselbe, was ich vor 5 Tagen mal vorgeschlagen hatte ;)

Artim hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 17:16:43
PS: kann man Themen hier auch als gelöst markieren?
Du kannst den ersten Beitrag bearbeiten und ein „[gelöst]“ im Titel anhängen.
Danke. Das Bearbeiten meines OP wurde eben nicht angeboten...🤷‍♂️

TomL

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von TomL » 14.01.2020 17:34:51

JTH hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 17:07:24
~ verhält sich in der pam_mount.conf.xml wie mans naiv erwarten würde:
man pam_mount.conf hat geschrieben: "~" expands to the user's home directory as present in the passwd database, according to sh semantics.
Richtig, und weil der normale User per default keine Rechte zum Mounten hat, läuft dieser Prozess unter UID 0, weswegen ~ hier auf das Homedir "/root" expandiert wird... das heisst, auf den Namen des normal angemeldeten User wird das Cache-Dir von root nach /tmp gemountet, was auf die eigentliche Absicht, das User-Dir .cache via tempfs laufen zu lassen überhaupt keine Wirkung hätte . Ich glaube nicht, dass das erwünscht ist.... und es findet ja während dieses Prozesses eben kein Kontextwechsel auf den User statt, damit ~ auf das richtige Homedir expandiert werden könnte.


Nachtrag... nach weiteren 3 mal durchlesen... tja, ich weiss es nicht wirklich... das Man-Page-Zitat hat mich jetzt verunsichert ... ich würde mich allerdings da nicht drauf verlassen und lieber eindeutige Pfade verwenden. Mir fehlt jetzt jedoch die Energie, das gegenzuprüfen, ob das wirklich korrekt expandiert wird. Deswegen sag ich mal, abhaken.... vielleicht habe ich das tatsächlich falsch interpretiert. Aber ich würde diese Unsicherheit von vornherein mit Eindeutigkeit beseitigen.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von JTH » 14.01.2020 18:12:03

TomL hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 17:34:51
Mir fehlt jetzt jedoch die Energie, das gegenzuprüfen, ob das wirklich korrekt expandiert wird.
Wie gesagt, ich habs ’n paar mal ausprobiert: ~ expandiert in der pam_mount.conf.xml zum Home des Benutzers, der gerade angemeldet wird; das Mounten selbst läuft zwangsläufig, wie du schreibst, mit notwendigen „höheren“ Berechtigungen.

~ anstatt von /home/user/xyz in der pam_mount.conf.xml hat auch den Vorteil, dass das pam_mount auch für root funktioniert – der hat ja kein Home unter /home/root. ~ expandiert dann korrekt zu /root.
Manchmal bekannt als Just (another) Terminal Hacker.

TomL

Re: [gelöst]Mounten von $USER/.cache nach /tmp via systemd

Beitrag von TomL » 14.01.2020 18:34:00

Das hat mich jetzt überzeugt. Danke! :THX:

Artim
Beiträge: 86
Registriert: 22.11.2019 11:33:28

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von Artim » 14.01.2020 18:39:54

JTH hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 13:16:59

Code: Alles auswählen

$ cat /usr/local/bin/pam-mkusercache
#!/bin/sh
set -eu

user_cache_dir="/tmp/user-${PAM_USER}.cache"

case "$PAM_TYPE" in
	open_session)
		/bin/mkdir -m0700 -p "$user_cache_dir"
		/bin/chown "${PAM_USER}:${PAM_USER}" "$user_cache_dir"
		;;
	close_session)
		# Optional: Cache leeren, wenn Benutzer *komplett* abgemeldet.
		login_count="$(/usr/sbin/pmvarrun -u "$PAM_USER" -o 0)"
		if [ "$login_count" -eq 1 ]; then
			/bin/rm -fr "$user_cache_dir/"*
		fi
		;;
esac
plus die Zeile

Code: Alles auswählen

session	optional	pam_exec.so /usr/local/bin/pam-mkusercache
session	optional	pam_mount.so
über der pam_mount-Zeile in /etc/pam.d/common-session.
Als ich das ausprobiert habe meine pam das es das Skript nicht ausführen könne. Kann es sein dass es 755 statt 644 haben muss?

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [gelöst]Mounten von $USER/.cache nach /tmp via systemd

Beitrag von JTH » 14.01.2020 18:56:37

Artim hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 18:39:54
Kann es sein dass es 755 statt 644 haben muss?
Ja, genau. Es muss ausführbar sein.
Manchmal bekannt als Just (another) Terminal Hacker.

Artim
Beiträge: 86
Registriert: 22.11.2019 11:33:28

Re: [gelöst]Mounten von $USER/.cache nach /tmp via systemd

Beitrag von Artim » 14.01.2020 18:57:48

JTH hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 18:56:37
Artim hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 18:39:54
Kann es sein dass es 755 statt 644 haben muss?
Ja, genau. Es muss ausführbar sein.
OK, kein Wunder dass es nicht wollte 🤦‍♂️

Benutzeravatar
MSfree
Beiträge: 10774
Registriert: 25.09.2007 19:59:30

Re: Mounten von $USER/.cache nach /tmp via systemd

Beitrag von MSfree » 14.01.2020 19:05:40

Artim hat geschrieben: ↑ zum Beitrag ↑
14.01.2020 18:39:54
Als ich das ausprobiert habe meine pam das es das Skript nicht ausführen könne. Kann es sein dass es 755 statt 644 haben muss?
Laut der Fehlermeldung muß dein Skript ausführbar sein. Ich würde mit der Rechtevergabe aber noch restrikiver sein. Pam läuft meines Wissen immer mit root-Rechten und reduziert die Privilegien erst nachträglich.

Mit

Code: Alles auswählen

chown root.root Skriptname
würde ich das Skript root zuordnen und dann das Skript mit

Code: Alles auswählen

chmod 700 Skriptname
ausschließlich root Lese-, Schreib-, und Executerechte verpassen.

Antworten