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


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.