El usuario no puede tocar -t

10

Cuando SCP'ing a mi servidor Fedora, un usuario sigue recibiendo errores acerca de no poder modificar las marcas de tiempo del archivo ("hora establecida: operación no permitida"). El usuario no es el propietario del archivo, pero no podemos enviarle chownarchivos a este usuario por razones de seguridad. El usuario puede sudo, pero como esto sucede a través de un cliente SCP / FTP, tampoco hay forma de hacerlo. Y finalmente, no queremos tener que darle acceso a este usuario root, solo para permitirle usar una sincronización como rsync o WinSCP que necesita establecer marcas de tiempo.

El usuario es parte de un grupo con rwpermisos completos en todos los archivos y directorios relevantes. ¿Alguna idea sobre cómo otorgar permiso de usuario a touch -testos archivos específicos sin chowndárselos?

Información adicional Todo esto tiene que ver con habilitar el desarrollo de PHP en un escenario de desarrollador único (es decir, sin SCM). Estoy tratando de trabajar con Eclipse o NetBeans para trabajar en una copia local del sitio basado en PHP (WordPress), mientras le permito al usuario obtener una vista previa "instantánea" de sus cambios en el servidor de desarrollo. El usuario estará trabajando de forma remota. Hasta ahora, todos los intentos de sincronización automática han fallado, incluso utilizando WinSCP en modo "carpeta de observación", donde monitorea una carpeta local e intenta cargar cualquier cambio hasta el error del directorio remoto porque siempre intenta establecer la fecha / marca de tiempo .

El usuario tiene acceso a sudo, pero me han dicho que realmente no es una buena idea trabajar en 'root', por lo que no he estado dispuesto a iniciar sesión como root para hacer este trabajo. Además, no debería ser necesario. Me gustaría que otro usuario que no sea superusuario pueda hacer lo mismo: usar la información de su cuenta, establecer una conexión FTP y poder trabajar de forma remota a través de la sincronización. Por lo tanto, la solución debe funcionar para alguien sin acceso de root.

Lo que me sorprende es la dificultad que tengo. Todos estos softwares (NetBeans, Eclipse, WinSCP) están diseñados para permitir la sincronización, y todos intentan escribir la marca de tiempo. Entonces debe ser posible. WinSCP tiene la opción de desactivar "establecer marca de tiempo", pero esta opción deja de estar disponible (siempre "activada") cuando selecciona monitor / sincronizar carpeta. Por lo que se tiene que ser algo que es bastante estándar.

Dado que soy un completo idiota cuando se trata de Linux, y soy el "administrador del servidor" del desarrollador, solo puedo suponer que es algo idiota lo que estoy haciendo o que he (mal) configurado.

Resumen En pocas palabras, quiero que todos los usuarios que tengan acceso grupal de r / w a un directorio puedan cambiar la marca de tiempo de los archivos en ese directorio a través de SCP.

Tom Auger
fuente
1
¿Su sistema de archivos está montado con algo divertido? ¿Estás usando ACL? Normalmente esto sería posible con la membresía grupal.
Caleb
55
Básicamente, su sistema le dice: "No puede tocar -t [his]".
boehj
@Caleb: No, solo puede establecer la fecha actual a menos que sea el propietario. @Tom: ¿Es importante que se respete la fecha? ¿Podría ampliar un poco los requisitos: si el usuario puede escribir en el archivo, ¿por qué es importante si los posee? Por lo general, en estas situaciones, la última persona que escribió en el archivo lo posee.
Gilles 'SO- deja de ser malvado'
@Tom: Existe una aparente contradicción entre "no queremos tener que darle acceso a este usuario root" y "El usuario puede sudo", ¿podría explicar mejor esta parte? Con respecto a su uso del rootgrupo: el rootgrupo no tiene permisos especiales, solo el rootusuario los tiene.
Gilles 'SO- deja de ser malvado'
2
@Tom: ACL = lista de control de acceso
Gilles 'SO- deja de ser malvado'

Respuestas:

10

Por que no funciona

Cuando intenta cambiar el tiempo de modificación de un archivo con touch, o más generalmente con la llamada del sistema subyacente utime, hay dos casos.

  • Está intentando establecer la hora de modificación del archivo a una hora específica. Esto requiere que usted sea el propietario del archivo. (Técnicamente hablando, la identificación de usuario efectiva del proceso debe ser el propietario del archivo.²)
  • Está intentando establecer la hora de modificación del archivo a la hora actual. Esto funciona si y solo si tiene permiso para escribir en el archivo. La razón de esta excepción es que de todos modos podría lograr el mismo efecto sobrescribiendo un byte existente del archivo con el mismo valor¹.

Por qué esto normalmente no importa

  • Cuando copia archivos con ftp, scp, rsync, etc., la copia crea un nuevo archivo propiedad de quien hizo la copia. Entonces la copiadora tiene el permiso para establecer los tiempos del archivo.
  • Con rsync, no podrá establecer la hora de los directorios existentes: se establecerán a la hora en que un archivo se sincronizó por última vez en ellos. En la mayoría de los casos, esto no importa. Puede decirle a rsync que no se moleste con los tiempos de directorio pasando --omit-dir-times( -O).
  • Con los sistemas de control de versiones, las fechas de revisión se almacenan dentro de los archivos; Los metadatos en los archivos son irrelevantes.

Soluciones

Todo esto tiene que ver con habilitar el desarrollo de PHP en un escenario de desarrollador único (es decir, sin SCM).

Ok, detente ahí. El hecho de que haya un único desarrollador no significa que no deba usar SCM. Deberías estar usando SCM. Haga que el desarrollador registre un archivo y bríndele una forma de presionar un botón de "implementación" para verificar los archivos de SCM en el directorio en vivo.

No hay absolutamente ninguna razón técnica por la que no deba usar SCM, pero puede haber una razón humana. Si la persona que trabaja en estos archivos se llama a sí misma "desarrollador", debería estar usando SCM. Pero si se trata de una persona no técnica que introduce documentos, SCM podría ser demasiado complicado. Así que continúa empujando los archivos a través de FTP o SSH. Hay tres formas en que esto puede funcionar.

  • ¿Realmente necesitas sincronizar los tiempos? Como se indicó anteriormente, rsynctiene una opción para no sincronizar tiempos. Scp no lo hace a menos que se lo digas. No conozco WinSCP pero probablemente también pueda.
  • Continúa haciendo lo que estás haciendo, simplemente ignora los mensajes sobre los tiempos. Los archivos aún se están copiando. Esta no es una buena opción, porque ignorar los errores siempre es arriesgado. Pero es técnicamente posible.
  • Si necesita flexibilidad para completar los archivos que posee el apacheusuario, el enfoque habitual sería permitir el acceso SSH del usuario como apache. El enfoque fácil es hacer que el usuario cree una clave privada SSH y agregue la clave pública correspondiente ~apache/.ssh/authorized_keys. Esto significa que el usuario podrá ejecutar comandos arbitrarios como el apacheusuario. Como de todas formas está de acuerdo en otorgarle al usuario derechos de sudo, no importa en su caso. Es posible, pero no tan fácil, poner más restricciones (necesita una entrada de base de datos de usuario separada con un nombre diferente, la misma ID de usuario, un shell restringido y una cárcel chroot; detalles en una pregunta separada, aunque esto ya puede estar cubierto en este sitio o en la falla del servidor ).

¹ O, para un archivo vacío, escriba un byte y luego trunque.
² Salvo complicaciones adicionales, pero ninguna que yo sepa se aplica aquí.

Gilles 'SO- deja de ser malvado'
fuente
Gracias Gilles, por la interesante explicación. Sin embargo, no estoy seguro de cuánto más claro puedo ser sobre el caso de uso. NetBeans continúa arrojando errores de "no se puede desconectar" cada vez que sincronizo (aunque el archivo se transfiere correctamente y se verifica en el servidor); WinSCP arroja errores de "tiempo establecido: operación no permitida"; cuando descomprimo un archivo, recibo advertencias sobre la imposibilidad de establecer la marca de tiempo en un momento en el futuro. Más allá de eso, no sé dónde radica el problema. Simplemente quiero poder sincronizar un directorio local con un directorio remoto. a través de SCP / FTP y el problema parece ser las marcas de tiempo. ¿Esto ayuda? Probablemente no.
Tom Auger
@Tom: Todavía no entiendo por qué no puedes hacer que los usuarios sean dueños de los archivos.
Gilles 'SO- deja de ser malvado'
Algunos de los archivos deben ser propiedad de Apache (por ejemplo, el directorio de cargas) para que no pueda cambiar el propietario, solo porque alguien está trabajando en algunos de los archivos en el directorio. Lo que estás diciendo no tiene sentido: cuando sobreescribo un archivo usando FTP, el propietario no cambia necesariamente. No veo la necesidad de alterar este comportamiento.
Tom Auger
@ Tom: el propietario no cambia solo porque estos son archivos existentes. No entiendo por qué no dejas que los usuarios carguen archivos apache, entonces podrían establecer tiempos. Vea mi respuesta revisada para la solución correcta y un par de subóptimas.
Gilles 'SO- deja de ser malvado'
Gracias por seguir con esta pregunta, Gilles. Usar SVN o alguna variante es subóptimo desde una perspectiva de desarrollo. Cualquier persona que haya realizado desarrollo web de forma remota puede decirle que el proceso suele ser micro-incremental, especialmente cuando se trata de un diseño visual, por lo que está haciendo confirmaciones cada 30-60 segundos. Si tiene que salir constantemente de su IDE, ejecutar una confirmación y luego previsualizar su navegador, está agregando un montón de sobrecarga a lo que debería ser un proceso simple. SVN solo tiene sentido en el contexto cuando varios desarrolladores están trabajando en la misma parte de un sitio. Es diferente de la programación.
Tom Auger
2

Puede configurar rsync para usar sudo en el extremo remoto de esta manera:

rsync -ave ssh --rsync-path="sudo rsync" /source/ user@host:/dest/
Caleb
fuente
¿Cuál sería la regla del sudo? Simplemente permitir rsync permitiría al usuario sobrescribir archivos arbitrarios. Es bastante difícil acertar con las limitaciones de los argumentos, y de todos modos aquí creo que tendrías que poner restricciones en la entrada de rsync, que es técnicamente posible con un script de envoltura pero no es fácil.
Gilles 'SO- deja de ser malvado'
Tienes razón, permitir sudo rsynces muy difícil de restringir. Solo lo sugerí porque el OP dijo que el usuario ya tenía acceso a sudo.
Caleb
Gracias, esto es interesante, aunque el desarrollador está en una caja de Windows, así que no estoy seguro de que rsync sea la mejor opción. Nuevamente, como mencioné en la edición de mi publicación, quiero que esta solución funcione para cualquier usuario promedio, no para algunos usuarios privilegiados, más allá de alguien que pertenezca al grupo que posee ese directorio en particular.
Tom Auger
Creo que lo siguiente a considerar es configurar ACL (listas de control de acceso), pero tengo poca experiencia en esta área, por lo que tal vez algún gurú pueda agregar una respuesta y explicar si se puede hacer esto.
Caleb