Cách an toàn để cho phép bất kỳ người dùng nào chạy chương trình trong không gian tên mạng cụ thể


9

Tôi có một modem di động được kết nối với máy chủ của mình mà tôi muốn sử dụng làm phương tiện để nhận email thông báo khi điện thoại cố định chết.

Để tách riêng quyền truy cập mạng bình thường và quyền truy cập modem di động đặc biệt này, tôi đã tạo một không gian tên mạng và tạo thiết bị mạng trong đó làm thiết bị duy nhất. Để có một chương trình sử dụng modem di động, tôi chỉ cần sử dụng ip netns exec.

Điều khó chịu là tôi muốn cho phép bất kỳ người dùng nào chạy bất kỳ chương trình nào họ muốn trong không gian tên, nhưng netns execyêu cầu root. Giải pháp của tôi là như sau:

/ usr / local / sbin / _oob_shim:

#!/bin/sh
cmd_line="$@"
/bin/ip netns exec oob \
    /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" /bin/sh -c "$cmd_line"

/ etc / sudoers:

ALL ALL=NOPASSWD: /usr/local/sbin/_oob_shim

Tôi nghĩ cách duy nhất để chạy shim mà không cần root hoặc biết mật khẩu gốc là thông qua sudo và tôi có thể tin tưởng sudo để đặt $ SUDO_UID và $ SUDO_GID đúng giá trị.

Tôi có tự mở ra rủi ro đáng kể không? Hoặc, tôi có nên nói là tôi thiếu bất kỳ cảnh báo rõ ràng nào không?

Câu trả lời:


6

Lỗi duy nhất tôi thấy với mã của bạn là bạn đang chạy lệnh của người dùng một cách không cần thiết sh -ckhi bạn chỉ nên chạy trực tiếp. Chạy nó thông qua sh -cmua cho bạn không có gì nhưng nó phá hủy trích dẫn mà người dùng ban đầu đưa vào lệnh. Ví dụ: thử điều này:

sudo /usr/local/sbin/_oob_shim ls -l "a b"

nên liệt kê một tệp được gọi a bbên trong ngữ cảnh của không gian tên nhưng thay vào đó, nó liệt kê hai tệp được gọi ab.

sudo /usr/local/sbin/_oob_shim ls -l "*"

nên liệt kê một tệp có tên *(dấu hoa thị), không thành công vì lý do tương tự.

Vì vậy, nó sẽ trông như thế này thay vào đó:

#!/bin/sh
/bin/ip netns exec oob \
    /usr/bin/sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"

Làm cho kịch bản đơn giản hơn để khởi động!

Một điểm khác tôi có thể đưa ra là mặc dù trong trường hợp này, lỗi chỉ là lỗi chức năng, không phải lỗi bảo mật, người ta luôn nghi ngờ khi kiểm tra mã nhạy cảm bảo mật và phát hiện ra rằng nó chạy mọi thứ thông qua shell bởi vì đó hầu như luôn là vấn đề.

Cuối cùng, các nhóm bổ sung của người dùng sẽ không được truyền vào không gian tên (họ chỉ nhận được uid và gid chính của họ), nhưng điều đó dường như không phải là một vấn đề lớn và việc sửa chữa không tầm thường.

Ngoài ra, nó có vẻ tốt với tôi.


1
Sử dụng shell không mua được gì cho tôi, nó ngăn chặn sudo /usr/local/sbin/_oob_shim -u root cat /etc/shadowđó là một lỗ hổng trong phiên bản được đề xuất của bạn. Mặc dù bạn hoàn toàn đúng về việc trích dẫn, tôi sẽ bắt đầu sudo -u "#$SUDO_UID" -g "#$SUDO_GID" -- "$@"và tiếp tục tìm kiếm các lỗ hổng bảo mật.
Michael Shick

Bạn rất đúng về việc người dùng có thể ghi đè các tùy chọn với phiên bản của tôi. Tôi hoàn toàn bỏ lỡ điều đó. Giải pháp sử dụng của bạn --nếu tất nhiên đúng. Tôi nên chỉnh sửa nó để trả lời!
Celada
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.