Thực thi chương trình mỗi khi ai đó đăng nhập qua SSH vào hộp Linux


10

Tôi có một máy chủ SSH nhỏ và tôi muốn viết một tập lệnh để chạy mỗi khi ai đó đăng nhập qua SSH.

Bây giờ, làm thế nào tôi sẽ đi về điều đó?

Tôi muốn tập lệnh chạy bất cứ lúc nào BẤT K log đăng nhập và tôi cần có quyền truy cập ít nhất tên người dùng của người đã đăng nhập và địa chỉ IP mà người đăng nhập.

Tôi nghĩ về việc sử dụng /etc/bash.bashrc, nhưng đó có phải là một giải pháp tốt? Chẳng hạn, có cách nào người dùng có thể vô hiệu hóa việc sử dụng nó và do đó vô hiệu hóa tập lệnh của tôi không? Nếu có, các lựa chọn khác của tôi là gì?

Cảm ơn.


Điều này sẽ chỉ hoạt động nếu người dùng sử dụng bash, tất nhiên. Nó sẽ không hoạt động nếu người dùng có thể chọn vỏ của riêng họ.
Paŭlo Ebermann

Câu trả lời:


12

Cơ chế sử dụng phụ thuộc vào mục tiêu của bạn.

Nếu bạn muốn cung cấp một cái gì đó thuận tiện hoặc thân thiện cho người dùng của bạn, thì bạn /etc/profileđủ hợp lý nếu tất cả người dùng của bạn sử dụng cùng một vỏ. Nếu bạn muốn các lệnh chỉ thực thi khi đăng nhập qua ssh, hãy đặt các lệnh vào /etc/ssh/sshrc. (Nếu bạn không phiền người dùng ghi đè các lệnh bằng ~/.ssh/rctệp riêng của họ .)

Nếu bạn muốn buộc người dùng thực thi một chương trình và chỉ một chương trình , thì ForceCommandtùy chọn như được mô tả bởi DigitalRoss là một cách tiếp cận tốt. (Cá nhân tôi sẽ giới hạn người dùng hơn nữa với hệ thống kiểm soát truy cập bắt buộc như AppArmor , SELinux , TOMOYO hoặc SMACK , để đảm bảo chương trình không thể cho phép người dùng thoát. công cụ tôi chọn đầu tiên, nhưng những công cụ khác là những công cụ tốt được viết bởi các lập trình viên xuất sắc.)

Nếu bạn chỉ muốn một chương trình thực thi và không làm phiền người dùng theo bất kỳ cách nào , thì cách tiếp cận tốt nhất là sử dụng pam_exec(8)mô-đun, không thể bỏ qua, hoạt động bất kể shell và cung cấp khả năng dễ dàng chạy như người dùng hoặc người dùng tài khoản của chương trình thực hiện ủy quyền. Trang này đưa ra ví dụ sau:

   Add the following line to /etc/pam.d/passwd to rebuild the
   NIS database after each local password change:

               passwd optional pam_exec.so seteuid make -C /var/yp

   This will execute the command

       make -C /var/yp

   with effective user ID.

Điều này có thể được mở rộng để chạy trên auth, account, password, và sessionhành động; có lẽ sessionsẽ là tốt nhất để thực hiện khi đăng nhập. Chỉ cần thêm một dòng như:

session optional pam_exec.so log=/var/log/ssh_login_cmd /usr/local/bin/ssh_cmd

để /etc/pam.d/sshdtập tin kiểm soát của bạn .


Có vẻ như pam_execmô-đun là chính xác những gì tôi đang tìm kiếm. Cảm ơn!
houbysoft

2
XEM RA, nếu lệnh bạn thực thi thoát với mã thoát không bằng 0, đăng nhập của bạn sẽ thất bại và bạn có thể bị khóa. Một cách để giải quyết điều này là đảm bảo có một 'phiên tùy chọn' khác được gọi với một mô-đun khác luôn thành công.
gflarity

4

Các phiên bản mới của OpenSSH có một tính năng máy chủ được gọi là ForceCommand cho phép kiểm soát tập lệnh thay vì thao tác (scp, ssh, ...) mà người dùng dự định. Kịch bản được thông qua lệnh ban đầu, vì vậy bạn có thể xâu chuỗi nó sau khi làm bất cứ điều gì bạn cần làm.

Từ sshd_config (5):

ForceCommand

Buộc thực thi lệnh được chỉ định bởi ForceCommand, bỏ qua mọi lệnh được cung cấp bởi máy khách và ~ / .ssh / rc nếu có. Lệnh được gọi bằng cách sử dụng shell đăng nhập của người dùng với tùy chọn -c. Điều này áp dụng cho shell, lệnh hoặc thực thi hệ thống con. Nó là hữu ích nhất trong một khối Match. Lệnh ban đầu được cung cấp bởi máy khách có sẵn trong môi trường SSH_ORIGINAL_COMMAND có thể thay đổi. Việc chỉ định một lệnh của `` Internal-sftp '' sẽ buộc sử dụng máy chủ sftp đang xử lý không yêu cầu các tệp hỗ trợ khi được sử dụng với ChrootDirectory.

Tôi đã sử dụng điều này một lần để ghi đè lên scp và cung cấp tải lên đá quý an toàn mà không cho phép mọi người dùng được phép tải lên quyền truy cập tương tác mà họ không cần hoặc không muốn.


3

Một cách là sử dụng syslog-ng như một daemon syslog và cấu hình nó để chạy nền kịch bản mỗi khi một mục nhật ký nhất định (chẳng hạn như đăng nhập ssh thành công) khớp.


0

Kiểm tra này:

http://ubuntuforums.org/showthread.php?p=9383927

Tôi không tin có một cách để vô hiệu hóa điều này khỏi chạy. Bất cứ ai khác có thể xác minh điều này?


Nó ( /etc/profilehoặc ~/.profile) phụ thuộc vào vỏ của người dùng, chỉ ít hơn một chút bashrc. Nếu người dùng của bạn đang sử dụng bash hoặc tương tự, điều này là tốt.
Paŭlo Ebermann
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.