systemd: ให้สิทธิ์ผู้ใช้ที่ไม่ได้รับสิทธิพิเศษเพื่อแก้ไขบริการหนึ่งที่เฉพาะเจาะจง


20

ฉันใช้เซิร์ฟเวอร์เกมส่วนตัวบนกล่อง linux ที่ไม่มีหัว เนื่องจากฉันไม่ใช่คนโง่พูดว่าเซิร์ฟเวอร์กำลังทำงานในฐานะผู้ใช้ที่ไม่มีสิทธิ์ของตัวเองด้วยสิทธิ์การเข้าถึงขั้นต่ำที่เปลือยเปล่าซึ่งจำเป็นต้องดาวน์โหลดการอัปเดตและแก้ไขฐานข้อมูลโลก

ฉันยังสร้างไฟล์หน่วย systemd เพื่อเริ่มต้นอย่างถูกต้องหยุดและรีสตาร์ทเซิร์ฟเวอร์เมื่อจำเป็น (เช่นสำหรับการอัปเดตดังกล่าว)

อย่างไรก็ตามเพื่อที่จะโทรจริงsystemctlหรือservice <game> start/stop/restartฉันยังต้องเข้าสู่ระบบในฐานะผู้ใช้รูทหรือsudoผู้ใช้ที่มีความสามารถ

มีวิธีบอก systemd หรือไม่ว่าสำหรับ<game>บริการผู้ใช้ที่gamesrvไม่มีสิทธิได้รับอนุญาตให้รันคำสั่ง start / stop / restart ได้หรือไม่?


PolicyKit / การกระจายรุ่นใด Debian (และอนุพันธ์) อยู่ในรุ่นเก่าที่ต้องใช้รูปแบบแฟ้มการกำหนดค่าที่แตกต่างกัน
Gert van den Berg

คำตอบ:


37

ฉันสามารถคิดถึงวิธีนี้ได้สองวิธี:


หนึ่งคือการให้บริการบริการผู้ใช้มากกว่าบริการระบบ

แทนที่จะสร้างหน่วยระบบหน่วย systemd $HOME/.config/systemd/user/daemon-name.serviceจะถูกวางไว้ภายใต้ไดเรกทอรีบ้านของผู้ใช้บริการที่ จากนั้นผู้ใช้เดียวกันสามารถจัดการบริการsystemctl --user <action> daemon-name.serviceกับ

ในการอนุญาตให้หน่วยผู้ใช้สามารถเริ่มต้นที่บูตsudo loginctl enable-linger usernameรากต้องเปิดใช้อิทธิพลสำหรับบัญชีคือ WantedBy=default.targetหน่วยนอกจากนี้ยังต้องมี


อีกวิธีคืออนุญาตให้ผู้ใช้เข้าถึงการจัดการหน่วยระบบผ่าน PolicyKit สิ่งนี้ต้องการ systemd 226 หรือสูงกว่า (และ PolicyKit> = 0.106 สำหรับไฟล์ JavaScript rules.d - ตรวจสอบด้วยpkaction --version)

คุณจะสร้างไฟล์การกำหนดค่า PolicyKit ใหม่เช่น/etc/polkit-1/rules.d/57-manage-daemon-name.rulesซึ่งจะตรวจสอบแอตทริบิวต์ที่คุณต้องการอนุญาต สำหรับตัวอย่างเช่น :

// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "example.service" &&
        subject.user == "alice") {
        return polkit.Result.YES;
    }
});

จากนั้นผู้ใช้สามารถจัดการชื่อบริการชื่อด้วยและโดยไม่ต้องใช้systemctlsudo


โหมดผู้ใช้และloginctlทำงาน
Shadur

1
ใช้งานกับ Ubuntu 16.04 ได้หรือไม่ เป็นเรื่องปกติหรือไม่ที่ไม่มีกฎ rules.d ฉันไม่สามารถทำงานได้ กฎของฉันถูกเพิกเฉย
2560

3
ฉันต้องรีสตาร์ทบางอย่างเพื่อให้ PolicyKit เปิดใช้งานหรือไม่
Josir

@MichaelHampton ด้วย systemd --user ฉันสามารถใช้งานได้ทุกอย่างที่ฉันต้องการยกเว้นการเริ่มต้นบริการเมื่อบู๊ต ฉันคิดว่านี่เป็นเรื่องปกติเมื่อฉันอ่านมันในหลาย ๆ ที่ (เช่น archlinux wiki) แต่คุณบอกว่ามันควรจะใช้ได้คุณแน่ใจหรือไม่
daks

@daks ใช่มันทำงานได้ หากคุณยังมีปัญหาอยู่ให้ถามคำถามใหม่
Michael Hampton

12

sudoทำเพื่อสิ่งนั้น แก้ไข/etc/sudoersไฟล์ของคุณด้วยvisudoเพื่อเพิ่มCmd_aliasคำสั่งที่คุณต้องการให้ผู้ใช้ที่ไม่มีสิทธิ์ใช้งานสามารถใช้งานได้:

# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>

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

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

อ่านเอกสารเพิ่มเติมเกี่ยวกับหัวข้อสำหรับพารามิเตอร์ต่างๆของคำสั่ง sudo

คุณอาจต้องติดตั้งsudoแพ็คเกจเพื่อให้มีsudoในระบบของคุณ


ฉันรู้วิธีใช้ sudo ใช่ ผมสงสัยว่าถ้ามีตัวเลือกว่าต้องการให้ฉันข้ามแม้กระทั่งว่าเนื่องจากในกรณีนี้สิ่งแรกที่ไฟล์หน่วยไม่สามารถระบุได้ว่าจะต้องมีการทำงานเป็นsystemd gamesrv
Shadur

1

คุณอาจเชื่อมโยงsudoกับการให้การเข้าถึงที่เทียบเท่าrootแต่สามารถใช้เพื่ออนุญาตการเข้าถึงรูทของผู้ใช้เฉพาะสำหรับชุดคำสั่งที่เฉพาะเจาะจงและ จำกัด

วิธีการดังกล่าวได้รับการตอบใน Server Fault แล้วที่ [ ให้การเข้าถึงชุดคำสั่งแก่ผู้ใช้ที่ไม่ใช่รูทโดยไม่มีการเข้าถึงsudoของชุดคำสั่งให้กับผู้ใช้ที่ไม่ใช่รูทโดยไม่ใช้ sudo)

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

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