O usuário não pode tocar em -t

10

Ao enviar SCP para o meu servidor Fedora, um usuário continua recebendo erros por não conseguir modificar os carimbos de data / hora do arquivo ("tempo definido: operação não permitida"). O usuário não é o proprietário do arquivo, mas não podemos chownarquivos para esse usuário por razões de segurança. O usuário pode sudo, mas como isso está acontecendo através de um cliente SCP / FTP, também não há como fazer isso. E, finalmente, não queremos dar a esse usuário acesso root, apenas para permitir que ele use uma sincronização como rsync ou WinSCP que precise definir carimbos de data e hora.

O usuário faz parte de um grupo com rwpermissões totais em todos os arquivos e diretórios relevantes. Alguma idéia de como conceder permissão do usuário a touch -tesses arquivos específicos sem chownenviá-los a ele?

Informações adicionais Tudo isso tem a ver com a ativação do desenvolvimento do PHP em um cenário de desenvolvedor único (ou seja: sem o SCM). Estou tentando trabalhar com o Eclipse ou o NetBeans para trabalhar em uma cópia local do site baseado em PHP (WordPress), permitindo ao usuário "instantaneamente" visualizar suas alterações no servidor de desenvolvimento. O usuário estará trabalhando remotamente. Até o momento, todas as tentativas de sincronização automática falharam - mesmo usando o WinSCP no modo "watch folder", onde monitora uma pasta local e tenta carregar qualquer alteração até o erro do diretório remoto, porque sempre tenta definir a data / data / hora .

O usuário tem acesso ao sudo, mas foi-me dito que não é realmente uma boa ideia trabalhar com 'root', por isso não estava disposto a fazer login como root para fazer esse trabalho. Além disso, não deveria ser necessário. Eu gostaria que outro não-usuário pudesse fazer a mesma coisa - usando as informações da conta, estabelecendo uma conexão FTP e trabalhando remotamente via sincronização. Portanto, a solução precisa funcionar para alguém sem acesso root.

O que me surpreende é quanta dificuldade estou tendo. Todos esses softwares (NetBeans, Eclipse, WinSCP) foram projetados para permitir a sincronização e todos tentam escrever o registro de data e hora. Então deve ser possível. O WinSCP tem a opção de desativar "definir data e hora", mas essa opção fica indisponível (sempre "ativada") quando você seleciona a pasta de monitoramento / sincronização. Portanto, é tem que ser algo que é bastante normal.

Dado que sou um completo idiota no que diz respeito ao Linux, e sou o dev "administrador do servidor", posso apenas assumir que é algo idiota que estou fazendo ou que (configurado) (mis).

Resumo Em poucas palavras, desejo que qualquer usuário com acesso r / w de grupo a um diretório possa alterar o registro de data e hora nos arquivos desse diretório via SCP.

Tom Auger
fonte
1
O seu sistema de arquivos está montado com algo engraçado? Você está usando ACL? Normalmente, isso seria possível com a participação no grupo.
Caleb
5
Basicamente, seu sistema está lhe dizendo: "Você não pode tocar em -t [dele]".
boehj
@Caleb: Não, você só pode definir a data atual, a menos que seja o proprietário. @ Tom: É importante que a data seja respeitada? Você poderia expandir um pouco os requisitos: se o usuário pode gravar no arquivo, por que importa se ele é o proprietário? Normalmente, nessas situações, quem escreveu o arquivo pela última vez é o proprietário.
Gilles 'SO- stop be evil'
@ Tom: Existe uma aparente contradição entre “não queremos ter que dar acesso root a esse usuário” e “O usuário pode sudo”, você poderia explicar melhor essa parte? Em relação ao uso do rootgrupo: o rootgrupo não possui permissões especiais, apenas o rootusuário.
Gilles 'SO- stop be evil'
2
@ Tom: ACL = lista de controle de acesso
Gilles 'SO- stop be evil'

Respostas:

10

Por que não funciona

Quando você tenta alterar a hora da modificação de um arquivo touchou, geralmente, com a chamada do sistema subjacente utime, há dois casos.

  • Você está tentando definir o horário de modificação do arquivo para um horário específico. Isso requer que você seja o proprietário do arquivo. (Tecnicamente falando, o ID do usuário efetivo do processo deve ser o proprietário do arquivo.²)
  • Você está tentando definir a hora da modificação do arquivo para a hora atual. Isso funciona se e somente se você tiver permissão para gravar no arquivo. O motivo dessa exceção é que você pode obter o mesmo efeito substituindo um byte existente do arquivo com o mesmo valor¹.

Por que isso normalmente não importa

  • Quando você copia arquivos com ftp, scp, rsync etc., a cópia cria um novo arquivo que pertence a quem fez a cópia. Portanto, a copiadora tem permissão para definir os horários do arquivo.
  • Com o rsync, você não poderá definir a hora dos diretórios existentes: eles serão definidos para a hora em que um arquivo foi sincronizado pela última vez neles. Na maioria dos casos, isso não importa. Você pode dizer ao rsync para não se preocupar com os horários dos diretórios passando --omit-dir-times( -O).
  • Nos sistemas de controle de versão, as datas de revisão são armazenadas em arquivos; os metadados nos arquivos são principalmente irrelevantes.

Soluções

Tudo isso tem a ver com a ativação do desenvolvimento do PHP em um cenário de desenvolvedor único (ou seja: sem o SCM).

Ok, pare aí mesmo. Só porque existe um único desenvolvedor, não significa que você não deve usar o SCM. Você deveria estar usando o SCM. Peça ao desenvolvedor que faça o check-in de um arquivo e dê a ele uma maneira de pressionar um botão "deploy" para fazer o check-out dos arquivos do SCM no diretório ativo.

Não existe absolutamente nenhuma razão técnica para você não estar usando o SCM, mas pode haver uma razão humana. Se a pessoa que trabalha nesses arquivos se autodenomina "desenvolvedor", deve usar o SCM. Mas se for uma pessoa não técnica que envia documentos, o SCM pode ser muito complicado. Então continue enviando os arquivos por FTP ou SSH. Existem três maneiras de isso funcionar.

  • Você realmente precisa sincronizar os horários? Como indicado acima, rsynctem uma opção para não sincronizar os horários. Scp não, a menos que você diga. Eu não conheço o WinSCP, mas provavelmente também pode.
  • Continue fazendo o que está fazendo, apenas ignore as mensagens sobre horários. Os arquivos ainda estão sendo copiados. Esta não é uma boa opção, porque ignorar erros é sempre arriscado. Mas é tecnicamente possível.
  • Se você precisar de flexibilidade para preencher os arquivos pertencentes ao apacheusuário, a abordagem usual seria permitir que o usuário SSH acesse como apache. A abordagem fácil é fazer com que o usuário crie uma chave privada SSH e adicione a chave pública correspondente ~apache/.ssh/authorized_keys. Isso significa que o usuário poderá executar comandos arbitrários como o apacheusuário. Como você concorda em conceder direitos ao usuário sudo de qualquer maneira, isso não importa no seu caso. É possível, mas não tão fácil, colocar mais restrições (você precisa de uma entrada separada do banco de dados do usuário com um nome diferente, o mesmo ID do usuário, um shell restrito e uma prisão chroot; detalhes em uma pergunta separada, embora isso já possa estar coberto neste site ou na falha do servidor ).

¹ Ou, para um arquivo vazio, escreva um byte e depois trunque.
² Exceto complicações adicionais, mas nenhuma que eu saiba se aplica aqui.

Gilles 'SO- parar de ser mau'
fonte
Obrigado Gilles, pela explicação interessante. No entanto, não tenho certeza de quanto posso ser mais claro sobre o caso de uso. O NetBeans continua lançando erros "não é possível desconectar" sempre que sincronizo (embora o arquivo seja transferido corretamente e verificado no servidor); O WinSCP lança erros de 'tempo definido: operação não permitida'; Quando desarmar um arquivo, recebo avisos sobre a impossibilidade de definir o carimbo de data / hora para um horário no futuro. Além disso, não sei onde está o problema. Eu simplesmente quero ser capaz de sincronizar um local para um diretório remoto. via SCP / FTP e o problema parece ser o registro de data e hora. Isso ajuda? Provavelmente não.
Tom Auger
@ Tom: Eu ainda não entendo por que você não pode apenas ter os usuários como proprietários dos arquivos.
Gilles 'SO- stop be evil'
Alguns dos arquivos precisam pertencer ao Apache (por exemplo, o diretório de uploads), portanto não posso alterar o proprietário, apenas porque alguém está trabalhando em alguns dos arquivos do diretório. O que você está dizendo não faz sentido - quando sobrescrevo um arquivo usando FTP, o proprietário não muda necessariamente. Não vejo a necessidade de alterar esse comportamento.
Tom Auger
@ Tom: O proprietário não muda apenas porque esses são arquivos existentes. Não entendo por que você não permite que os usuários enviem arquivos como apache- eles poderiam definir horários. Veja minha resposta revisada para a solução certa e algumas abaixo do ideal.
Gilles 'SO- stop be evil'
Obrigado por continuar com esta pergunta Gilles. O uso de SVN ou alguma variante é subótimo do ponto de vista do desenvolvimento. Qualquer pessoa que tenha feito o desenvolvimento da Web remotamente pode dizer que o processo geralmente é micro-incremental - especialmente quando visualmente estilizado - então você faz confirmações a cada 30 a 60 segundos. Se você precisar sair constantemente do IDE, executar uma confirmação e visualizar o navegador, estará adicionando uma tonelada de sobrecarga ao que deveria ser um processo simples. O SVN só faz sentido no contexto quando vários desenvolvedores estão trabalhando na mesma parte de um site. É diferente de programação.
Tom Auger
2

Você pode configurar o rsync para usar o sudo na extremidade remota da seguinte maneira:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/
Caleb
fonte
Qual seria a regra do sudo? Simplesmente permitir o rsync permitiria ao usuário substituir arquivos arbitrários. É muito difícil acertar as limitações de argumentos e, de qualquer maneira, acho que você precisará colocar restrições na entrada do rsync, o que é tecnicamente possível com um script de wrapper, mas não é fácil.
Gilles 'SO- stop be evil'
Você está certo, sudo rsyncé muito difícil restringir a permissão . Eu o sugeri apenas porque o OP disse que o usuário já tinha acesso ao sudo.
Caleb
Obrigado - isso é interessante, embora o desenvolvedor esteja em uma caixa do Windows, então não tenho certeza se o rsync é o melhor caminho a percorrer. Novamente, como mencionei na edição da minha postagem, quero que esta solução funcione para qualquer usuário comum, não para alguns usuários privilegiados, além de alguém pertencente ao grupo que possui esse diretório específico.
Tom Auger
Penso que a próxima coisa a considerar é configurar ACLs (Access Control Lists), mas tenho pouca experiência nessa área, então talvez algum guru possa adicionar uma resposta e explicar se e como isso pode ser feito.
Caleb