chroot를 사용하여 SSH를 사용하고 "sftp", "rsync"(둘 다)만 작동합니까?

chroot를 사용하여 SSH를 사용하고 "sftp", "rsync"(둘 다)만 작동합니까?

내 Ubuntu 서버에는 두 명의 사용자와 하나의 공유 폴더가 있습니다.

  1. writer에 대한 쓰기 권한이 있는 사용자 입니다 /var/shared. SSH 키를 사용하여 원격에서 이 폴더의 파일을 정기적으로 변경하는 애플리케이션입니다.

  2. 사용자는 reader내 허가 없이 얻을 수 있는 SSH 키를 사용하여 여러 클라이언트에서 사용하므로 이 셸에서 사용 가능한 명령을 제한해야 합니다.

질문:

readersftp 및 rsync 프로토콜만 사용할 수 있도록 사용자 가 액세스할 수 있는 명령을 제한해야 합니다 ( mkdir, ls, top, ...와 같은 표준 명령 없음). 디렉토리만 /var/shared읽을 수 있어야 하며 루트 경로여야 합니다. 예를 들어 루트 경로 cd에 들어갈 필요는 없으며 이미 /sftp 또는 rsync에 있습니다.

그러한 동작을 제공하는 usermod -s사용자에게 적용할 수 있도록 쉘 스크립트를 어떻게 작성합니까 ?reader샘플을 찾을 수 없습니다. 경로가 동일하도록 writer"감옥" 상태를 유지하려면 어떻게 해야 합니까 ?/var/share

노트:

  1. sshd_config나는 이미 ' Match및 지시문 ForceCommand internal-sftp을 시도했습니다 ChrootDirectory. 이를 위해서는 ChrootDirectory루트가 소유하고 쓰기 불가능(755 이하)해야 하며 를 지원하지 않습니다 rsync.

  2. 시도했지만 rssh로그인한 사용자의 홈 디렉토리 외부 디렉토리에서는 작동하지 않습니다. 그래서 다른 권한을 가진 사용자를 동일한 디렉터리로 이동할 수 없었습니다.

  3. command=".." ssh-rsa....파일 에서 사용하려고 했지만 authorized_keys필요한 동작을 활성화하는 방법을 얻지 못했습니다. rrsyncrsync 문서에서만 스크립트를 확인합니다. 이 방법에는 chroot필요한 기능이 없습니다 .

적어도 그러한 껍질에 대한 샘플을 얻을 수 있습니까? 스크립트로 이것이 가능합니까?

Bash 및 C++(필요한 경우)를 환영합니다. 출력 ldd /bin/bash:

linux-vdso.so.1 =>  (0x00007fff7e9d1000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f79dfd8b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f79dfb87000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79df7bd000)
/lib64/ld-linux-x86-64.so.2 (0x000055bd0767c000)

답변1

우선 ChrootDirectory루트가 소유해야 하며 다른 사용자가 쓸 수 없어야 합니다. 따라서 /var/shared귀하의 경우에는 ChrootDirectory가치가 없습니다.

/var/shared루트로만 쓸 수 있는 디렉터리를 만들고 Linux 바인드 마운트나 일종의 심볼릭 링크 해결 방법을 통해 이 디렉터리 내에서 액세스할 수 있도록 하는 것이 좋습니다 .

제한이 필요한 경우 sftpSSH 공개 키를 통해 시행되는 "래퍼"의 도움으로 서버의 환경 변수를 rsync확인해야 합니다 . 이 변수는 사용자가 인증된 후 채워지며 클라이언트가 어떤 종류의 연결을 진행하는지에 대한 정보를 포함합니다. 수립. 내부에 가 있을 것이고 세션 만 있을 경우 IIRC 변수가 비어 있을 것 입니다 . 서버의 인증된 사용자로 실행됩니다!SSH_ORIGINAL_COMMANDForceCommandcommandsftpsftp-serverrsyncrsyncsshssh datedateSSH_ORIGINAL_COMMAND

이것이 래퍼의 시작일 수 있습니다.

#!/usr/bin/env bash

set -eu
set -o pipefail

[[ -z "${SSH_ORIGINAL_COMMAND:-}" ]] && exit 1

case "${SSH_ORIGINAL_COMMAND}" in
    "/usr/libexec/openssh/sftp-server")
        exec /usr/libexec/openssh/sftp-server
        ;;
    "rsync --server"*)
        exec ${SSH_ORIGINAL_COMMAND}
        ;;
    *)
        exit 1
        ;;
esac

보시다시피 ssh -v서버에서 어떤 명령이 실행되는지에 대한 정보를 제공합니다. 따라서 /tmp래퍼에서도 다른 것으로 변경할 수 있습니다 .

$ rsync -a -e "ssh -v" bin localhost:/tmp/ 2>&1 | grep '^debug.*Sending command:'
debug1: Sending command: rsync --server -logDtpre.iLsfxC . /tmp/

관련 정보