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
하고 그 위에 뭔가를 추가합니다.