Wie starte ich nicht privilegierte lxc-Container automatisch?

9

Unter Ubuntu 14.04 habe ich einen nicht privilegierten Container erstellt, den ich manuell starten und stoppen kann.

Aber ich möchte, dass dies zusammen mit dem System gestartet und gestoppt wird.

Ich habe der Konfiguration des Containers Folgendes hinzugefügt: lxc.start.auto = 1 lxc.start.delay = 5

Die Systemskripte scheinen jedoch keine nicht privilegierten Container auszuwählen.

Auf linuxcontainers.org gibt es einen entsprechenden Thread , aber die Lösung scheint auf den rootBenutzer beschränkt zu sein .

Gibt es eine saubere Möglichkeit, dies für einen Nicht-Root-Benutzer zu tun (mit Zustimmung des Root-Benutzers)?

HRJ
quelle

Antworten:

3

Ich denke, ich habe eine bessere Lösung gefunden als die derzeit hier vorgestellten. Zum einen, weil cgmanager, soweit ich das beurteilen kann, tot ist, zum anderen, weil sich meine Lösung nicht wie eine hackige Problemumgehung anfühlt, sondern zum größten Teil, weil diese Diskussion immer noch auftaucht, wenn nach einer Lösung für das Problem gesucht wird. Eigentlich ist es ziemlich einfach: Verwenden Sie den Systemd-Benutzermodus .

Zugegeben, wenn Sie systemd nicht verwenden, hilft diese Lösung nicht weiter. In diesem Fall würde ich Ihnen raten, herauszufinden, ob Ihr Init-System es nicht privilegierten Benutzern ermöglicht, Dienste beim Booten auszuführen und dies als Ausgangspunkt zu verwenden.

Verwenden des Systemd-Benutzermodus zum automatischen Starten nicht privilegierter lxc-Container

Ich gehe davon aus, dass Sie nicht privilegierte lxc-Container haben, die ordnungsgemäß funktionieren und die ausgeführt werden, lxc-autostartwenn der Benutzer des Containers arbeitet. Wenn ja, gehen Sie wie folgt vor:

  1. Erstellen Sie die Datei ~/.config/systemd/user/lxc-autostart.servicein der Startseite des Benutzers, der über die lxc-Container verfügt:
[Unit]
Description="Lxc-autostart for lxc user"

[Service]
Type=oneshot
ExecStart=/usr/bin/lxc-autostart
ExecStop=/usr/bin/lxc-autostart -s
RemainAfterExit=1

[Install]
WantedBy=default.target
  1. Führen Sie dann als dieser Benutzer Folgendes aus:
systemctl --user enable lxc-autostart

(Beachten Sie, dass die --userOption systemctl mitteilt, dass Sie es im Benutzermodus verwenden. Alle Dinge, die ich normalerweise mit systemctl, start, stop, statuc, enable usw. mache, funktionieren mit --user.)

  1. Führen Sie dann Folgendes aus, wobei $userder Name des Benutzers lautet, der über die lxc-Container verfügt:
sudo loginctl enable-linger $user

Dies ist erforderlich, damit systemd $userbeim Booten eine systemd-Benutzerinstanz für startet . Andernfalls würde im Moment nur eine $userAnmeldung gestartet .

Für weitere Informationen würde ich die archlinux wiki systemd / timer Seite und die systemd Manpages empfehlen .

Zugriff auf die systemd-Instanz eines Benutzers als root

Sie können den systemd-Dienst eines Benutzers als root starten / stoppen / was auch immer. Dazu müssen Sie jedoch die XDG_RUNTIME_DIRUmgebungsvariable festlegen . Angenommen, es $user handelt sich um den Benutzer, auf dessen Instanz Sie zugreifen möchten, und um $uiddie UID. Auf diese Weise starten Sie den oben definierten lxc-autostart.service:

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart

Sie können sogar systemd-runbeliebige Befehle als Benutzer so ausführen, dass lxc nicht beschädigt wird. Ich verwende die folgenden Befehle, um meine Container vor / nach der Sicherung zu stoppen / zu starten. Dabei $namelautet der Name des lxc-Containers, der gesichert wird:

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --wait lxc-stop -n $name
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --scope lxc-start -n $name

(Beachten Sie, dass ohne --waitsystemd-run nicht blockiert wird, bis der Container gestoppt wird.)

Wieke
quelle
7

Ich würde empfehlen, den praktischen @rebootAlias ​​in Ubuntus Cron zum Ausführen zu verwenden lxc-autostart.

Führen Sie als Benutzer, dem der nicht privilegierte Container gehört, crontab -edie folgende Zeile aus und fügen Sie sie hinzu:

@reboot lxc-autostart

codiert
quelle
Das klingt großartig. Es scheint jedoch keine Möglichkeit zu geben, einen Befehl beim Herunterfahren (über cron) auszuführen. Irgendwelche Ideen?
HRJ
Mir sind keine einfachen Möglichkeiten bekannt, einen Job beim Herunterfahren auszuführen. Sie müssten wahrscheinlich als Root einen Upstart-Job hinzufügen, um Container für jeden Benutzer herunterzufahren, dem sie gehören. Sie könnten nach /etc/init/lxc.confHinweisen suchen . Es ist der Startjob, der die privilegierten Container startet. Es sollte nicht zu schwierig sein, es zu kopieren und zu ändern, um auch nicht privilegierte Container herunterzufahren.
verschlüsselt am
1
Da jeder Prozess im Container vom Host aus sichtbar ist, benötigt der Container wahrscheinlich nichts Besonderes, um ihn herunterzufahren. Jeder Prozess sollte das TERM-Signal vom Host empfangen. Möglicherweise müssen Sie beim Herunterfahren nichts Besonderes tun. Wenn Sie beim Herunterfahren einige Skripte oder ähnliche Dinge ausführen möchten, ist dies anders, aber die meisten Prozesse sollten die Möglichkeit haben, normal herunterzufahren.
verschlüsselt am
Funktioniert der Crontab-Ansatz? Unter Ubuntu 14.04 wird der Fehler "Aufruf von cgmanager_move_pid_sync fehlgeschlagen: ungültige Anforderung" angezeigt, der auftritt, weil PAM, nämlich libpam-systemd, nicht am Benutzeränderungsprozess beteiligt ist. Sie können sehen, /proc/self/cgroupdass es Sequenzen wie /user/0.user/1.sessionanstelle von/user/1000.user/1.session
Daniel Alder
3

Für den Fall, dass jemand auf diese Fragen und Antworten stößt, um die Antwort auf das automatische Starten von nicht privilegierten LXC-Containern zu erhalten (ich schaue hier sicherlich viel nach), ist hier eine Lösung, die gut funktioniert und die ich befolgt habe, um sie auf meinem Server zum Laufen zu bringen:

http://blog.lifebloodnetworks.com/?p=2118 von Nicholas J Ingrassellino.

Kurz gesagt, es werden zwei Skripte erstellt, die beim Start zusammenarbeiten, damit LXC die nicht privilegierten Container jedes aufgelisteten Benutzers starten kann, ohne sich tatsächlich beim Benutzerkonto anmelden zu müssen. Mit anderen Worten: Ausführen des Befehls als Benutzer mit intakter CGroups-Magie. In Übereinstimmung mit SO Best Practice werde ich hier die Knochen zitieren, aber es lohnt sich, seinen Originalartikel zu lesen.

Erlauben Sie unserem Benutzerkonto, die Bridge zu verwenden ...

echo "$USER veth lxcbr0 1024" | sudo tee -a /etc/lxc/lxc-usernet

Upstart-Skript erstellen… /etc/init/lxc-unprivileged.confHinzufügen…

description "LXC Unprivileged Containers"
author "Mike Bernson <[email protected]>"

start on started lxc

script
    USERS="[user]"

    for u in $USERS; do
        cgm create all lxc$u
        cgm chown all lxc$u $(id -u $u) $(id -g $u)
        lxc-autostart -L -P /home/$u/.local/share/lxc | while read line;
        do
            set -- $line
            /usr/local/bin/startunprivlxc lxc$u $u $1
            sleep $2
        done
    done
end script

Stellen Sie sicher, dass Sie [Benutzer] durch Ihr Benutzerkonto ersetzen.

Erstellen Sie das Container-Startskript… /usr/local/bin/startunprivlxc Zusätzlich…

#!/bin/sh

cgm movepid all $1 $$
sudo -iH -u $2 -- lxc-start -n $3 -d

… Und es ausführbar machen…

sudo chmod +x /usr/local/bin/startunprivlxc

Ich möchte nur betonen, dass es sicher und korrekt zu funktionieren scheint und nicht erfordert, dass der Root für SSH in die anderen Benutzerkonten eingeht.

Hier finden Sie auch weitere Informationen zu diesem Thema (Berühren verwandter Fallstricke): https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f, die hilfreich sein können, um zu verstehen, warum dies so ist.

Kevin Teljeur
quelle
2

Ich habe ein kleines Skript geschrieben , um das Problem zu umgehen. Befolgen Sie einfach die kommentierten Anweisungen.

Thiago de Arruda
quelle
0

ENTSCHULDIGUNG: antwortete zu früh. Es hat nicht funktioniert, obwohl lxc-ls "AUTOSTART" als "YES" anzeigt.

Hier ist ein Link mit viel nützlicheren Informationen, und vielleicht kann jemand davon Gebrauch machen: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/

Ich bin auf dieser Seite gelandet, weil ich das gleiche Problem hatte. Nachdem ich diesen Thread gelesen hatte, stellte ich fest, dass lxc-create nicht in das übliche Verzeichnis "/ var / lib / lxc /" schreiben kann, wenn es nicht mit sudo ausgeführt wird.

Ich habe mich umgesehen und die rootfs für meinen nicht privilegierten Container in "~ / .local / share / lxc" gefunden und die beiden Zeilen in der Frage in config in diesem Verzeichnis abgelegt.

Ich habe mir die von mir verwendete Vorlage "lxc-download" als Hinweis angesehen, aber ich glaube, dieser Pfad wurde übergeben, als "lxc-download" aufgerufen wurde. Ich habe nicht untersucht, wie das System beim Booten nach nicht privilegierten Containern sucht.

lxc n00b
quelle
0

Ich führe jeden nicht privilegierten Container mit einem gleichnamigen Benutzer aus, um die Isolation zu verbessern, und so mache ich es:

#!/bin/bash

LXC_CONTAINERS="container1 container2"

for LXC_CONTAINER in $LXC_CONTAINERS; do
 su - $LXC_CONTAINER -c "lxc-start -n $LXC_CONTAINER --logfile /home/$LXC_CONTAINER/.local/share/lxc/lxc-$LXC_CONTAINER.log --logpriority DEBUG"
done
Sam
quelle
-1

Angenommen, Sie melden sich als der Benutzer an, der den nicht privilegierten lxc-Container "besitzt". Der folgende Befehl sollte sich mit dem befassen, wonach Sie suchen.

$ echo "lxc-start -n LXC-CONTAINER-NAME -d" >> .bashrc

Dadurch wird einfach der obige Befehl ausgeführt, wenn Sie sich über bash anmelden. Dies setzt auch voraus, dass bash die Login-Shell ist. Bitte ersetzen Sie den Namen: LXC-CONTAINER-NAMEdurch den Namen Ihres LXC-Containers, den Sie starten möchten.

user249005
quelle
-1

Ich habe einen anderen Ansatz gewählt und es funktioniert

1º Fügen Sie die folgenden Einträge in die Container-Konfigurationsdatei ein

AUTO START CONFIG

lxc.start.auto = 1 lxc.start.delay = 5

2º Erstellen Sie eine Vertrauensbeziehung zwischen dem Containerbenutzer und sich selbst auf demselben Server

userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Generiert ein öffentliches / privates rsa-Schlüsselpaar. Geben Sie die Datei ein, in der der Schlüssel gespeichert werden soll (/home/userlxc/.ssh/id_rsa): Geben Sie die Passphrase ein (leer für keine Passphrase): Geben Sie dieselbe Passphrase erneut ein: Ihre Identifikation wurde in /home/userlxc/.ssh/id_rsa gespeichert. Ihr öffentlicher Schlüssel wurde in /home/userlxc/.ssh/id_rsa.pub gespeichert. Der Schlüsselfingerabdruck lautet: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 Das Randomart-Bild des Schlüssels lautet: + - [RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o =. | | . +. +. | | oO = oo | + ----------------- +

userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / autorisierte_schlüssel userlxc @ GEST-4: ~ $ ls -lrt .ssh / autorisierte_keys -rw-rw-r-- 1 userlxc userlxc 404 19. November 17:23 .ssh / autorisierte_Tasten

Überprüfen Sie die SSH-Verbindung. Sie müssen sie ohne Kennwort verwenden können. Userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

NAME STATE IPV4 IPV6 AUTOSTART

EXTLXCCONT01 STOPPED - - JA
UBUSER1404USERCONT01-Test STOPPED - - NEIN
UBUSER1404USERLXCCONT01 STOPPED - - NO

3º Erstellen Sie einen Crontab-Eintrag beim Containerbesitzer

@reboot ssh userlxc @ localhost "lxc-autostart"

user323185
quelle