로컬 폴백을 사용하는 getty 대신 SSH 로그인

로컬 폴백을 사용하는 getty 대신 SSH 로그인

내 문제의 이름을 정확히 지정하는 방법을 모르겠습니다.

내 요구에 맞는 TUI 프로그램 세트가 포함된 서버가 있다는 시나리오입니다.

네트워크의 다른 사용자가 raspi 또는 공룡 컴퓨터와 같은 더 작은 것을 열길 원하며 부팅할 때 사용자는 정상적으로 로컬 로그인에 대한 getty를 볼 수 없지만 대신 서버에 ssh를 표시합니다. 서버가 응답하지 않는 경우에만 로컬 로그인 정보가 사용자에게 제공됩니다.

이런 유형의 시나리오는 새롭거나 급진적이지 않은 것 같습니다... 제 생각에는 기본적으로 SSH를 통해 tcp/ip로 연결된 씬 클라이언트의 개념입니다.

답변1

실제로 가능합니다. 저는 1998년쯤에 대학에서 비슷한 일을 했습니다.

기본적으로 표준 프로그램 대신 getty사용자 정의 버전의 프로그램을 호출하도록 RasPi의 프로세스를 구성해야 합니다 .login/bin/login

login특별히 보안할 필요가 없거나 단지 프로토타입만 만드는 경우 사용자 지정 대체 항목은 스크립트일 수도 있습니다. 그러나 심각한 구현을 위해서는 안전을 위해 컴파일된 프로그램이어야 한다고 생각합니다. 스크립트 인터프리터를 제거하면 실행할 코드의 양이 최소화되어 경쟁 조건이나 기타 공격을 설정하기가 더 어려워집니다.

그러나 귀하의 디자인에는 사용자 경험 문제가 있을 수 있습니다. 사용자가 이미 로그인 이름을 입력한 경우 비밀번호 프롬프트가 표시되자마자 별다른 노력 없이 거의 반사 동작으로 비밀번호를 직접 입력할 수 있습니다. SSH 연결 시도가 실패하고 동일한 로그인이 로컬 로그인 시도에 자동으로 재사용되는 경우 사용자는 자신이 서버에 연결되어 있다고 생각하고 로컬 로그인을 사용하고 있음을 발견하면 혼란스러울 수 있습니다.

getty바람직하게 는 로컬 로그인을 위해 수정되지 않은 구성을 사용하여 두 번째 가상 콘솔 로 전환하는 등 좀 더 신중한 조치가 필요합니다 . 로그인 프롬프트 앞에 표시 /etc/issue되도록 필요한 키 입력에 대한 지침을 추가할 수 있습니다 . getty부작용으로 사용자 정의 login스크립트 또는 바이너리는 기본적으로 다음과 같이 크게 단순화될 수 있습니다.

#!/bin/sh
REMOTEUSER="$1"
exec ssh -oEscapeChar=none "$REMOTEUSER"@your.server.example

-oEscapeChar=none옵션은 OpenSSH를 사용하여 키 입력이 이스케이프되는 것을 방지하므로 사용자는 SSH 클라이언트를 사용하여 포트 전달을 구성하거나 다른 헛소리를 수행할 수 없습니다(알려준 Ferrybig에게 감사드립니다!).

(또는 그 대체 항목 중 하나 라도 ) 루트로 실행되므로 이 명령을 실행하기 전에 루트가 아닌 일부 사용자로 전환 login하는 것이 좋습니다 . 여기서는 컴파일된 프로그램이 더 유연해집니다.exec()ssh

약간의 프로그래밍 경험이 있다면 /bin/login선택한 Linux 배포판용 소스 코드 패키지를 다운로드하고 이를 해킹할 수 있는지 확인하는 것이 좋습니다.

getty기본적으로 두 가지 변경이 필요합니다. 주어진 사용자 이름을 매개변수로 사용하여 로그인할 사용자 이름을 선택하는 대신 , 교체 사용자가 나가는 SSH 연결용으로만 예약된 하드코딩된 사용자 이름을 사용하도록 할 수 있습니다 . login. exec()로그인 프로세스가 끝날 때 사용자의 셸을 사용하는 대신 SSH 명령을 사용 하여 매개변수로 exec()얻은 사용자 이름과 서버 이름을 getty제공합니다 .

답변2

나는 다음과 같은 것을 사용하는쪽으로 기울고 있습니다 /etc/profile(사용자의 쉘이 bash 또는 ksh 또는 이와 유사한 것이라고 가정 /etc/profile).

if [[ $(ps h -o cmd $(ps h -o ppid $$)) =~ $(basename "$SHELL") ]] \
   || id | grep -q '(sshgroup)' \
   && fping -q remotehost; then
  set -e   # exit on any error, incl. user pressing ^C during
           # ssh-keygen or ssh-copy-id

  # generate a key if it doesn't already exist
  if [ ! -e ~/.ssh/id_rsa ] then
    ssh-keygen
  fi

  # install it on remote host if ~/.ssh/key-installed doesn't exist
  if [ ! -e ~/.ssh/key-installed ] ; then
    ssh-copy-id -i ~/.ssh/id_rsa.pub remotehost
    touch ~/.ssh/key-installed
  fi

  # rewrite the following if any users have a shell which doesn't
  # support arrays (ash, dash, posix sh, etc)
  ssh_args=(-oEscapeChar=none)
  exec ssh "${ssh_args[@]}" remotehost
fi

중국어: 상위 프로세스가 사용자의 쉘이 아닌 경우그리고이 사용자는 다음 조직의 구성원입니다.sshgroup 그리고원격 호스트는 ping에 응답하고, ping은 원격 호스트에 대한 ssh에 응답합니다(그리고 -ed이므로 sshssh exec세션이 끝나자마자 사용자는 로그아웃됩니다). 그렇지 않으면 평소대로 로그인이 진행됩니다. 그룹 멤버십은 이전에 테스트되었으므로 fping비회원은 "fping" 결과를 기다릴 필요가 없습니다.

로컬 및 원격 호스트의 파일에 있는 적절한 메시지를 /etc/motd사용하여 해당 파일이 궁극적으로 어느 컴퓨터에 상주하는지 강조할 수 있습니다.

사용자가 원격 호스트에 SSH 키를 갖고 있지 않은 경우 ~/.ssh/authorized_keys에도 비밀번호를 묻습니다. 스크립트 조각의 ssh-keygen및 콘텐츠는 ssh-copy-id이를 방지하는 방법에 대한 최소한의 예입니다. 또한 로그인할 때마다가 아니라 하루에 한 번만 키의 비밀번호를 입력하면 되도록 ssh-agent실행 해야 할 수도 있습니다 .-t 86400

이와 같이 그룹 구성원 자격을 확인하면 특정 사용자(예: 루트 또는 루트가 아닌 관리자 계정)가 자동으로 원격 호스트로 SSH되는 것을 쉽게 제외할 수 있습니다. 테스트를 되돌리고 자동으로 모든 사용자에게 SSH를 통해 연결할 수 있습니다.아니요특정 그룹의 구성원입니다.

관련 정보