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.
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/dirnã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.
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):
(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.)
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:
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.
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-datausuário é adicionado ao app01grupo ? 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.
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:
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.
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.
+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.
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.
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.
sudo -u www-data
mas restringir-se nosudoers
arquivo para poder apenassudo www-data
(e não o sudo root). Veja serverfault.com/questions/295429/…Respostas:
A maioria das respostas aqui não é 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ê 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/www
foi movido para/var/www/html
Ajustar os comandos nesta resposta de acordo.Vejo:
Onde colocar meu site local começando com a versão 2.4.7 do apache2?
Por que o diretório www apache2 www foi movido para / var / www / html?
Alterando a raiz do documento padrão para o servidor HTTP
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 owww-data
usuáriochgrp -R www-data $HOME
(cob) - permitewww-data
ler ou gravar qualquer arquivo no diretório inicial. Isso não mantém em mente a regra dos privilégios mínimoschown -R $USER:$USER /var/www
(kv1dr) - a menos que o mundo tenha permissões de leitura/var/www
, o servidor da web em execuçãowww-data
nã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-data
privilégios de gravação. No entanto,/usr/share/doc/base-passwd/users-and-groups.txt.gz
afirma:Sempre que possível, não conceda permissões de gravação ao
www-data
grupo.www-data
só precisa ler os arquivos para que o servidor da web possa atendê-lo. O único caso em quewww-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 defina o bit setgid no/var/www
diretório para que todos os arquivos recém-criados também herdam esse grupo.Corrija os arquivos criados anteriormente (supondo que você seja o único usuário de
/var/www
):(ainda mais seguro: use
640
ou2750
e manualmentechmod g+w file-or-dir
que 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/foo
e você deseja localizá-lo em/var/www/foo
, execute: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 parawww-data
, mas defina apenas o bit de execução (sem leitura / gravação). Faça o mesmo com a~/projects
pasta, pois ela pode conter outros projetos além de www. (Você não precisasudo
se já adicionou seu usuário aowww-data
grupo.)Definir o grupo para
www-data
on~/projects/foo
e permitir que o servidor web para ler e gravar arquivos e arquivos de diretórios + e descer em diretórios: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/foo
seja acessível pelo grupo.A partir de agora, você poderá acessar o site
http://localhost/foo
e editar os arquivos do projeto~/projects/foo
.Veja também
fonte
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?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.setfacl -d u::rwX,g::rX /var/www
tem 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/www
já é inacessível pelo mundo, não é necessário./var/www/app01
possui propriedadeapp01:app01
e owww-data
usuário é adicionado aoapp01
grupo ? Ou isso vai quebrar alguma coisa?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.
fonte
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:
Você poderá editar
/var/www/
arquivos sem problemas.A primeira linha adiciona você ao
www-data
grupo, a segunda linha limpa todos os arquivos com propriedade desarrumada e a terceira faz com que todos os usuários que são membros dowww-data
grupo possam ler e gravar todos os arquivos/var/www
.fonte
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-data
usuá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-data
e é 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/www
nã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.
fonte
É 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
Em seguida, basta mostrar o diretório do projeto ao seu usuário.
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 :)
fonte
/var/www
si mesma, mas de subdiretórios.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.
fonte
/var
, apenas/var/www
e / ou seu conteúdo.Você pode iniciar uma sessão www em um terminal
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:
e obtê-lo,
/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 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.
fonte