내 Ubuntu 서버에는 두 명의 사용자와 하나의 공유 폴더가 있습니다.
writer
에 대한 쓰기 권한이 있는 사용자 입니다/var/shared
. SSH 키를 사용하여 원격에서 이 폴더의 파일을 정기적으로 변경하는 애플리케이션입니다.사용자는
reader
내 허가 없이 얻을 수 있는 SSH 키를 사용하여 여러 클라이언트에서 사용하므로 이 셸에서 사용 가능한 명령을 제한해야 합니다.
질문:
reader
sftp 및 rsync 프로토콜만 사용할 수 있도록 사용자 가 액세스할 수 있는 명령을 제한해야 합니다 ( mkdir
, ls
, top
, ...와 같은 표준 명령 없음). 디렉토리만 /var/shared
읽을 수 있어야 하며 루트 경로여야 합니다. 예를 들어 루트 경로 cd
에 들어갈 필요는 없으며 이미 /
sftp 또는 rsync에 있습니다.
그러한 동작을 제공하는 usermod -s
사용자에게 적용할 수 있도록 쉘 스크립트를 어떻게 작성합니까 ?reader
샘플을 찾을 수 없습니다. 경로가 동일하도록 writer
"감옥" 상태를 유지하려면 어떻게 해야 합니까 ?/var/share
노트:
sshd_config
나는 이미 'Match
및 지시문ForceCommand internal-sftp
을 시도했습니다ChrootDirectory
. 이를 위해서는ChrootDirectory
루트가 소유하고 쓰기 불가능(755 이하)해야 하며 를 지원하지 않습니다rsync
.시도했지만
rssh
로그인한 사용자의 홈 디렉토리 외부 디렉토리에서는 작동하지 않습니다. 그래서 다른 권한을 가진 사용자를 동일한 디렉터리로 이동할 수 없었습니다.command=".." ssh-rsa....
파일 에서 사용하려고 했지만authorized_keys
필요한 동작을 활성화하는 방법을 얻지 못했습니다.rrsync
rsync 문서에서만 스크립트를 확인합니다. 이 방법에는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 바인드 마운트나 일종의 심볼릭 링크 해결 방법을 통해 이 디렉터리 내에서 액세스할 수 있도록 하는 것이 좋습니다 .
제한이 필요한 경우 sftp
SSH 공개 키를 통해 시행되는 "래퍼"의 도움으로 서버의 환경 변수를 rsync
확인해야 합니다 . 이 변수는 사용자가 인증된 후 채워지며 클라이언트가 어떤 종류의 연결을 진행하는지에 대한 정보를 포함합니다. 수립. 내부에 가 있을 것이고 세션 만 있을 경우 IIRC 변수가 비어 있을 것 입니다 . 서버의 인증된 사용자로 실행됩니다!SSH_ORIGINAL_COMMAND
ForceCommand
command
sftp
sftp-server
rsync
rsync
ssh
ssh date
date
SSH_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/