SSH 사용자가 로그인 할 때 시스템 종료를 방지하는 방법은 무엇입니까?


20

네트워크 환경을 관리하고 있으며 어제 흥미로운 상황이 발생했습니다. 일반 사용자가 호스트를 종료해야하는 경우 다른 사용자가 로컬로 로그인 한 경우 종료하지 않습니다. 그러나 다른 사용자가 SSH를 통해 로그인 한 경우에는 그렇지 않습니다. 한 사용자가 로컬로 로그인하고 한 사용자가 SSH를 통해 로그인하고 로컬로 로그인 한 사용자가 경고없이 종료를 시도하면 다른 사용자의 SSH 연결이 갑자기 종료됩니다. 내 질문은, 로컬 사용자에 대한 정책처럼 이것을 막을 수있는 방법이 있습니까? 나는 이미 맨 페이지를 보았고 sshd_config관련이있는 것을 찾을 수 없었습니다.


편집 (추가 정보) :

네트워크에는 Mandriva 2009, Mandriva 2010.2, Mandriva 2011 및 Ubuntu 11.04의 4 가지 OS가 있습니다. 내가 언급 한 특정 사례는 Mandriva 2009 호스트의 SSH 사용자와 Mandriva 2011 호스트의 로컬 사용자가 있습니다.

Mandriva 2009 호스트는 GNOME 2.28 환경을 사용하고, 2010.2 호스트는 GNOME 2.32를 사용하고, 2011 호스트는 KDE Plasma를 사용하고, Ubuntu 11.04 호스트는 Unity를 사용합니다.


최신 정보

이 질문 에서 언급했듯이 , 나는 메시지를 던지는 동작을 파일 polkit아래에서 살펴보고 /usr/share/polkit-1/actions/(파일에서 org.freedesktop.consolekit.policy) 발견했습니다.org.freedesktop.consolekit.system.stop-multiple-users

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

( org.freedesktop.*네이밍 규칙 으로 인해 ) 이것이 D-BUS를 통해 DM으로 전송되는 일종의 신호 라고 생각 합니다. 이 polkit동작을 트리거하는 신호를 찾을 수 있으면 동작을 수정할 수 있어야한다고 생각합니다. 어떤 아이디어?


업데이트 2

나는 오늘 약간의 실험을 시도했고 그것은 매우 이상한 결과를 주었다. SSH를 통해 한 상자에 로그인하려고 시도했지만 다른 사용자가 VT에 로그인하지 않았는지 확인했습니다. ShutdownGDM의 '작업'메뉴에서 선택 하면 오랫동안 기다려온 정책 메시지가 표시되므로 다른 사용자가 로그인 할 때 인증 없이는 로그인 할 수 없다는 메시지가 표시됩니다. 그러나 GDM을 사용하여 로컬로 로그인하여 그놈 메뉴에서 상자를 종료하기 위해 SSH 세션이 이전과 같이 방해를받습니다. 이것이 어떻게 가능한지? shutdownGDM 에서 요청을 시작할 때와 GDM 에서 요청을 시작할 때의 동작이 다릅니 gnome-session까? 그게 내가 문제를 해결하는 데 도움이 될만한 것을 말합니까?


실행중인 OS에 대한 힌트를 줄 수 있다면 아마 도움이 될 것입니다.
Jenny D

네트워크에는 Mandriva 2009, Mandriva 2010.2, Mandriva 2011 및 Ubuntu 11.04의 4 가지 OS가 있습니다. 나는 이것이 OS마다 다르다는 것을 몰랐다. 내 질문을 편집 ...
조셉 R.

2
SSH보다 OS와 더 관련이 있다고 생각합니다. 내가 운영하는 유닉스에서 내가 겪은 것은 아니다. 그러나 다시, 나는 일반적으로 루트로 종료합니다.
Jenny D

@JennyD : 해결책은 사용자가 UI를 통해 종료하지 못하게하는 것일 수 있습니다. 그러나 나는 그것이 오히려 성가신 것이라고 생각합니다.
Joseph R.

2
SSH 문제가 아니라 PAM 구성 문제 (호스트 종료 중)에 문제가있을 수 있습니다. PAM이 시스템 종료를 통해 로그인 한 사용자를 판별하고 시스템을 종료하려는 사용자에게 동일한 경고를 제공하는 방법을 살펴 보셨습니까?
Rob Gibson

답변:


3

netstat및 / 또는를 통해 활성 SSH 연결을 확인하는 작은 프로그램을 작성합니다 ps. shutdown명령 대신 삭제하십시오 .

다른 사람이 기기를 사용하지 않는 경우 shutdown사용자가 전화를 걸 때 전화 하십시오. 누군가 기계를 사용하는 경우 shutdown명령 을 발행 한 사용자에게 경고하십시오 .

Netstat는 이와 같은 출력을 제공 .ssh하며 출력에서 찾기가 매우 쉽습니다 .

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               *.*

ps이렇게하면 출력이 나지만 아웃 바운드 연결에 대해 걱정할 필요가 없으므로 조금 더 어려워집니다. Netstat아마도 올바른 길입니다.

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

정말 좋은 데요 더 강력한 방법은 SSH session를 통해 로그인 할 때 파일을 만지고 사용자가 로그 아웃 할 때 파일을 제거한 다음 제안한 프로그램이 단순히 존재 여부를 확인하도록하는 프로그램으로 SSH PAM 체인 을 보강하는 것입니다 이 파일들. 이것이 작동하면 귀하의 답변을 수락하는 것입니다.
Joseph R.

1
작동합니다. 한 가지 생각 : 로그 아웃하지 않고 연결을 끊으면 어떻게됩니까? SSH 세션이 단순히 종료되면 파일이 손상됩니까? 당신은 않습니다 있는지 확인하려면 것
kmort

흠. 그것은 참으로 생각하기위한 음식입니다.
Joseph R.

1
아마도 who대신 출력을 구문 분석하여 접근 방식을 단순화 할 수 있습니다 . 연결되어있는 사용자와 호스트를 나타냅니다.
Joseph R.

1
가능성이 매우 높다. 쉘에서 가장 많이 사용하는 것은 who많은 출력을주지 않지만 대부분의 다른 쉘은 사용합니다. (실리 임베디드 시스템 ...) 어쨌든을 사용하려면을 사용 netstat하여 필요한 열을 얻는 것이 매우 간단합니다 awk. netstat -a | awk '{print $4}'(적어도 내 껍질에) 의 라인을 따라 뭔가
kmort

2

실제로 올바른 정보를 찾았습니다. 적어도 우분투에서는 13.04까지 작동했습니다.

다음과 같이 "auth_admin_keep"을 사용하여 설정할 때 다음 정책 항목은 시스템 종료가 발생하는 것을 선호합니다.

<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>

그러나 어쨌든 13.10 이후이 정책은 완전히 무시됩니다. 지금까지 아무도 그것을 대체 할 것이 무엇인지 말해 줄 수 없었습니다.

또한 재시작 항목 (org.freedesktop.consolekit.system.restart-multiple-users)도 설정해야 auth_admin_keep합니다.

AskUbuntu에서이 질문 / 응답도 참조하십시오 : /ubuntu/1190/how-can-i-make-shutdown-not-require-admin-password


0

SSH 연결 수를 세고 그 이상인 경우 종료하십시오.

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

이 같은?

"어쨌든 종료하겠습니까?"와 같은 프롬프트가 표시되도록 일부 읽기 변수를 삽입했을 것입니다. "종료 하시겠습니까?"

그런 다음 별명 또는 이와 유사한 것으로 사용할 수 있습니다.


들어오는 연결 만 확인합니다. 그냥 언급 했어
jamadagni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.