하나의 디렉토리에만 사용자에게 읽기 / 쓰기 액세스 권한 부여


18

서버를 실행 중이며 단일 사용자에게 특정 디렉토리에 대한 읽기 / 쓰기 액세스 권한을 부여해야합니다. 나는 다음을 시도했다.

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.


2
짧은 대답 : chroot를 사용하십시오.
— Chris Down

@Chris Care 그 답을 자세히 설명 하시겠습니까? Manish와 나는 이것으로 어려움을 겪었고 그것을 작동시킬 수없는 것 같습니다.
— 실행 취소

mysql프로그램 은 어디에 있습니까 ? 사용자는이 파일과 필요한 모든 라이브러리 및 데이터 파일을 읽을 수 있어야합니다.
— Gilles 'SO- 악마 그만해

@ 길스 흠. 내가 알 수있는 한 apt-get에서 표준 mysql 설치입니다 (시스템이 아니라 실행 취소입니다).
— Manishearth

답변:


18

부정적인 ACL

액세스 제어 목록 을 설정하여 사용자가 파일 시스템의 특정 부분에 액세스하지 못하게 할 수 있습니다 . 예를 들어, 사용자 abcd가 다음에있는 파일에 액세스 할 수 없도록하려면 다음을 수행하십시오 /home.

setfacl -m user:abcd:0 /home

이 방법은 간단하지만 액세스하고 싶지 않은 모든 항목에 대한 액세스를 차단해야합니다 abcd.

root

abcd볼 수 있는 것을 긍정적으로 제어하려면 chroot를 설정하십시오 . 즉, 파일 시스템의 하위 트리로 사용자를 제한하십시오.

chroot 아래에서 사용자가 필요로하는 모든 파일 (예 : mysql사용자가 실행할 수있는 경우 모든 종속 항목) 을 만들어야합니다 mysql. 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와 같은 보안 프레임 워크를 사용할 수도 있습니다. 두 경우 모두 구멍을 남기지 않도록 상당히 섬세한 구성을 작성해야합니다.


특정 디렉토리에 대한 읽기 및 쓰기 권한을 부여하는 훨씬 쉬운 방법은 그룹을 만드는 것입니까? 예를 들어 새 그룹을 만들고 chown을 사용하여 디렉토리 그룹 소유자를 만든 그룹으로 만들고 사용자를 그룹에 추가 할 수 있습니다. 마지막으로 디렉토리에 그룹에 대한 읽기 및 쓰기 권한을 부여하십시오.
— Qasim

@Qasim 모든 파일의 권한과 소유권이 원하는대로 설정되어 있어야합니다. 잘못 될 수있는 것들이 너무 많습니다 (다른 곳에서 복사하거나 사용 권한이 보존 된 아카이브에서 추출한 파일, 다른 그룹에 속해야하는 파일, 그룹에서 읽을 수없는 파일, 실수를 저 지르거나 할 수없는 사용자) 그룹 접근성이 원하는대로 유지되도록 귀찮게하지 마십시오…)
— Gilles 'SO- 악마 중지'

디렉토리에 대한 그룹 권한이 사용자가 디렉토리에 "cd"또는 "ls"디렉토리를 "cd"할 수없는 방식으로 설정된 경우 파일이 어떻게 자신의 권한을 가져야하는지 알 수 없습니다.
— Qasim

@Qasim 아래의 모든 파일 /var/www/allowfolder과 하위 디렉토리는 액세스 할 수 있어야 /var/www/allowfolder합니다. 반대로 다른 파일에는 액세스 할 수 없어야합니다. 실제로 파일 권한과 ACL만을 기반으로하는 솔루션은 요구 사항을 완전히 충족 할 수 없습니다. 사용자 가 액세스 /var/www할 수있는 x 권한이 있어야하므로 주어진 이름이 존재하는지 여부를 테스트 /var/www할 수 있습니다 /var/www/allowfolder.
— Gilles 'SO- 악마 중지'

알았어.하지만 / var 디렉토리를 제외하고 / home / user 디렉토리의 일반 디렉토리에 대해 이야기하고 있다고 말할 수 있습니까?
— Qasim

5

을 사용해야합니다 chroot. 이 chroot명령은 모든 하위 프로세스가 보는 루트 디렉토리를 변경합니다. 작동 방식을 보여주는 예를 들어 보겠습니다.

이것은 그 자리에 쓰여졌습니다. 나는 현재 유닉스 머신 앞에 있지 않다. 이 예에서,라는 디렉토리 거기에 dir세 개의 파일 : a, b, c,와 ls. 처음 세 개는 일반 파일입니다. chroot에있는 동안 파일을 나열 할 수 있도록 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

그러나 이것이 모든 심볼릭 링크로 전체 chroot 환경을 설정하도록 요구하지 않습니까? 새 사용자가 다른 디렉토리에 액세스 할 수 없도록 명령을 실행하는 것이 쉽지 않습니까? 그러나 아파치와 같은 프로그램은 해당 디렉토리에 대한 액세스 권한을 잃지 않습니까?
— Manishearth

기본적으로 다른 사용자의 액세스에 영향을 미치지 않고 사용자가 나머지 fs에 대한 읽기 액세스 권한을 잃게 만드는 방법이 있습니까 (chmod를 통해)?
— Manishearth

@Manishearth로는 간단한 방법이 없습니다 chmod. "명령을 실행하는 것이 더 쉬울 수는 없지만 액세스 권한을 잃지 마십시오"라고 말할 때 해당 명령은 chroot입니다. "전체 chroot 환경"의 의미 또는 이것이 왜 문제가되는지 설명한다면 더 잘 이해할 것입니다. (주 당신은 oneliner 모든 실행 파일에 대한 액세스 권한을 부여 할 수 있음 : ln /bin/* /path/to/chroot/target)
— strugee

내 모범이 이해가되지 않는 경우 @Manishearth 나는 당신이 chroot스스로 놀 거나 말이되지 않는 것을 알려주 도록 권유 한다. 더 잘, 둘 다 수행하십시오. (및 맨 페이지를 읽으십시오.)
— strugee

@Manishearth이 답변이 답변으로 안내하는 데 도움이 되었으면 수락하는 것을 고려해야합니다.
— strugee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.