Làm cách nào để ngăn chặn tắt máy khi người dùng SSH đăng nhập?


20

Tôi đang quản trị một môi trường mạng và tôi đã có một tình huống thú vị phát sinh ngày hôm qua. Khi một máy chủ được yêu cầu tắt máy bởi một người dùng thông thường, nó sẽ từ chối làm như vậy nếu người dùng khác đăng nhập cục bộ. Tuy nhiên, đây không phải là trường hợp khi người dùng khác đăng nhập qua SSH. Nếu một người dùng đăng nhập cục bộ và một người dùng đăng nhập qua SSH và người dùng đã đăng nhập cục bộ sẽ tắt máy, nó sẽ thành công mà không cần cảnh báo và kết nối SSH của người dùng khác bị ngắt đột ngột. Câu hỏi của tôi là, có cách nào để ngăn chặn điều này giống như chính sách dành cho người dùng địa phương không? Tôi đã xem trang người đàn ông sshd_configvà không thể tìm thấy bất cứ điều gì có vẻ liên quan.


EDIT (Thông tin bổ sung.):

Có 4 hệ điều hành trên mạng: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 và Ubuntu 11.04. Trường hợp cụ thể mà tôi đang đề cập đến có người dùng SSH trên máy chủ Mandriva 2009 và người dùng cục bộ trên máy chủ Mandriva 2011.

Máy chủ Mandriva 2009 sử dụng môi trường Gnome 2.28, máy chủ 2010.2 sử dụng máy chủ Gnome 2.32, 2011 sử dụng máy chủ KDE Plasma và máy chủ Ubuntu 11.04 sử dụng Unity.


Cập nhật

Như tôi đã lưu ý trong câu hỏi này , tôi đã xem xét polkitcác hành động bên dưới /usr/share/polkit-1/actions/và tìm thấy (trong tệp org.freedesktop.consolekit.policy) một hành động được gọi là org.freedesktop.consolekit.system.stop-multiple-usersném thông điệp

System policy prevents stopping the system when other users are logged in

Tôi đang nghĩ (do org.freedesktop.*quy ước đặt tên) rằng đây là một loại tín hiệu được gửi đến DM thông qua D-BUS. Tôi nghĩ rằng nếu tôi có thể tìm ra tín hiệu nào kích hoạt polkithành động này , tôi sẽ có thể sửa đổi hành vi của nó. Có ý kiến ​​gì không?


Cập nhật 2

Tôi đã thử một thử nghiệm nhỏ ngày hôm nay và nó cho tôi kết quả rất kỳ lạ. Tôi đã thử đăng nhập qua SSH vào một hộp và đảm bảo không có người dùng nào khác đăng nhập vào bất kỳ VT nào. Nếu tôi chọn Shutdowntừ menu "Hành động" của GDM, tôi nhận được thông báo chính sách được chờ đợi từ lâu thông báo cho tôi rằng không thể làm như vậy nếu không có xác thực vì những người dùng khác đã đăng nhập. Tuy nhiên , nếu tôi sử dụng GDM để đăng nhập cục bộ và chọn để tắt hộp từ menu của Gnome, phiên SSH bị ghi đè như trước. Sao có thể như thế được? Hành vi có khác khi tôi bắt đầu shutdownyêu cầu từ GDM so với khi tôi bắt đầu yêu cầu từ bên trong gnome-sessionkhông? Điều đó có nói cho ai biết bất cứ điều gì có thể giúp tôi giải quyết vấn đề không?


Có lẽ sẽ hữu ích nếu bạn có thể đưa ra một số gợi ý về hệ điều hành bạn đang chạy.
Jenny D

Có 4 hệ điều hành trên mạng: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 và Ubuntu 11.04. Tôi đã không nhận ra điều này là dành riêng cho hệ điều hành; chỉnh sửa câu hỏi của tôi ...
Joseph R.

2
Tôi nghĩ rằng nó liên quan nhiều đến HĐH hơn là với SSH. Đó không phải là thứ tôi đã chạy trong Unix mà tôi chạy; nhưng sau đó một lần nữa, tôi thường tắt máy như root.
Jenny D

@JennyD: Một giải pháp có thể là ngăn người dùng tắt thông qua UI; nhưng tôi nghĩ điều đó sẽ gây khó chịu cho họ
Joseph R.

2
Thay vì là một vấn đề với SSH, nó có thể là một vấn đề với cấu hình của PAM (trên máy chủ bị tắt). Bạn đã xem làm thế nào PAM có thể giúp tắt máy xác định người dùng đã đăng nhập và đưa ra cảnh báo tương tự cho người dùng đang tìm cách tắt hệ thống?
Rob Gibson

Câu trả lời:


3

Tôi sẽ viết một chương trình nhỏ kiểm tra mọi kết nối SSH đang hoạt động thông qua netstatvà / hoặc ps. Thả nó vào vị trí của shutdownlệnh.

Nếu không có ai khác đang sử dụng máy, hãy gọi shutdownkhi người dùng cố gắng. Nếu ai đó đang sử dụng máy, chỉ cần cảnh báo người dùng đã ra shutdownlệnh.

Netstat sẽ cung cấp cho bạn đầu ra như thế này và thật dễ dàng để tìm kiếm .sshtrong đầu ra.

netstat -a
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        State
tcp        0     52  10.5.6.xx.ssh          10.6.6.yy.51400        ESTABLISHED
tcp        0      0  *.ssh                  *.*                    LISTEN
udp        0      0  *.syslog               *.*

pssẽ cung cấp cho bạn đầu ra như thế này, nhưng khó hơn một chút vì bạn phải đảm bảo không phải lo lắng về các kết nối ra bên ngoài. Netstatcó lẽ là cách đúng đắn để đi

  ps -e | grep ssh
      10084366 ?        00:00:07 /opt/sbin/sshd
        282647 ?        00:00:00 /opt/sbin/sshd

Nghe rât hâp dân. Tôi đang nghĩ một cách mạnh mẽ hơn là tăng sessionchuỗi SSH PAM bằng một chương trình chạm vào tệp khi người dùng đăng nhập qua SSH và xóa nó khi người dùng đăng xuất và sau đó có chương trình bạn đề xuất chỉ cần kiểm tra sự tồn tại của những tập tin này. Nếu điều này hoạt động, tôi chấp nhận câu trả lời của bạn.
Joseph R.

1
Cần làm việc. Một suy nghĩ: điều gì xảy ra nếu họ ngắt kết nối mà không đăng xuất? Tập tin có bị chạm nếu phiên SSH đơn giản là chết không? Bạn sẽ muốn chắc chắn rằng nó
kmort

Hừm. Đó thực sự là thức ăn cho suy nghĩ ...
Joseph R.

1
Có lẽ cách tiếp cận của bạn có thể được đơn giản hóa bằng cách phân tích đầu ra whothay thế. Nó cho biết người dùng nào đang / được kết nối và từ máy chủ nào.
Joseph R.

1
Rất có khả năng. Trên shell tôi sử dụng hầu hết whokhông cho đầu ra nhiều, nhưng hầu hết các shell khác nó làm. (Hệ thống nhúng ngớ ngẩn ...) Trong mọi trường hợp, nếu bạn muốn sử dụng netstat, thật đơn giản để có được cột bạn cần awk. Một cái gì đó dọc theo dòng netstat -a | awk '{print $4}'(Ít nhất là trên vỏ của tôi.)
kmort

2

Bạn thực sự tìm thấy thông tin đúng. Ít nhất nó đã hoạt động trong Ubuntu lên đến 13.04.

Mục chính sách sau đây, khi được thiết lập với "auth_admin_keep" như bên dưới, sẽ thích tắt máy hơn xảy ra:

<action id="org.freedesktop.consolekit.system.stop-multiple-users">
  <description>Stop the system when multiple users are logged in</description>
  <message>System policy prevents stopping the system when other users are logged in</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>auth_admin_keep</allow_active>
  </defaults>
</action>

Nhưng bằng cách nào đó, kể từ ngày 13.10, chính sách này hoàn toàn bị bỏ qua. Không ai cho đến nay đã có thể cho tôi biết cái gì sẽ thay thế nó (nếu có gì.)

Lưu ý rằng bạn cũng có một mục như vậy để khởi động lại (org.freedesktop.consolekit.system.restart-nhiều người dùng) cũng nên được đặt thành auth_admin_keep.

Xem câu hỏi / câu trả lời này quá trên AskUbfox: https://askubfox.com/questions/1190/how-can-i-make-shutdown-not-require-admin-password


0

Đếm các kết nối SSH và nếu nhiều hơn kết nối của bạn, thì hãy tắt máy:

SSH_CONS=$(ps x | grep 'sshd:' | grep -v 'grep' | wc -l)

if [ "$SSH_CONS" -gt 1 ]
then
    echo "More than 1 SSH connection..."
else
    echo "Shutting down..."
    # halt
fi

Một cái gì đó như thế này?

Tôi có thể sẽ chèn một số biến đọc để nó nhắc tôi, như "Bạn có muốn tắt máy không?" và "Bạn có muốn tắt máy không?".

Sau đó, bạn có thể sử dụng nó như một bí danh hoặc tương tự.


Điều này chỉ kiểm tra các kết nối đến. Chỉ cần đề cập.
jamadagni
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.