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


Eu quero parar de ter que usar sudo toda vez que eu trabalho /var/www. Como eu posso fazer isso? Eu simplesmente quero colocar todos os meus sites neste diretório e trabalhar com eles sem muita dor.


162
2018-06-01 03:43


origem


Você está usando o apache? - Rinzwind
Depois de ler aqui, isso também pode ajudar na parte da permissão: askubuntu.com/questions/20105/… - Luis Alvarado♦
Outra maneira de obter segurança é continuar a usar sudo -u www-data mas restringir-se no sudoers arquivo para apenas ser capaz de sudo www-data (e não sudo root). Vejo serverfault.com/questions/295429/… - Simon Woodside


Respostas:


A maioria das respostas aqui não está escrita com a segurança em mente. É bom ter a sensação de que correr sudo cada vez não é muito sábio. Se você fizer um erro de digitação (por exemplo,não execute) sudo rm -rf / var/www/dir), você pode estragar seu sistema.

Nota: Começando com o Apache 2.4.7 / Ubuntu 14.04, /var/www foi movido para /var/www/html Ajuste os comandos nesta resposta de acordo.

Vejo:

Más ideias:

  • chmod 777 (sagarchalise) - permite que qualquer pessoa com acesso ao seu sistema grave nos diretórios e arquivos e, assim, permita que o intruso execute qualquer código sob o www-data do utilizador
  • chgrp -R www-data $HOME (cob) - isso permite www-data para ler ou gravar quaisquer arquivos no diretório inicial. Isso não está mantendo em mente a regra do Menor privilégio
  • chown -R $USER:$USER /var/www (kv1dr) - a menos que o mundo tenha permissões de leitura /var/www, o servidor web rodando sob www-data não será capaz de ler (servir) os arquivos. Se o arquivo for um documento HTML simples acessível ao público, talvez não seja um problema se o mundo puder ler o arquivo. Mas se o arquivo é um arquivo PHP contendo senhas, é.

NOTA: nas soluções abaixo, eu concedi www-data escreva privilégios. Contudo, /usr/share/doc/base-passwd/users-and-groups.txt.gz estados:

www-data

Alguns servidores da web são executados como www-data. O conteúdo da Web não deve pertencer a este     usuário, ou um servidor Web comprometido seria capaz de reescrever um site. Dados     escritas por servidores da web serão de propriedade da www-data.

Sempre que possível, faça não conceder permissões de gravação ao www-data grupo. www-data só precisa ser capaz de ler os arquivos para que o servidor possa atendê-lo. O único caso em que www-data precisa 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-data grupo e definir o bit setgid no /var/www diretório de tal forma que todos os arquivos recém-criados herdam esse grupo também.

sudo gpasswd -a "$USER" www-data

Corrigir 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 640 ou 2750 e manualmente chmod g+w file-or-dir que precisa ser gravável pelo servidor web)

Solução 2

Crie um symlink para cada projeto em seu diretório pessoal. Diga que seu projeto está localizado em ~/projects/foo e você quer tê-lo localizado em /var/www/foo, corre:

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

Se o seu diretório home não tiver nenhum bit de execução (descer) definido para other (por motivos de segurança), mude o grupo para www-data, mas definir o bit de execução apenas (sem leitura / gravação). Faça o mesmo para o ~/projectspasta, pois pode conter outros projetos além de www. (Você não precisa sudo se você já adicionou seu usuário ao www-data grupo.)

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

Definir o grupo para www-data em ~/projects/foo e permitir que o servidor da Web leia e grave em arquivos e arquivos + diretórios e desça 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 arquivos chmod e diretórios manualmente que precisam ser gravados pelo usuário do servidor web. O bit setgid deve ser adicionado somente se você quiser que cada arquivo recém-criado ~/projects/foo para ser acessível pelo grupo.

De agora em diante, você pode acessar seu site em http://localhost/foo e edite seus arquivos de projeto em ~/projects/foo.

Veja também


229
2018-06-01 09:48



O que você acha de uma sessão 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 uma política sempre para colocar o xterm correspondente em - por exemplo - o desktop virtual 4, para que você se acostume com ele, Evite confusão? - user unknown
@ usuário desconhecido: se você faz tudo no terminal bem como você tem uma separação clara 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 sob outro usuário na sessão atual é segura ou não, seria uma questão interessante. - Lekensteyn
@imaginaryRobots: se eu fosse postar diferentes soluções 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 dividi-lo. - Lekensteyn
@berbt setfacl -d u::rwX,g::rX /var/www tem o efeito engraçado de que o modo padrão se torna 0750 (ou 0640) mesmo que o umask seja zero. Pode ser uma boa ideia se você quiser evitar arquivos graváveis ​​pelo mundo, mas se /var/www já é inacessível pelo mundo não é necessário. - Lekensteyn
Existe um problema com a inversão do processo na solução 1? Com isso quero dizer /var/www/app01 tem propriedade app01:app01e depois o www-data  do utilizador é adicionado ao app01  grupo? Ou isso vai quebrar alguma coisa? - Jack_Hu


Em vez de armazenar meus sites em / var / www, coloco links para os sites que estão localizados na minha pasta pessoal. Eu posso editar livremente ou adicionar páginas aos meus sites. Quando estou feliz com as mudanças, transfiro para uma empresa de hospedagem onde o meu nome de domínio está vinculado.


7
2018-06-01 07:06



Esta é uma ideia sensata. - thomasrutter


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

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

Você deve então poder editar /var/www/ arquivos sem problemas.

A primeira linha adiciona você ao www-data grupo, a segunda linha apaga todos os arquivos com propriedade confusa, e o terceiro faz com que todos os usuários que são membros do www-data grupo pode ler e gravar todos os arquivos /var/www.


6
2017-07-01 00:41



Esta é uma péssima ideia de segurança e este conselho não deve ser seguido, por razões explicadas em outras respostas. www-data é suposto ser um sem privilégios grupo, sem acesso de gravação. - thomasrutter


Não é

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

    Essa é uma falha de segurança significativa, especialmente se você ativar o script do lado do servidor, como o PHP. Processos não privilegiados não devem ser capazes de gravar em arquivos que possam afetar o site ou, no caso de script do lado do servidor ser usado, executar código arbitrário.

  • Não se inclua como membro do www-data grupo e dar-lhe permissões de gravação

    O objetivo desse grupo é que ele é um sem privilégios grupo que o processos do servidor correr como. 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 do Apache

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

    Em determinadas circunstâncias, você deseja que os scripts do lado do servidor possam gravar em arquivos, nesse caso  esses arquivos devem ser gravados por www-data e cuidado deve ser tomado para garantir a segurança.

Dos

  • Defina os arquivos para serem de sua propriedade

    Se você é o único, ou o usual, para modificar certos arquivos no site, então faz todo o sentido apenas apropriar-se desses arquivos. Defina seu dono para <your username>.

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

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

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

  • Se você quiser dar grupo escrever acesso, criar um Novo grupo para o efeito

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


5
2017-11-23 23:43





É simples assim. Você não precisa ativar o 'UserDir' do apache (não recomendado) nem bagunçar 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

Então, basta chown o diretório do projeto para o seu usuário.

sudo chown your_username my_project

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


5
2017-08-06 07:49



+1 É isso que eu faço: alterar a propriedade não de /var/www em si, mas de subdiretórios. - fkraiem


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


1
2018-06-01 03:59



Não é uma ideia estúpida, é uma ideia sensata em termos de segurança. Nota: Você não precisa (e não deve) alterar as permissões de /var, somente /var/www e / ou seu conteúdo. - thomasrutter


Você poderia iniciar uma sessão www em um terminal por

sudo su www-data

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

*) Para um prompt diferentemente colorido 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 de /etc/bash.bashrc por exemplo.

Como ferramenta adicional para ajudar na distinção, você sempre pode editar seus arquivos com um alias 'edit' ou um symlink, que aponta, dependendo da sua identidade (taylor / www-data) para o 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 preto em branco ou branco em preto, por exemplo.

Eu só tenho uma política para trabalhar como root, então não tenho certeza de como será bom trabalhar com www-data. Combinado com ssh-sessions para hosts diferentes, que têm seus próprios prompts, isso não me impediu de ser às vezes errado, mas se isso acontece, eu percebo rápido, o que está errado, e isso acontece raramente.

note: O script de prompt é parcialmente uma cópia da manpage do bash.


1
2018-06-01 15:49



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


Em esta página do meu site Eu cubro os comandos para mudar a permissão em /var/www entre apache e o usuário pi, mas é essencial

sudo chown -R pi /var/www

então um reinício do apache

sudo service apache2 restart

-1
2017-11-23 23:27



Link agora funciona - Gadgetroid