{"id":1402,"date":"2016-04-14T08:55:07","date_gmt":"2016-04-14T08:55:07","guid":{"rendered":"http:\/\/esferas.org\/msqlu\/?p=1402"},"modified":"2016-04-17T08:59:03","modified_gmt":"2016-04-17T08:59:03","slug":"ampliando-cups-pdf-para-distribuir-documentos","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2016\/04\/14\/ampliando-cups-pdf-para-distribuir-documentos\/","title":{"rendered":"Ampliando cups-pdf para distribuir documentos &#8230;"},"content":{"rendered":"<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:955,&quot;href&quot;:&quot;https:\\\/\\\/astillas.net\\\/wiki\\\/Sudo&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:965,&quot;href&quot;:&quot;http:\\\/\\\/unix.stackexchange.com\\\/questions\\\/364\\\/allow-setuid-on-shell-scripts&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260219104852\\\/https:\\\/\\\/unix.stackexchange.com\\\/questions\\\/364\\\/allow-setuid-on-shell-scripts&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-15 17:18:45&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-15 17:18:45&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:966,&quot;href&quot;:&quot;https:\\\/\\\/packages.debian.org\\\/jessie\\\/super&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20151207000520\\\/https:\\\/\\\/packages.debian.org\\\/jessie\\\/super&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-15 17:18:47&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-15 17:18:47&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;}]'><\/div>\n<p>&#8230; ya que no siempre existe una correlaci\u00f3n entre el usuario que crea los trabajos de impresi\u00f3n y el que tiene que acceder a ellos.<\/p>\n<p><!--more--><\/p>\n<p>Ya coment\u00e9 c\u00f3mo he aprovechado el anclaje de cups-pdf para posprocesar los documentos PDF y enviarlos a una o varias cuentas de correo electr\u00f3nico. Y s\u00ed, funciona bien, pero tambi\u00e9n necesitan que dichos documentos se instalen en las carpetas correspondientes para que tengan acceso desde su escritorio (existe un montaje NFS y un enlace simb\u00f3lico en cada puesto de trabajo).<\/p>\n<p>Estuve d\u00e1ndole vueltas y me percat\u00e9 de que pod\u00eda crear un envoltorio de posproceso que hiciese m\u00e1s de una cosa. Sirve de puente entre el programa de <em>cups-pdf<\/em> y el a\u00f1adido que hice para enviar correo y que he llamado <em>cups-pdf2email<\/em>. Adem\u00e1s de a \u00e9ste tambi\u00e9n llama <em>a\u00a0<\/em><em>cups-pdf2copy<\/em>, un script que consulta un archivo mapa y copia los PDF generados a otros directorios. No he tenido tiempo ni ganas de establecer mejores controles sobre la ejecuci\u00f3n de todos ellos. Son tan simples que conf\u00edo en una b\u00fasqueda en los registros de <em>cups<\/em> en caso de fallos catastr\u00f3ficos. Tal vez m\u00e1s adelante si es que lo usan mucho.<\/p>\n<p>Bien, el caso es que por motivos de seguridad <em>cups-pdf<\/em> funciona siempre con los permisos de la cuenta de usuario que ha creado el trabajo de impresi\u00f3n o, en caso de no encontrarlo por no existir correspondencia con el sistema donde se origin\u00f3, una cuenta an\u00f3nima. Y aqu\u00ed es donde tenemos el mayor escollo para que el resultado sea correcto: los permisos de acceso.<\/p>\n<p>Cada usuario tiene su propio directorio de documentos PDF que importa directamente en su m\u00e1quina utilizando NFS y autofs. Como es normal no debe poder escribir, ni siquiera leer, de los directorios de los dem\u00e1s aunque tenga un acceso indirecto hacia ellos.<\/p>\n<p style=\"padding-left: 30px;\">Por si alguien se ha liado lo que hago es importar un recurso NFS llamado <\/p>\n<pre class=\"inline:true decode:1 \" >\/var\/pdf<\/pre>\n<p> de donde cuelgan directorios con el nombre del usuario. El script de arranque de sesi\u00f3n mantiene un enlace simb\u00f3lico de <\/p>\n<pre class=\"inline:true decode:1 \" >$HOME\/Archivos\/PDF -&gt; \/var\/pdf\/$USER<\/pre>\n<p>. Es posible entonces acceder a los PDF de otro usuario como\u00a0<\/p>\n<pre class=\"inline:true decode:1 \" >\/var\/pdf\/OTRO<\/pre>\n<p> pero las carpetas no suelen tener permisos m\u00e1s all\u00e1 de lectura del \u00edndice.<\/p>\n<p>As\u00ed pues nos encontramos con que el script que debe copiar un documento PDF a otras carpetas se encuentra funcionando bajo la identidad de un usuario local y necesita permisos para instalar dichos archivos en carpetas de otros usuarios con los permisos suficientes para que puedan leerlas.<\/p>\n<pre class=\"lang:default decode:true\">$ install -u $USER $PDF \/var\/pdf\/$USER<\/pre>\n<p>Tan simple como eso. Pero desde hace mucho, mucho tiempo, los scripts no pueden utilizar el mecanismo <em>setuid<\/em> de los sistemas UNIX debido a los graves problemas de seguridad que pueden producir. \u00bf Qu\u00e9 hacemos entonces ? Hay un par de soluciones que pueden m\u00e1s o menos funcionar:<\/p>\n<ul>\n<li>Dar permisos de uso del programa <em>install<\/em> a todos los usuarios que puedan utilizar la impresora virtual. En este caso concreto todas las cuentas tienen como atributo com\u00fan el que pertenecen a un grupo con el nombre de la empresa. Y ah\u00ed s\u00ed que podemos emplear <a href=\"https:\/\/astillas.net\/wiki\/Sudo\">sudo<\/a>.<\/li>\n<li>Usar un programa lanzadera que s\u00ed que funcione con permisos administrativos v\u00eda <em>setuid<\/em> e indicarle que sea \u00e9l que lance el programa de copia. Y buscando, buscando, <a href=\"http:\/\/unix.stackexchange.com\/questions\/364\/allow-setuid-on-shell-scripts\">he encontrado<\/a> una referencia a un programa -empaquetado para Debian- llamado <a href=\"https:\/\/packages.debian.org\/jessie\/super\">super<\/a><em>. <\/em><\/li>\n<\/ul>\n<p>Ten\u00eda pensado hacer algunas pruebas pero me han quitado el poco tiempo que ten\u00eda para ello: necesitan que funcione ya y me he inclinado por emplear la opci\u00f3n de <em>sudo<\/em> dado que es la menos costosa. Puedo incluir el fragmento de configuraci\u00f3n en el paquete que configura las impresoras y retocar m\u00ednimamente el script de copia para que todo funcione.<\/p>\n<p><em>super<\/em>, por otra parte, es algo m\u00e1s engorroso de usar. No s\u00e9 si por la redacci\u00f3n de la documentaci\u00f3n o por el concepto en s\u00ed, pero no es f\u00e1cil hallar ejemplos simples.<\/p>\n<p>As\u00ed que al final he creado el siguiente archivo en <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/sudoers.d\/cups-pdf<\/pre>\n<p> con el contenido<\/p>\n<pre class=\"lang:default decode:true\"># Mantenemos el entorno\r\nDefaults       env_keep += MAINTAINER\r\n\r\n# Los miembros del grupo empresa pueden usar, sin \r\n# contrase\u00f1a, el script de copia\r\n%Empresa ALL=NOPASSWD: \/usr\/bin\/cups-pdf2copy\r\n<\/pre>\n<p>Y en el script envoltorio que lanza las dos tareas, el env\u00edo de email y la copia de documentos, s\u00f3lo necesita prefijar la llamada a \u00e9ste \u00faltimo con el programa <em>sudo<\/em>:<\/p>\n<pre class=\"lang:default decode:true\">#   PDF enviado por email\r\n\/usr\/bin\/cups-pdf2email \"$PDF\" \"$USER\"\r\n\r\n#   PDF copiado en otros directorios\r\n<strong>sudo<\/strong> \/usr\/bin\/cups-pdf2copy \"$PDF\" \"$USER\"\r\n\r\n<\/pre>\n<p>Y jo, funciona muy bien. El riesgo de seguridad se reduce bastante porque no doy permisos de acceso directo para el programa <em>install<\/em>; menos mal, porque estaba de lo m\u00e1s inc\u00f3modo con la medida.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8230; ya que no siempre existe una correlaci\u00f3n entre el usuario que crea los trabajos de impresi\u00f3n y el que tiene que acceder a ellos.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[2],"tags":[250,564,222,565],"class_list":["post-1402","post","type-post","status-publish","format-standard","hentry","category-software","tag-cups","tag-cups-pdf","tag-pdf","tag-sudo"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/1402","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=1402"}],"version-history":[{"count":0,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/1402\/revisions"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=1402"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=1402"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=1402"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}