sandboxd para los backends de CUPS en Mac OS X Yosemite

4

Estoy usando un backend CUPS personalizado para imprimir en Mac OS X. El backend funciona al reenviar los datos de impresión a otra máquina (usando ssh) y desde allí enviar los datos a la impresora. Para que esto funcione, el backend (implementado como un script de shell) necesita acceso a una clave privada ssh. Problema: desde que actualicé a Yosemite, el script ya no puede acceder al archivo que contiene la clave. En su lugar, veo el siguiente mensaje de error en la consola:

sandboxd: [...] deny file-read-data /

y

/usr/libexec/cups/backend/.mybackend-ssh/id_dsa: Permission denied

en el archivo de registro de errores CUPS.

¿Cómo puedo inyectar un archivo en el arenero utilizado para aislar los backends de CUPS?

    
pregunta jochen 29.10.2014 - 16:53

2 respuestas

4

Después de una larga sesión de depuración, finalmente he resuelto este problema. En caso de que otras personas encuentren las mismas dificultades, esto es lo que aprendí sobre los backends de CUPS en Mac OS X Yosemite:

  • Los backends son archivos ejecutables (en mi caso, un script de shell) en el directorio /usr/libexec/cups/backend/ . La información sobre el trabajo de impresión se pasa a estos programas a través de los argumentos de la línea de comandos ( $1 = id-trabajo, $2 = usuario, $3 = título, $4 = copias, $5 = opciones, $6 = archivo) y variables de entorno ( ej. $DEVICE_URI ).

  • Los backends se ejecutan como usuario _lp , grupo _lp , con permisos restringidos aún más por sandboxd. El directorio actual cuando se inicia el backend es el directorio raíz / , pero el backend no tiene permiso para leer este directorio. Los directorios que se pueden leer incluyen /usr/libexec/cups/backend/ , /etc/ y sus subdirectorios. Solo se permite el acceso muy restringido (¿o ninguno?) Al directorio principal del usuario _lp (en /var/spool/cups ).

  • Mi backend requiere el uso de ssh. Para que esto funcione, ssh debe poder acceder a la clave privada requerida para iniciar sesión en el servidor remoto, y un archivo known_hosts que identifica al servidor remoto. La clave requerida se puede colocar en /usr/libexec/cups/backend/ o en un subdirectorio, solo debe ser legible por el usuario _lp . Parece que ssh, cuando se inicia desde el backend de CUPS, no tiene permiso para acceder a /var/spool/cups/.ssh/ , incluso si este directorio existe; por lo tanto, el archivo known_hosts debe almacenarse en /etc/ , como /etc/ssh_known_hosts . (Tenga en cuenta que la página del manual ssh afirma incorrectamente que esto debería ser /etc/ssh/ssh_known_hosts ).

    Editar: en MacOS X 10.11 (El Capitán), parece que ssh ahora usa la ubicación documentada /etc/ssh/ssh_known_hosts para lo conocido archivo de hosts. Tuve que mover mi archivo a /etc/ssh/ para hacer que la impresora filtre trabajar después de la actualización del sistema operativo.

  • Para depurar problemas como este, usar cupsctl --debug-logging es invaluable: después de que se emita este comando, todo lo escrito en stderr en el backend de CUPS aparece en /var/log/cups/error_log . El registro se puede volver a desactivar usando cupsctl --no-debug-logging . Además, siempre que sandboxd niegue un intento de acceso a un archivo, se puede encontrar un mensaje como sandboxd[426] ([15998]): sh(15998) deny file-read-data / en /var/log/system.log .

respondido por el jochen 31.10.2014 - 20:46
4

Mientras esto no responde a la pregunta, me topé con esto - enlace - al intentar obtener Tea4CUPS trabajando en OS X 10.10 (no pude lograr esto):

  

Para que PaperCut funcione con Mac OS 10.10 en el ínterin, deberás desactivar el sandbox. Edite el archivo /etc/cups/cups-files.conf para incluir la nueva línea "Sandboxing Relaxed". Luego reinicie CUPS para que esto tenga efecto.

sudo sh -c 'echo "Sandboxing Relaxed" >> /etc/cups/cups-files.conf'
sudo launchctl stop org.cups.cupsd
    
respondido por el chris1h1 26.02.2015 - 20:59

Lea otras preguntas en las etiquetas