Linux 사용자를 자신이 소유 한 파일로 제한


24

여러 (~ 100) 고객이 단일 서버에 쉘 액세스 할 수있는 공유 웹 호스팅 회사의 서버 설정을 상상해보십시오.

많은 웹 "소프트웨어"는 파일 0777chmod 할 것을 권장합니다 . 이 자습서를 따르지 않고 고객에게 파일을 열어 다른 고객에게 현명하게 신경을 씁니다. (필자 cmod 0777는 자신 을 불필요하게 사용하고 있지 않습니다 !) 고객이 자신의 파일에만 액세스하고 다른 사용자의 세계에서 읽을 수있는 파일에 액세스하지 못하도록하는 방법이 있습니까?

AppArmor를 살펴 보았지만 프로세스와 밀접하게 연결되어있어 해당 환경에서 실패하는 것 같습니다.


12
실제로 "웹 소프트웨어"의 권장 사항이 chmod files 0777꼭 필요한지, 즉 문제의 근본 원인을 해결하는 것입니다. 누군가가 다른 사람의 파일을 읽을 수있는 증상이 아니라고 생각합니다. 대부분의 경우 모든 액세스 권장 사항 허용 은 지원 요청을 피하는 저렴한 방법이거나 권한을 올바르게 설정할 수있는 기술력이 부족합니다. 0777요청이있을 때 파일을 설정 하거나 응용 프로그램에 전체 루트 액세스 권한을 부여 할 필요가 거의 없었습니다 . 사용자 및 / 또는 공급 업체 교육이 여기에서 크게 도움이됩니다.
우주 Ossifrage

3
@CosmicOssifrage, 사용자는 쉽게 교육받을 수 없으며 지침이나 설명서를 읽고 싶지 않습니다.
Cristian Ciupitu

12
여전히 777 권한을 권장 모든 "웹 소프트웨어는"꺼내어 할 필요가 . 사용 suexec또는 mpm_itk유사합니다.
Shadur

3
@CosmicOssifrage 필립이 사용자에게 chmod 0777파일 을 알려주거나 강요한다고 생각하지 않습니다 . 나는 글이 잘못 쓰여진 기사를 맹목적으로 따르면서 그들 스스로 가고 스스로 loltoturialz.com/php_problems설정 하는 것에 대해 긴장하고 있다고 생각합니다 chmod 0777. 그들이 그렇게하지 못하도록하거나 다른 사람이 물건을 훔칠 때 화를내는 것을 막을 방법은 없습니다.
Kevin-복원 모니카

2
@kevin-보증 무효가 생성 된 이유입니다. 나는 그런 조항이 없으면 심각한 기기 (소프트웨어 컴파일, 스크립트 등)를 본 적이 거의 없습니다. 그리고 대부분의 기업 환경에서 사용자는 이것을 잘 알고 있습니다
Dani_l

답변:


34

외부 세계와 보호 된 파일 사이에 제한 적이고 변경 불가능한 디렉토리를 두십시오 ( 예 :

/
 ├─ bin
 ├─ home
 │  └─ joe <===== restricted and immutable
 │     └─ joe <== regular home directory

또는 /home/joe/restricted/public_html.

제한은 사용자 및 웹 서버 만 읽을 수 있음을 의미합니다 (예 : 모드 0700/ 0750또는 일부 ACL ).

불변성은 chattr +i소유권을 또는로 변경하여 수행 할 수 있습니다 root:joe.

Ubuntu에서 해당 계층을 만드는 쉬운 방법은 편집 /etc/adduser.conf하고로 설정 GROUPHOMES하는 것 yes입니다.


15

고려할 수있는 옵션이 있습니다 (작업을 수행하려는 작업량에 따라 다름).

다른 사람들이 이미 게시 한 것처럼 "일반적으로"쉘 액세스 권한을 가진 사람이 세계에서 읽을 수있는 파일을 읽을 수 없도록 막을 수는 없습니다.

그러나 기본적으로 쉘 액세스를 원하는 루트 디렉토리 (AKA 홈 디렉토리)로 제한하고 두 번째로 사용자가 원하지 않는 모든 것을 실행하지 못하도록 쉘 액세스를 제한 할 수 있습니다.

한 명의 사용자가 웹 파일에 액세스 할 수있을 때 비슷한 접근 방식을 사용했지만 웹 폴더 외부의 다른 파일을 보지 못하게하고 싶었습니다.

이것은 많은 오버 헤드를 가지고 있었고 설정의 혼란이었습니다. 내가 무언가를 업데이트 할 때마다 파산했습니다.

그러나 오늘 OpenSSH chroot 옵션을 사용하면 쉽게 얻을 수 있다고 생각합니다 .

WikiBooks OpenSSH


SFTP의 chroot는 구현하기 쉽지만 쉘 액세스가 쉬운지는 확실하지 않습니다. 각 사용자의 모든 바이너리와 라이브러리를 사용하여 chroot를 설정해야합니다.
Cristian Ciupitu

2
구현에 따라 다릅니다. ARCHLINUX에는 모든 추가 바인드 마운트를 처리하는 특정 arch-chroot 명령이 있습니다. wiki.archlinux.org/index.php/Change_Root#Change_root
Dani_l

@CristianCiupitu 내가 한 일, 모든 필수 라이브러리를 연결하는 명령의 특정 하위 집합 만 허용하므로 그게 엉망이라고 말했습니다 :) Dani_l 사실, 내 설정은 데비안 서버 였으므로 슬프게도 젠투를 체크인 할 시간이 없었습니다. .
Dennis Nolte

@Dani_l : 설치된 패키지는 어떻습니까? 그 arch-chroot명령은 그것을 다루지 않는 것 같습니다. 그리고 모든 복제본과 함께 디스크 공간 낭비 문제도 있습니다. 나는 그것이 불가능하다고 말하지 않고 단지 현재 조금 더 복잡 할 수 있습니다.
Cristian Ciupitu

1
이것을 좀 더 쉽게 만드는 것은 UnionFS를 사용하여 사용자를 읽기 전용 모드 및 읽기 쓰기 홈 디렉토리에서 rootfs의 특수 조합으로 chroot하는 것입니다. 즉, 모든 시스템 패키지와 바이너리를 볼 수 있지만 쓰기는 자동으로 수행됩니다. 그들의 홈 폴더. 이것은 모든 홈 디렉토리 (700)의 권한을 다른 사용자가 어쨌든 다른 사용자로부터 파일을 읽을 수 있도록하는 권한과 결합해야한다.
Vality

11

POSIX 액세스 제어 목록을 사용하면 시스템 관리자로서 중요한 사용자를 깰 수있는 많은 기회없이 정기적 인 사용자 그룹 다른 파일 시스템 권한을 재정 의하여 최악의 무지에서 사용자를 보호 할 수 있습니다. .

웹 컨텐츠는 아파치에서 액세스 할 수 있어야하기 때문에 예를 들어 (fi) 홈 디렉토리에 월드 액세스 가능해야하는 경우 특히 유용합니다 ~/public_html/. (ACL을 사용하더라도 리버스를 수행하고 모든 사용자에 대한 액세스를 제거하고 아파치 사용자를위한 특정 유효 ACL을 사용할 수 있습니다.)

그렇습니다. 지식이 풍부한 사용자가 다시 제거 / 재정의 할 수 있고, 가능성이 거의없는 경우는 드물며, 일반적으로 편리하지 않은 사용자도 있습니다 chmod -R 777 ~/.

aclmount 옵션을 사용 하여 파일 시스템을 마운트해야합니다 .

 mount -o remount,acl /home

많은 배포판에서 기본값은 사용자 그룹을 생성하는 것이며, 각 사용자는 기본 그룹을 가지고 있으며, 상상할 수없는 이름으로 보조 그룹의 모든 사용자를 설정했습니다 users.

ACL을 사용하면 다른 사용자가 홈 디렉토리에 액세스하지 못하게하는 것이 간단합니다.

전에:

 chmod 0777 /home/user* 

 ls -l /home/user*
 drwxrwxrwx.  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx.  2 user2  user2  4096 Jul 11 15:24 user2

이제 users그룹 구성원의 유효 디렉토리 권한을 0읽기, 쓰기 또는 액세스 안함으로 설정하십시오 .

 setfacl setfacl -m g:users:0 /home/user*

 ls -l 
 drwxrwxrwx+  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx+  2 user2  user2  4096 Jul 11 15:24 user2

+기호가 ACL 설정의 존재를 의미한다. 그리고 getfacl그것을 확인할 수 있습니다 :

getfacl /home/user1
getfacl: Removing leading '/' from absolute path names
# file: home/user1
# owner: user1
# group: user1
user::rwx
group::rwx
group:users:---
mask::rwx
other::rwx

group:users:---그룹이 효과적으로 다른 존재에 대한 일정한 권한에도 불구하고, 접근 권한이없는 것을 보여other::rwx

그리고 user1으로 테스트 :

[user1@access ~]$ ls -la /home/user2
ls: cannot open directory /home/user2: Permission denied

공유 시스템의 두 번째 일반적인 솔루션은 요청시 자동 마운터가 홈 디렉토리를 마운트하여 셸 액세스 전용 서버를 설치하는 것입니다. 그것은 어리석은 증거와는 거리가 멀지 만 일반적으로 소수의 사용자 만 동시에 로그인하여 해당 사용자의 홈 디렉토리 만 보이고 액세스 할 수 있습니다.


5
"fi" 는 무엇입니까 ? "eg", "ie", "etc"및 아마도 OP와 같은 고전적인 것이 아닌 한 두문자어 또는 약어를 사용하지 않는 것이 좋습니다.
Cristian Ciupitu

3

리눅스 컨테이너 (LXC) 는 chroot와 개별 시스템의 최상의 조합 일 수 있습니다.

  1. 가상화가 아닌 고급 chroot와 비슷하지만 하나의 서버에서 다른 운영 체제를 결합 할 수 있습니다.

  2. 사용자에게 완전한 운영 체제를 제공하고 거기에서 chroot 할 수 있으므로 사용자가 로그인하면 컨테이너로 이동합니다. 또한 프로세서 및 메모리 사용량을 제한 할 수도 있습니다.

LXC의 저자 인 Stéphane Graber는 시작하는 데 유용한 자습서 를 제공합니다.


서로 다른 운영 체제를 결합 할 수는 없습니다. 모든 운영 체제는 Linux 커널 을 사용해야 하지만 서로 다른 배포판을 사용할 수 있기 때문 입니다.
Cristian Ciupitu

1
고마워 :) 네, 다른 리눅스 커널 기반 운영 체제.
maniaque

@CristianCiupitu 같은 리눅스 커널을 의미합니까? 또는 각 컨테이너가 다른 버전의 커널을 가질 수 있다는 것을 의미합니까?
agks mehx

@agksmehx, 모든 LXC 컨테이너는 호스트의 커널을 공유합니다 . 응용 프로그램과 라이브러리 만 사용됩니다. 예를 들어, Ubuntu 14.04 컨테이너가있는 RHEL 7 호스트가있는 경우 RHEL 커널 (3.10.0-123)이 사용되지만 Ubuntu 호스트 (3.13.0-24.46)는 사용되지 않습니다. 튜토리얼 에서이 주석 도 읽으십시오 . 그런데 컨테이너의 커널이 사용되지 않기 때문에 디스크 공간을 절약하기 위해 커널을 제거하는 것이 좋습니다.
Cristian Ciupitu

@CristianCiupitu 그것이 내가 생각한 것입니다. 대답이나 의견에서 명확하지 않았으므로 명확히하고 싶었습니다.
agks mehx

3

예를 들어, 사용자가 자신의 home디렉토리 에만 액세스 할 수있게 하려면 다음을 수행해야합니다.

cd /home
sudo chmod 700 *

이제는 /home/username소유자 만 볼 수 있습니다. 이 모든 새로운 사용자 편집의 기본 만들려면 /etc/adduser.conf및 설정 DIR_MODE0700대신의 0755기본.

물론 기본 DIR_MODE를 변경하려면 배포본에 따라 다릅니다 Ubuntu.

편집하다

으로 @Dani_l가 제대로 언급이 답변이 NOT 세계 읽을 그들을 만드는 올바른 것입니다.


그것들을 이유로 "월드 읽기 가능"이라고합니다.
Mark K Cowan

1
@DennisNolte 실제로 파일을 읽을 수있는 경우에도 파일을 읽을 수 없거나 실행하지 않은 디렉토리에 있으면 읽을 수 없습니다.
Vality

1
@Vality true, 분명히 잘못되었으므로 내 의견을 제거하십시오.
Dennis Nolte

2

그냥 pedantic하기 위해-아니, 없습니다.
@Marek이 정답 을했지만 질문이 잘못되었습니다. "세계에서 읽을 수있는"파일에 액세스하는 것을 막을 수 없습니다.
그것들은 세계가 읽을 수 있거나 읽을 수 없습니다. @Marek의 대답은 세상을 읽을 수 없도록 만드는 데 정확합니다.


2
잘못된 경우, 사용자를 하위 폴더에 chroot / jail하여 "일반적으로"세계가 읽을 수있는 파일을 읽을 수 없습니다.
Dennis Nolte

1
-1 OP의 질문에 불필요하게 비판적이라고 생각합니다. 그는 자신의 권한에 대해 똑똑하지 않은 고객을 위해 안전망을 제공하려고합니다. 그러나 OP가 Unix 파일 권한의 작동 방식이나 기본 보안 주체를 알지 못하는 것은 아닙니다.
Kevin-복원 모니카

또한 파일을 000 권한 디렉토리 내의 디렉토리에 넣을 수 있으며, 파일을 세계적으로 읽을 수 있더라도 아무도 액세스 할 수 없습니다.
Vality

아무도? 뿌리조차도? ;-)
Dani_l

@Kevin은 제 의견이 불필요하다고 비판하고 있다는 데 동의했습니다. 그러나 Dani_I는 hes pedandic와 벌이 틀렸다고 미워해서는 안됩니다. 내가 그의 나머지 답변에 동의하지 않는다고 말하지 않았습니다.
Dennis Nolte

0

나는 지금까지 주어진 대답에서 '제한 된 껍질'에 대한 언급이 없습니다.

ln / bin / bash / bin / rbash

이것을 로그인 쉘로 설정하십시오.


0

웹 서버가 호스팅되는 모든 도메인에 대해 동일한 사용자 및 그룹으로 실행되는 경우 설정을 안전하게 만드는 것은 어렵습니다 (불가능하지는 않지만).

웹 서버뿐만 아니라 사용자도 특정 파일에 액세스 할 수 있지만 다른 사용자는 액세스 할 수 없습니다. 그러나 웹 서버가 액세스 할 수있게되면 다른 사용자가 자신의 웹 사이트에 파일에 대한 심볼릭 링크를 넣어서 읽을 수 있습니다.

각 웹 사이트를 별도의 사용자로 실행할 수 있다면 상당히 간단 해집니다. 각 고객은 이제 시스템에 웹 서버용과 셸 액세스 용의 두 명의 사용자를 갖게됩니다.

이 두 사용자를 포함하는 그룹을 작성하십시오. 이제 해당 그룹 및 사용자 루트가있는 디렉토리를 작성하십시오. 해당 디렉토리에는 권한이 있어야합니다. 즉 750, 루트는 전체 액세스 권한을 가지며 그룹은 읽기 및 실행 액세스 권한을 갖습니다. 해당 디렉토리 내에 두 사용자 각각에 대한 홈 디렉토리를 작성할 수 있습니다. 이것은 사용자의 홈 디렉토리가 더 이상 양식 /home/username을 가지지 않고 적어도 하나 이상의 디렉토리 구성 요소를 가진 것을 의미합니다 . 이것은 문제가되지 않으며, 특정 규칙에 따라 홈 디렉토리의 이름을 지정할 필요가 없습니다.

이름 기반 가상 호스트를 사용하는 경우 다른 사용자 및 그룹으로 실행되는 웹 사이트를 얻는 것은 까다로울 수 있습니다. IP 기반 vhost로만 분리 작업을 수행 할 수 있고 각 사이트에 충분한 IP가없는 경우 IPv6 주소에서 각 웹 사이트를 호스팅하고 모든 웹 사이트에 대한 리버스 프록시를 사용할 수 있습니다. IPv4 주소.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.