L'utente non può toccare -t


10

Quando SCP si rivolge al mio server Fedora, un utente continua a ricevere errori per non essere in grado di modificare i timestamp dei file ("set time: operazione non consentita"). L'utente non è il proprietario del file, ma non possiamo inviare chownfile a questo utente per motivi di sicurezza. L'utente può sudo, ma dal momento che ciò accade tramite un client SCP / FTP, non c'è modo di farlo neanche. E infine, non vogliamo dare a questo utente l'accesso root, solo per consentirgli di utilizzare una sincronizzazione come rsync o WinSCP che deve impostare i timestamp.

L'utente fa parte di un gruppo con rwautorizzazioni complete su tutti i file e le directory pertinenti. Qualche idea su come concedere l'autorizzazione dell'utente a touch -tquesti file specifici senza chowninviarli a lui?

Ulteriori informazioni Tutto ciò ha a che fare con l'abilitazione dello sviluppo di PHP in uno scenario a singolo sviluppatore (ovvero: senza SCM). Sto cercando di lavorare con Eclipse o NetBeans per lavorare su una copia locale del sito basato su PHP (WordPress), consentendo allo stesso tempo all'utente di visualizzare in anteprima "istantaneamente" le sue modifiche sul server di sviluppo. L'utente lavorerà in remoto. Finora, tutti i tentativi di sincronizzazione automatica sono falliti, anche usando WinSCP in modalità "watch folder", dove controlla una cartella locale e tenta di caricare qualsiasi modifica fino all'errore della directory remota perché cerca sempre di impostare la data / il timestamp .

L'utente ha accesso sudo, ma mi è stato detto che non è una buona idea lavorare sotto 'root', quindi non sono stato disposto a fare il login come root per fare questo lavoro. Inoltre, non dovrebbe essere necessario. Vorrei che qualcun altro, non superutente, fosse in grado di fare la stessa cosa: usare le informazioni del proprio account, stabilire una connessione FTP ed essere in grado di lavorare in remoto tramite la sincronizzazione. Quindi la soluzione deve funzionare per qualcuno senza accesso root.

Ciò che mi sconcerta è quanta difficoltà sto avendo. Tutti questi software (NetBeans, Eclipse, WinSCP) sono progettati per consentire la sincronizzazione e provano tutti a scrivere il timestamp. Quindi deve essere possibile. WinSCP ha l'opzione per disattivare "set timestamp", ma questa opzione non è disponibile (sempre "on") quando si seleziona monitor / sincronizza cartella. Quindi è ottenuto di essere qualcosa che è abbastanza standard.

Dato che sono un completo idiota quando si tratta di Linux, e sono il dev "server admin", posso solo supporre che sia qualcosa di idiota che sto facendo o che ho (mis) configurato.

Riepilogo In breve, desidero che tutti gli utenti che hanno accesso di gruppo r / w a una directory, siano in grado di modificare il timestamp sui file in quella directory tramite SCP.


1
Il tuo file system è montato con qualcosa di divertente? Stai usando gli ACL? Normalmente questo sarebbe possibile con l'appartenenza al gruppo.
Caleb,

5
Fondamentalmente il tuo sistema ti sta dicendo "Non puoi toccare -t [suo]".
Boehj,

@Caleb: No, puoi solo impostare la data corrente a meno che tu non sia il proprietario. @ Tom: è importante rispettare la data? Potresti espandere un po 'i requisiti: se l'utente è in grado di scrivere sul file, perché importa se potrebbe possederli? Di solito, in queste situazioni, chiunque abbia scritto per ultimo sul file lo possiede.
Gilles 'SO- smetti di essere malvagio' il

@ Tom: esiste un'apparente contraddizione tra "non vogliamo dare a questo utente l'accesso root" e "L'utente può sudo", potresti spiegare meglio questa parte? Per quanto riguarda l'utilizzo del rootgruppo: il rootgruppo non ha autorizzazioni speciali, solo l' rootutente lo fa.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


10

Perché non funziona

Quando si tenta di modificare il tempo di modifica di un file con touch, o più in generale con la chiamata di sistema sottostante utime, ci sono due casi.

  • Stai tentando di impostare l'ora di modifica del file su un orario specifico. Ciò richiede che tu sia il proprietario del file. (Tecnicamente parlando, l'ID utente effettivo del processo deve essere il proprietario del file.²)
  • Stai tentando di impostare l'ora di modifica del file sull'ora corrente. Funziona se e solo se si dispone dell'autorizzazione per scrivere nel file. Il motivo di questa eccezione è che è possibile ottenere comunque lo stesso effetto sovrascrivendo un byte esistente del file con lo stesso valore¹.

Perché questo in genere non ha importanza

  • Quando si copiano file con ftp, scp, rsync, ecc., La copia crea un nuovo file di proprietà di chiunque abbia eseguito la copia. Quindi la fotocopiatrice ha il permesso di impostare i tempi del file.
  • Con rsync, non sarai in grado di impostare l'ora delle directory esistenti: saranno impostate sull'ora dell'ultima sincronizzazione di un file in esse. Nella maggior parte dei casi, questo non ha importanza. Puoi dire a rsync di non preoccuparti dei tempi della directory passando --omit-dir-times( -O).
  • Con i sistemi di controllo della versione, le date di revisione sono memorizzate all'interno dei file; i metadati sui file sono per lo più irrilevanti.

soluzioni

Tutto questo ha a che fare con l'abilitazione dello sviluppo di PHP in uno scenario a singolo sviluppatore (ovvero: senza SCM).

Ok, fermati proprio lì. Solo perché c'è un singolo sviluppatore non significa che non dovresti usare SCM. Dovresti usare SCM. Chiedi allo sviluppatore di archiviare un file e dargli un modo per premere un pulsante "deploy" per estrarre i file da SCM nella directory live.

Non c'è assolutamente alcun motivo tecnico per cui non dovresti usare SCM, ma potrebbe esserci un motivo umano. Se la persona che lavora su questi file si definisce "sviluppatore", dovrebbe usare SCM. Ma se questa è una persona non tecnica che invia documenti, SCM potrebbe essere troppo complicato. Quindi continua a inviare i file su FTP o SSH. Ci sono tre modi in cui questo può funzionare.

  • Hai davvero bisogno di sincronizzare i tempi? Come indicato sopra, rsyncha un'opzione per non sincronizzare i tempi. Scp no a meno che tu non lo dica a. Non conosco WinSCP ma probabilmente può farlo anche.
  • Continua a fare quello che stai facendo, ignora i messaggi sui tempi. I file sono ancora in fase di copia. Questa non è una buona opzione, perché ignorare gli errori è sempre rischioso. Ma è tecnicamente possibile.
  • Se hai bisogno di flessibilità nel popolare i file di proprietà apachedell'utente, il solito approccio sarebbe quello di consentire all'utente l'accesso SSH come apache. L' approccio semplice consiste nel consentire all'utente di creare una chiave privata SSH e aggiungere la chiave pubblica corrispondente a ~apache/.ssh/authorized_keys. Ciò significa che l'utente sarà in grado di eseguire comandi arbitrari come l' apacheutente. Dato che sei d'accordo nel dare all'utente i diritti sudo comunque, non importa nel tuo caso. È possibile, ma non è così semplice, mettere più restrizioni (è necessaria una voce di database utente separata con un nome diverso, lo stesso ID utente, una shell con restrizioni e una prigione chroot; dettagli in una domanda separata, anche se questo potrebbe già essere coperto su questo sito o su Server Fault ).

¹ Oppure, per un file vuoto, scrivere un byte e poi troncare.
² Salvo ulteriori complicazioni, ma nessuna di quelle che conosco si applica qui.


Grazie Gilles, per l'interessante spiegazione. Non sono sicuro di quanto più chiaro possa essere riguardo al caso d'uso. NetBeans continua a generare errori "impossibile disconnettere" ogni volta che eseguo la sincronizzazione (sebbene il file sia trasferito correttamente e verificato sul server); WinSCP genera errori "tempo impostato: operazione non consentita"; quando annulla la decompressione di un file ricevo avvisi in merito all'impossibilità di impostare il timestamp su un orario futuro. Oltre a ciò, non so dove sia il problema. Voglio semplicemente essere in grado di sincronizzare un locale con una directory remota. tramite SCP / FTP e il problema sembra essere il timestamp. questo aiuta? Probabilmente no.
Tom Auger,

@Tom: non capisco ancora perché non puoi avere i file solo dagli utenti.
Gilles 'SO- smetti di essere malvagio' il

Alcuni file devono essere di proprietà di Apache (ad esempio, la directory dei caricamenti), quindi non posso avere il proprietario che viene modificato, solo perché qualcuno sta lavorando su alcuni dei file nella directory. Quello che stai dicendo non ha senso: quando sovrascrivo un file usando FTP, il proprietario non cambia necessariamente. Non vedo la necessità di modificare questo comportamento.
Tom Auger,

@Tom: il proprietario non cambia solo perché si tratta di file esistenti. Non capisco perché non consenti agli utenti di caricare file come apache- quindi sarebbero in grado di impostare i tempi. Vedi la mia risposta rivista per la soluzione giusta e un paio di soluzioni non ottimali.
Gilles 'SO- smetti di essere malvagio' il

Grazie per essere rimasto con questa domanda Gilles. L'uso di SVN o alcune varianti non è ottimale dal punto di vista dello sviluppo. Chiunque abbia eseguito lo sviluppo Web in remoto può dirti che il processo è in genere micro-incrementale, specialmente quando si tratta di uno stile visivo, quindi stai facendo dei commit ogni 30-60 secondi. Se devi uscire costantemente dal tuo IDE, eseguire un commit e quindi visualizzare l'anteprima del browser, stai aggiungendo un sacco di sovraccarico a quello che dovrebbe essere un semplice processo. SVN ha senso solo nel contesto in cui più sviluppatori lavorano sulla stessa parte di un sito. È diverso dalla programmazione.
Tom Auger,

2

È possibile configurare rsync per utilizzare sudo sull'estremità remota in questo modo:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/

Quale sarebbe la regola sudo? Consentire semplicemente rsync consentirebbe all'utente di sovrascrivere file arbitrari. È piuttosto difficile ottenere le limitazioni degli argomenti giusti, e comunque qui penso che dovresti mettere restrizioni sull'input di rsync, che è tecnicamente possibile con uno script wrapper ma non facile.
Gilles 'SO- smetti di essere malvagio' il

Hai ragione, consentire sudo rsyncè molto difficile limitare. L'ho suggerito solo perché l'OP ha detto che l'utente aveva già accesso sudo.
Caleb,

Grazie - questo è interessante, anche se lo sviluppatore è su una finestra di Windows, quindi non sono sicuro che rsync sia il modo migliore per andare. Ancora una volta, come ho detto nella modifica al mio post, voglio che questa soluzione funzioni per qualsiasi utente medio, non per alcuni utenti privilegiati, oltre a qualcuno appartenente al gruppo che possiede quella particolare directory.
Tom Auger,

Penso che la prossima cosa da esaminare sia la creazione di ACL (Access Control Lists), ma ho poca esperienza in questo settore, quindi forse alcuni guru possono aggiungere una risposta e spiegare se e come questo può essere fatto.
Caleb,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.