สคริปต์ใดที่ทำให้ผู้ใช้ทั่วไปสามารถใช้เนมสเปซเครือข่ายได้


22

ฉันมีสถาปัตยกรรมที่ใช้เนมสเปซเครือข่าย (netns) ฉันต้องการอนุญาตให้ผู้ใช้ทั่วไปทำการดำเนินการบางอย่างในเน็ตเหล่านี้

ฉันสามารถเขียนสคริปต์netns-exec.shซึ่งได้รับแรงบันดาลใจจากโพสต์นี้ดำเนินการโดยsudoมี:

ip netns exec $1 su $USER -c "$2"

และเพิ่มลงในไฟล์ sudoer ของฉัน:

user ALL=(ALL) /path/to/netns-exec.sh

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


1
ทำไมคุณไม่กำหนดCmd_Alias CMD_NETNS = ip netns exec [regexp matching your namespace] su [regexp matching allowed used] -c [regexp matching allowed namespace command]ในไฟล์ sudoers ของคุณแล้วสร้างกลุ่มที่คุณใส่ผู้ใช้ที่ได้รับอนุญาตของคุณและเชื่อมโยงกลุ่มนี้กับนามแฝงคำสั่งนี้
netmonk

2
มันเป็นsudoสิ่งsuที่ทำให้ฉันรำคาญไม่ใช่สคริปต์ อย่างไรก็ตามฉันจะเขียนสคริปต์เพื่อห่อสิ่งนั้น มันทำให้สวิตช์ของผู้ใช้ 2 อันมันน่าเกลียดจริง ๆ คุณไม่คิดเหรอ?
Raspbeguy

6
ที่ควรทำให้คุณกลัว ผู้ใช้สามารถแก้ไข $ USER เป็นรูทได้
สตีเฟ่น

1
ใช่แล้วมันทำให้ฉันกลัว แต่ฉันคิดออกภายหลังว่าsudoมีตัวแปรเฉพาะ$SUDO_USERซึ่งปลอดภัยกว่า แต่นั่นก็ยังน่าเกลียด
Raspbeguy

1
@Elronnd - เคอร์เนลละเว้น setuid บนสคริปต์
Angelo

คำตอบ:


1

โซลูชันที่ 1

เพียงเพิ่มกลุ่มที่เรียกว่า "netns" เพิ่มผู้ใช้ที่ต้องการลงในกลุ่ม จากนั้นให้ความเป็นเจ้าของกับรูท: netns และให้ความสามารถในการอ่าน / ผู้บริหารให้กับกลุ่ม

ในแง่อื่น ๆ :

# New group netns
sudo groupadd --system netns

# Add root to "netns", not sure if needed
sudo usermod -aG netns root

# Do this for every needed user
sudo usermod -aG netns $UserName

# Change ownership to root, grant rw acces to group netns
sudo chown root:netns /path/to/netns-exec.sh
sudo chmod 633 /path/to/netns-exec.sh

โซลูชันที่ 2

วิธีนี้ง่ายกว่าคุณต้องแก้ไขไฟล์ sudoers ตามที่แสดงในตัวอย่างนี้

user ALL=(ALL) /bin/ip netns

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

สิ่งนี้chmod 0633จะให้write+executeสิทธิ์แก่ผู้ใช้และnetnsกลุ่ม ฉันสงสัยว่าคุณต้องการที่จะตั้งค่าบิต SGID ในสคริปต์ แต่เป็น @Angelo กล่าวถึง: setuidและsetgidจะถูกละเว้นสำหรับเชลล์สคริปต์และสำหรับเหตุผลที่ดี
ckujau

0

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

#!/bin/bash
# ip netns wrapper script, nns.
# Usage: nns nsname cmdline

case "${1}" in
    do)
        shift # remove "do"
        NSNAME="${1}" # remember nsname
        shift # remove nsname to get argument list for su -c
        [ -z "${NSNAME}" -o -z "${1}" ] && exit 1 # if either nsname or arglist is empty - error out
        echo ip netns exec "${NSNAME}" su "${SUDO_USER}" -c "${*}" # execute, ${*} merges separate arguments into single word for su/sh -c parsing. See with strace.
    ;;
    *)
        SCRIPTNAME="${0}" # remember script full path
        exec sudo "${SCRIPTNAME}" do "${@}" # run it through sudo with elevated privileges
    ;;
esac

ติดตั้งที่ใดที่หนึ่ง/usr/binและอนุญาตให้ผู้ใช้ของคุณดำเนินการได้


ขอบคุณสำหรับการตอบกลับของคุณ (และขออภัยที่สังเกตเห็นหลายเดือนหลังจากนั้น) แต่ปัญหายังคงเหมือนเดิมคือการพูดโดยใช้ sudo
Raspbeguy

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