Kịch bản nào có thể cho phép người dùng thường xuyên sử dụng không gian tên mạng?


22

Tôi có một kiến ​​trúc sử dụng không gian tên mạng (netns). Tôi muốn cho phép người dùng thường xuyên thực hiện một số thao tác trong các mạng này.

Tôi có thể viết một kịch bản netns-exec.sh, lấy cảm hứng từ bài đăng này , được thực hiện với sudo, chứa:

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

và thêm vào tập tin sudoer của tôi:

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

Nhưng tôi thấy nó xấu đến nỗi tôi hoàn toàn có thể gặp ác mộng về nó. Có một giải pháp tốt hơn để cho phép người dùng thường xuyên sử dụng không gian tên? Có thể đưa người dùng vào một số nhóm hữu ích? Tôi đã tìm kiếm về nó nhưng không tìm thấy gì.


1
tại sao bạn không xác định Cmd_Alias CMD_NETNS = ip netns exec [regexp matching your namespace] su [regexp matching allowed used] -c [regexp matching allowed namespace command]trong tệp sudoers của mình và sau đó tạo một nhóm trong đó bạn đặt người dùng được phép của mình và liên kết nhóm này với bí danh lệnh này.
netmonk

2
sudochứa một suthứ gây khó chịu cho tôi, không phải chính kịch bản. Dù sao, tôi sẽ viết một kịch bản để bọc. Nó làm cho 2 người dùng chuyển đổi, điều đó thực sự xấu xí, bạn có nghĩ vậy không?
Raspbeguy

6
Điều đó sẽ làm bạn sợ. Người dùng có thể sửa đổi $ USER để được root.
Stephen

1
Vâng, và nó làm tôi sợ. Nhưng tôi đã tìm ra sau đó sudocung cấp một biến cụ thể $SUDO_USER, an toàn hơn. Nhưng điều đó vẫn xấu.
Raspbeguy

1
@Elronnd - kernel bỏ qua setuid trên các tập lệnh
Angelo

Câu trả lời:


1

Giải pháp 1

Chỉ cần thêm một nhóm được gọi là "netns" thêm tất cả người dùng mong muốn vào nó. Sau đó, trao quyền sở hữu cho root: netns và cung cấp khả năng đọc / thực thi cho nhóm.

Nói cách khác:

# 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

Giải pháp 2

Giải pháp này đơn giản hơn, bạn phải chỉnh sửa tệp sudoers của bạn như trong ví dụ này .

user ALL=(ALL) /bin/ip netns

Vâng, giải pháp 1 là không thể, lệnh ip netnssẽ trả về một lỗi nói rằng chỉ root mới có thể thực thi nó. Giải pháp 2 là những gì tôi đã có trong đầu, nhưng theo tôi thì không thỏa mãn.
Raspbeguy

Điều này chmod 0633sẽ cung cấp write+executequyền cho tất cả người dùng và cho netnsnhóm. Tôi nghi ngờ bạn muốn đặt bit SGID trên tập lệnh, nhưng như @Angelo đã đề cập: setuidsetgidbị bỏ qua cho tập lệnh shell và vì lý do chính đáng .
ckujau

0

Cá nhân tôi không biết liệu có khả năng cho phép người dùng thường xuyên chạy các lệnh trong các không gian tên mạng khác nhau hay không, nhưng tập lệnh shell được chú thích này có thể phù hợp hơn với nhu cầu của bạn:

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

Cài đặt nó ở đâu đó trong /usr/binvà cho phép người dùng của bạn thực thi nó.


Cảm ơn phản hồi của bạn (và xin lỗi vì đã nhận thấy vài tháng sau). Nhưng vấn đề vẫn như cũ, đó là nói sử dụng sudo.
Raspbeguy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.