Sudo vs gốc; bất kỳ sự khác biệt thực tế?


44

Tôi đang làm việc với một thành viên hỗ trợ cho một sản phẩm và anh ấy khẳng định rằng tôi cần phải root để cài đặt một loạt các bản vá, và sudo đó sẽ không hoạt động; anh ta không cung cấp một lý do nhưng có vẻ rất vững chắc trong niềm tin của mình. Duyệt Superuser Tôi không thể xác định bất kỳ lý do có thể nào cho trường hợp này và trong xác nhận, khi tôi chạy:

sudo -l

Tôi có:

...
User [MY USERNAME] may run the following commands on this host:
    (ALL) ALL

Việc truy cập từ nhóm Linux / máy chủ thực sự là root không phải là một quá trình bắt chước như tôi hiểu, vì vậy tôi muốn tự mình cài đặt chúng.

Có bất kỳ lý do thực tế nào tại sao sudo sẽ hành xử khác với root để cài đặt phần mềm trên máy chủ không?


2
Tôi nghĩ bạn nên ném lại cho anh ta. Như những người khác đã chỉ ra, có vô số cách để lấy root bằng sudo và nếu anh ta không thể cung cấp cho bạn một lý do cụ thể là tại sao sudo không đủ, thì anh ta không có chỗ đứng.
Garrett

1
Môi trường và các tiểu ban đến với tâm trí. Tôi nghĩ rằng Hastur đã làm rất tốt với môi trường và Jayen đã làm một công việc rất tốt với các tiểu ban, đường ống và chuyển hướng.
jww

2
Garrett có một điểm tốt, nhưng trước khi tôi tham gia một cuộc thi bực mình tiềm năng, tôi sẽ hỏi thành viên hỗ trợ: bạn đã thử cả hai cách và nó đã thất bại một trong những cách đó chưa? Anh ta có thể đã đi vào con đường thất bại sudovà các kịch bản như các kịch bản hiện đang được viết. Nếu đó là trường hợp, thì câu trả lời của sds có thể hữu ích nhất cho bạn : sudo su -.
jww

Câu trả lời:


34

Nó hoàn toàn phụ thuộc vào cách bạn gọi chương trình của bạn với sudohoặc su.
Ví dụ, trên hệ thống mà tôi đang ở thời điểm này:

                  .bashrc                        
    COMMAND        $HOME   $USER  Env.  $PATH
 1. sudo -i        (root)   root  root  [1]
 2. sudo -s        (USER)   root  USER  /home/${USER}/bin:[1]
 3. sudo /bin/bash (USER)   root  USER  /home/${USER}/bin:[1]  
 4. sudo su        (root)   root  USER  [1]:/usr/games:/usr/local/games  
 5. sudo su -      (root)   root  root  [1] 

Trong đó [1] = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin
Env = Biến môi trường được đặt lại cho 1 và 5, được lấy từ $ USER trong 2,3,4.

Vì vậy, một kịch bản, hoặc một chương trình được tung ra với một lựa chọn khác nhau có thể nhìn thấy nhau $PATH, $HOME, vỏ của nó có thể đọc khác nhau .bashrc, .profilevà các biến môi trường. Nó đọc các tập tin liên quan với $HOME. Mỗi người dùng có thể sửa đổi môi trường của mình theo một cách khác nhau (biến $PATH, .bashrc, .profile, .bash_profile, bí danh ...). Cụ thể, một người dùng có thể có một thứ tự khác nhau của các thư mục trong đó $PATHvà do đó, một tập lệnh có thể thực thi một lệnh, ví dụ /home/$USER/binthay vào đó là một thư mục trong đường dẫn được mong đợi từ root.

Bạn có thể chạy chương trình theo sudo -inhư bạn đã đăng nhập bằng root su -, nhưng bạn có thể có hành vi khác nếu bạn chạy nó với sudo MyCommandhoặc với su -c MyCommand.


Từ man su:

Trong phần mô tả:
Môi trường hiện tại được chuyển sang shell mới . Giá trị của $ PATH được đặt lại thành / bin: / usr / bin cho người dùng bình thường hoặc / sbin: / bin: / usr / sbin: / usr / bin cho siêu người dùng
...
Trong phần tùy chọn:
- , -l , --login
Cung cấp một môi trường tương tự như những gì người dùng mong đợi nếu người dùng đăng nhập trực tiếp .

Từ người đàn ông sudo

-i , --login
Chạy shell được chỉ định bởi mục nhập cơ sở dữ liệu mật khẩu của người dùng đích làm shell đăng nhập. Điều này có nghĩa là các tệp tài nguyên dành riêng cho đăng nhập như .profile hoặc .login sẽ được đọc bởi trình bao. Nếu một lệnh được chỉ định, nó được chuyển đến shell để thực thi thông qua tùy chọn -c của shell. Nếu không có lệnh nào được chỉ định, shell tương tác được thực thi. sudocố gắng thay đổi thư mục chính của người dùng đó trước khi chạy shell. Lệnh được chạy với môi trường tương tự như môi trường mà người dùng sẽ nhận được khi đăng nhập . Phần Môi trường lệnh trong tài liệu thủ công sudoers (5) làm thế nào tùy chọn -i ảnh hưởng đến môi trường mà lệnh được chạy khi sử dụng chính sách sudoers.


Câu trả lời chính xác. Tôi vẫn là người mới làm quen với Linux, nhưng có một điểm khác biệt nữa là những gì bạn có thể làm khi sử dụng sudocó thể bị giới hạn bởi các quyền trong tệp sudoers so với thực hiện những việc mà root không có những hạn chế đó? Trích dẫn khối cuối cùng có thể ngụ ý điều đó, nhưng nếu tôi hiểu chính xác, đó dường như là một sự khác biệt đáng kể khác ngoài môi trường (hoặc có thể vì môi trường?).
fixer1234

23

Nếu bạn có sudoquyền truy cập đầy đủ , bạn có thể trở nên rootsử dụng sudo su -, vì vậy điểm bảo mật là không cần thiết.

Thật vậy, có một cách để phân biệt sự khác biệt giữa một chương trình được chạy rootvà một chương trình được chạy theo sudo- sử dụng getuidvs geteuid- nhưng đây là một thủ thuật giả định. Tại sao một hệ thống vá sẽ làm điều đó?


5
Nói về su -, anh ta có thể muốn sử dụng sudo -iđể anh ta có môi trường giống như khi đăng nhập trực tiếp.
Cristian Ciupitu

2
Nếu bạn chạy với ví dụ: sudo myscriptbạn sẽ giữ $ PATH và các biến môi trường từ shell mà bạn đang ở. Nếu bạn chạy với sudo -i myscriptbạn chạy như thể bạn đăng nhập bằng root. Xem câu trả lời với _zoo của các cuộc gọi
Hastur

1
Tôi nghĩ điều quan trọng là chỉ ra rằng các biến môi trường có thể không được thiết lập giống sudonhư khi đăng nhập bằng root
secretformula

1
@dmanexe: sudo không đại diện cho superuser do, đó là "chuyển đổi người dùng làm". su và sudo có thể được sử dụng để chuyển sang bất kỳ người dùng nào thay vì chỉ siêu người dùng. Ngoài ra không có gì giả về sudo, bạn thực sự có được root thực sự khi chạy sudo chứ không phải giả mạo gì cả. Lưu ý rằng phép thuật của sudo thực sự đến từ bit cho phép setuid.
Nói dối Ryan

2
sds, @CharlesDuffy: Ý tưởng rằng sudo và su gây ra geteuid()getuid()khác biệt với nhau là một huyền thoại. su và sudo thay đổi cả ID người dùng thực và hiệu quả thành ID người dùng đích trước khi chạy lệnh hoặc shell được chỉ định, ngoại trừ trong trường hợp rất bất thường mà bạn đã cấu hình rõ ràng để hành xử theo cách khác. Bạn có thể xác minh điều này (đối với sudo) bằng cách chạy sudo id -usudo id -ru(cả hiển thị 0), đọc sudo (8) (theo THỰC HIỆN QUY ĐỊNH ) hoặc viết chương trình thử nghiệm .

7

Có một vài sự khác biệt nếu bạn nhận được một vỏ gốc, như được chỉ ra bởi @Hastur.

Nếu bạn không nhận được một vỏ gốc, thì có nhiều sự khác biệt. Thành viên hỗ trợ có thể có kinh nghiệm cố gắng thực hiện những việc như chạy sudo patch -p0 < /root/patch.fileở đâu patchbằng root, nhưng <(đường ống từ tệp) thì không.


1
Phải: quan điểm thực tế thường đưa ra những gợi ý khó phát hiện hơn chỉ từ các trang người đàn ông. Để khắc phục tình trạng tương tự, bạn buộc phải tập gym nhiều hơn [:-)], ví dụ như viết một cái gì đó như sudo /bin/bash -c "./patch -p0 < /root/patch". Tinh tế hơn nữa là trường hợp khi bạn sử dụng chuyển hướng để tạo một tập tin >. Theo cách đầu tiên, bạn sẽ tạo một tệp thuộc về người dùng chỉ khi bạn có đủ quyền để viết trong thư mục cuối cùng. Theo cách sau, bạn sẽ tạo một tệp thuộc sở hữu của root ... mặt tối của Unix ;-)
Hastur

1

Tôi tin tưởng khi sử dụng truy cập sudo, một tệp nhật ký được tạo, tuy nhiên khi chạy trực tiếp thông qua quyền truy cập root thì không có.


0

Nó phụ thuộc vào mức độ chi tiết mà bạn muốn truy cập root được. Nếu bạn có một vài người dùng thực hiện các tác vụ khác nhau trên một hệ thống thì sudo sẽ lý tưởng hơn. Một ví dụ tôi sử dụng thường xuyên là cần phải khởi động lại một ứng dụng hoặc cơ sở dữ liệu. Bảo mật luôn được thực hiện tốt nhất ít đặc quyền nhất. Tôi sử dụng các nhóm và chỉ cho phép các nhóm đó thực hiện các hành động rõ ràng. Một cuốn sách hay mô tả quá trình này là "Sudo Mastery: Kiểm soát truy cập người dùng cho người thật". Thật ra nó là một cuốn sách hay về sudo nói chung ...

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.