Tại sao lệnh sudo không cần mật khẩu root?


48

Tôi đã sử dụng Linux được một thời gian và bất cứ khi nào tôi gõ, sudotôi nghĩ rằng tôi đang chuyển sang người dùng root để nhận lệnh.

Rõ ràng điều này không đúng vì tất cả những gì tôi cần là mật khẩu tài khoản người dùng của tôi. Tôi đoán vì tôi đã không làm việc với nhiều người dùng nên tôi thực sự không nhận thấy điều này trong thế giới thực.

Tôi không chắc chắn cách Ubuntu thiết lập tài khoản đầu tiên của tôi. Có một người dùng root? Tôi có gốc không? Tôi đoán tôi vừa tạo một người dùng mới khi cài đặt nhưng nó cho tôi quyền root? Chỉ có một chút bối rối ở đây ...

Vậy tại sao tôi được phép chạy các lệnh root bằng mật khẩu của người dùng?


Sử dụng người dùng nào bạn cần mật khẩu và bạn không cần mật khẩu? Lệnh nào bạn đang chạy? Hãy nhớ rằng, sudo lưu mật khẩu của bạn trong một thời gian trước khi bạn phải nhập lại mật khẩu.
Braiam

11
sudocó tập bit "setuid". Vì vậy, nó chạy như người dùng sở hữu nó (là root trên tất cả các hệ thống tiêu chuẩn nếu tôi không nhầm lẫn), không phải người dùng khởi chạy nó. sudosau đó tải /etc/sudoerstệp và kiểm tra những gì được phép dựa trên người đã khởi chạy nó.
LawrenceC


1
Tôi xin lỗi nếu tôi lặp lại điều gì đó mà người khác nói, nhưng tôi không thể tìm thấy nó. Câu trả lời là: Đó là một quyết định chính sách. Dự đoán tốt nhất của tôi về động lực là, trong một cài đặt lớn nơi bạn có nhiều người có sudođặc quyền, có thể làm việc tại các địa điểm phân phối theo địa lý và trên ca 24 × 7, bạn muốn có thể thu hồi quyền truy cập đặc quyền của một người ngay lập tức (ví dụ: bạn nghi ngờ tính chính trực của anh ấy). Nếu mọi người đang sử dụng mật khẩu gốc một và duy nhất và bạn thay đổi mật khẩu đó mà không có sự phối hợp trước, sự hỗn loạn có thể xảy ra. Tiết kiệm
G-Man nói 'Phục hồi Monica'

1
@HagenvonEitzen Tôi biết tôi trễ một vài ngày, nhưng làm thế nào đây không phải là một câu hỏi của chúng tôi?
strugee

Câu trả lời:


65

Trong chi tiết, nó hoạt động theo cách sau:

  1. /usr/bin/sudotệp thực thi có tập bit setuid , vì vậy ngay cả khi được thực thi bởi người dùng khác, nó vẫn chạy với id người dùng của chủ sở hữu tệp (gốc trong trường hợp đó).

  2. sudokiểm tra trong /etc/sudoerstập tin những đặc quyền nào bạn có và liệu bạn có được phép chạy lệnh bạn đang gọi hay không. Nói một cách đơn giản, /etc/sudoerslà một tệp xác định người dùng nào có thể chạy lệnh nào bằng sudocơ chế.

    Đó là cách tập tin đó tìm trên Ubuntu của tôi:

    # User privilege specification
    root    ALL=(ALL:ALL) ALL
    
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL
    
    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL
    

    Dòng thứ ba là những gì có lẽ bạn quan tâm. Nó cho phép bất cứ ai trong nhóm "sudo" thực hiện bất kỳ lệnh nào như bất kỳ người dùng nào.

    Khi Ubuntu thiết lập tài khoản đầu tiên trong khi cài đặt, nó sẽ thêm tài khoản đó vào nhóm "sudo". Bạn có thể kiểm tra những nhóm người dùng thuộc về grouplệnh nào.

  3. sudohỏi bạn mật khẩu Về thực tế là nó cần mật khẩu của người dùng, không phải mật khẩu gốc, đó là một đoạn trích từ hướng dẫn sử dụng sudoers :

    Xác thực và đăng nhập

    Chính sách bảo mật của sudoers yêu cầu hầu hết người dùng tự xác thực trước khi họ có thể sử dụng sudo. Không cần mật khẩu nếu người dùng gọi là root, nếu người dùng đích giống với người dùng gọi hoặc nếu chính sách đã vô hiệu hóa xác thực cho người dùng hoặc lệnh. Không giống như su (1), khi sudoers yêu cầu xác thực, nó xác nhận thông tin đăng nhập của người dùng, chứ không phải thông tin đăng nhập của người dùng đích (hoặc gốc). Điều này có thể được thay đổi thông qua các cờ rootpw, targetpw và runaspw, được mô tả sau.

    Tuy nhiên, trên thực tế, sudokhông cần mật khẩu người dùng của bạn cho bất cứ điều gì. Nó yêu cầu nó chỉ để đảm bảo rằng bạn thực sự là bạn và cung cấp cho bạn một số loại cảnh báo (hoặc cơ hội để dừng lại) trước khi gọi một số lệnh nguy hiểm tiềm tàng. Nếu bạn muốn tắt mật khẩu yêu cầu, hãy thay đổi mục nhập sudoers thành:

    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. Sau khi xác thực sudosinh ra tiến trình con chạy lệnh được gọi. Đứa trẻ kế thừa id người dùng gốc từ cha mẹ của nó - sudoquá trình.


Vì vậy, trả lời chính xác câu hỏi của bạn:

Tôi nghĩ rằng tôi đã chuyển sang người dùng root cho một lệnh.

Bạn đa đung. Mỗi lệnh đi trước sudochạy với id người dùng gốc.

Có một người dùng root?

Có, có một tài khoản người dùng root, tách biệt với tài khoản người dùng của bạn được tạo trong quá trình cài đặt hệ thống. Tuy nhiên, theo mặc định trong Ubuntu, bạn không được phép đăng nhập vào thiết bị đầu cuối tương tác với tư cách là người dùng root.

Tôi có gốc không?

Không, bạn không phải là một gốc. Bạn chỉ có đặc quyền để chạy các lệnh riêng lẻ như một root , sử dụng sudocơ chế được mô tả ở trên.

Vậy tại sao tôi được phép chạy các lệnh root bằng mật khẩu của người dùng?

Bạn phải nhập mật khẩu của người dùng chỉ do sudocơ chế bảo mật nội bộ. Nó có thể dễ dàng tắt. Bạn có được quyền hạn gốc của mình vì bit setuid /usr/bin/sudochứ không phải vì bất kỳ mật khẩu nào bạn nhập.


6
Câu trả lời nên thực sự bắt đầu với phần setuid, bởi vì đó là lý do mà nó thực sự có thể. / etc / sudoers chỉ là lý do cho tính linh hoạt của lệnh sudo.
daniel kullmann

Hấp dẫn. Tôi không biết rằng bạn có thể chỉ định rằng sudocó thể chạy mà không cần nhập mật khẩu của tôi. Câu trả lời chính xác!
jwir3

1
Lưu ý rằng sudo có thể được cấu hình để yêu cầu mật khẩu gốc với rootpwcờ trong sudoers.
Phục hồi Monica - M. Schröder

2
Thực tế bạn có thể đăng nhập với tư cách là người dùng root: sudo su - rootsẽ làm điều đó và cung cấp cho bạn một thiết bị đầu cuối gốc. Tuy nhiên, bạn không thể dễ dàng đăng nhập vào một phiên máy tính để bàn như root.
jmiserez

1
Về cơ bản sudocó đặc quyền gốc, và nó quyết định có truyền đạt cho bạn dựa trên tệp cấu hình hay không.
Siyuan Ren

15
  • Toàn bộ vấn đề sudolà cấp cho bạn đặc quyền của người khác (thường là root) mà không yêu cầu mật khẩu của tài khoản khác này (không giống như su).

  • sudo đang hỏi mật khẩu của bạn ở đây chỉ để đảm bảo người qua đường sẽ không sử dụng sai thiết bị đầu cuối đã mở khóa của bạn.

  • Ubuntu và nhiều hệ điều hành Linux và Unix khác đang cấp một tài khoản ban đầu được tạo khi cài đặt có quyền chạy bất kỳ lệnh nào root.

  • Mặc dù rootvẫn là một tài khoản trong Linux, rootđăng nhập trực tiếp bị tắt theo mặc định để bảo mật và truy xuất nguồn gốc tốt hơn.


7
Mặc dù đăng nhập root trực tiếp thực sự bị vô hiệu hóa theo mặc định, vẫn có một tài khoản root với Ubuntu. Nó không còn là một tài khoản trên ít nhất là Solaris, nơi nó được mặc định là một vai trò.
jlliagre

Cảm ơn rất nhiều - tôi luôn tự hỏi làm thế nào điều đó vẫn hoạt động, và bây giờ nó có ý nghĩa hơn rất nhiều.
mikeerv

5

Piotr đã đưa ra một lời giải thích rất tốt về cách làm sudoviệc. Tuy nhiên, anh ấy không thực sự thúc đẩy lý do tại sao nó hoạt động theo cách này, vì vậy tôi sẽ cố gắng thêm nó ở đây.

Trước khi sudolệnh được tạo, chúng tôi đã có sulệnh. Lệnh này cho phép một người dùng thực thi các lệnh như một người dùng khác, thông thường root(như với sudo, đây là người dùng đích mặc định). Nó hoàn toàn không được phân biệt, bạn có thể thực hiện bất kỳ lệnh nào. Vì nó có thể được sử dụng bởi bất kỳ người dùng nào, tương đương với việc đăng nhập với tư cách người dùng đó, nên nó yêu cầu bạn phải biết mật khẩu của người dùng mục tiêu.

Tại một số điểm, một chút kiểm soát truy cập đã được thêm vào: để sử dụng su, bạn phải là thành viên của wheelnhóm. Nhưng vì bạn vẫn có thể thực thi bất kỳ lệnh nào, nên vẫn yêu cầu bạn biết mật khẩu của họ.

Mặc dù, yêu cầu người dùng phải biết mật khẩu của nhau hoặc mật khẩu không phải là rất an toàn. Thường thì bạn chỉ muốn cung cấp cho người dùng nhất định quyền truy cập hạn chế vào một số tài khoản khác (đây là một phần của khái niệm bảo mật được gọi là nguyên tắc đặc quyền tối thiểu ). Điều này cũng gây khó khăn cho trách nhiệm giải trình: nếu nhiều người biết mật khẩu của tài khoản và tài khoản đó có liên quan đến lỗi hoặc lạm dụng, bạn không thể biết ai trong số họ thực sự đã làm điều đó.

Thế sudolà được tạo ra. Thay vì cho phép người dùng thực thi bất kỳ lệnh nào, nó có tệp cấu hình phức tạp, được chạm nhanh vào câu trả lời của Piotr, chỉ định chính xác ai có thể sử dụng lệnh này, người dùng nào họ có thể chuyển sang và những lệnh nào họ được phép chạy. Với quyền kiểm soát chi tiết này về việc ai có thể làm gì với ai, chúng tôi không còn cần cung cấp cho người dùng mật khẩu của tài khoản đích; nếu chúng ta làm như vậy, họ có thể dễ dàng bỏ qua tất cả các điều khiển trong tệp cấu hình bằng cách đăng nhập với tư cách người dùng đó. Thay vào đó, chúng tôi thường chỉ yêu cầu họ chứng minh rằng họ là người mà họ đã đăng nhập bằng cách nhập mật khẩu của riêng họ - điều này nhằm ngăn chặn ai đó lợi dụng tài khoản nếu thiết bị đầu cuối không được giám sát.

Yêu cầu này được miễn cho siêu người dùng - tài khoản này có thể làm hầu hết mọi thứ cho hệ thống mà không cần sử dụng sudo, vì vậy nó được coi là không cần thiết. Bạn cũng có thể chỉ định trong tệp cấu hình rằng người dùng hoàn toàn không phải nhập mật khẩu - một số tổ chức sử dụng điều này khi họ tin rằng bảo mật vật lý của môi trường máy trạm của họ là đủ để ngăn chặn lạm dụng.


Tôi chưa khám phá điều này, nhưng tôi hiểu một trong những tính năng của sudo mà su không có là nó (có khả năng không?) Giữ một bản ghi các lệnh được chạy bởi người dùng nào để dễ dàng theo dõi các vấn đề hơn nguồn của họ. Tôi chỉ nhìn vào hệ thống kubfox của mình và không thấy nhật ký như vậy, vì vậy có lẽ đây không phải là hành vi mặc định.
Joe

Chỉ tìm thấy đăng nhập sudo trong /var/log/auth.log - cùng với rất nhiều nội dung khác bao gồm một số IP từ Trung Quốc đang cố gắng truy cập root ssh vào hệ thống của tôi - vì vậy, nếu bạn chỉ muốn xem sudo, bạn phải lọc nó thông qua grep hoặc tương tự.
Joe

Chính xác. sucũng ghi nhật ký, nhưng vì nó chỉ khởi động một shell mới, nó chỉ ghi lại thực tế là ai đó đã chạy nó.
Barmar

Bạn không thể dựa vào nhật ký, bất kỳ ai có thể root đều có thể thay đổi nhật ký (trừ khi bạn đăng nhập vào máy khác và đảm bảo rằng bạn không cấp quyền truy cập cho đến khi giao dịch đăng nhập hoàn tất). Tuy nhiên, sudokhông cho phép các đặc quyền bị thu hồi mà không phải cấp lại mật khẩu gốc cho mọi người cần nó.
ctrl-alt-delor

1
@richard Vì sudocho phép bạn hạn chế những lệnh nào người dùng có thể thực thi, bạn có thể cố gắng đảm bảo rằng bạn không cấp cho họ quyền truy cập vào các lệnh sẽ ghi đè lên nhật ký.
Barmar

3

Câu trả lời cho câu hỏi của bạn là:

Khi bạn chạy một lệnh với sudo , bạn chạy lệnh với các đặc quyền nâng cao , đó là các quyền riêng tư gốc . Bạn chỉ phải nhập mật khẩu người dùng thông thường vì bạn (người dùng) đã được thêm vào tệp sudoers, cung cấp cho bạn quyền riêng tư gốc .


2
Ngoại trừ sudo không ngụ ý các đặc quyền nâng cao, chỉ là những đặc quyền khác với người dùng hiện tại. Ví dụ: bạn có thể chạy một chương trình như một người dùng bình thường không có vỏ. Ngoài ra, trong tập tin sudoers không cho root.
James Tocknell

1
@aragilar có sudokhông phải lúc nào cũng cung cấp đặc quyền nâng cao, nhưng nó chạy ở đặc quyền nâng cao, sau khi thực hiện công việc của mình (kiểm tra xác thực, nó có thể bỏ đặc quyền). Nó cần những đặc quyền nâng cao này để có thể thay đổi người dùng.
ctrl-alt-delor

1
Chắc chắn, sudokhông sử dụng nâng đặc quyền (nhưng đó không phải là duy nhất để sudo, ví dụ như gắn kết không còn), nhưng lệnh mà bạn gọi tức là commandsudo commandthể không (tùy thuộc vào những gì được thiết lập trong /etc/sudoers).
James Tocknell

1

Đầu tiên, việc vô hiệu hóa tài khoản thường được thực hiện bằng cách đặt mật khẩu được mã hóa thành *, đây không phải là giá trị được mã hóa của bất kỳ chuỗi nào. Tôi không thể kiểm tra ngay bây giờ, nhưng tôi tin rằng đó cũng là những gì Ubuntu làm cho root. Về mặt kỹ thuật, không có mật khẩu root trên Ubuntu.

Nhưng sudo có trước Ubuntu; nó được thiết kế cho các hệ thống có mật khẩu gốc. Vậy tại sao nó không yêu cầu mật khẩu root? Về cơ bản, sudo được thiết kế để cấp quyền chạy các lệnh cụ thể cho một số người dùng nhất định --- ví dụ: cho phép quyền truy cập gốc của nhà phát triển để khởi động lại ứng dụng web, nhưng không khởi động các máy chủ tùy ý. Biết mật khẩu root, mặt khác, cho phép bạn truy cập không giới hạn; bạn có thể sử dụng đăng nhập hoặc su để mở shell gốc và chạy các lệnh tùy ý. Vì sudo phải làm việc cho những người không có mức truy cập đó, nên nó không thể yêu cầu mật khẩu gốc để chạy.


Nó cũng cho phép một người thu hồi các đặc quyền gốc của người dùng mà không phải thay đổi mật khẩu gốc.
Ian D. Scott
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.