모든/모든 연결 사용자 이름에 대해 OpenSSH 쉘 구성

모든/모든 연결 사용자 이름에 대해 OpenSSH 쉘 구성

Debian의 기본 OpenSSH sshd 패키지를 사용하여 모든 사용자 이름을 동일하게 처리하도록 구성하는 방법이 있습니까?

예를 들어 누군가가 임의의 사용자 이름(예: 8LaRiQRd8Qjh)으로 연결했지만 해당 사용자 이름이 Linux 사용자로 존재하지 않는 경우 이를 "testuser"와 같은 일관된 사용자 이름으로 처리하도록 sshd를 구성할 수 있습니까?

SSH 클라이언트 관점에서 이 작업을 수행하는 방법을 알고 있지만 SSH 서버 자체가 모든 연결 자격 증명을 허용하도록 하고 싶습니다(내 쉘이 해당 수준의 인증을 처리할 수 있도록 허용).

이상적으로 내가 원하는 것은 "기존 사용자 이름이 없으면 이 사용자 이름을 사용하십시오"와 같은 규칙입니다. "항상 이 사용자 이름을 사용하십시오"도 작동하지만 이상적이지는 않습니다.

자체 sshd 서비스를 실행하는 대신 기본 OpenSSH sshd 서비스를 사용하여 간단한 솔루션을 찾을 수 있다면 좋을 것입니다.

답변1

왜 이런 짓을 하려는지는 모르겠지만, 그건 나쁜 생각인 것 같습니다.

그렇긴 하지만, 어떤 이유로 이 질문이 나를 매료시켰고 나는 답을 찾아야 합니다.

간단히 말해서 데비안에서 사용 가능한 패키지를 구성하는 것만으로는 이를 수행할 수 없습니다.

이를 수행하려면 두 개의 모듈(NSS용 모듈과 PAM용 모듈)을 작성해야 합니다.

~을 위한네트워크 서비스 모듈최소한 순서대로 제공해야 합니다 _getpwbynam_r.PAM 모듈더 많은 상용구가 있습니다.

이것은 많은 작업처럼 보이고 원하는 작업은 아니지만 인증을 직접 처리하고 싶다고 말씀하셨으므로 이를 수행하는 방법은 다음과 같습니다.

더 간단한 옵션(아마도 덜 안전할 수도 있음)은 다음을 사용하는 것입니다.파라미코Python SSH 서버를 설정하고 인증 기능을 사용자 정의/후킹합니다.

운 좋게도 paramiko의 사람들은 이미 이 문제에 대한 대부분의 무거운 작업을 수행했습니다.데모 서버그들은 창고에 그것을 가지고 있습니다.

대체하거나 check_auth_password유효한 check_auth_publickey사용자를 수락할 수 있습니다. 비밀번호 확인 예시(*):

# pip install pam
import pam
MYUSER = 'testuser'

class Server(paramiko.ServerInterface):
    def check_auth_password(self, username, password):
        if password and pam.authenticate(username=MYUSER, password=password):
            return paramiko.AUTH_SUCCESSFUL
        return paramiko.AUTH_FAILED

이건 StackOverflow가 아니므로 여기서 멈추겠습니다 :)

그러면 사용자 이름에 대한 비밀번호 인증을 무시하고 주어진 비밀번호를 확인하는 SSH 서버가 생성됩니다 testuser.

기본적으로 서버는 이름을 묻는 메시지를 표시하고 종료됩니다. 이를 셸이나 사용자 정의 응용 프로그램으로 바꿀 수도 있습니다.

사용자 이름을 하드코딩했지만 구성 파일이나 데이터베이스 조회 등에서 쉽게 얻을 수 있습니다.

host_key변수와 포트 번호를 대체할 수도 있습니다 .

발에 총을 쏘는 방법에는 여러 가지가 있습니다. 아주 아주 아주 조심해야 합니다. 이 코드는 프로덕션 용도로 사용할 준비가 되지 않았습니다. 전체 내용을 검토하세요. 아무런 문제가 없다면 좋은 리뷰를 작성하고 있는 것이 아닙니다 ;-).


*Server: 이것은 클래스의 함수를 대체 demo_server.py하고 그 위에 뭔가를 추가합니다.

관련 정보