행주기씨대종중

홈페이지 관리/운영 자료

웹서비스를 위한 퍼미션 문제

페이지 정보

profile_image
작성자 관리자
댓글 0건 조회 9,403회 작성일 21-02-22 12:29

본문

웹서비스를 위한 퍼미션 문제

워드프레스를 설치하다가 config.php 파일을 생성할 수 없다(쓰기 권한이 없어서)는 에러를 접하게 되었다.

전반적인 문제

이 문제는 Apache와 PHP의 파일생성 권한과 연관되어 있다.

Apache의 데몬실행 권한은 Apache 설정파일에 설정되어 있는데 우분투의 경우는 www-data이고 다른 배포판에서는 nobody, 혹은 apache로 되어 있다.

이는 서버에서 웹서비스를 구동할 때 그 웹사이트를 구동하는 Owner(소유주)가 서버계정의 소유주가 아니라 Apache의 www-data가 된다는 것이다.

그래서 PHP를 실행하게 되는 소유주 또한 www-data이기에 PHP를 이용해 파일을 생성하게 되는 경우, 예를 들어 fopen을 이용한 파일생성, 업로드를 통해 생성되는 파일등의 소유주가 www-data가 된다.

일반적으로 위와 같이 사용자 - unclepapa 가 디렉토리에 대한 소유자이며 그룹사용자이다.

디렉토리 퍼미션 755 이다.(umask 022)

위와 같은 디렉토리에서 서비스되는 웹페이지는 원래 uncelpapa의 권한으로 서비스가 되어야 하지만 보안과 모종의 이유로 이를 www-data로 실행하게 되는 것이다.

계정의 소유주와 퍼미션이 서버에 이미 정해져 있기에 www-data가 파일을 생성할 때 퍼미션 755의 마지막 5(Other)의 권한으로 실행되기에 쓰기 권한이 없다는 오류를 접하게 되는 것이다.

이로인해 국내의 XE보드, 그누보드등이 설치시에 설치디렉토리의 퍼미션을 777 혹은 707을 요구하게 된다.

또한 이렇게 PHP등을 이용해 생성하게 되는 파일들의 소유권은 아래와 같이 www-data:www-data 가 된다.

rwxr--r-- www-data www-data  config.php

위와 같이 생성된 파일들은 퍼미션이 644로 이 파일의 소유권자(www-data)만이 이를 수정/삭제가 가능하기에 서버계정의 소유주 조차도 이 파일에 대한 수정 권한이 없게 된다.(Other의 권한뿐이 부여받지 못하기에)

물론, 대부분의 업로드관련 소스들은 umask()와 chmod()함수로 업로드시에 파일및 디렉토리 퍼미션을 666 / 777 으로 설정하여 Other 권한으로 접근하여 수정할수 있게 하고 있다. 하지만 이 또한 보안상으로 위험을 감수해야 하는 방식이다.

얽힌 실타래 풀기

보안을 중시한 방법

웹서비스의 홈디렉토리의 소유자를 www-data:www-data 로 변경하는 방법이 있다.

$ sudo chown -R www-data:www-data /home/unclepapa/public_html

위와 같은 방식은 www-data의 권한을 탈취당해도 www-data가 가진 권한이 매우 적기에 보안상 추천되고 있다.

하지만 이는 FTP 접속에 제한이 될 수밖에 없는데 계정사용자가 홈디렉토리에 접속해도 소유권이 모두 www-data 이기에 업로드와 수정이 불가능하게 된다.

FTP 사용에 편의를 위해서는 어떻게든 디렉토리와 파일의 소유권이 계정사용자를 포함해야 한다.

Owner 값은 id 값으로 중복될 수 없기 때문에 www-data 값을 변경할 수는 없다.

Group 값은 중복될 수 있기 때문에 www-data 의 group에 FTP 계정을 사용할 사용자를 추가할 수 있다.

 $ sudo usermod -a -G www-data unclepapa

이 경우 기본적인 리눅스 umask 값에 의해 디렉토리 퍼미션이 755이기에 umask 값을 002로 변경하여 생성하는 디렉토리나 파일들이 775 / 664의 값을 갖도록 해야 파일의 업로드/수정이 가능해진다.

$ sudo chmod -R 775 /home/unclepapa/public_html




XE 설치 시 안전한 폴더권한 설정하기 (chown 사용)

XE 설치시 보통 html 폴더에 777 혹은 707 등으로 권한을 다 준다.

하지만 서버의 chown 명령어를 이용해서 굳이 소유자가 아닌 다른 사용자(others)에게까지 모든 권한을 주지 않고서도 처리가 가능하다.

이 명령어를 사용할 수 있는 권한이 있어야 하기에 일반 웹호스팅은 거의 불가능하고 적어도 가상호스팅이나 실제서버 정도는 되어야 한다. 혹은 PHP를 이용하여 폴더를 생성해야 한다.

XE 경우에는 권한이 필요한 경우가, 웹서버(php)단에서 xe/files 폴더에 접근하여 읽고 쓸 경우에 필요합니다. 나머지는 굳이 권한 따로 주지 않더라도 기본적인 r(읽기) 권한 아래에서도 문제없이 돌아갈 수 있다.

files 폴더는 XE 코어 파일에는 따로 존재하지 않지만 설치과정을 거치면서 D/B정보 및 각종 설정과 캐시가 기록되는 파일을 모아놓는 폴더다. 이 폴더 하나에만 제대로 된 권한이 있어도 문제없이 돌아갈 수 있다.

이를 chown 명령어를 이용해 쓰는 방법이다. 따로 권한을 주지 않아도 바로 웹서버가 해당 폴더에 접근할 수 있게끔 소유자를 명시적으로 바꾸어 주는 방법이다. 어쨌든 웹서버가 접근할 수 있게끔 해 주는 것이다.

아래 방법은 CentOS 기준으로 작성되었으나 다른 운영체제에서도 소유자명만 다를 뿐 다른 부분은 동일할 것이다.

777을 통해 설치한 폴더 내부를 보면 정작 내부 파일들은 777 권한 없이도 잘 돌아가며 소유자가 웹서버 (apache:apache (CentOS RPM 패키지 설치 기준)) 등으로 되어있다.

이에서 착안,

[root@localhost html]# mkdir files

설치 전 미리 XE가 설치된 코어루트(/, modules addons layouts 등의 폴더가 존재하는 위치) 폴더에 files 폴더도 같이 생성해 준다.
 
[root@localhost html]# chwon apache:apache files

그리고 소유자를 웹서버로 바꾸어 준다.

이 이후에 XE를 설치하면 권한은 충분히 있기에 실제로 777 혹은 707 권한을 주지 않아도 소유자 권한으로 매끄럽게 넘어간다. 그리고 웹서버를 제외한 다른 계정에선 권한이 없다.

이미 설치되어있는 서버에서도 위 방법 적용 후 chmod 로 권한 755 정도나 혹은 소유자만 남기고 다 버려주면 정상적으로 돌아간다.

웹서버가 CentOS는 apache:apache, Ubuntu는 www-data 등으로 되어있고 nobody 등으로 되어있을 수도 있다. 이 부분은 apache 환경설정 파일에 User Group 부분에 나와 있으니 그 부분 그대로 적용하면 된다.

XE 뿐만 아니라 적어도 PHP 쓰는 애플리케이션은 사정이 다 비슷비슷하지 않을까 싶습니다.


웹 계정에서 지워지지 않는 폴더 및 파일 삭제하는 방법(웹에서 생성된 노바디, apache 권한 폴더 및 파일 삭제하는 방법)

FTP로 계정에 접속하여 전송한 파일이 아니라 웹상에서 사용자들이 파일을 업로드한 경우나 웹상에서 생성된 파일이나 폴더의 경우 삭제가 되지 않아 난감할 때가 있다.

웹 서버의 동작 권한은 nobody이고 웹상에서 생성된 파일이므로, 해당 파일이 nobody 소유권으로 시스템에 생성되게 된다.

이렇게 생성된 파일이나 폴더가 삭제되지 않을 경우 아래와 같은 방법으로 웹상에서 실행시키면 지워지지 않는 파일이나 폴더를 삭제할 수 있다.

1. 메모장을 열어 아래의 소스를 복사하여 붙여넣기 한 후

 주의 : 아래 `는 키보드 상의 왼쪽 위 물결(~)키와 함께 있는 기호다.

<?

// 폴더 또는 파일 삭제시

$cmd = `rm -rf 노바디로 된 폴더명`;

echo "$cmd";

echo "삭제되었습니다.";

?>

* "노바디로 된 폴더명"을 삭제하고자 하는 폴더명으로 바꾼다.

2. 파일 -> 다른 이름으로 저장 -> 아래 탭에서 파일 형식을 "모든 파일"로  선택 후 -> "원하는 파일명.php" 로 저장 (ex: del.php)

3. FTP를 통해 계정에 '원하는 파일명.php'를 업로드한 후 웹상에서 '원하는 파일명.php'를 불러내면 된다.

 ex: 만약 XXX 폴더/YYY 폴더 안에 삭제하고자 하는 zzz 파일이 있을 경우

XXX  폴더 안에 del.php를 업로드한 다음 (`rm -rf YYY`)

브라우저에서 http://도메인 주소/XXX/del.php 를 입력한 후 Enter 하면 된다.

4. del.php를 실행하면 YYY 폴더 안의 파일은 삭제되고 nobody 권한의 YYY 폴더는 그대로 남게 됩니다. (YYY 폴더 안의 파일들만 삭제됨)

이후 FTP로 계정에 접속한 다음 해당 폴더의 권한 설정을 777로 변경한 후 해당 YYY 폴더를 삭제하시면 됩니다.

ex)

<?

// 퍼미션 변경시

$cmd = `chmod -R 777 노바디로 된 폴더명`;

echo "$cmd";

echo "퍼미션이 변경되었습니다.";

?>

5. 위의 에에서 XXX 폴더를 삭제하고자 할 경우에는 위 del.php에 삭제하고자 하는 폴더명 XXX를 입력(`rm -rf XXX`)한 후 del.php를 FTP로 웹상에 업로드한 다음 http://도메인 주소/del.php 를 실행하면 XXX 폴더 및 그 하위 YYY 폴더 안의 파일까지 모두 삭제가 됩니다. 만약 폴더가 삭제되지 않을 경우에는 삭제하고자 하는 XXX 폴더의 권한 설정을 777로 변경한 후 del.php를 실행시키면 됩니다.



특정 디렉토리내의 모든 파일( 디렉토리 )의 소유자( 소유그룹 )을 동시에 변경하기

 - chown 명령어의 -R 옵션을 사용하면 특정 디렉토리내에 있는 모든 파일과 서브디렉토리의 소유자와 소유그룹을 한꺼번에 변경할 수 있음.

 - chown -R stkim:stkim dir1

댓글목록

등록된 댓글이 없습니다.


Copyright © KISTORY.NET 2001 - 2025 기회근 개인 홈페이지 All rights reserved.
모바일버전