Como evitar o uso do sudo ao trabalhar em / var / www?

173

Quero deixar de ter que usar sudosempre que trabalho /var/www. Como eu posso fazer isso? Eu simplesmente quero colocar todos os meus sites nesse diretório e trabalhar com eles sem muita dor.

TaylorOtwell
fonte
3
Você está usando apache?
Rinzwind
1
Depois de ler aqui, isso também pode ajudar na parte de permissão: askubuntu.com/questions/20105/...
Luis Alvarado
2
Outra maneira de obter segurança é continuar usando, sudo -u www-datamas restringir-se no sudoersarquivo para poder apenas sudo www-data(e não o sudo root). Veja serverfault.com/questions/295429/…
Simon Woodside

Respostas:

250

A maioria das respostas aqui não é escrita com a segurança em mente. É bom ter a sensação de que correr sudocada vez não é muito sábio. Se você digitar um erro de digitação (por exemplo, um único espaço em branco em um local errado: sudo rm -rf / var/www/dir não execute! ), Poderá eliminar o sistema do lixo.

Nota: A partir do Apache 2.4.7 / Ubuntu 14.04, /var/wwwfoi movido para /var/www/htmlAjustar os comandos nesta resposta de acordo.

Vejo:

Más idéias:

  • chmod 777(sagarchalise) - isso permite que qualquer pessoa com acesso ao seu sistema grave nos diretórios e arquivos e, assim, permita que o invasor execute qualquer código sob o www-datausuário
  • chgrp -R www-data $HOME(cob) - permite www-dataler ou gravar qualquer arquivo no diretório inicial. Isso não mantém em mente a regra dos privilégios mínimos
  • chown -R $USER:$USER /var/www(kv1dr) - a menos que o mundo tenha permissões de leitura /var/www, o servidor da web em execução www-datanão poderá ler (atender) os arquivos. Se o arquivo for um documento HTML simples acessível ao público, pode não ser um problema se o mundo puder ler o arquivo. Mas se o arquivo é um arquivo PHP contendo senhas, é.

NOTA : nas soluções abaixo, concedi www-dataprivilégios de gravação. No entanto, /usr/share/doc/base-passwd/users-and-groups.txt.gzafirma:

www-data

Alguns servidores web são executados como www-data. O conteúdo da Web não deve pertencer a esse usuário, ou um servidor comprometido poderá reescrever um site. Os dados gravados pelos servidores da Web pertencem à www-data.

Sempre que possível, não conceda permissões de gravação ao www-datagrupo. www-datasó precisa ler os arquivos para que o servidor da web possa atendê-lo. O único caso em que www-dataprecisa de permissões de gravação é para diretórios que armazenam uploads e outros locais que precisam ser gravados.

Solução 1

Adicione-se ao www-datagrupo e defina o bit setgid no /var/wwwdiretório para que todos os arquivos recém-criados também herdam esse grupo.

sudo gpasswd -a "$USER" www-data

Corrija os arquivos criados anteriormente (supondo que você seja o único usuário de /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 {} \;

(ainda mais seguro: use 640ou 2750e manualmente chmod g+w file-or-dirque precise ser gravável pelo servidor da web)

Solução 2

Crie um link simbólico para cada projeto no seu diretório pessoal. Digamos que seu projeto esteja localizado em ~/projects/fooe você deseja localizá-lo em /var/www/foo, execute:

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

Se o diretório inicial não tiver o bit de execução (descendente) definido por other(por razões de segurança), altere o grupo para www-data, mas defina apenas o bit de execução (sem leitura / gravação). Faça o mesmo com a ~/projectspasta, pois ela pode conter outros projetos além de www. (Você não precisa sudose já adicionou seu usuário ao www-datagrupo.)

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

Definir o grupo para www-dataon ~/projects/fooe permitir que o servidor web para ler e gravar arquivos e arquivos de diretórios + e descer em diretórios:

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

Ainda mais seguro: use 640 e 2750 por padrão e manualmente arquivos e diretórios chmod que precisam ser graváveis ​​pelo usuário do servidor da web. O bit setgid deve ser adicionado apenas se você quiser que cada arquivo recém-criado ~/projects/fooseja acessível pelo grupo.

A partir de agora, você poderá acessar o site http://localhost/fooe editar os arquivos do projeto ~/projects/foo.

Veja também

Lekensteyn
fonte
O que você acha de uma sessão de www em um terminal sudo su www-data? Combinado com um prompt de cores diferentes, para tornar mais óbvio que é o shell de um usuário diferente e com uma política sempre colocar o xterm correspondente - por exemplo - na área de trabalho virtual 4, para que você se acostume a isso. Evite confusão?
usuário desconhecido
@ usuário desconhecido: se você fizer tudo bem no terminal, terá uma clara separação entre contas de usuário. Mas não vai funcionar se você usar um programa GUI como gedit. Eu nunca pesquisei se a execução de um programa GUI com outro usuário na sessão atual é segura ou não, seria uma pergunta interessante.
Lekensteyn
1
@imaginaryRobots: se eu fosse postar soluções diferentes para cada pergunta, o Askubuntu estaria cheio de respostas de três linhas. Vou mantê-lo como está, a menos que você possa me convencer a dividir.
Lekensteyn
1
O @berbt setfacl -d u::rwX,g::rX /var/wwwtem o efeito engraçado de que o modo padrão se torne 0750 (ou 0640), mesmo que o umask seja zero. Pode ser uma boa ideia se você deseja evitar arquivos graváveis ​​pelo mundo, mas se /var/wwwjá é inacessível pelo mundo, não é necessário.
Lekensteyn
1
Existe um problema com a inversão do processo na solução 1? Com isso, quero dizer, /var/www/app01possui propriedade app01:app01e o www-data usuário é adicionado ao app01 grupo ? Ou isso vai quebrar alguma coisa?
31418 Jack_Hu
9

Em vez de armazenar meus sites em / var / www, eu coloco links para os sites localizados na minha pasta pessoal. Posso editar livremente ou adicionar páginas aos meus sites. Quando estou satisfeito com as alterações, transfiro para uma empresa de hospedagem onde meu nome de domínio está vinculado.

fragos
fonte
Essa é uma ideia sensata.
thomasrutter
7

Se você tornar o / var / www gravável por seu grupo e se adicionar ao grupo, não precisará usar o sudo enquanto ainda estiver bastante seguro. Tente o seguinte:

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

Você poderá editar /var/www/arquivos sem problemas.

A primeira linha adiciona você ao www-datagrupo, a segunda linha limpa todos os arquivos com propriedade desarrumada e a terceira faz com que todos os usuários que são membros do www-datagrupo possam ler e gravar todos os arquivos /var/www.

Azendale
fonte
4
Essa é uma péssima idéia para segurança e esse conselho não deve ser seguido, por razões explicadas em outras respostas. www-data deve ser um grupo sem privilégios , sem acesso de gravação.
thomasrutter
5

Não é

  • Não defina permissões de arquivo para 777 (gravável no mundo)

    Essa é uma falha de segurança significativa, especialmente se você habilitar scripts no servidor, como PHP. Os processos não privilegiados não devem poder gravar em arquivos que afetariam o site ou, no caso de scripts do lado do servidor, executar código arbitrário.

  • Não se adicione como membro do grupo www-data e conceda permissões de gravação

    O objetivo desse grupo é que ele é um grupo sem privilégios que o servidor processa . Eles só devem ter acesso de leitura aos arquivos do site sempre que possível, pelos mesmos motivos acima.

  • Não altere as permissões dos processos Apache

    Os processos filho do Apache são executados como www-datausuário e grupo por padrão, e isso não deve ser alterado. Esta é apenas uma maneira de não conceder permissão de gravação ao sistema de arquivos.

    Em determinadas circunstâncias, você deseja que seus scripts do servidor possam gravar em arquivos; nesse caso, somente esses arquivos devem ser gravados www-datae é necessário tomar cuidado para garantir a segurança.

Dos

  • Defina os arquivos como de sua propriedade

    Se você é o único, ou o habitual, a modificar determinados arquivos no site, faz todo o sentido apenas tomar posse desses arquivos. Defina o proprietário para <your username>.

    Você não precisa modificar as permissões do servidor para isso, pois o servidor continuará recebendo acesso somente leitura, mesmo quando os arquivos pertencerem a você.

  • Escolha um local sensato para abrigar os arquivos (usando o DocumentRoot )

    Se /var/wwwnão faz sentido, você pode colocá-los em outro lugar. Se eles forem específicos para seu próprio desenvolvimento ou teste, você poderá colocá-los em seu diretório pessoal. Ou você pode configurar alguns diretórios no /srv.

  • Se você deseja conceder acesso de gravação ao grupo , crie um novo grupo para a finalidade

    Não reutilize um grupo de sistemas, porque eles geralmente são projetados para ter o acesso que eles têm atualmente, e não mais, por motivos de segurança.

thomasrutter
fonte
5

É simples assim. Você não precisa habilitar o 'UserDir' do apache (não recomendado) nem bagunçar os grupos 'www-data' (grupo apache no caso do Fedora)

Basta criar o diretório do seu projeto dentro /var/www/html

cd /var/www/html
sudo mkdir my_project

Em seguida, basta mostrar o diretório do projeto ao seu usuário.

sudo chown your_username my_project

Agora você pode começar a trabalhar na pasta do projeto como um usuário comum em qualquer editor, IDE de sua escolha. Não há mais sudos :)

Gayan Weerakutti
fonte
1
+1 É o que eu faço: alterar a propriedade não de /var/wwwsi mesma, mas de subdiretórios.
fkraiem
2

chmod em / var em www para permitir o acesso do proprietário e chown para garantir que você seja o proprietário. Provavelmente uma idéia estúpida, mas definitivamente funcionaria.

Daniel
fonte
2
Não é uma idéia estúpida, é uma idéia sensata em termos de segurança. Nota: Você não precisa (e não deve) alterar as permissões /var, apenas /var/wwwe / ou seu conteúdo.
thomasrutter
1

Você pode iniciar uma sessão www em um terminal

sudo su www-data

Combinado com um prompt de cor diferente *, para tornar mais óbvio que é o shell de um usuário diferente e uma política de sempre colocar o xterm (e editor e similares) correspondente - por exemplo - na área de trabalho virtual 4, para que você se acostuma, para evitar confusão.

*) Para um prompt de cores diferentes com um caractere diferente, crie um arquivo / etc / prompt como este:

# 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

e obtê-lo, /etc/bash.bashrcpor exemplo.

Como ferramenta adicional para ajudar na distinção, você sempre pode editar seus arquivos com um alias 'edit' ou um link simbólico, que aponta, dependendo da sua identidade (taylor / www-data) para gedit ou mousepad, vim ou pico. Ou você pode usar diferentes perfis de editor, pelo menos no gedit você pode definir suas preferências para texto em preto sobre fundo branco ou texto em branco sobre fundo preto, por exemplo.

Eu só tenho essa política para trabalhar como root, por isso não tenho certeza de como será adequado trabalhar com dados www. Combinado com ssh-sessions para hosts diferentes, que têm seus próprios prompts, isso não me impediu de estar errado às vezes, mas se acontecer, percebo rapidamente o que está errado e isso acontece raramente.

Nota: O script de prompt é parcialmente uma cópia da página de manual do bash.

Usuário desconhecido
fonte
Isso funcionará e não afetará negativamente a segurança (se usado com cuidado), mas pode não ser a solução mais direta. É uma solução válida para algumas pessoas.
thomasrutter