đăng nhập và su nội bộ


10

Tôi đang cố gắng hiểu làm thế nào quyền của người dùng hoạt động trong Linux. Nhân khởi động và bắt đầu initnhư root, phải không? Ban đầu sau đó chạy các kịch bản khởi động và chạy getty( agetty), một lần nữa với quyền root. Agetty chỉ đọc tên người dùng và chạy login, vẫn là root, tôi nghĩ vậy. Không có gì thú vị cả. Nhưng đăng nhập làm gì? Tôi không thể tìm thấy bất cứ điều gì tốt hơn "nó cố gắng đăng nhập". Giả sử đăng nhập thấy rằng mật khẩu khớp với (và chúng tôi đang cố gắng đăng nhập như người dùng thông thường), làm thế nào để thay đổi id người dùng? Tôi nghĩ rằng nên có cuộc gọi hệ thống cho điều đó nhưng tôi không thể tìm thấy nó (có lẽ tôi chỉ bị mù?)


Ngoài ra, về su. sucó tập bit 'setuid' nên khi chúng ta chạy nó, nó luôn chạy dưới dạng root. Nhưng khi chúng tôi bảo nó đăng nhập như người dùng thông thường, nó lại cần thay đổi id người dùng. Tôi có hiểu chính xác rằng cùng một "phép thuật" xảy ra suloginkhi họ cần thay đổi người dùng không? Nếu vậy, tại sao có hai chương trình khác nhau? Có bất kỳ loại kinh doanh nghiêm trọng nào xảy ra khi chạy đăng nhập không?

Câu trả lời:


9

Có một số phần để các chương trình đăng nhập làm gì. Các chương trình đăng nhập khác nhau về cách chúng tương tác với người dùng đang cố gắng đăng nhập. Dưới đây là một vài ví dụ:

  • login: đọc đầu vào trên thiết bị đầu cuối văn bản
  • su: được gọi bởi người dùng đã đăng nhập, nhận hầu hết dữ liệu từ các đối số dòng lệnh của nó, cộng với dữ liệu xác thực (mật khẩu) từ thiết bị đầu cuối
  • gksu: tương tự su, nhưng đọc dữ liệu xác thực trong X
  • rlogind: có được đầu vào qua kết nối TCP thông qua giao thức rlogin
  • sshd: có được đầu vào qua kết nối TCP thông qua giao thức SSH
  • Trình quản lý hiển thị X (xdm, gdm, kdm, Nhận): tương tự login, nhưng đọc đầu vào trên màn hình X

Các chương trình này hoạt động theo cách tương tự.

  1. Phần đầu tiên là xác thực : chương trình đọc một số thông tin từ người dùng và quyết định xem người dùng có được phép đăng nhập hay không. Phương pháp truyền thống là đọc tên người dùng và mật khẩu, và kiểm tra xem người dùng có được đề cập trong cơ sở dữ liệu người dùng của hệ thống hay không và mật khẩu mà người dùng đã nhập là mật khẩu trong cơ sở dữ liệu. Nhưng có nhiều khả năng khác (mật khẩu một lần, xác thực sinh trắc học, chuyển ủy quyền, xóa).

  2. Khi đã được thiết lập rằng người dùng được phép đăng nhập và trong tài khoản nào, chương trình đăng nhập sẽ thiết lập ủy quyền của người dùng, ví dụ như nhóm người dùng sẽ thuộc về nhóm nào trong phiên này.

  3. Chương trình đăng nhập cũng có thể kiểm tra các hạn chế tài khoản. Ví dụ: nó có thể thực thi thời gian đăng nhập hoặc số lượng người dùng đăng nhập tối đa hoặc từ chối một số người dùng nhất định trên các kết nối nhất định.

  4. Cuối cùng, chương trình đăng nhập sẽ thiết lập phiên của người dùng. Có một số bước nhỏ:

    1. Đặt quyền xử lý cho những gì đã được quyết định trong ủy quyền: người dùng, nhóm, giới hạn, Bằng Bạn có thể xem một ví dụ đơn giản về bước phụ này tại đây (nó chỉ xử lý người dùng và nhóm). Ý tưởng cơ bản là chương trình đăng nhập vẫn đang chạy bằng root tại thời điểm này, vì vậy nó có các đặc quyền tối đa; đầu tiên nó loại bỏ tất cả các đặc quyền ngoài việc là người dùng root và cuối cùng gọi setuidđể loại bỏ đặc quyền cuối cùng nhưng không kém phần quan trọng này.
    2. Có thể gắn thư mục nhà của người dùng, hiển thị một thư bạn có tin nhắn mail, v.v.
    3. Gọi một số chương trình với tư cách là người dùng, thường là trình bao của người dùng (cho loginsu, hoặc sshdnếu không có lệnh nào được chỉ định; trình quản lý hiển thị X gọi trình quản lý phiên X hoặc trình quản lý cửa sổ).

Hầu hết các thông báo hiện nay sử dụng PAM (Mô-đun xác thực có thể cắm) để cung cấp cách thức quản lý dịch vụ đăng nhập thống nhất. PAM chia chức năng của nó thành 4 phần : Authhhh bao gồm cả xác thực (1 ở trên) và ủy quyền (2 ở trên); Tài khoản của người Việt và phiên của người khác là 3 và 4 ở trên; và cũng có mật khẩu của Nhật Bản, không được sử dụng để đăng nhập nhưng để cập nhật mã xác thực (ví dụ: mật khẩu).


4

Các cuộc gọi hệ thống mà bạn đang tìm kiếm được gọi là những thứ như thế setuidseteuidmặc dù thực sự có cả một nhóm hem tùy thuộc vào chính xác các biến thể của danh tính người dùng mà bạn đang cố gắng thay đổi.

Cũng có những cuộc gọi song song như setgidđể thay đổi nhóm mà một quá trình chạy như.


4

loginsẽ bỏ quyền root khi cần thiết. Nhiều chương trình chỉ cần quyền root ban đầu sẽ bắt đầu bằng root, làm những gì chúng cần làm và sau đó thả xuống tài khoản người dùng bình thường để chúng không cần lo lắng về việc ai đó sử dụng lỗi trong nhị phân để có quyền truy cập vào Vỏ rễ. logintự nhiên giữ các đặc quyền lâu hơn, nhưng nguyên tắc là như nhau.

Trên thực tế bỏ quyền root là khá tầm thường. POSIX định nghĩa setuid()và các setgid()chức năng, thay đổi ID người dùng và nhóm của bạn, tương ứng (thực tế và hiệu quả, nếu bạn bắt đầu với quyền root). logingọi cả hai thứ này, cũng như initgroups()để thiết lập bất kỳ nhóm bổ sung nào bạn có thể có (vì setgidchỉ để đặt ID nhóm chính của bạn)

Đương nhiên, đó là hạt nhân thực sự xử lý việc thay đổi quy trình 'UID / GID. Làm thế nào tôi có thể tìm thấy việc thực hiện các cuộc gọi hệ thống nhân Linux? giải thích rất nhiều về các tòa nhà chọc trời; trong nguồn kernel của tôi, tôi có:

#define __NR_setgid 144
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_setuid 146
__SYSCALL(__NR_setuid, sys_setuid)

vì vậy 144 và 146 là số gọi hệ thống cho các chức năng đó trên máy của tôi


Tôi đã không kiểm tra sunguồn để xem nó làm gì, nhưng tôi nghi ngờ nó cũng giảm quyền root ngay trước khi exec()sử dụng shell, sử dụng cùng một phương thức

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.