จะเริ่มภาชนะ lxc ที่ไม่ได้รับสิทธิโดยอัตโนมัติได้อย่างไร?


9

บน Ubuntu 14.04 ฉันได้สร้างคอนเทนเนอร์ที่ไม่มีสิทธิพิเศษซึ่งฉันสามารถเริ่มและหยุดได้ด้วยตนเอง

แต่ฉันต้องการสิ่งนี้เพื่อเริ่มและหยุดพร้อมกับระบบ

ฉันได้เพิ่มสิ่งต่อไปนี้ในการกำหนดค่าของคอนเทนเนอร์: lxc.start.auto = 1 lxc.start.delay = 5

อย่างไรก็ตามสคริปต์ของระบบดูเหมือนจะไม่เลือกคอนเทนเนอร์ที่ไม่มีสิทธิใช้งาน

มีเธรดที่เกี่ยวข้องกับสิ่งนี้บน linuxcontainers.org แต่ดูเหมือนว่าโซลูชันจะ จำกัด เฉพาะrootผู้ใช้

มีวิธีทำความสะอาดสำหรับผู้ใช้ที่ไม่ใช่รูท (ด้วยความยินยอมของผู้ใช้รูท) หรือไม่?

คำตอบ:


3

ฉันคิดว่าฉันได้พบวิธีแก้ปัญหาที่ดีกว่าที่เสนอในปัจจุบัน ในส่วนหนึ่งเพราะเท่าที่ฉันสามารถบอกได้ว่า cgmanager นั้นตายไปแล้วส่วนหนึ่งเป็นเพราะวิธีแก้ปัญหาของฉันไม่รู้สึกเหมือนวิธีแก้ปัญหาที่แฮ็ก แต่ส่วนใหญ่เป็นเพราะการสนทนานี้ยังปรากฏขึ้นเมื่อค้นหาวิธีการแก้ไขปัญหา มันสวยเรียบง่ายจริง: ใช้โหมดผู้ใช้ systemd

ได้รับถ้าคุณไม่ได้ใช้ systemd วิธีนี้จะไม่ช่วย ในกรณีนี้ฉันแนะนำให้คุณทราบว่าระบบเริ่มต้นของคุณมีวิธีการอนุญาตให้ผู้ใช้ที่ไม่ได้รับสิทธิพิเศษสามารถใช้บริการตอนบู๊ตและใช้เป็นจุดเริ่มต้นได้หรือไม่

การใช้โหมดผู้ใช้ systemd เพื่อเริ่มต้นคอนเทนเนอร์ lxc ที่ไม่มีสิทธิพิเศษโดยอัตโนมัติ

ฉันสมมติว่าคุณมีคอนเทนเนอร์ lxc ที่ไม่มีสิทธิพิเศษทำงานอย่างถูกต้องและทำงานlxc-autostartในฐานะผู้ใช้ของคอนเทนเนอร์ ถ้าเป็นเช่นนั้นทำต่อไปนี้:

  1. สร้างไฟล์~/.config/systemd/user/lxc-autostart.serviceในบ้านของผู้ใช้ทุกคนที่มีคอนเทนเนอร์ 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. จากนั้นเป็นผู้ใช้ที่ทำงาน:
systemctl --user enable lxc-autostart

(หมายเหตุ--userตัวเลือกบอก systemctl ที่คุณใช้ในโหมดผู้ใช้ทุกสิ่งที่ฉันทำกับ systemctl, start, stop, statuc, enable, etc ทำงานกับ --user)

  1. จากนั้นรันต่อไปนี้โดยที่$userชื่อของผู้ใช้ที่มีคอนเทนเนอร์ lxc อยู่:
sudo loginctl enable-linger $user

นี่เป็นสิ่งจำเป็นสำหรับ systemd เพื่อเริ่มต้นอินสแตนซ์ผู้ใช้ systemd สำหรับ$userตอนบูต มิฉะนั้นจะเริ่มต้นเพียงครั้งเดียวในขณะที่$userเข้าสู่ระบบ

สำหรับข้อมูลเพิ่มเติมฉันขอแนะนำให้วิกิพีเดีย ArchLinux systemd / จับเวลาหน้าและหน้าคน systemd

การเข้าถึงอินสแตนซ์ systemd ของผู้ใช้ในฐานะรูท

คุณสามารถเริ่ม / หยุด / บริการใด ๆ ของ systemd ของผู้ใช้ในฐานะรูทได้อย่างไรก็ตามสิ่งนี้ต้องการให้คุณตั้งค่าXDG_RUNTIME_DIRตัวแปรสภาพแวดล้อม สมมติว่า$user เป็นผู้ใช้ที่อินสแตนซ์ที่คุณต้องการเข้าถึงและ$uidเป็น uid นี่คือวิธีที่คุณจะเริ่มต้น lxc-autostart.service ที่กำหนดไว้ด้านบน:

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

คุณยังสามารถใช้systemd-runเพื่อเรียกใช้คำสั่งโดยพลการในฐานะผู้ใช้ในลักษณะที่ไม่ทำให้แตก lxc ฉันใช้คำสั่งต่อไปนี้เพื่อหยุด / เริ่มต้นคอนเทนเนอร์ของฉันก่อน / หลังการสำรองข้อมูลซึ่ง$nameเป็นชื่อของคอนเทนเนอร์ lxc ที่ถูกสำรอง:

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

(โปรดทราบว่าหากไม่มี--waitsystemd-run จะไม่บล็อกจนกว่าคอนเทนเนอร์จะหยุดทำงาน)


7

ฉันแนะนำให้ใช้@rebootนามแฝงที่มีประโยชน์ในcron ของ Ubuntuเพื่อให้ทำงานlxc-autostartได้

ในฐานะผู้ใช้ที่เป็นเจ้าของคอนเทนเนอร์ที่ไม่มีสิทธิใช้งานให้รันcrontab -eและเพิ่มบรรทัดต่อไปนี้:

@reboot lxc-autostart


มันฟังดูดีมาก อย่างไรก็ตามดูเหมือนจะไม่มีวิธีเรียกใช้คำสั่งเมื่อปิดระบบ (ผ่าน cron) ความคิดใด ๆ
HRJ

ฉันไม่ทราบวิธีง่ายๆในการทำงานเมื่อปิดเครื่อง คุณอาจจะต้องเพิ่มงานพุ่งพรวดเพื่อปิดตู้คอนเทนเนอร์สำหรับผู้ใช้แต่ละคนที่เป็นเจ้าของ คุณสามารถมองหาพ/etc/init/lxc.confอยน์เตอร์ได้ มันเป็นงานธรรมดาที่เริ่มต้นภาชนะที่ได้รับการยกเว้น ไม่ควรคัดลอกและปรับเปลี่ยนเป็นคอนเทนเนอร์ที่ไม่ได้รับสิทธิพิเศษเช่นกัน
เข้ารหัส

1
มันเกิดขึ้นกับฉันว่าเนื่องจากแต่ละกระบวนการในคอนเทนเนอร์สามารถมองเห็นได้จากโฮสต์คอนเทนเนอร์นั้นไม่จำเป็นต้องมีอะไรพิเศษเพื่อปิดมันแต่ละกระบวนการควรได้รับสัญญาณ TERM จากโฮสต์ โอกาสที่คุณไม่จำเป็นต้องทำอะไรเป็นพิเศษเมื่อปิดเครื่อง หากคุณต้องการเรียกใช้สคริปต์บางอย่างหรือสิ่งอื่น ๆ เช่นเมื่อปิดระบบนั้นแตกต่างกัน แต่กระบวนการส่วนใหญ่ควรมีโอกาสปิดปกติ
เข้ารหัส

วิธี crontab ทำงานได้หรือไม่? ใน Ubuntu 14.04 ฉันได้รับข้อผิดพลาด "การเรียกไปยัง cgmanager_move_pid_sync ล้มเหลว: คำขอไม่ถูกต้อง" ซึ่งเกิดขึ้นเนื่องจาก PAM คือ libpam-systemd ไม่เกี่ยวข้องกับกระบวนการเปลี่ยนผู้ใช้ คุณสามารถเห็นได้/proc/self/cgroupว่ามันมีลำดับดังนี้/user/0.user/1.sessionแทน/user/1000.user/1.session
Daniel Alder

3

ในกรณีที่ทุกคนสะดุดกับคำถาม & คำตอบสำหรับการเริ่มต้นการบรรจุตู้คอนเทนเนอร์ LXC ที่ไม่มีผู้ด้อยโอกาสโดยอัตโนมัติ (ฉันกลับมาที่นี่บ่อยๆ) นี่เป็นวิธีแก้ปัญหาที่ใช้งานได้ดีและฉันตามไปทำงานบนเซิร์ฟเวอร์ของฉัน:

http://blog.lifebloodnetworks.com/?p=2118โดย Nicholas J Ingrassellino

สั้น ๆ มันเกี่ยวข้องกับการสร้างสองสคริปต์และพวกเขาทำงานร่วมกันเมื่อเริ่มต้นเพื่อให้ LXC เริ่มภาชนะบรรจุที่ไม่มีสิทธิพิเศษของผู้ใช้ที่ระบุไว้แต่ละรายโดยไม่ต้องเข้าสู่บัญชีผู้ใช้จริง; กล่าวอีกนัยหนึ่งคือดำเนินการคำสั่งในฐานะผู้ใช้ที่มีกลุ่มมายากล CGGL ทั้งหมด เพื่อให้สอดคล้องกับแนวทางปฏิบัติที่ดีที่สุดดังนั้นฉันจะเสนอราคาของกระดูกที่นี่ แต่ก็คุ้มค่าที่จะอ่านบทความต้นฉบับของเขา

อนุญาตให้บัญชีผู้ใช้ของเราใช้สะพาน ...

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

สร้างสคริปต์พุ่งพรวด ... ในการ/etc/init/lxc-unprivileged.confเพิ่ม ...

description "LXC Unprivileged Containers"
author "Mike Bernson <mike@mlb.org>"

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

ตรวจสอบให้แน่ใจว่าได้แทนที่ [ผู้ใช้] ด้วยบัญชีผู้ใช้ของคุณ

สร้างสคริปต์เริ่มคอนเทนเนอร์ ... ใน/usr/local/bin/startunprivlxc เพิ่ม ...

#!/bin/sh

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

... และทำให้มันใช้งานได้ ...

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

ฉันแค่อยากจะย้ำว่ามันทำงานได้อย่างปลอดภัยถูกต้องและไม่ต้องการให้รูทของ SSH เข้าไปในบัญชีผู้ใช้อื่น

นอกจากนี้ยังมีเพิ่มเติมเกี่ยวกับเรื่อง (สัมผัสกับ gotchas ที่เกี่ยวข้อง) ที่นี่: https://gist.github.com/julianlam/4e2bd91d8dedee21ca6fซึ่งจะมีประโยชน์ในการทำความเข้าใจว่าทำไมมันถึงเป็นแบบนี้



0

ขอโทษ: ตอบเร็วเกินไป มันไม่ทำงานแม้ว่า lxc-ls จะแสดง "AUTOSTART" เป็น "YES"

นี่คือลิงค์ที่มีข้อมูลที่มีประโยชน์มากขึ้นและอาจมีบางคนสามารถใช้ประโยชน์ได้: http://www.geeklee.co.uk/unprivileged-privileged-conrivers-ubuntu-14-04-lxc/

ฉันลงจอดบนหน้านี้เพราะฉันมีปัญหาเดียวกัน หลังจากอ่านกระทู้นี้ฉันรู้ว่า lxc-create ไม่สามารถเขียนไปยังไดเรกทอรี "/ var / lib / lxc /" ปกติถ้ามันไม่ได้ทำงานด้วย sudo

ฉันดูรอบ ๆ และหารูทของคอนเทนเนอร์ที่ไม่มีสิทธิพิเศษของฉันใน "~ / .local / share / lxc" และวางสองบรรทัดในคำถามลงใน config ในไดเรกทอรีนั้น

ฉันดูเทมเพลตที่ฉันใช้ "lxc-download" เพื่อหาเบาะแส แต่ฉันคิดว่าเส้นทางนั้นถูกส่งผ่านเมื่อมีการเรียกใช้ "lxc-download" ฉันไม่ได้ดูว่าระบบจะค้นหาคอนเทนเนอร์ที่ไม่มีสิทธิพิเศษระหว่างการบูตอย่างไร


0

ฉันกำลังเรียกใช้คอนเทนเนอร์ที่ไม่มีสิทธิพิเศษแต่ละรายการที่มีชื่อผู้ใช้เดียวกันสำหรับการแยกที่ดีกว่าและนี่คือวิธีที่ฉันทำ:

#!/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

-1

สมมติว่า (ซึ่งเป็นแม่ของวิธีการทั้งหมดที่จะทำสิ่งต่าง ๆ ขึ้นไป) คุณกำลังเข้าสู่ระบบในฐานะผู้ใช้ที่ "เป็นเจ้าของ" คอนเทนเนอร์ lxc ที่ไม่ได้รับสิทธิพิเศษแล้วคำสั่งต่อไปนี้ควรจัดการสิ่งที่คุณต้องการ ...

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

นี้จะเรียกใช้คำสั่งข้างต้นเมื่อคุณเข้าสู่ระบบผ่านทุบตี นี่เป็นข้อสมมติว่า bash คือเชลล์การล็อกอิน โปรดแทนที่ชื่อ: LXC-CONTAINER-NAMEด้วยชื่อของคอนเทนเนอร์ LXC ที่คุณต้องการเริ่ม


-1

ฉันใช้วิธีการอื่นและใช้งานได้

1ºเพิ่มรายการต่อไปนี้ที่ไฟล์ config container

กำหนดค่าเริ่มโดยอัตโนมัติ

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

2ºสร้างความสัมพันธ์ที่เชื่อถือระหว่างผู้ใช้คอนเทนเนอร์กับตัวเองที่เซิร์ฟเวอร์เดียวกัน

userlxc @ GEST-4: ~ $ ssh-keygen -t rsa กำลังสร้างคู่คีย์สาธารณะ / ส่วนตัว rsa ป้อนไฟล์ที่จะบันทึกคีย์ (/home/userlxc/.ssh/id_rsa): ป้อน passphrase (ว่างโดยไม่มี passphrase): ป้อน passphrase เดียวกันอีกครั้ง: รหัสประจำตัวของคุณถูกบันทึกไว้ใน /home/userlxc/.ssh/id_rsa รหัสสาธารณะของคุณได้รับการบันทึกใน /home/userlxc/.ssh/id_rsa.pub ลายนิ้วมือที่สำคัญคือ: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: เป็น: b6: 80: 39: 59: 59: 98 userlxc @ GEST-AMENCIA-4 ภาพสุ่มของกุญแจคือ: + - [RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o = | | . +. + | | oO = oo | + ----------------- +

userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / authorized_keys userlxc @ GEST-4: ~ $ ls -lrt .ssh / authorized_keys -rw-rw-r-- 1 userlxc userlxc 404 พ.ย. 19 17:23 .ssh / authorized_keys

ตรวจสอบการเชื่อมต่อ ssh คุณจะต้องสามารถใช้งานได้โดยไม่ต้องใช้รหัสผ่าน userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

NAME STATE IPV4 IPV6 AUTOSTART

EXTLXCCONT01 STOPPED - - ใช่
UBUSER1404USERCONT01-test STOPPED - - NO
UBUSER1404USERLXCCONT01 ที่หยุด - - NO

3ºสร้างรายการ crontab ที่เจ้าของคอนเทนเนอร์

@reboot ssh userlxc @ localhost "lxc-autostart"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.