Làm thế nào để tôi thực hiện sudo bảo vệ các biến môi trường của tôi?


47

Sử dụng sudo 1.7.4p4 trên Solaris 5.10 và sudo 1.6.7p5 trên RHEL4 u6 Tôi không thể thấy cách bảo tồn các biến môi trường của mình, ví dụ $ PYTHONPATH. Tôi đã thêm dòng này vào sudoers, nhưng nó không tạo ra sự khác biệt nào:

Defaults !env_reset

Tôi đang làm gì đó sai, hay cài đặt sudo đơn giản là không tôn trọng cờ env_reset?

Chỉnh sửa: Ít nhất là trên Solaris, chúng tôi thấy rằng vấn đề này phụ thuộc vào vỏ! Vỏ gốc tiêu chuẩn là Bourne, mặt khác, nếu chúng ta chạy bash dưới sudo ( sudo bash), thì env_preset sẽ bảo vệ môi trường (bao gồm cả PATH và LD_LIBRARY_PATH). Đây là hành vi khá khó hiểu tôi phải nói.


Câu trả lời:


44

Sử dụng cẩn thận, có vấn đề bảo mật với sudo và các biến.

Từ man sudoerstôi thấy rằng bạn nên sử dụng

Mặc định env_reset
Mặc định env_keep + = "PYTHONPATH YETANOTHER KHÁC"

Trong Ubuntu, sudokhông bảo tồn một số biến. sudo -igiống như đăng nhập bằng root và sau đó chạy lệnh. Cả hai có thể bất tiện, trước đây để sudo nano myfilelại các tập tin thuộc sở hữu gốc trong nhà của bạn và sau này sudo -i nano myfilesẽ cố gắng mở / root / myfile.


Chạy

sudo printenv PATH

và xem những gì nó mang lại. Nó ở đây

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

ví dụ. Bây giờ chạy sudo visudovà thêm dòng

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

thay thế bởi những gì bạn tìm thấy trước đây. Nối một đường dẫn mới vào nó nếu bạn cần.

Về thư viện:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

Các bản phân phối Linux rất quan tâm PATHvà bạn thực sự nên cẩn thận trước khi chơi với nó. Đặc biệt cẩn thận về việc thêm các đường dẫn như " ." hoặc /home/username, nó không an toàn.

Một trong những mối nguy hiểm của việc thêm đường dẫn là nó mở ra khả năng các tệp trên các đường dẫn này được thực thi bằng cách rootmở một cửa sổ trong bảo mật hệ thống có thể bị phần mềm độc hại khai thác. Có thể có những nguy hiểm khác. Chỉ cần chắc chắn rằng bạn biết những gì bạn đang làm. Bỏ qua sudocác biện pháp bảo mật có thể khiến Solaris của bạn an toàn như Windows XP.


Cám ơn vì sự gợi ý. Trên Solaris ít nhất, có vẻ như env_keep chỉ hoạt động một phần, vì nó bỏ qua PATH và LD_LIBRARY_PATH. Có lẽ sudo được xây dựng với các cài đặt khiến nó từ chối bảo tồn các biến "nguy hiểm"?
aknuds1

Nó có hoạt động với một vai khác, như AKNUDS không? Bạn cũng có thể chạy sudo sudo -V (vâng, hai lần sudo!) Và xem những gì nó nói. Ở đây, giải pháp trên hoạt động tốt với PYTHONPATH, nhưng PATH thực sự có vẻ đặc biệt. Vấn đề thực sự là với PATH. Trong Ubuntu, họ xây dựng sudo cố tình thiết lập lại PATH.
dùng39559

env_keep bảo quản PYTHONPATH và HOME cho tôi, vì vậy rõ ràng có một số bộ lọc đang diễn ra.
aknuds1

Trong giải pháp sửa đổi của bạn, bạn đang đề xuất rằng tôi cứng cáp sudo PATH bằng cách sửa đổi safe_path, phải không? Tôi không nghĩ rằng tôi muốn làm điều đó. Có lẽ chúng ta gần với một câu trả lời cho câu hỏi của tôi; Tôi nghĩ rằng sudo được xây dựng để bỏ qua reset_env và bỏ qua các biến như PATH và LD_LIBRARY_PATH, khi được chỉ định với env_keep. Tôi nghĩ rằng tôi có thể làm mà không cần bảo quản PATH / LD_LIBRARY_PATH theo sudo, nó không phải là vấn đề lớn, nhưng vẫn rất thú vị để biết lý do tại sao nó sẽ không hoạt động :)
aknuds1

Nó sẽ không hoạt động vì sudocác nhà văn đã cẩn thận trong việc ngăn cản bạn làm điều đó. Bạn không muốn thư viện độc hại được tải vì chúng được tìm thấy trong đường dẫn được sử dụng bởi sudo. Vì vậy, đó là lý do tại sao nó được thiết lập lại. Nếu bạn đang mã hóa những thứ có nghĩa là được chạy bởi root, hãy sao chép chúng vào thư mục hệ thống thích hợp.
dùng39559

8

Đấu tranh với sudoerslà phải được thực hiện một cách thận trọng, như những người khác đã nói.

Một cách tiếp cận đơn giản hơn cho các trường hợp đơn giản hơn khi có các biến môi trường cụ thể mà bạn muốn bảo tồn là chỉ truyền biến môi trường mà bạn muốn trực tiếp thông qua sudo (điều này được thể hiện như [VAR=value]trong trợ giúp cmdline sudo).

Xem ví dụ nhỏ này, nơi tôi cũng đã chứng minh nó cho nhiều hơn một biến.

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

Đối với PYTHONPATHví dụ ban đầu trong câu hỏi, chỉ cần sử dụng như sau:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

Tạo một bí danh cho loại điều này là tiện dụng. Thích như vậy:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'

1
có thể là tốt để làm cho điều đó - bí danh sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - sau đó sử dụng nó sudopy some_script.py
Có khả năng Mac

@AbleMac Bạn nói đúng. Đó là một sai lầm ... Tôi sẽ sửa nó. Cảm ơn!
Nga

3

Ngoại hình của bạn Defaults !env_resetổn, giả sử bạn không gọi sudo bằng -Etùy chọn.

Bạn có thể thử loại bỏ hoàn toàn mục đó.

Bạn đã xác minh bạn đang chỉnh sửa tệp sudoers chính xác chưa? Tôi đoán nó có thể /etc/sudoershoặc /usr/local/etc/sudoerstùy thuộc vào cách nó được cài đặt. Bạn đã chỉnh sửa nó bằng cách sử dụng visudo?

Làm thế nào bạn đang chạy sudo? sudo python, sudo su, sudo su -, sudo -s, Cái gì khác? Chỉ sudo pythonsudo susẽ bảo vệ môi trường của bạn.

env | grep PYTHONPATHnói gì Nếu không có gì, hãy đảm bảo PYTHONPATH được xuất bằng cách chạy export PYTHONPATHvà thử lại.

sudo env | grep PYTHONPATHnói gì Nếu nó in giá trị mong đợi, thì một cái gì đó khác sẽ ghi đè lên giá trị PYTHONPATH của bạn. Có thể root .bashrc hoặc .bash_profile hoặc các tệp cấu hình trên toàn hệ thống.


1
Tôi khá chắc chắn rằng tôi đang chỉnh sửa sudoers chính xác, với tiền tố cài đặt tương ứng với sudo. Tôi đang chạy sudo là "sudo su". Tôi sẽ phải liên lạc lại với bạn, trong một vài ngày không may, hãy viết những lời đề nghị còn lại. Cảm ơn!
aknuds1

1
Hãy thử thay đổi cài đặt không quan trọng như editorhoặc passpromptđể xem bạn có đúng tệp không. Hoặc sử dụng strace, dtrace, truss hoặc tương tự và xem những gì nó mở tập tin.
Mikel

env | grep PYTHONPATH khi người dùng của tôi in giá trị mong đợi, theo sudo, tuy nhiên, không có gì được in. Chỉnh sửa sudoers, tôi có thể đảm bảo rằng PYTHONPATH được bảo tồn bằng cách sửa đổi "env_keep". Tuy nhiên, env_keep sẽ không bảo tồn PATH hoặc LD_LIBRARY_PATH. Tôi đoán sudo có một hạn chế bảo mật để không bảo toàn các biến như PATH và LD_LIBRARY_PATH? Một thiết lập thời gian xây dựng có lẽ?
aknuds1

1
! env_reset bị bỏ qua theo như tôi có thể nói, nhưng tôi có thể kiểm tra lại vào ngày mai. Tôi khá chắc chắn env_delete không được thiết lập, nhưng tôi cũng có thể kiểm tra điều đó.
aknuds1

1
Tôi đã xác nhận rằng! Env_reset bị bỏ qua và env_delete không được đặt.
aknuds1

-1

Theo tài liệu Ubuntu cho LD_LIBRARY_PATH :

Bạn phải sử dụng tập tin cấu hình /etc/ld.so.conf.d/*.conf

Sau đó:

  1. Thêm một ld.sotệp cấu hình /etc/ld.so.conf.d/với đường dẫn của bạnLD_LIBRARY_PATH

  2. Cập nhật bộ đệm với:

    sudo ldconfig -v
    

Đẹp, nhưng câu hỏi không phải là về Ubuntu. Gợi ý: Lần sau hãy nhìn vào các thẻ dưới câu hỏi.
DavidPostill
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.