존재하지 않는/가상 사용자로 SSH를 실행하십시오.

존재하지 않는/가상 사용자로 SSH를 실행하십시오.

sshSSH 연결을 시작하는 호스트에 존재하지 않는 사용자로 실행할 수 있는 방법이 있습니까 ?

계정 설정이 있고 sshd가 실행 중인 원격 호스트가 있다고 가정해 보겠습니다. . ssh remote-user@remote-host​설정 키가 있으면 ssh가 이를 사용하고, 키가 작동하지 않으면 비밀번호를 묻는 메시지가 표시됩니다. 비밀번호 인증이 활성화되어 있다고 가정합니다.

docker-imageSSH 및 기타 필수 소프트웨어가 설치된 Docker 이미지가 있다고 가정해 보겠습니다 . 문제 없이 컨테이너와 SSH를 시작할 수 있습니다. 루트 사용자가 존재한다는 점에 유의하십시오.

hostname$ docker run -it --rm docker-image bash
container-id$ whoami
root
container-id$ ssh remote-user@remote-host
remote-user@remote-host's password: 

이미지에 존재하지 않는 사용자를 사용하여 컨테이너를 시작하면 SSH를 사용하여 원격 호스트에 연결할 수 없습니다.

hostname$ docker run -it --rm -u 1234:100 docker-image bash
container-id$ whoami
whoami: cannot find name for user ID 1234
container-id$ ssh remote-user@remote-host
No user exists for uid 1234
container-id$ echo $?
255

오류는 다음에서 발생합니다.ssh.c:

    /* Get user data. */
    pw = getpwuid(getuid());
    if (!pw) {
        logit("No user exists for uid %lu", (u_long)getuid());
        exit(255);
    }

오류 메시지는 ssh가 사용자 홈 디렉터리의 sshconfig, 키, Knownhosts 등의 파일을 사용하기 때문에 의미가 있지만 사용자가 아래와 같이 해당 파일에 대해 다른 위치를 지정하면 작동할 것으로 예상할 수 있습니다.

ssh -vvv -i /dev/null  -F /dev/null   \
         -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null      \
         -o PubkeyAuthentication=no  -o PreferredAuthentications=password \
         -o PasswordAuthentication=yes
    remote-user@remote-host

위의 명령에서 ssh에 필요한 파일 중 (내가 알 수 있는 한) 사용자의 홈 디렉터리에는 없습니다. 이 경우 호스트를 마운트 /etc/passwd하거나 가짜 비밀번호 파일을 마운트하거나 /etc/passwd파일을 엉망으로 만들거나 이미지에 로컬 사용자를 생성하지 않고도 ssh를 실행할 수 있는 방법이 있습니까 ? 제가 어떤 옵션을 간과하고 있나요?

클라이언트의 SSH 프로세스 소유자가 누구인지는 어떻게 중요합니까? 로컬 사용자 확인을 강제하는 타당한 이유가 있습니까? 아니면 SSH 개발자가 선택한 구현 옵션입니까?

답변1

그래서 나는 똑같은 문제를 겪었습니다 . ssh./etc/passwd

호스트에 대한 액세스 권한이나 컨테이너 자체 내부의 루트 액세스 권한이 없기 때문에 문제가 되는 코드를 교체했습니다...


경고:내 사용 사례에서는 보안이 문제가 되지 않으므로 작동하는 한 문제를 망쳐도 괜찮습니다. 이로 인해 향후 보안 문제가 발생할지 모르므로 책임은 본인이 감수하시기 바랍니다. 이것은 어떤 대가를 치르더라도 작업을 완료할 수 있는 빠르고 더러운 해킹입니다.


내부에서 ssh.c호출을 getpwuid(getuid())다음으로 대체했습니다.

/* Get user data without using getpwuid
 * to run ssh inside a docker container 
 * without a valid passwd entry for the current user
 */
struct passwd fake_user_data = {
    .pw_name = "ssh",
    .pw_passwd = "",
    .pw_uid = getuid(),
    .pw_gid = getgid(),
    .pw_gecos = "",
    .pw_dir = getenv("HOME"),
    .pw_shell = getenv("SHELL")
};

/* pw = getpwuid(getuid()); */
pw = &fake_user_data;

그리고 misc.c나는 다음을 수정했습니다 tilde_expand_filename.

path = strchr(filename, '/');
struct passwd fake_user_data = {
    .pw_dir = getenv("HOME")
};
if (path != NULL && path > filename) {          /* ~user/path */
    ...
} else if ((pw = getpwuid(uid)) == NULL) {
    /* bypass missing passwd entry...
       fatal("tilde_expand_filename: No such uid %ld", (long)uid); */

    pw = &fake_user_data;
}

관련 정보