{"id":2460,"date":"2017-11-24T16:32:35","date_gmt":"2017-11-24T16:32:35","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=2460"},"modified":"2017-12-12T10:02:32","modified_gmt":"2017-12-12T10:02:32","slug":"adduser-cuando-necesitas-anadir-muchas-cuentas","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2017\/11\/24\/adduser-cuando-necesitas-anadir-muchas-cuentas\/","title":{"rendered":"adduser: cuando necesitas a\u00f1adir muchas cuentas"},"content":{"rendered":"<p>Y es que sigo con mi prop\u00f3sito de facilitar la creaci\u00f3n de copias de seguridad y hasta ahora he visto que lo m\u00e1s <em>usable<\/em> son las cuentas de sistema.<\/p>\n<p><!--more--><\/p>\n<p>Porque s\u00ed, las cuentas virtuales est\u00e1n muy bien para otras cosas como el correo, la validaci\u00f3n de credenciales o el acceso a sistemas de archivos ex\u00f3ticos, pero cuando necesitas interactuar con un conjunto de herramientas como las disponibles en un Linux (Debian en mi caso) el uso de la norma es lo m\u00e1s s\u00f3lido.<\/p>\n<p>As\u00ed que he aprovechado para estudiar un poco m\u00e1s sobre la herramienta <em>adduser<\/em> que se incluye en <em>Debian<\/em> y lo primero que he buscado son las diferencias entre ella y <em>useradd<\/em> que es m\u00e1s conocida.<\/p>\n<p>La respuesta m\u00e1s precisa la he encontrado en los foros de <a href=\"https:\/\/unix.stackexchange.com\/questions\/121071\/what-does-adduser-do-that-useradd-doesnt\">StackOverFlow<\/a> (para variar) que viene a decir que <em>adduser<\/em> es una herramienta de mayor nivel que <em>useradd<\/em>, que emplea un archivo de configuraci\u00f3n espec\u00edfico en <em>\/etc\/adduser.conf<\/em> y que abarca m\u00e1s aspectos sobre la creaci\u00f3n de cuentas en <em>Debian<\/em>. Es, pues, m\u00e1s recomendable, aunque no hay nada que haga una que no pueda hacer la otra.<\/p>\n<h3>La configuraci\u00f3n<\/h3>\n<p>El archivo <a href=\"https:\/\/manpages.debian.org\/stretch\/adduser\/adduser.conf.5.en.html\">\/etc\/adduser.conf<\/a> limita y gu\u00eda el funcionamiento de la herramienta; las opciones m\u00e1s interesantes que he encontrado son:<\/p>\n<pre class=\"lang:default decode:true\">DHOME=\/home\r\nLETTERHOMES=no\r\nSKEL=\/etc\/skel\r\nQUOTAUSER=\"\"\r\nEXTRA_GROUPS=\"dialout cdrom floppy audio video plugdev users\"\r\nADD_EXTRA_GROUPS=1\r\n<\/pre>\n<p>Todo ello referido a los usuarios normales, aquellos que no se consideran <em>de sistema<\/em>.<\/p>\n<h3>El directorio de trabajo<\/h3>\n<p>La variable <em>SKEL<\/em> indica un directorio que emplear como molde cuando se crea el directorio de trabajo del usuario (<em>HOME<\/em>) y es all\u00ed donde se pueden incluir algunas cosas interesantes.<\/p>\n<p>Por ejemplo se puede a\u00f1adir un directorio para las conexiones <em>ssh<\/em> y otro para facilitar la publicaci\u00f3n de contenido v\u00eda web.<\/p>\n<pre class=\"lang:default decode:true \">root@gladius:\/etc# tree \/etc\/skel\/\r\n\/etc\/skel\/\r\n\u2514\u2500\u2500 public_html\r\n\r\n1 directory, 0 files\r\nroot@gladius:\/etc# tree -puag \/etc\/skel\/\r\n\/etc\/skel\/\r\n\u251c\u2500\u2500 [-rw-r--r-- root     root    ]  .bash_logout\r\n\u251c\u2500\u2500 [-rw-r--r-- root     root    ]  .bashrc\r\n\u251c\u2500\u2500 [-rw-r--r-- root     root    ]  .kshrc\r\n\u251c\u2500\u2500 [-rw-r--r-- root     root    ]  .profile\r\n\u251c\u2500\u2500 [drwxr-xr-x root     root    ]  public_html\r\n\u2514\u2500\u2500 [drw------- root     root    ]  .ssh\r\n\r\n2 directories, 4 files\r\n<\/pre>\n<p>Y el siguiente usuario que creemos su directorio de trabajo estar\u00e1 as\u00ed:<\/p>\n<pre class=\"lang:default decode:true\">root@gladius:~# adduser coco\r\nA\u00f1adiendo el usuario `coco' ...\r\nA\u00f1adiendo el nuevo grupo `coco' (1003) ...\r\nA\u00f1adiendo el nuevo usuario `coco' (1003) con grupo `coco' ...\r\nCreando el directorio personal `\/home\/coco' ...\r\nCopiando los ficheros desde `\/etc\/skel' ...\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 coco\r\n...\r\n\u00bfEs correcta la informaci\u00f3n? [S\/n] s\r\nroot@gladius:~# tree -puag \/home\/coco\/\r\n\/home\/coco\/\r\n\u251c\u2500\u2500 [-rw-r--r-- coco     coco    ]  .bash_logout\r\n\u251c\u2500\u2500 [-rw-r--r-- coco     coco    ]  .bashrc\r\n\u251c\u2500\u2500 [-rw-r--r-- coco     coco    ]  .kshrc\r\n\u251c\u2500\u2500 [-rw-r--r-- coco     coco    ]  .profile\r\n\u251c\u2500\u2500 [drwxr-xr-x coco     coco    ]  public_html\r\n\u2514\u2500\u2500 [drw------- coco     coco    ]  .ssh\r\n\r\n2 directories, 4 files\r\n<\/pre>\n<p>Ya tiene un directorio <em>.ssh<\/em> con los permisos correctos y un directorio que emplear con el servidor web Apache y el correspondiente m\u00f3dulo para que pueda servir contenido empleando el URL <code>http:\/\/localhost\/~coco<\/code>.<\/p>\n<p>Los permisos se copian tal cual, el usuario y el grupo, obviamente no.<\/p>\n<p>Sin embargo esta configuraci\u00f3n es un poco exagerada cuando lo que queremos es que un grupo concreto de cuentas de usuario dispongan de una estructura de carpetas espec\u00edfica.<\/p>\n<h3>Usuarios para copias de seguridad<\/h3>\n<p>\u00bf Podemos emplear lo anterior para facilitar la creaci\u00f3n de usuarios que, siendo del sistema, tengan unas caracter\u00edsticas especiales ? Pues s\u00ed, siempre que sepamos qu\u00e9 queremos exactamente.<\/p>\n<p>Supongamos que estamos creando un servidor de copias de seguridad; llamamos al proyecto <em>spaces<\/em> en un alarde de originalidad y queremos que las cuentas elegidas dispongan de un acceso seguro a una parte del disco (de las cuotas ya hablo otro d\u00eda).<\/p>\n<p>Hemos elegido conexiones <em>sftp<\/em> para ello (aunque tambi\u00e9n pueden emplearse <em>scp<\/em> y <em>rsync<\/em> al mismo tiempo) y necesitamos que dichos usuarios tengan:<\/p>\n<ol>\n<li>Un nombre que empiece por la secuencia <code>sp_<\/code> seguida de su n\u00famero, nada de nombres reconocibles.<\/li>\n<li>Un directorio de trabajo bajo <code>\/srv\/backups.<\/code><\/li>\n<li>Un shell limitado como <code>\/usr\/bin\/rssh.<\/code><\/li>\n<li>Un identificador de usuario que est\u00e9 situado en un margen especial. Si en Debian los usuarios normales est\u00e1n entre el el 1000 y el 29999 los nuestros se situar\u00e1n a partir del 15000.<\/li>\n<li>Un grupo compartido para asignarles otro tipo de facilidades. Pongamos que creamos el grupo <em>spaces<\/em> con el identificador num\u00e9rico 15000 y que queremos que sea el predeterminado para todos ellos.<\/li>\n<li>La estructura b\u00e1sica de su directorio ser\u00e1 diferente y, por tanto, no podr\u00e1 tomarse de la habitual en <code>\/etc\/skel.<\/code>.<\/li>\n<\/ol>\n<p>La manera m\u00e1s sencilla de conseguir esto es indicarle a <em>adduser<\/em> que utilice otro archivo de configuraci\u00f3n. \u00c9ste puede tener un aspecto similar al siguiente:<\/p>\n<pre class=\"lang:default decode:true\"># Guardado bajo \/etc\/spaces.conf\r\nDSHELL=\/usr\/bin\/rssh\r\nDHOME=\/srv\/backups\r\nSKEL=\/etc\/skel-backups\r\nFIRST_UID=15000\r\nFIRST_GID=15000\r\nDIR_MODE=0750\r\nSETGID_HOME=yes\r\nQUOTAUSER=\"\"\r\nEXTRA_GROUPS=spaces\r\nADD_EXTRA_GROUPS=1\r\nNAME_REGEX=\"^sp_[0-9]*\\$\"\r\n<\/pre>\n<p>Aunque antes de proceder con la creaci\u00f3n de usuarios tendr\u00edamos que crear el directorio de plantillas al que hacemos referencia en la configuraci\u00f3n (en este ejemplo lo he creado en mi directorio temporal):<\/p>\n<pre class=\"lang:default decode:true\">victor@gladius:~\/tmp $ tree -puag skel-backup\r\nskel-backup\r\n\u251c\u2500\u2500 [-rw-r--r-- victor   victor  ]  .profile\r\n\u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  README\r\n\u2514\u2500\u2500 [drw------- victor   victor  ]  .ssh\r\n\r\n1 directory, 2 files\r\n<\/pre>\n<p>Y, por supuesto el grupo que indicamos como principal cuando creamos el usuario:<\/p>\n<pre class=\"lang:default decode:true\">victor@gladius:~\/tmp$ sudo addgroup --conf .\/spaces.conf --force-badname spaces\r\nPermitiendo el uso de un nombre de usuario dudoso.\r\nA\u00f1adiendo el grupo `spaces' (GID 15000) ...\r\nHecho.\r\n<\/pre>\n<p style=\"padding-left: 30px;\">En este caso nos hemos disparado en el pi\u00e9 y hemos tenido que indicarle que ignore la validaci\u00f3n del nombre de grupo, pero dado que ser\u00e1 la primera y \u00fanica vez que lo usemos para ello tampoco es tan grave.<\/p>\n<p>Ahora s\u00ed, ahora podemos a\u00f1adir el usuario:<\/p>\n<pre class=\"lang:default decode:true\">victor@gladius:~\/tmp$ sudo adduser --conf .\/spaces.conf --disabled-login --ingroup spaces --gecos \"Spaces's user\" sp_0001\r\nA\u00f1adiendo el usuario `sp_0001' ...\r\nA\u00f1adiendo el nuevo usuario `sp_0001' (15000) con grupo `spaces' ...\r\nCreando el directorio personal `\/srv\/backups\/sp_0001' ...\r\nCopiando los ficheros desde `.\/skel-backups' ...\r\nA\u00f1adiendo al nuevo usuario `sp_0001' a grupos adicionales ...\r\nA\u00f1adiendo al usuario `sp_0001' al grupo `spaces' ...\r\nvictor@gladius:~\/tmp$ sudo tree -puag \/srv\/backups\/\r\n\/srv\/backups\/\r\n\u2514\u2500\u2500 [drwxr-x--- sp_0001  spaces  ]  sp_0001\r\n    \u251c\u2500\u2500 [-rw-r--r-- sp_0001  spaces  ]  .profile\r\n    \u251c\u2500\u2500 [-rw-rw-r-- sp_0001  spaces  ]  README\r\n    \u2514\u2500\u2500 [drw------- sp_0001  spaces  ]  .ssh\r\n\r\n2 directories, 2 files\r\n<\/pre>\n<p>Como detalles finales queda la creaci\u00f3n de un peque\u00f1o <em>script<\/em> envoltorio que facilite el l\u00edo de los par\u00e1metros y, tambi\u00e9n, asignar las contrase\u00f1as correspondientes para que los datos comiencen a llegar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Y es que sigo con mi prop\u00f3sito de facilitar la creaci\u00f3n de copias de seguridad y hasta ahora he visto que lo m\u00e1s usable son las cuentas de sistema.<\/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":[6],"tags":[732,731,18],"class_list":["post-2460","post","type-post","status-publish","format-standard","hentry","category-debian","tag-addgroup","tag-adduser","tag-administracion-de-sistemas"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2460","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=2460"}],"version-history":[{"count":0,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2460\/revisions"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=2460"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=2460"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=2460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}