Vượt qua Pudo qua sudo


13

Tóm lại : làm thế nào để sudo không tuôn ra PATH mọi lúc?

Tôi có một số trang web được triển khai trên máy chủ của mình (kiểm tra Debian) được viết bằng Ruby on Rails. Tôi sử dụng Mongrel + Nginx để lưu trữ chúng, nhưng có một vấn đề xuất hiện khi tôi cần khởi động lại Mongrel (ví dụ: sau khi thực hiện một số thay đổi).

Tất cả các trang web đều được kiểm tra trong VCS (git, nhưng điều đó không quan trọng) và có chủ sở hữu và nhóm được đặt cho người dùng của tôi, trong khi Mongrel chạy theo, người dùng mongrel bị hạn chế nghiêm trọng về quyền của nó. Vì vậy, Mongrel phải được bắt đầu dưới quyền root (nó có thể tự động thay đổi UID) hoặc mongrel.

Để quản lý mongrel tôi sử dụng gem mongrel_cluster vì nó cho phép bắt đầu hoặc dừng bất kỳ số lượng máy chủ Mongrel nào chỉ bằng một lệnh. Nhưng nó cần thư mục /var/lib/gems/1.8/bin để ở trong PATH: điều này là không đủ để bắt đầu nó với đường dẫn tuyệt đối .

Sửa đổi PATH trong root .bashrc không thay đổi gì, điều chỉnh enudo_reset của sudo và env_keep cũng không.

Vì vậy, câu hỏi: làm thế nào để thêm một thư mục vào PATH hoặc giữ PATH của người dùng trong sudo?

Cập nhật: một số ví dụ

$ env | grep PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin
$ sudo cat /etc/sudoers | egrep -v '^$|^#'
Defaults    env_keep = "PATH"
root    ALL=(ALL) ALL
%sudo ALL=NOPASSWD: ALL
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

Ngoài ra tôi có thể nói rằng nó cũng hoạt động chính xác theo cách này trong Debian ổn định (lenny).


Câu trả lời:


12

Đấu tranh với cùng một vấn đề trong vài giờ. Trong debian lenny, bạn có thể sửa nó bằng cách thêm

Defaults        exempt_group=<your group> 

vào tập tin sudoers.

Đây là cách duy nhất để đi xung quanh tùy chọn đường dẫn được biên dịch, (theo như tôi biết).

Đáng chú ý, điều này cũng sẽ miễn cho người dùng không cần nhập mật khẩu khi họ sudo.


3

Nếu bạn đã secure_paththiết lập /etc/sudoers, bạn có thể chơi với env_reset/ env_keeptất cả những gì bạn thích và nó sẽ không tạo ra bất kỳ sự khác biệt nào cho đường dẫn. Nếu bạn thấy một cái gì đó như thế này, bình luận nó ra.

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

Không, tất nhiên nó không được thiết lập.
Whitequark

0

Tôi muốn nói rằng hãy nhìn vào các tùy chọn env_reset và env_keep trong man sudo . Nhưng có vẻ như bạn đã làm điều đó (bạn chỉ gọi nhầm env_keep là "keepenv"). Nếu bạn tắt tùy chọn env_reset (mặc định được bật), tôi nghĩ rằng nó không có nghĩa vụ phải xóa bất kỳ biến env nào . Nhưng điều này là ít an toàn.

Ngoài ra còn có một tùy chọn safe_path để sudo; Tôi nghĩ rằng điều này được kích hoạt theo mặc định. Bạn có thể thử vô hiệu hóa nó.

Các tùy chọn trước được đặt trong tệp / etc / sudoers của bạn. Ngoài ra còn có -itùy chọn dòng lệnh để sudo. Điều đó sẽ khiến sudo chạy /root/.profile hoặc /root/.login. Bạn có thể thiết lập đường dẫn mong muốn của bạn ở đó.


1
Không, khi env_reset bị tắt, nó vẫn thay đổi (không xóa) PATH. Có lẽ điều này được thực hiện để thêm / * / sbin dirs. Không, tùy chọn -i không phù hợp vì nó khởi động trình bao tương tác và tôi chỉ cần chạy lệnh.
Whitequark

Được rồi, vấn đề đã biến mất sau khi cài đặt lại Debian (vì di chuyển sang LVM) và cả RubyGems; câu trả lời của bạn là hữu ích nhất trong tất cả vì vậy nó có thể được chấp nhận ngay bây giờ.
Whitequark

-1

Chà, bạn đang làm gì đó sai. Ngoài ra, bạn không chỉ định những gì bạn đã làm với tệp / etc / sudoers của mình. Đây là những gì bạn nên làm - đây là hệ thống CentOS, BTW:

Đầu tiên, đây là với cài đặt env_keep đúng (chú ý PATH ở đó):

sudo grep -5 PATH / etc / sudoers env_keep = "MÀU HIỂN THỊ

Defaults   timestamp_timeout = 15 

## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple

-> export PATH=$PATH:hithere
-> sudo sh -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/bin:hithere

Có vẻ tốt. Bây giờ, hãy xóa cài đặt env_keep và thử lại:

-> sudo visudo
-> sudo grep -5 PATH /etc/sudoers
                    LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                    LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                    LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                    LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                    _XKB_CHARSET XAUTHORITY"
 #_XKB_CHARSET XAUTHORITY PATH"

Thật là một PATH buồn:

 -> sudo sh -c 'echo $PATH'
 /usr/bin:/bin

1
Tôi đã kiểm tra NHIỀU HƠN hai lần! Kiểm tra cập nhật trong bài.
Whitequark

Tôi có cùng một vấn đề, tôi chắc chắn có các cài đặt đúng mà bạn đề cập
Draemon
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.