{"id":2218,"date":"2017-03-23T08:30:54","date_gmt":"2017-03-23T08:30:54","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=2218"},"modified":"2017-03-23T08:30:54","modified_gmt":"2017-03-23T08:30:54","slug":"archivos-accesibles-por-varias-vias","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2017\/03\/23\/archivos-accesibles-por-varias-vias\/","title":{"rendered":"Archivos accesibles por varias v\u00edas &#8230;"},"content":{"rendered":"<p>&#8230; para facilitar la conexi\u00f3n desde m\u00faltiples dispositivos.<\/p>\n<p><!--more--><\/p>\n<p>Todo comienza cuando me encuentro con un pu\u00f1ado de archivos y directorios que necesito compartir de unas m\u00e1quinas a otras, algunas con acceso temporal a la red, y para los que veo un engorro tener que montar un sistema de identificaci\u00f3n de usuarios.<\/p>\n<p>Es como una zona salvaje, de tr\u00e1nsito, donde poder guardar y recuperar cosas, pero que tendr\u00e1 acceso desde diferentes arquitecturas y programas. Por ello pretendo que exista una cuenta en el sistema que alojar\u00e1 el contenido con el menor privilegio posible y que todos los programas la empleen de alguna forma para no tener demasiados forcejeos cuando llegue el momento de usarla.<\/p>\n<p>Con este enfoque me encuentro con que, dado que\u00a0 en un sistema Linux b\u00e1sico los privilegios se asocian a un usuario y a su grupo, tendr\u00e9 que asegurarme de que todo el contenido que se creen en esta zona tenga siempre la misma propiedad y los mismos derechos.<\/p>\n<p>De momento pretendo que el contenido sea accesible de las siguientes formas:<\/p>\n<ul>\n<li><strong>SMB\/CIFS<\/strong> para redes Windows<\/li>\n<li><strong>rsync<\/strong> para el ejecutable del mismo nombre y programas similares de copia.<\/li>\n<li><strong>WebDAV<\/strong> para accesos desde clientes DAV o HTTP.<\/li>\n<li><strong>FTP<\/strong> an\u00f3nimo de toda la vida.<\/li>\n<\/ul>\n<h3>Los archivos<\/h3>\n<p>Una vez que he elegido un punto ra\u00edz para los archivos (<code>\/srv\/repositorios<\/code>) necesito prepararlo para que el resto de los servicios accedan a \u00e9l.<\/p>\n<p>Primero creamos un usuario y un grupo a los que asignar la propiedad del contenido:<\/p>\n<pre class=\"lang:sh decode:true\">$ sudo addgroup archivos\r\n$ sudo adduser --home \/srv\/repositorios --ingroup archivos archivos \r\nIntroduzca la nueva contrase\u00f1a de UNIX: \r\nVuelva a escribir la nueva contrase\u00f1a de UNIX: \r\npasswd: contrase\u00f1a actualizada correctamente\r\nCambiando la informaci\u00f3n de usuario para archivos\r\nIntroduzca el nuevo valor, o pulse INTRO para usar el valor predeterminado\r\n        Nombre completo []: Archivos\r\n        N\u00famero de habitaci\u00f3n []: \r\n        Tel\u00e9fono del trabajo []: \r\n        Tel\u00e9fono de casa []: \r\n        Otro []: \r\n\u00bfEs correcta la informaci\u00f3n? [S\/n] s\r\n<\/pre>\n<p>Despu\u00e9s preparamos el directorio con los permisos suficientes para conservar la propiedad y los modos cuando se le a\u00f1ada contenido:<\/p>\n<pre class=\"lang:default decode:true \">$ sudo install -d -o archivos -g archivos -m 6770 \/srv\/repositorios \r\n$ sudo -lda \/srv\/repositorios\r\ndrwsrws--- 2 archivos archivos 4096 mar  1 09:40 \/srv\/repositorios\r\n$<\/pre>\n<p>Los bits SUID y SGID a\u00f1adidos al directorio ra\u00edz se aplicar\u00e1n a los directorios pero no a los archivos. O s\u00ed, pero estar\u00e1n condicionados por el valor de <em>umask<\/em> que como valor predeterminado suele ser <em>0022<\/em>. Necesitamos que quede en <em>0002<\/em> y para eso empleamos el m\u00f3dulo <em>libpam-umask<\/em> que en Debian viene inclu\u00eddo en el paquete <span style=\"text-decoration: underline;\"><em>libpam-modules<\/em><\/span>, con la siguiente estrofa a\u00f1adida al archivo <code>\/etc\/pam.d\/common-session<\/code>:<\/p>\n<pre class=\"lang:default decode:true\"># and here are more per-package modules (the \"Additional\" block)\r\n...\r\nsession optional        pam_umask.so umask=0002\r\n# end of pam-auth-update config\r\n<\/pre>\n<p>Hay otras posibilidades para definir este valor pero por el momento nos quedamos con \u00e9sta.<\/p>\n<h3>SMB\/CIFS<\/h3>\n<p>O lo que viene siendo los recursos de red compartidos de las redes Windows, que en Linux est\u00e1n representado por el paquete <em>Samba<\/em>.<\/p>\n<p>Para que podamos tener acceso a este recurso vamos a definir un <em>share<\/em> en el archivo de configuraci\u00f3n <code>\/etc\/samba\/smb.conf<\/code> de la siguiente forma:<\/p>\n<pre class=\"lang:default decode:true \">[public]\r\n        comment = Programas y documentos p\u00fablicos\r\n        path = \/srv\/repositorios\/public\r\n        force user = archivos\r\n        force group = archivos\r\n        read only = No\r\n        force create mode = 0660\r\n        force directory mode = 0770\r\n        guest ok = Yes\r\n<\/pre>\n<h3>rsync<\/h3>\n<p>El protocolo rsync es \u00fatil y s\u00f3lido. Admite accesos directos al servidor o indirectos v\u00eda SSH lo que le hace muy vers\u00e1til. Es tambi\u00e9n la base de muchos programas de copias de seguridad, el protocolo de sincronizaci\u00f3n quiero decir, as\u00ed que termina siendo un recurso muy \u00fatil.<\/p>\n<p>La configuraci\u00f3n m\u00ednima en mi caso ser\u00eda un archivo <code>\/etc\/rsyncd.conf<\/code> como el siguiente:<\/p>\n<pre class=\"lang:default decode:true \">uid = archivos\r\ngid = archivos\r\nuse chroot = yes\r\n\r\n[public]\r\n        path = \/srv\/repositorios\/public\r\n        comment = Archivos p\u00fablicos \r\n        list = yes\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>WebDAV<\/h3>\n<p>Esta parte es m\u00e1s delicada y, como explico m\u00e1s adelante, casi anecd\u00f3tica puesto que un acceso v\u00eda web sin protecci\u00f3n llega a ser bastante peligroso en un servidor. Por eso la configuraci\u00f3n que describo a continuaci\u00f3n es adecuada para uso interno y no debe entenderse como segura ni por asomo. Es m\u00e1s, posiblemente s\u00f3lo sirva para salir de un apuro porque el servidor web donde voy a hacerlo funcionar lo hace bajo un \u00fanico usuario y \u00e9ste suele ser de muy baja acreditaci\u00f3n. Hacer que lea los archivos es sencillo, que escriba no tanto.<\/p>\n<p>El servidor web Apache dispone de m\u00f3dulos que permiten convertirlo en un servidor DAV y que son bastante sencillos de configurar; los pasos a seguir son los siguientes:<\/p>\n<ol>\n<li>Activar los m\u00f3dulos dav y dav_fs (uno depende de otro).<\/li>\n<li>Configurar una localizaci\u00f3n sobre la que tienen que funcionar.<\/li>\n<li>Situar al usuario del servidor web en el grupo correspondiente para que tenga acceso de escritura.<\/li>\n<\/ol>\n<p>Los aspectos negativos son los siguientes:<\/p>\n<ol>\n<li>No se puede indicar los permisos de creaci\u00f3n de archivos ni directorios.<\/li>\n<li>No se puede limitar el acceso a subdirectorios concretos.<\/li>\n<\/ol>\n<p>La configuraci\u00f3n m\u00ednima es la siguiente:<\/p>\n<pre class=\"lang:default decode:true \">&lt;VirtualHost *:443&gt;\r\n        ServerName      backups.empresa.net\r\n        ServerAdmin     root@empresa.net\r\n\r\n        DavLockDB       \/var\/www\/DavLock\r\n\r\n        Alias \/webdav   \/srv\/repositorios\/public\r\n\r\n        &lt;Directory \/srv\/repositorios\/public&gt;\r\n                Require all granted\r\n                DAV     On\r\n        &lt;\/Directory&gt;\r\n\r\n        &lt;Location \/webdav&gt;\r\n                Require all granted\r\n                # make it Browser readonly\r\n                # https:\/\/www.d7031.de\/content\/apache-webdav-read-write-permissions\/\r\n                Options +Indexes\r\n                IndexIgnore ..\r\n                IndexOptions -IconsAreLinks NameWidth=* FancyIndexing SuppressLastModified FoldersFirst\r\n                IndexOrderDefault Ascending Name\r\n        &lt;\/Location&gt;\r\n        ...\r\n&lt;\/VirtualHost&gt; \r\n<\/pre>\n<h3>FTP<\/h3>\n<p>El acceso FTP an\u00f3nimo es un mecanismo antiguo y muy fiable. Para darle servicio he elegido el programa vsftpd porque es bastante sencillo de configurar para lo que pretendo.<\/p>\n<p>De hecho la configuraci\u00f3n b\u00e1sica est\u00e1 en el archivo <code>\/etc\/vsftpd.conf<\/code> y la que me sirve es:<\/p>\n<pre class=\"lang:default decode:true  \"># Directivas obligatorias\r\nlisten=yes\r\nanonymous_enable=yes\r\nanon_root=\/srv\/repositorios\/public\r\nwrite_enable=YES\r\nlocal_umask=002\r\nanon_upload_enable=YES\r\nanon_mkdir_write_enable=YES\r\nnopriv_user=archivos\r\nchroot_local_user=YES\r\n\r\n# Directivas opcionales \r\nanon_max_rate=2048000\r\nxferlog_enable=YES\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Enlaces y referencias<\/h3>\n<ul>\n<li><a href=\"https:\/\/www.d7031.de\/content\/apache-webdav-read-write-permissions\/\">How to grant different rights to users on webdav shares<\/a><\/li>\n<li><a href=\"https:\/\/www.g-loaded.eu\/2008\/12\/02\/set-up-an-anonymous-ftp-server-with-vsftpd-in-less-than-a-minute\/\">Set up an anonymous FTP server with vsftpd in less than a minute<\/a><\/li>\n<li><a href=\"https:\/\/unix4lyfe.org\/darkhttpd\/\">darkhttpd<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>&#8230; para facilitar la conexi\u00f3n desde m\u00faltiples dispositivos.<\/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":[18,696,475,42,695,474,423],"class_list":["post-2218","post","type-post","status-publish","format-standard","hentry","category-software","tag-administracion-de-sistemas","tag-ftp","tag-pam","tag-rsync","tag-smb","tag-umask","tag-webdav"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2218","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=2218"}],"version-history":[{"count":0,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2218\/revisions"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=2218"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=2218"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=2218"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}