/ var / www에서 작업 할 때 sudo를 사용하지 않는 방법은 무엇입니까?


173

sudo에서 일할 때마다 사용을 중단하고 싶습니다 /var/www. 어떻게해야합니까? 모든 사이트를이 디렉토리에 넣고 너무 고통없이 작업하고 싶습니다.


3
아파치를 사용하고 있습니까?
Rinzwind 2016 년

1
여기를 읽은 후에도 권한 부분에 도움이 될 수 있습니다. askubuntu.com/questions/20105/…
Luis Alvarado

2
안전을 얻는 또 다른 방법 sudo -u www-datasudoers파일 을 계속 사용 하지만 파일 에서 자신을 sudo www-data루트 만 할 수 없도록 제한하는 것입니다 . 참조 serverfault.com/questions/295429/...
시몬 우드 사이드

답변:


250

여기에있는 대부분의 답변은 보안을 염두에두고 작성되지 않았습니다. sudo매번 달리는 것이 그리 현명하지 않다는 느낌을받는 것이 좋습니다. 오타를 만드는 경우 (예 : 잘못된 장소에 단일 공백 ​​: sudo rm -rf / var/www/dir 실행하지 마십시오! ) 시스템이 손상 될 수 있습니다.

참고 : Apache 2.4.7 / Ubuntu 14.04부터는 이 답변의 명령 조정에 따라 /var/www이동되었습니다 /var/www/html.

보다:

나쁜 생각 :

  • chmod 777(sagarchalise)-시스템에 액세스 할 수있는 모든 사람이 디렉토리와 파일에 쓸 수있게하여 침입자가 www-data사용자의 코드를 실행할 수 있도록합니다.
  • chgrp -R www-data $HOME(cob)- www-data홈 디렉토리에있는 파일을 읽거나 쓸 수 있습니다. 이것은 최소 권한 규칙을 염두에 두지 않습니다.
  • chown -R $USER:$USER /var/www(kv1dr)-세계에에 대한 읽기 권한 이 없으면 /var/www아래에서 실행중인 웹 서버 www-data가 파일을 읽을 수 없습니다. 파일이 공개적으로 액세스 가능한 일반 HTML 문서 인 경우, 세계가 파일을 읽을 수 있으면 문제가되지 않을 수 있습니다. 그러나 파일이 비밀번호를 포함하는 PHP 파일 인 경우입니다.

참고 : 아래 솔루션에서 www-data쓰기 권한을 부여했습니다. 그러나 /usr/share/doc/base-passwd/users-and-groups.txt.gz상태는 다음과 같습니다.

www-data

일부 웹 서버는 www-data로 실행됩니다. 이 사용자가 웹 컨텐츠를 소유하지 않아야합니다. 그렇지 않으면 손상된 웹 서버가 웹 사이트를 다시 작성할 수 있습니다. 웹 서버가 작성한 데이터는 www-data가 소유합니다.

가능 하면 그룹에 쓰기 권한을 부여 하지 마십시오www-data . 웹 서버가 파일을 제공 할 수 있도록 파일 www-data읽을 수 있어야 합니다. www-data쓰기 권한이 필요한 유일한 경우 는 업로드를 저장하는 디렉토리 및 작성해야하는 다른 위치입니다.

해결책 1

www-data그룹에 자신을 추가 /var/www하고 새로 작성된 모든 파일이이 그룹을 상속 하도록 디렉토리 에 setgid 비트를 설정하십시오 .

sudo gpasswd -a "$USER" www-data

이전에 작성된 파일을 정정하십시오 (유일한 사용자 인 경우 /var/www).

sudo chown -R "$USER":www-data /var/www
find /var/www -type f -exec chmod 0660 {} \;
sudo find /var/www -type d -exec chmod 2770 {} \;

(더 안전 : 웹 서버에서 쓰기 가능해야하는 사용 640또는 2750수동 chmod g+w file-or-dir)

해결책 2

홈 디렉토리에 대한 각 프로젝트에 대한 심볼릭 링크를 만듭니다. 프로젝트가 위치하고 ~/projects/foo있고 다음 위치에 있고 싶다고 가정하십시오 /var/www/foo.

sudo ln -sT ~/projects/foo /var/www/foo

홈 디렉토리는 더 비트 (이 하강)을 실행 한 경우 설정되어 있지 other(보안상의 이유로)로 그룹을 변경 www-data하지만, 실행 비트 만 설정되어 있지 (더 읽기 / 쓰기). ~/projectswww 이외의 다른 프로젝트를 포함 할 수 있으므로 폴더에 대해서도 동일하게 수행하십시오 . ( sudo이전에 사용자를 www-data그룹 에 추가 한 경우 필요하지 않습니다 .)

sudo chgrp www-data ~ ~/projects
chmod 710 ~ ~/projects

그룹을 www-dataon으로 설정하고 ~/projects/foo웹 서버가 파일 및 파일 + 디렉토리를 읽고 쓰는 것을 허용하고 디렉토리로 내려갑니다.

sudo chgrp www-data ~/projects/foo
find ~/projects/foo -type f -exec chmod 660 {} \;
find ~/projects/foo -type d -exec chmod 2770 {} \;

더 안전합니다 : 기본적으로 640 및 2750을 사용하고 웹 서버 사용자가 쓸 수있는 chmod 파일 및 디렉토리를 수동으로 사용하십시오. setgid 비트는 새로 생성 된 모든 파일을 ~/projects/foo그룹이 액세스 할 수 있도록 하려는 경우에만 추가해야합니다 .

이제부터에서 사이트에 액세스 http://localhost/foo하고 에서 프로젝트 파일을 편집 할 수 있습니다 ~/projects/foo.

또한보십시오


터미널에서 www-session에 대해 어떻게 생각 sudo su www-data하십니까? 다른 색상의 프롬프트와 결합하여 다른 사용자의 쉘임을 분명히하고, 해당하는 xterm을 가상 데스크톱 4와 같은 곳에 배치하는 정책을 통해 사용자에게 익숙해 지도록합니다. 혼란을 피하기 위해?
사용자 알 수 없음

@user unknown : 사용자 계정을 명확하게 구분하여 터미널에서 모든 작업을 제대로 수행하는 경우. 그러나와 같은 GUI 프로그램을 사용하면 작동하지 않습니다 gedit. 현재 세션에서 다른 사용자로 GUI 프로그램을 실행하는 것이 안전한지 여부를 연구 한 적이 없습니다. 흥미로운 질문이 될 것입니다.
Lekensteyn 2016 년

1
@imaginaryRobots : 모든 질문에 대해 다른 솔루션을 게시하려는 경우 Askubuntu는 세 줄의 답변으로 가득합니다. 분할하도록 설득 할 수 없다면 그대로 보관하겠습니다.
Lekensteyn 2016 년

1
@berbt setfacl -d u::rwX,g::rX /var/www는 umask가 0이더라도 기본 모드가 0750 (또는 0640) 이되는 재미있는 효과가 있습니다. 세계 기록 가능한 파일을 피하고 싶을 때는 좋은 생각이지만, /var/www이미 세계에서 액세스 할 수없는 경우 에는 필요하지 않습니다.
Lekensteyn

1
솔루션 1의 프로세스를 반전시키는 데 문제가 있습니까? 즉, /var/www/app01소유권 app01:app01이 있고 www-data 사용자app01 그룹에 추가 됩니까? 아니면 뭔가 깨질까요?
Jack_Hu

9

웹 사이트를 / var / www에 저장하는 대신 내 홈 폴더에있는 사이트에 링크를 배치합니다. 사이트를 자유롭게 편집하거나 페이지를 추가 할 수 있습니다. 변경 사항에 만족하면 도메인 이름이 연결된 호스팅 회사로 FTP를 보냅니다.


이것은 현명한 아이디어입니다.
thomasrutter

7

그룹이 / var / www를 쓰기 가능하게하고 그룹에 자신을 추가하면 여전히 안전하면서 sudo를 사용할 필요가 없습니다. 이 시도:

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rw /var/www

그러면 /var/www/번거 로움없이 파일 을 편집 할 수 있어야합니다 .

첫 번째 행은 www-data그룹에 사용자를 추가 하고 두 번째 행은 엉망인 소유권이있는 파일을 지우고 세 번째 행은 www-data그룹의 구성원 인 모든 사용자가의 모든 파일을 읽고 쓸 수 있도록합니다 /var/www.


4
이것은 보안에 대한 매우 나쁜 아이디어이며 다른 답변에 설명 된 이유로이 조언을 따라서는 안됩니다. www-data는 쓰기 권한이없는 권한이없는 그룹 이어야합니다 .
thomasrutter

5

하지마

  • 파일 권한을 777 (세계 쓰기 가능)로 설정하지 마십시오

    이는 특히 PHP와 같은 서버 측 스크립팅을 활성화 할 경우 중요한 보안 결함입니다. 권한이없는 프로세스는 웹 사이트에 영향을 줄 파일에 쓸 수 없거나 서버 측 스크립팅을 사용하는 경우 임의의 코드를 실행할 수 없습니다.

  • www-data 그룹 의 구성원으로 자신을 추가하지 말고 쓰기 권한을 부여하십시오

    해당 그룹의 목적은 서버 프로세스가 실행 되는 권한이없는 그룹이라는 것입니다. 위와 같은 이유로 웹 사이트 파일에 대한 읽기 권한 만 있어야합니다.

  • Apache 프로세스의 권한을 변경하지 마십시오

    Apache 하위 프로세스 www-data는 기본적으로 사용자 및 그룹으로 실행되므로 변경하지 않아야합니다. 이것은 파일 시스템에 대한 쓰기 권한을 부여하지 않는 방법입니다.

    특정 상황에서는 서버 측 스크립트가 파일에 쓸 수 있기를 원하며,이 경우 해당 파일 쓰기 가능해야하며 www-data보안을 위해주의를 기울여야합니다.

도스

  • 파일을 자신이 소유하도록 설정

    웹 사이트에서 특정 파일을 수정하는 유일한 사람이거나 일반적인 파일 인 경우 해당 파일의 소유권을 가져 오는 것이 좋습니다. 소유자를로 설정하십시오 <your username>.

    파일을 소유 한 경우에도 서버는 계속 읽기 전용 액세스 권한을 가지므로 이에 대한 서버 권한을 수정할 필요가 없습니다.

  • 파일을 저장할 적절한 장소를 선택하십시오 ( DocumentRoot 사용 )

    경우 /var/www이해가되지 않습니다, 당신은 다른 곳을 게재 할 수 있습니다. 이들이 자신의 개발 또는 테스트에 특정한 경우 홈 디렉토리에 배치 할 수 있습니다. 또는에서 일부 디렉토리를 설정할 수 있습니다 /srv.

  • 그룹에 쓰기 권한 을 부여 하려면 목적에 맞는 그룹을 만드십시오.

    시스템 그룹은 일반적으로 현재 보안상의 이유로 현재 액세스 권한을 갖도록 설계되었으므로 재사용하지 마십시오.


5

이 간단합니다. 아파치 'UserDir'(권장하지 않음)을 활성화하거나 'www-data'그룹 (페도라의 경우 아파치 그룹)을 망칠 필요가 없습니다.

내부에 프로젝트 디렉토리를 만드십시오. /var/www/html

cd /var/www/html
sudo mkdir my_project

그런 다음 프로젝트 디렉토리를 사용자에게 숨기십시오.

sudo chown your_username my_project

이제 원하는 편집기 인 IDE를 사용하여 일반 사용자로 프로젝트 폴더 작업을 시작할 수 있습니다. 더 이상 sudos 없습니다 :)


1
+1 그게 내가하는 일입니다. 소유권 /var/www자체가 아닌 하위 디렉토리 의 소유권을 변경하십시오 .
fkraiem 2016 년

2

소유자가 액세스 할 수있게하려면 www의 / var에있는 chmod를 사용하고 소유자가 소유하고 있는지 확인하십시오. 어리석은 생각이지만 분명히 효과가 있습니다.


2
어리석은 아이디어는 아니지만 현명한 아이디어입니다. 참고 : 당신은 할 필요가 없습니다 (그리고 안)의 사용 권한 변경 /var단지, /var/www및 / 또는 그 내용을.
thomasrutter

1

터미널에서 www-session을 시작할 수 있습니다.

sudo su www-data

다른 색상의 프롬프트 *와 결합하여 다른 사용자의 쉘임을 분명히하고, 해당 xterm (및 편집기 등)을 항상 가상 데스크톱 4에 배치하는 정책 혼동을 피하기 위해 익숙해집니다.

*) 문자가 다른 다른 색상의 프롬프트를 보려면 다음과 같이 / etc / prompt 파일을 만드십시오.

# PROMPTING
#       When  executing  interactively, bash displays the primary prompt PS1 when it is ready to read a command, and the sec-
#       ondary prompt PS2 when it needs more input to complete a command.  Bash allows these prompt strings to be  customized
#       by inserting a number of backslash-escaped special characters that are decoded as follows:
#              \a     an ASCII bell character (07)
#              \d     the date in "Weekday Month Date" format (e.g., "Tue May 26")
#              \D{format}
#                     the  format is passed to strftime(3) and the result is inserted into the prompt string; an empty format
#                     results in a locale-specific time representation.  The braces are required
#              \e     an ASCII escape character (033)
#              \h     the hostname up to the first `.'
#              \H     the hostname
#              \j     the number of jobs currently managed by the shell
#              \l     the basename of the shell's terminal device name
#              \n     newline
#              \r     carriage return
#              \s     the name of the shell, the basename of $0 (the portion following the final slash)
#              \t     the current time in 24-hour HH:MM:SS format
#              \T     the current time in 12-hour HH:MM:SS format
#              \@     the current time in 12-hour am/pm format
#              \A     the current time in 24-hour HH:MM format
#              \u     the username of the current user
#              \v     the version of bash (e.g., 2.00)
#              \V     the release of bash, version + patchelvel (e.g., 2.00.0)
#              \w     the current working directory
#              \W     the basename of the current working directory
#              \!     the history number of this command
#              \#     the command number of this command
#              \$     if the effective UID is 0, a #, otherwise a $
#              \nnn   the character corresponding to the octal number nnn
#              \\     a backslash
#              \[     begin a sequence of non-printing characters, which could be used to embed a terminal  control  sequence
#                     into the prompt
#              \]     end a sequence of non-printing characters
#
#       The  command  number and the history number are usually different: the history number of a command is its position in
#       the history list, which may include commands restored from the history file (see HISTORY below),  while  the  command
#       number  is  the  position in the sequence of commands executed during the current shell session.  After the string is
#
# colors:
# \[...\]   wird benötigt, damit die shell weiß, daß hier kein printable output ist, und die Umbrüche richtig plaziert.
#
# ANSI COLORS
CRE="\[
[K\]"
NORMAL="\[[0;39m\]"
# RED: Failure or error message
RED="\[[1;31m\]"
# GREEN: Success message
GREEN="\[[1;32m\]"
# YELLOW: Descriptions
YELLOW="\[[1;33m\]"
# BLUE: System messages
BLUE="\[[1;34m\]"
# MAGENTA: Found devices or drivers
MAGENTA="\[[1;35m\]"
# CYAN: Questions
CYAN="\[[1;36m\]"
# BOLD WHITE: Hint
WHITE="\[[1;37m\]"
#
# default:
# postgres, oracle, www-data
#
# PS1=$BLUE"machine]->"$NORMAL\\w"$BLUE ø $NORMAL"
PS1=$BLUE"machine]:"$NORMAL\\w"$BLUE > $NORMAL"
#
# root, stefan:
#
case "$UID" in
    '0')
        PS1=$RED"machine:"$NORMAL\\w"$RED # $NORMAL"
    ;;
    '1000')
    PS1=$GREEN"machine:"$BLUE\\w$YELLOW" > "$NORMAL
    ;;
#    default)
#    ;;
esac

/etc/bash.bashrc예를 들어 소스를 제공합니다.

구별을 돕기위한 추가 도구로서, 항상 사용자의 신원 (테일러 / www-data)에 따라 gedit 또는 mousepad, vim 또는 pico를 가리키는 별명 'edit'또는 symlink를 사용하여 파일을 편집 할 수 있습니다. 또는 다른 편집기 프로파일을 사용할 수 있습니다. 적어도 gedit에서는 기본 설정을 흰색 바탕에 검은 색 텍스트 또는 검은 색 바탕에 흰색 텍스트로 설정할 수 있습니다.

나는 루트로 일하기위한 그러한 정책 만 가지고 있으므로 www-data를 사용하는 것이 얼마나 좋은지 잘 모르겠습니다. 자체 프롬프트가있는 다른 호스트에 대한 ssh-sessions와 결합하여 때로는 잘못되는 것을 막지 못했습니다.

참고 : 프롬프트 스크립트는 부분적으로 bash 맨 페이지의 복사본입니다.


이는 작동하며 보안에 부정적인 영향을 미치지 않지만 가장 간단한 해결책은 아닙니다. 그래도 일부 사람들에게는 유효한 솔루션입니다.
thomasrutter
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.