Jak automatycznie uruchomić nieuprzywilejowane kontenery LXC?

9

Na Ubuntu 14.04 utworzyłem nieuprzywilejowany kontener, który mogę ręcznie uruchamiać i zatrzymywać.

Ale chciałbym, żeby to zaczęło się i kończyło wraz z systemem.

Dodałem następujące ustawienia do konfiguracji kontenera: lxc.start.auto = 1 lxc.start.delay = 5

Jednak skrypty systemowe nie wybierają nieuprzywilejowanych kontenerów.

Wątek ten jest powiązany z linuxcontainers.org, ale rozwiązanie wydaje się być ograniczone do rootużytkownika.

Czy istnieje czysty sposób na zrobienie tego dla użytkownika innego niż root (za zgodą użytkownika root)?

HRJ
źródło

Odpowiedzi:

3

Myślę, że znalazłem lepsze rozwiązanie niż obecnie prezentowane tutaj. Po części dlatego, że o ile mogę stwierdzić, cgmanager nie żyje, po części dlatego, że moje rozwiązanie nie wydaje się hackującym obejściem, ale głównie dlatego, że ta dyskusja wciąż pojawia się podczas szukania rozwiązania problemu. Jest to dość proste: użyj trybu użytkownika systemowego .

Oczywiście, jeśli nie używasz systemd, to rozwiązanie nie pomoże. W takim przypadku radzę ci dowiedzieć się, czy Twój system init ma jakiś sposób na umożliwienie nieuprzywilejowanym użytkownikom uruchamiania usług podczas rozruchu i używania tego jako punktu wyjścia.

Używanie trybu użytkownika systemowego do automatycznego uruchamiania nieuprzywilejowanych kontenerów LXC

Zakładam, że masz nieuprzywilejowane kontenery lxc działające poprawnie i działające, lxc-autostartgdy działa użytkownik kontenera. Jeśli tak, wykonaj następujące czynności:

  1. Utwórz plik ~/.config/systemd/user/lxc-autostart.servicew domu dowolnego użytkownika, który ma kontenery lxc:
[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. Następnie jako ten użytkownik uruchom:
systemctl --user enable lxc-autostart

(Uwaga, --useropcja mówi systemctl, że używasz go w trybie użytkownika. Wszystkie rzeczy, które normalnie robię z systemctl, start, stop, statuc, enable itp., Praca z --user.)

  1. Następnie uruchom następujące polecenie, gdzie $userjest nazwa użytkownika, który ma kontenery LXC:
sudo loginctl enable-linger $user

Jest to konieczne, aby systemd uruchomił instancję użytkownika systemd $userpodczas uruchamiania. W przeciwnym razie uruchomiłby się tylko w momencie $userzalogowania.

Aby uzyskać więcej informacji, poleciłbym stronę archlinux wiki systemd / timer i systemd strony man .

Dostęp do wystąpienia systemowego użytkownika jako root

Możesz faktycznie uruchomić / zatrzymać / dowolną usługę systemową użytkownika jako root, jednak wymaga to ustawienia XDG_RUNTIME_DIRzmiennej środowiskowej. Załóżmy, że $user jest to użytkownik, do którego instancji chcesz uzyskać dostęp i $uidjest to identyfikator UID, a następnie uruchom lxc-autostart.service zdefiniowany powyżej:

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

Możesz nawet użyć systemd-rundo uruchomienia dowolnych poleceń jako ten użytkownik w sposób, który nie psuje LXC. Korzystam z następujących poleceń, aby zatrzymać / uruchomić moje kontenery przed / po utworzeniu kopii zapasowej, gdzie $namejest nazwa kontenera LXC, którego kopię zapasową wykonuję:

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

(Pamiętaj, że bez --waituruchomienia systemowego nie blokuje się, dopóki kontener nie zostanie zatrzymany).

Wieke
źródło
7

Polecam użycie przydatnego @rebootaliasu w cronie Ubuntu do uruchomienia lxc-autostart.

Jako użytkownik, który jest właścicielem nieuprzywilejowanego kontenera, uruchom crontab -ei dodaj następujący wiersz:

@reboot lxc-autostart

zakodowane
źródło
Brzmi świetnie. Wydaje się jednak, że nie ma sposobu na uruchomienie komendy podczas zamykania systemu (przez crona). Jakieś pomysły?
HRJ
Nie znam żadnych prostych sposobów uruchamiania pracy przy zamykaniu. Prawdopodobnie będziesz musiał jako root dodać zadanie początkowe do zamykania kontenerów dla każdego użytkownika, który jest ich właścicielem. Możesz poszukać /etc/init/lxc.confwskazówek. To pierwsze zadanie, które uruchamia uprzywilejowane kontenery. Nie powinno być zbyt trudne do skopiowania go i zmodyfikowania, aby zamknąć również nieuprzywilejowane kontenery.
zakodowano
1
Przyszło mi do głowy, że ponieważ każdy proces w kontenerze jest widoczny z hosta, kontener prawdopodobnie nie potrzebuje niczego specjalnego, aby go zamknąć, każdy proces powinien otrzymać sygnał TERM z hosta. Możliwe, że nie musisz robić nic specjalnego przy wyłączaniu. Jeśli chcesz uruchamiać niektóre skrypty lub inne podobne rzeczy podczas zamykania systemu, jest inaczej, ale większość procesów powinna mieć szansę na normalne wyłączenie.
zakodowano
Czy podejście crontab działa? W systemie Ubuntu 14.04 pojawia się błąd „wywołanie cgmanager_move_pid_sync nie powiodło się: nieprawidłowe żądanie”, które występuje, ponieważ PAM, a mianowicie libpam-systemd, nie bierze udziału w procesie zmiany użytkownika. Widać w /proc/self/cgrouptym, że zawiera sekwencje podobne /user/0.user/1.sessionzamiast/user/1000.user/1.session
Daniel Alder
3

W przypadku, gdy ktoś natknie się na to pytanie i odpowiedź na pytanie o automatyczne uruchamianie nieuprzywilejowanych kontenerów LXC (z pewnością często tu sprawdzam), oto rozwiązanie, które działa dobrze i które zastosowałem, aby działało na moim serwerze:

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

Mówiąc w skrócie, polega to na utworzeniu dwóch skryptów, które działają razem podczas uruchamiania, aby LXC mógł uruchomić nieuprzywilejowane kontenery każdego wymienionego użytkownika bez konieczności logowania się na konto użytkownika; innymi słowy, wykonanie polecenia jako użytkownik przy nienaruszonej magii CGroups. Zgodnie z najlepszą praktyką SO przytoczę jej kości, ale warto przeczytać jego oryginalny artykuł.

Pozwól, aby nasze konto użytkownika korzystało z mostu…

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

Utwórz skrypt Upstart… /etc/init/lxc-unprivileged.confDodaj…

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

Pamiętaj, aby zastąpić [użytkownik] swoim kontem użytkownika.

Utwórz skrypt startowy kontenera… /usr/local/bin/startunprivlxc Dodaj…

#!/bin/sh

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

… I spraw, by był wykonywalny…

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

Chciałbym tylko podkreślić, że wydaje się działać bezpiecznie, poprawnie i nie wymaga rootowania do SSH na innych kontach użytkowników.

Więcej informacji na ten temat (dotykając pokrewnych gotch) można znaleźć tutaj: https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f, które mogą być pomocne w zrozumieniu, dlaczego tak jest.

Kevin Teljeur
źródło
2

Napisałem mały skrypt, aby obejść ten problem, po prostu postępuj zgodnie z komentowanymi instrukcjami.

Thiago de Arruda
źródło
0

SORRY: odpowiedział zbyt wcześnie. Nie działało, mimo że lxc-ls pokazuje „AUTOSTART” jako „TAK”.

Oto link z dużo bardziej użytecznymi informacjami i być może ktoś może z niego skorzystać: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/

Wylądowałem na tej stronie, ponieważ miałem ten sam problem. Po przeczytaniu tego wątku zdałem sobie sprawę, że lxc-create nie może pisać do zwykłego katalogu „/ var / lib / lxc /”, jeśli nie jest uruchamiany z sudo.

Rozejrzałem się i zlokalizowałem rootfs dla mojego nieuprzywilejowanego kontenera w "~ / .local / share / lxc" i umieszczając dwie linie w pytaniu w config w tym katalogu.

Spojrzałem na szablon, którego użyłem, „lxc-download” na wskazówkę, ale myślę, że ta ścieżka została przekazana, gdy wywoływane jest „lxc-download”. Nie patrzyłem, jak system szuka nieuprzywilejowanych kontenerów podczas uruchamiania.

lxc n00b
źródło
0

Korzystam z każdego nieuprzywilejowanego kontenera z tym samym nazwanym użytkownikiem dla lepszej izolacji i tak to robię:

#!/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
źródło
-1

Zakładając (że są matką wszystkich sposobów na zepsucie rzeczy), logujesz się jako użytkownik, który „jest właścicielem” nieuprzywilejowanego kontenera lxc, to poniższe polecenie powinno odpowiedzieć na to, czego szukasz ...

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

To po prostu uruchomi powyższe polecenie, gdy zalogujesz się przez bash. Zakłada się również, że bash jest powłoką logowania. Zastąp nazwę: LXC-CONTAINER-NAMEnazwą kontenera LXC, który chcesz rozpocząć.

użytkownik249005
źródło
-1

Użyłem innego podejścia i działa

1º Dodaj następujące wpisy w pliku konfiguracji kontenera

KONFIGURACJA AUTOMATYCZNEGO STARTU

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

2º Utwórz relację zaufania między użytkownikiem kontenera a sobą na tym samym serwerze

userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Generowanie pary kluczy publiczny / prywatny rsa. Wpisz plik, w którym chcesz zapisać klucz (/home/userlxc/.ssh/id_rsa): Wpisz hasło (puste dla hasła): Wprowadź ponownie to samo hasło: Twoja identyfikacja została zapisana w /home/userlxc/.ssh/id_rsa. Twój klucz publiczny został zapisany w /home/userlxc/.ssh/id_rsa.pub. Kluczowy odcisk palca to: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 Losowy obraz klucza to: + - [RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o =. | | . +. +. | | oO = oo | + ----------------- +

userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / Author_keys userlxc @ GEST-4: ~ $ ls -lrt .ssh / 17:23 .ssh / autoryzowane_klucze

Sprawdź połączenie ssh, musisz mieć możliwość korzystania z niego bez hasła userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

NAZWA STAN IPV4 IPV6 AUTOSTART

EXTLXCCONT01 ZATRZYMANY - - TAK
UBUSER1404USERCONT01-test ZATRZYMANY - - BRAK
UBUSER1404USERLXCCONT01 ZATRZYMANY - - NIE

3º Utwórz wpis crontab u właściciela kontenera

@ reboot ssh userlxc @ localhost "lxc-autostart"

użytkownik323185
źródło