Hệ thống trải qua những bước nào khi xử lý kết nối SSH?


9

Hệ thống trải qua những bước nào khi xử lý kết nối SSH?

  1. Chúng tôi cố gắng đăng nhập qua ssh
  2. sshd bắt đầu mô-đun pam và pam để xác thực chúng tôi
  3. Tùy thuộc vào cấu hình pam, chúng tôi cần cung cấp tên người dùng và mật khẩu (kiểm tra passwdshadowtập tin pam )
  4. kiểm tra pam cho hosts.allow/deny, /etc/shellsvà những thứ khác
  5. Nếu mọi thứ đều ổn, chúng tôi sẽ đăng nhập
  6. ???
  7. Shell được bắt đầu

Vì vậy, câu hỏi của tôi là cơ chế nào chịu trách nhiệm kiểm tra shell nào được gán cho người dùng trong passwdtệp của họ (trong bước 6)? Là nó pam chính nó, một số mô-đun pam cụ thể sshd, hoặc cái gì khác? Tôi biết rằng tôi có thể thay thế passwdtệp (để kiểm tra tên người dùng và mật khẩu) bằng cách viết mô-đun pam, nhưng làm cách nào tôi có thể thay thế passwdtệp cho mục nhập shell?

Câu trả lời:


8

Theo tôi biết, PAM không xác định trình bao của người dùng, phần này được để lại cho ứng dụng. Các mô-đun phiên của PAM thực hiện các hành động và kiểm tra chung phải được thực hiện cho mỗi lần đăng nhập bằng dịch vụ cụ thể đó. Nếu sau đó ứng dụng muốn khởi động trình bao, thì có thể tự do làm điều đó và thường sẽ tra cứu trình bao trong cơ sở dữ liệu người dùng.

Giả sử câu hỏi của bạn là về OpenSSH , đó chính xác là những gì nó làm: một khi người dùng được xác thực và công cụ phiên PAM đã được thực hiện (nếu được định cấu hình để sử dụng PAM¹), máy chủ ssh sẽ tìm kiếm shell trong cơ sở dữ liệu người dùng (trực tiếp, không thông qua thư viện PAM).

Cơ sở dữ liệu người dùng không giới hạn /usr/passwdvà bạn bè. Trên Linux (mà tôi cho rằng bạn đang sử dụng kể từ khi bạn đề cập shadow), điều gì tạo nên cơ sở dữ liệu người dùng được xác định bởi passwdcài đặt trong /etc/nsswitch.conf. Trong các thiết lập đa máy tính, các bổ sung phổ biến cho cơ sở dữ liệu cục bộ là NISLDAP . Nếu bạn muốn sử dụng lớp vỏ không phải là cái trong /etc/passwd, đây có thể là cấu hình (mặc dù nó hơi lạ và có thể mọi người có thể đưa ra đề xuất tốt hơn nếu bạn cho chúng tôi biết bạn đang cố gắng thực hiện điều gì).

Nếu bạn muốn có người dùng không có quyền truy cập shell đầy đủ, giải pháp tự nhiên là thay đổi /etc/passwdđể đặt shell bị hạn chế - có lẽ rssh chỉ cho phép một vài ứng dụng loại sao chép tệp như scp, rsync và cvs. Bạn cũng có thể sử dụng các lệnh bắt buộc trong ~/.ssh/authorized_keystệp của người dùng .

Nếu bạn muốn xem dấu vết của những gì máy chủ ssh đang làm, hãy khởi động trình nền như ssh -ddd. Bạn cũng có thể có được chế độ xem của khách hàng ssh -vvv, mặc dù ở đây, chế độ xem của máy chủ là điều bạn sẽ quan tâm nhất.

¹ OpenSSH chỉ sử dụng PAM nếu nó được cấu hình với sự hỗ trợ PAM và UsePAMchỉ thị được thiết lập để yessshd_config. Ngay cả khi nó sử dụng PAM, nó cung cấp các phương thức xác thực khác ngoài PAM; đặc biệt xác thực khóa công khai không đi qua PAM.


Tôi muốn cho phép người dùng ứng dụng của tôi đăng nhập vào shell như người dùng bình thường mà không cần tạo tài khoản trong hệ thống. Dữ liệu người dùng (tên người dùng, mật khẩu và vỏ) sẽ được lưu trữ trong db sqlite. Bước đầu tiên là mô-đun pam sqlite xác thực người dùng lại db. Bước thứ hai là cung cấp shell đọc từ cơ sở dữ liệu. Vì vậy, tôi nghĩ rằng nó có thể được thực hiện bằng cách viết mô-đun nis thích hợp. Thans cho câu trả lời ...
pbm

@pbm: Tôi không nghĩ bạn muốn nis, thay vào đó db(hoặc có lẽ là một mô-đun tùy chỉnh).
Gilles 'SO- ngừng trở nên xấu xa'

đó là lỗi đánh máy .. ý tôi là "bằng cách viết mô-đun
nss
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.