저는 서버를 실행 중이고 단일 사용자에게 특정 디렉터리에 대한 읽기/쓰기 액세스 권한을 부여해야 합니다. 나는 다음을 시도했습니다 :
sudo adduser abcd
sudo groupadd abcdefg
chown -R .abcdefg /var/www/allowfolder
chmod -R g+rw /var/www/allowfolder
usermod -a -G comments abcd
위의 방법은 작동하는 것처럼 보이지만 사용자에게 서버의 나머지 부분에 대한 읽기 전용 액세스 권한을 제공합니다.
사용자가 특정 폴더에 대해서만 읽고 쓸 수 있도록 권한을 설정하려면 어떻게 해야 합니까? 사용자는 mysql
.
답변1
부정적인 ACL
설정을 통해 사용자가 파일 시스템의 특정 부분에 액세스하는 것을 방지할 수 있습니다.액세스 제어 목록. 예를 들어 사용자가 abcd
다음 파일에 액세스할 수 없는지 확인하세요 /home
.
setfacl -m user:abcd:0 /home
이 방법은 간단하지만 abcd
액세스하고 싶지 않은 항목에 대한 액세스를 차단해야 한다는 점을 기억해야 합니다.
크롯
abcd
볼 수 있는 내용을 적극적으로 제어하려면 다음을 설정하세요.chroot즉, 사용자를 파일 시스템의 하위 트리로 제한합니다.
mysql
사용자에게 필요한 모든 파일(예를 들어 사용자가 실행할 수 있게 하려는 경우 해당 파일의 모든 종속성 mysql
)을 chroot 아래에 넣어야 합니다 . chroot에 대한 경로가 이라고 가정하면 /home/restricted/abcd
프로그램 mysql
은 에서 사용할 수 있어야 합니다 /home/restricted/abcd
. chroot 외부를 가리키는 기호 링크는 기호 링크 조회가 chroot Jail의 영향을 받기 때문에 좋지 않습니다. Linux에서는 바인드 마운트를 최대한 활용할 수 있습니다.
mount --rbind /bin /home/restricted/abcd/bin
mount --rbind /dev /home/restricted/abcd/dev
mount --rbind /etc /home/restricted/abcd/dev
mount --rbind /lib /home/restricted/abcd/lib
mount --rbind /proc /home/restricted/abcd/proc
mount --rbind /sbin /home/restricted/abcd/sbin
mount --rbind /sys /home/restricted/abcd/sys
mount --rbind /usr /home/restricted/abcd/usr
파일을 복사할 수도 있습니다(단, 파일이 최신인지 확인해야 합니다).
사용자를 chroot로 제한하려면 ChrootDirectory
지시문 을 추가하세요./etc/sshd_config
.
Match User abcd
ChrootDirectory /home/restricted/abcd
다음을 사용하여 이를 테스트할 수 있습니다.
chroot --userspec=abcd /home/restricted/abcd/ /bin/bash
보안 프레임워크
SELinux 또는 AppArmor와 같은 보안 프레임워크를 사용할 수도 있습니다. 두 경우 모두 구멍이 남지 않도록 상당히 세분화된 구성을 작성해야 합니다.
답변2
모든 하위 프로세스가 보는 루트 디렉터리를 변경하려면 . 명령 을 사용해야 합니다 chroot
. chroot
이것이 어떻게 작동하는지 보여주기 위해 예를 들어보겠습니다.
나는 이 글을 그 자리에서 썼습니다. 실제로 지금은 UNIX 시스템 앞에 서 있는 것이 아닙니다. 이 예에는 , 및 3 개의 파일 이 dir
포함된 디렉토리가 있습니다 a
. 처음 세 개는 일반 파일입니다. chroot에 파일을 나열할 수 있도록 실제 바이너리에 대한 하드 링크입니다 .b
c
ls
ls
ls
(루트 디렉토리의 일부 디렉토리를 잊어버렸을 수도 있습니다 chroot
. )dir
다음은 쉘 출력 형식의 설정입니다.
$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var
chroot
이제 들어갑니다 . dir
이 /bin/bash
매개변수는 새 루트 디렉토리를 사용하여 실행해야 하는 프로세스를 선택합니다. 기본값은 /bin/sh
.
$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/
이제 종료합니다 chroot
.
$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test
chroot
이것이 명령이 어떻게 작동하는지 설명해주기를 바랍니다 . 기본적으로 문제를 해결하기 위해 해야 할 일은 chroot
로그인할 때마다 해당 사용자로 명령을 실행하는 것뿐입니다. 어쩌면 시작 스크립트에 넣을 수도 있을까요?
파일에 대한 하드 링크는 chroot
파일에 다른 방법으로 액세스할 수 없는 경우에도 파일 내에서 계속 작동합니다(하드 링크가 경로가 아닌 inode를 가리키기 때문에 작동함). 따라서 사용자가 mysql
명령에 액세스하도록 허용하려면 다음을 수행합니다.
ln /usr/bin/mysql /path/to/chroot/target