dimarts, 26 d’octubre del 2021

Gestió d'usuaris i grups en Linux

Usuaris i grups Linux 


Els comptes de Linux són com els comptes de Windows o MacOS; però els detalls no, així que cal explicar alguns detalls, com les convencions de nomenclatura d'usuaris, la naturalesa dels grups i com associa Linux els nombres que utilitza internament amb els noms d'usuari i noms de grup que la gent sol utilitzar.


En aquest article veiem com es gestionen els comptes d'usuari i de grup d'usuaris Linux usant comandaments, concretament veurem:

  • Fitxers /etc/passwd, /etc/group, /etc/shadow
  • Identificadors UID i GID
  • Comandaments:
    • chown
    • chgrp
    • newgrp
    • useradd
    • passwd
    • chage
    • userdel
    • groupadd
    • groupmod
    • usermod
    • gpasswd
    • groupdel



Els noms d'usuaris de Linux

Linux és bastant flexible en els noms d'usuari, en la majoria de distribucions poden estar construïts amb qualsevol combinació de lletres majúscules i minúscules, nombres i molts símbols de puntuació, incloent punts i espais; no obstant això, els espais i alguns altres elements causen problemes en determinades utilitats de Linux, per la qual cosa és preferible evitar-los. Els punts i els guions baixos poden utilitzar-se, doncs no causen problemes.

Els noms d'usuari poden tenir fins a 32 caràcters. A causa que Linux distingeix entre majúscules i minúscules, el mateix ordinador pot tenir dos usuaris diferents anomenats ellen i Ellen, que pot resultar confús, per la qual cosa és millor evitar crear comptes els noms dels quals d'usuari es diferenciïn solament en aquest detall; l'habitual és usar lletres minúscules. Els noms d'usuari no tenen per què estar basats en noms de pila.

Establir un mètode estàndard per crear noms d'usuari pot ajudar a localitzar un compte que pertanyi a un individu concret. No obstant això, si l'ordinador té molts usuaris, pot ser que algunes convencions de nomenclatura produeixin duplicats, en particular si l'estàndard que hem creat empra les inicials per tallar els noms d'usuari. Pot ser que hàgim de desviar-nos de l'estàndard o incorporar nombres per distingir els comptes d'usuari, ja que cada compte necessita un únic nom d'usuari.
Relacionar als usuaris mitjançant grups per millorar la productivitat.

Grups d'usuaris


Els grups d'usuaris són un mitjà per organitzar usuaris: estan definits en fitxers de configuració similars als dels usuaris, tenen noms similars als noms d'usuari i es representen internament mitjançant nombres.

Els grups no són comptes, sinó mitjans per organitzar col·leccions de comptes. Com a mesura de seguretat, Linux associa cada fitxer amb un grup específic, podent-se assignar diversos permisos als membres del grup. Com Linux proporciona accés a la majoria dels dispositius de maquinari a través de fitxers, podem utilitzar aquest mateix mecanisme per controlar l'accés al maquinari.

Cada grup pot tenir des de cap usuari fins a punts com tingui l'ordinador. També, un usuari pot estar en més d'un grup, i com a mínim ha d'estar en un grup. La pertinença als grups es controla mitjançant el fitxer /etc/group que conté una llista de grups i els membres que pertanyen a cadascun d'ells. Cada usuari posseeix un grup per defecte o primari, que es defineix en la configuració de l'usuari del fitxer /etc/passwd. Quan els usuaris creen fitxers o inicien programes, aquests fitxers i programes en execució s'associen amb el grup actual. Un usuari pot accedir a fitxers que pertanyen a altres grups sempre que ell pertanyi també a aquest grup i que estigui permès pels permisos d'accés del grup.


Canviar de grup: comandament newgrp

Utilitzarem newgrp per canviar la pertinença del grup actual, per exemple, per canviar el nostre usuari al grup project escriurem:

newgrp project

Si l'usuari ja pertany al grup project (i figura al  /etc/group) llavors després d'executar el comandament actuarem com a membre del grup project des del grup actual. Si l'usuari no hi pertany al nou grup, el sistema li demanarà contrasenya de root per afegir-lo.

Canviar un fitxer de grup i de propietari: comandaments chgrp i chown

Tots els fitxers gestionats pel sistema operatiu tenen assignat un usuari propietari i un grup d'usuaris propietari del fitxer. Podem canviar el grup associat amb un fitxer existent amb els comandos chgrp i chown. Per exemple, per canviar el grup al que pertany un fitxer anomenat dades al grup projecte:

chgrp projecte dades

En general:
chgpr grup fitxer

El comandament chown permet canviar el propietari del fitxer i també el seu grup; la sintaxi és:

chown [options] new_owner object(s)

Exemple:

chown user_pepe dades

Per canviar també al grup projecte:

chown user_pepe:projecte dades

si el grup de user_pepe és projecte, llavors no cal escriure el nom del grup.


Aquesta estructura de grups permet dissenyar un sistema de seguretat amb diferents col·leccions d'usuaris per treballar fàcilment amb els mateixos fitxers mentre evitem que altres usuaris del mateix servidor mirin en els fitxers als quals no haurien de tenir accés. És habitual utilitzar els grups per a diferents projectes, classes o grups de treball, en els quals cada usuari aquest restringit a un d'aquests grups.

Identificadors UID i GID


Linux defineix els usuaris i grups per números: ID d'usuari (UID) i ID de grup (GID), i en els fitxers /etc/passwd o /etc/group es pot localitzar el nom associat al número. 

Es reserva el primer centenar d'ID d'usuari i de grup, del 0 al 99, per a l'ús del sistema. El zero correspon a root, tant a l'usuari com al grup,  els següents nombres els utilitzen els comptes i grups que estan associats amb utilitats i funcions específiques de Linux, per exemple, UID 2 i GID 2 poden ser el compte i el grup daemon (serveis del sistema) i UID 8 i GID 12 podrien ser el compte i el grup de mail. No tots els nombres del 0 al 99 estan en ús, en general només una o dues dotzenes de comptes i una desena de grups. Podem consultar els fitxers /etc/passwd i /etc/group per determinar quins ID d'usuari i grup s'estan utilitzant.

Exemple: llistat de les 10 primeres línies del fitxer, els nombres en negreta són els UID 
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin


La informació d'aquest fitxer és esquemàticament:




Exemple:
$ cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,jordi
tty:x:5:syslog
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:


Més enllà del nombre ID = 100 les ID d'usuari i grup estan disponibles per als comptes d'usuari i grup normals. En crear comptes addicionals, el sistema localitza el següent nombre al més alt sense utilitzar. 

Quan eliminem un compte l'ID, es podrà reutilitzar, però les eines de creació automàtica de comptes no ho fan si els números subsegüents estan en ús, el que crea un salt en la seqüència. Això no és perjudicial tret que ens quedem sense números per a les ID (65536 usuaris per nuclis de 16 bits, els nuclis de 32 arriben a 4 mil milions d'usuaris). 

Reutilitzar un nombre d'ID pot provocar problemes si no eliminem els fitxers de l'antic usuari, ja que el nou usuari esdevindrà el propietari d'ells.

Configurar comptes d'usuari


En els petits equips personals no cal fer el manteniment dels usuaris, però, en els grans sistemes, on els usuaris van i vénen constantment, és possible que sigui necessari realitzar un manteniment diari. Per a això, cal conèixer les eines de configuració de comptes. Fins i tot en sistemes que canvien molt de tant en tant, és útil saber afegir, modificar o eliminar comptes d'usuari quan calgui.

Descriurem les eines de tipus comandament per a la creació i el manteniment dels comptes, tot i que la majoria de distribucions tenen eines GUI amb les mateixes funcionalitats que varien segons la distribució o l'entorn. Les eines de tipus comandament proporcionen la major flexibilitat i es poden aplicar a més llocs.

Afegir usuaris: useradd


Els usuaris es poden afegir amb la utilitat useradd. La seva sintaxi és la següent :

useradd [ -c comentari ] [ -d dir -home ] [ - i data - expiració ] [ - f dies- inactiu ] [ - g grup grup_principal ] [- G grup [ altres grups... ] ] [ - m [ - k dir - esquelet ] | -M ] [- p contrasenya ] [ -s consola ] [- o UID [- o ] ] [ -r ] [- n] nom-usuari


En la seva forma més simple , es pot escriure només useradd nom-usuari , on nom-usuari és el nom d'usuari que volem crear . La resta dels paràmetres s'utilitzen per modificar els valors per defecte del sistema , que s'emmagatzemen en el fitxer /etc/login.defs . Els paràmetres de useradd modifiquen la comanda de diverses maneres:

  • Comentari : -c comentari és el camp de comentari de l'usuari . S'hi sol guardar informació pública , com el nombre de telèfon de l'usuari . No és obligatori registrar informació en aquest paràmetre .
  • Directori home : -d permet especificar el directori home del compte . El valor per defecte sol ser / home / nom -usuari .
  • Data d'expiració del compte : - i ens permet indicar la data en què es desactivarà el compte . El format és YYYY - MM - DD , encara que hi ha sistemes que accepten la forma MM - DD - YYYY . Per defecte , els comptes no expiren .
  • Dies inactius : un compte es desactiva completament un determinat nombre de dies després d'expirar una contrasenya. - f defineix aquest nombre de dies . El valor per defecte és -1 , que desactiva aquesta funcionalitat .
  • Grup per defecte : - g permet definir la GID o el nom del grup per defecte de l'usuari .
  • Grups addicionals : - G permet definir els noms o GID d'un o diversos grups als quals pertany l'usuari, no tenen per que ser el grup per defecte i podem especificar més d'un separant-los per comes .
  • Opcions del directori home : si especifiquem -m , es crea automàticament el directori home de l'usuari. Els fitxers de configuració per defecte es copien de /etc/skel , encara que podem especificar un altre directori plantilla amb l'opció -k . Diverses distribucions Linux utilitzen -m sempre .
  • No crear directori home : -M força al sistema a no crear un directori home automàticament , fins i tot si està especificat com a acció per defecte a /etc/login.defs .
  •  Encriptació de contrasenyes : amb - p podrem passar al sistema la contrasenya de l'usuari pre - encriptada . Aquest valor s'afegeix al fitxer / etc / passwd o / etc / shadow sense modificar , per la qual cosa , si escrivim una contrasenya sense xifrar , probablement no funcionarà com esperem . Aquest paràmetre és útil en els programes de automatitizació de tasques del sistema (scripts) , on podem xifrar una contrasenya ( utilitzant crypt per exemple) i després enviar el resultat a través de useradd . El valor per defecte desactiva el compte , pel que haurem d'executar passwd per canviar la contrasenya de l'usuari .
  • Consola per defecte : -s permet especificar la consola d'accés per defecte . La consola per defecte sol ser / bin / bash , encara que podem especificar una altra consola o un programa que no sigui una consola.
  • UID : - o  crea un compte amb el valor de UID de l' usuari especificat , el valor UID ha de ser un enter positiu , normalment més de 500 per als comptes d'usuari i nombres menors de 100 per als comptes del sistema . El nombre es pot reutilitzar i podem associar dos noms d'usuari a una UID .
  • Creació d'un compte del sistema : -r especifica la creació d'un compte del sistema , és a dir , un compte amb valor inferior a UID_MIN , segons el definit a / etc / login.defs ( sol ser 100 , 500 o 1000 ) . El comandament useradd no crea un directori home per als comptes del sistema .
  • No crear el grup de l'usuari: les distribucions solen crear un grup amb el mateix nom que el nom d'usuari, - n desactiva aquest comportament .

Exemple:
. Volem crear un compte per a un usuari anomenat pedro tal que tingui el seu directori personal dintre de /home/pere, a més volem que el nou usuari sigui membre dels grups project1, project2 i project3 tenint project2 com a grup principal:

sudo useradd -d /home/pere -g project2 -G project1,project3  pedro

Aquest usuari nou encara no té contrasenya.

Definir una contrasenya

El paràmetre - p de useradd que permet definir una contrasenya no és molt útil quan s'afegeix un usuari , ja que la demana preencriptada . És més fàcil crear un compte sense utilitzar - p (de forma desactivada ) i definir la contrasenya després de crear el compte amb la comanda passwd , que té la següent sintaxi :

passwd [ - k ] [ -l ] [ - o [- f ] ] [ -d ] [- S ] [ nom -usuari ]

Els paràmetres d'aquesta comanda permeten modificar el seu comportament de les maneres següents:

  •  Actualitzar els comptes expirades : - k indica que el sistema hauria actualitzar un compte expirada .
  •  Bloquejar comptes : -l bloqueja un compte anteposant un signe d'admiració ( ! ) A la contrasenya encriptada . Com a resultat , l'usuari no pot accedir al compte , tot i que els fitxers segueixen disponibles i el canvi es pot desfer fàcilment . És un paràmetre útil quan volem suspendre temporalment l'accés de l'usuari a un compte .
  • Desbloquejar comptes : - o desbloqueja un compte eliminant el signe d'exclamació que precedeix a la contrasenya encriptada . useradd crea comptes bloquejats sense contrasenya , si utilitzem aquesta comanda en un compte nou , obtindrem un compte sense contrasenya . Normalment passwd retorna un error quan intentem això , l'opció - f obliga passwd a convertir la compte en una sense contrasenya .
  • Esborrar la contrasenya d'un compte : -d esborra la contrasenya d'un compte .
  • Mostra la informació del compte : - S mostra la informació de la contrasenya d'un compte.

Un usuari normal utilitza passwd per canviar les seva contrasenya, però molts dels seus paràmetres són només accessibles des de l'usuari root (concretament -l,-o,-fy-d). Només root pot especificar un nom d'usuari a passwd, els usuaris normals han d'ometre el nom d'usuari a executar-lo.


 Exemple: a l'usuari pedro li creem contrasenya amb el comandament passwd:

passwd pedro
Changing password for user pedro
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully

passwd sol licita dues vegades la contrasenya, però no mostra el que escrivim. D'aquesta manera evitem que algú que vegi la nostra pantalla pugui llegir la contrasenya. La contrasenya s'encripta amb un algoritme d'encriptació (anomenat funció hash) i algun mètode d'encriptació, depenent de la distribució; alguns són:


$1$=MD5 (22 caracteres)

$2$=blowfish

$5$=SHA-256 (43 Caracteres)

$6$=SHA-512 (86 Caracteres)


Després es guarda la encriptació en el fitxer /etc/shadow:



Modificar usuaris: usermod

usermod és similar a useradd , però modifica un compte existent en lloc de crear un de nou;  canvia el contingut de /etc/passwd  i/ o /etc/shadow. Algunes diferències:

  • permet l'ús del paràmetre -m quan s'utilitza amb -d
  •   -d, per si sol , canvia el directori home de l'usuari però no mou cap fitxer, si li afegim -m , usermod mourà els fitxers de l'usuari al nou lloc.
  • permet canviar el nom d' accés de l'usuari pel valor especificat amb el paràmetre -l .
  • -L i -U permeten bloquejar i desbloquejar la contrasenya d'un usuari. Això també és pot fer amb el comandament passwd .
  • Si usem l'opció- G per afegir l'usuari a un grup, es treu a l'usuari de la resta de grups en els que hi era inclòs el grup per defecte de l'usuari!

Caducitat de comptes: chage

chage permet modificar els paràmetres relacionats amb l'expiració dels comptes . A Linux , els comptes es poden configurar per que expirin automàticament en complir qualsevol d'aquestes condicions :

    1. La contrasenya no ha canviat en un període de temps específic .

    2. La data del sistema ha sobrepassat un temps predeterminat.

Aquests paràmetres es controlen amb chage , que té la següent sintaxi :


chage [ -l ] [- m mindias ] [ -M maxdias ] [ -d ultimodia ] [- I diasinactivo ] [- E fechaexpiración ] [- W diasaviso ] nom_usuari


Els paràmetres del programa que modifiquen les accions de la comanda són:


  • Mostrar informació : -l mostra informació del període d'expiració del compte i la contrasenya d'un usuari concret .
  • Definir el temps mínim entre canvis de contrasenya: -m mindias defineix el nombre mínim de dies entre canvis de contrasenya. El valor zero ( 0 ) permet a l'usuari una contrasenya diverses vegades al dia , un ( 1) que pot canviar un cop al dia , dos (2 ) permet canviar un cop cada dos dies i així successivament .
  • Definir el temps màxim entre canvis de contrasenya: -M maxdias defineix el nombre màxim de dies que poden passar entre canvis de contrasenya, per exemple , 30 requereix que es canviï la contrasenya aproximadament un cop al mes , si l'usuari canvia la contrasenya abans de la data límit, el comptador es reinicializará amb la data de canvi de contrasenya.
  • Definir la data de l'últim canvi de contrasenya: -d ultimodía defineix l'últim dia que es canvi una contrasenya. Aquest valor el sol mantenir Linux , però podem manipular per alterar el comptador de canvis de contrasenya. ultimodía utilitza el format YYYY / MM / DD des l'1 de gener de 1970.
  • Definir el màxim de dies inactiu : -I díasinactivo defineix el nombre de dies entre l'expiració de la contrasenya i la desactivació del compte . Els comptes expirades poden no utilitzar o poden obligar l'usuari a canviar la contrasenya després d'accedir . Un compte desactivada , ho està completament .
  • Definir la data d'expiració : - E fechaexpiración permet definir una data d'expiració absoluta . Utilitza el format YYYY / MM / DD o el nombre de dies des l'1 de gener de 1970. -1 (Menys un) indica l'absència de data d'expiració .
  • Definir el nombre de dies d'avís: - W diasaviso permet indicar el nombre de dies previs a l'expiració en què el sistema avisarà a l'usuari de l'expiració imminent del compte , una opció recomanable quan s'utilitzen intensivament les expiracions en relació als canvis de contrasenya. També hem de tenir en compte que aquests avisos només es mostren als usuaris que accedeixen en mode text i no als que accedeixen per GUI , els que comparteixen fitxers i altres.


Només root pot utilitzar la comanda chage , però si només amb l'opció -l , qualsevol usuari normal pot consultar la informació d'expiració del seu compte.

Exemple
chage -l jordi
Últim canvi de contrasenya                              : de juny 17, 2021
La contrasenya caduca                                   : mai
Contrasenya inactiva                                    : mai
El compte caduca                                        : mai
Número mínim de dies entre canvis de contrasenya                : 0
Número màxim de dies entre canvis de contrasenya                : 99999
Número de dies d'avís abans que la contrasenya caduqui  : 7

Eliminar comptes: userdel

És una tasca fàcil elimina comptes i les seves entrades en / etc / passwd , i , si n'hi ha, de / etc / shadowuserdel només admet tres paràmetres :


  1. Esborrar fitxers d'usuari : - r --remove eliminen tots els fitxers de la cua de correu i directori home de l'usuari, així com el seu contingut . Si ometem -r preservarem els fitxers de l'usuari . 
  2. Forçar l'esborrat : -f --force esborrat d'un compte mentre l'usuari està actiu dins del sistema . També esborra la cua del correu , tot i que el propietari sigui un altre usuari , i força l'esborrat del directori home encara l'utilitzi un altre usuari .
  3. Obtenir ajuda : -h -- help resumeixen les opcions de userdel .

Exemple: Eliminar el compte de pedro i els seus correus i directori home :

sudo userdel -r pedro
[sudo] contrasenya per a jordi:  
userdel: pedro no s'ha trobat la cua de correu (/var/mail/pedro)
userdel: /home/pere no és propietat de pedro, no s'elimina

Veiem que l'usuari pedro tenia assignat com a directori home un del que no era propietari i per tant no s'eliminen els fitxers. Ho comprovem:

ls /home/pere -l -d
drwxr-xr-x 3 pereg pere 4096 d’oct.   26 12:10 /home/pere

Efectivament, el propietari és pereg.

Eliminació dels fitxers de l'usuari que no estan en el seu home

Quan eliminem un compte , haurem de recordar que sovint els usuaris creen fitxers fora del seu directori home. Per exemple hi ha programes que utilitzen / tmp com emmagatzematge temporal, lloc on poden trobar-se fitxers de l'usuari . Aquest directori s'esborra periòdicament de tant en tant i no resulta un problema, però , potser hi ha altres directoris on els usuaris hagin guardat fitxers . Per localitzar-los podem utilitzar la comanda find amb el paràmetre - uid o -user si encara no hem esborrat el compte . Per exemple, si pedro tenia la UID 529 , localitzarem tots els seus fitxers amb la següent comanda :

find / - uid 529

El resultat és una llista de fitxers el propietari dels quals és UID 529 . Ara podrem recórrer aquesta llista i fer alguna cosa amb aquests fitxers , ja que es podrien acabar assignant a un altre usuari diferent de pedro que torni a utilitzar la UID 529 , cosa que pot tenir conseqüències com l'excés de la quota de disc del nou usuari o la transmissió d'informació sensible al nou usuari.


Configurar grups

Les eines de configuració de grups s'assemblen a les de comptes d'usuari , encara que els grups no són comptes el que fa que les característiques d'aquestes eines siguin diferents. Podem crear o modificar grups editant els fitxers de configuració que tenen una estructura similar a la dels fitxers de control de comptes , encara que difereixen en els detalls .

Afegir grups: groupadd

La comanda groupadd afegeix nous grups , és similar a useradd , però amb menys opcions . La seva sintaxi és la següent :


groupadd [ - g GID [- o ] ] [ -r ] [- f ] nom_grup

Els paràmetres ajusten el funcionament de la següent manera :

  • Especificar un GID : - g GID permet utilitzar una GID específica . Si ometem aquest paràmetre , s'utilitzarà la següent GID disponible . El paràmetre - o invalida que no es pugui utilitzar una GID que ja estigui en ús , el que permet crear diversos grups que comparteixen una GID .
  • Crea un GID per sota de 500 : -r li indica a groupadd que creï un grup amb una GID per sota de 500, opció que no admeten totes les distribucions . Va ser incorporada per RedHat .
  • Forçar la creació: - f suprimeix el missatge d'error quan intentem crear un grup que ja existeix . No totes les versions de groupadd ho permeten .
Normalment els grups es creen sense especificar paràmetres , excepte el propi nom del grup. Exemple:

groupadd project

Aquesta comanda crea el grup project amb la GID que el sistema trobi convenient, normalment la més alta existent més un. Un cop creat podrem afegir usuaris al grup amb els paràmetres – g  i - G de la comanda useradd


Modificar la informació del grup

Podem modificar la informació del grup emprant utilitats o editant el fitxer / etc / group . Hi ha menys opcions per a modificar grups que per modificar comptes , encara que les seves utilitats i els seus fitxers de configuració són similars , de fet , usermod s'utilitza també per modificar grups .

Ús de groupmod i usermod

groupmod modifica els paràmetres d'un grup existent :


groupmod [ - g GID [- o ] ] [- n nombre_nuevo_grupo ] nombre_antiguo_grupo


Les opcions són les següents :


  • Especificar una GID : - g GID permet indicar una GID específica . Si la GID ja està en ús, groupmod retornarà un error. El paràmetre - o anul·la aquest comportament , permetent crear 2 grups o més que comparteixin la mateixa GID .
  • Especificar un nom de grup : especificarem un nou nom de grup amb l'opció - n nombre_nuevo_grupo .

Les manipulacions de grups més habituals no es controlen des groupmod , sinó des de usermod , que permet afegir un usuari a un grup amb el paràmetre - G

Exemple: definir pere com a membre dels grups users , project i project2 , i l'elimina de tots els altres grups on hi era:

usermod - G users , project , project2 pere


Per afegir a un usuari a altres grups a més dels que ja té, haurem d'assegurar-nos de llistar els grups actuals de l'usuari, ja que si ometem algun dels grups actuals , l'usuari serà eliminat d'ells . Una forma d'evitar l'omissió accidental d'un grup és modificar directament el fitxer / etc / group o utilitzar gpasswd . Ambdues opcions permeten afegir usuaris a nous grups sense haver d'especificar tots els grups als que pertanyen.

Modificar grups amb gpasswd

gpasswd és l'equivalent a passwd per als grups. Permet modificar característiques dels grups i assignar administradors als grups , que són usuaris que poden realitzar algunes funcions administratives pròpies dels grups. La seva sintaxi és la següent :


gpasswd [ - a usuari ] [ -d usuari ] [ -R ] [ -r ] [ -A usuari [ ... ] ] [- M usuari [ ... ] ] grup


 Les opcions són les següents :

    •     Afegir un usuari : - a usuari afegeix un usuari especificat al grup especificat .

    •     Esborrar un usuari : -d usuari elimina l'usuari especificat del grup especificat .

    •     Rebutjar incorporacions des newgrp : -R "tanca" el grup perquè no es permeti a ningú convertir-se en membre d'ell a través de newgrp .

    •     Esborrar la contrasenya : -r esborra la contrasenya d'un grup .

    •     Afegir administradors al grup : root pot emprar el paràmetre -A usuari [ ... ] per especificar els administradors del grup . L'administrador pot afegir i esborrar membres d'un grup a més de canviar la contrasenya. Aquest paràmetre sobreescriu la llista d'administradors, per la qual cosa haurem d'indicar tota la llista més el nou administrador que volem afegir quan vulguem que s'uneixi un nou administrador .

    • Afegir usuaris : -M usuari [ ... ] afegeix els usuaris especificats a la llista de membres del grup .


Si introduïm gpasswd només amb el nom del grup canviarem la contrasenya. La contrasenya permet controlar qui és membre d'un grup segons el assignat per newgrp . Si definim una contrasenya, fins i tot qui no sigui membre d'un grup es pot canviar a ell utilitzant newgrp. El grup ens sol·licitarà una contrasenya que farà que pertanyem temporalment a aquest grup. Aquestes funcionalitats no estan totalment implementades en totes les distribucions: en certs casos si algú no és membre d'un grup i introdueix la contrasenya el sistema pot respondre amb un missatge de " Accés Denegat ".

Eliminar grups: groupdel

Els grups s'eliminen amb la comanda groupdel , que només rep el nom del grup com a paràmetre . També podem eliminar un grup directament en el fitxer / etc / group , i / etc / gshadow si està present, esborrant la línia corresponent al grup . La millor solució és groupdel , ja que verifica si el grup és el grup primari d'algun usuari, en aquest cas haurem de canviar primer el grup primari de l'usuari o esborrar el seu compte. Igual que l'esborrat d'usuaris, l'esborrat de grups pot deixar fitxers orfes a l'ordinador que podrem localitzar amb la comanda find igual que amb els fitxers d'un usuari. 
Podem localitzar els fitxers d'un ordinador amb una GID determinada de la següent manera :

find / - gid 503

Aquesta comanda localitza tots els fitxers pertanyents al grup amb la GID 503 . Un cop localitzats els fitxers , haurem de decidir què fer amb ells perquè si es reutilitza l' GID, pot derivar en un risc per a la seguretat. El millor sol ser esborrar els fitxers o assignar-los a un altre grup amb les ordres chown o chgrp .












dimarts, 6 de juliol del 2021

Introducció al treball amb el shell bash

Hi han dos tipus de interfície d'usuari del sistema operatiu: l’anomenada shell («closca») del sistema i els entorns d’escriptori gràfic. El shell en realitat és un programa que espera ordres (comandaments) de l’usuari; aquest escriu el comandament, el shell interpreta el que ha escrit, i si és la sintaxi és correcte l’executa.

La interfície tipus shell és freqüent en servidors dedicats: un administrador expert en shell pot ser molt més ràpid i eficient fent tasques concretes que no pas usant un entorn d’escriptori.  Els entorns gràfics es caracteritzen per ser fàcils d’utilitzar ... aparentment, doncs sovint es carreguen amb molts objectes, menús dintre de menús i finestres farcides d’opcions, i acaba sent difícil de trobar el que busques. 

Avantatges del shell sobre l’escriptori gràfic:

    • És complert: qualsevol cosa que l’usuari pugui fer amb el sistema es pot fer des del shell, en canvi hi ha operacions que no es poden fer des de l’entorn gràfic

    • És potent: amb una única instrucció es pot fer el mateix que obrint diverses finestres i menús i clicant diverses opcions

    • És flexible: els comandaments es poden combinar entre sí i personalitzar per formar comandaments complexes, sense límit algun; això no es pot fer amb les finestres i menús 

    • És estable: sovint les interfícies gràfiques canvien entre versions del sistema operatiu fent perdre temps buscant allò que ja no està on estava; en canvi els comandaments del shell varien poc, de fet hi ha comandaments tant en Windows com en Linux que tenen més de 30 anys d’existència i segueixen funcionant perfectament.

    • És automatitzable: les tasques repetitives d’administració, com ara crear diversos usuaris nous del sistema (per exemple quan entren nous contractats a la organització) en l’entorn gràfic obliguen a usar repetidament les mateixes opcions de menús, en canvi els comandaments equivalents es poden guardar en un fitxer de text i executar-se tots alhora. Aquest fitxer el podem guardar per reutilitzar-lo en un futur.

En aquest article fem una breu introducció al treball des del shell més conegut de Linux: el bash

Introduir comandaments

Quan tenim el shell del sistema obert podem començar a escriure comandaments, que podem veure com sol·licituds per que el sistema executi alguna acció,  en realitat cada comandament crida a un programa del sistema. 

En la imatge veiem que el shell mostra un text (en verd) que s'anomena el prompt que varia segons la versió del sistema, en aquest dóna: el nom de l'usuari que té oberta la sessió (jordi), separat pel caràcter @ el nom de la màquina (jordi-SVE1513CSE), després dels ":" es mostra el caràcter ~ que indica que dintre del sistema de fitxers estem situats en l'arrel dels directoris de l'usuari (que per norma és /home/usuari, en l'exemple /home/jordi) i després el caràcter $ que indica que l'usuari no és administrador que en Linux sempre s'anomena usuari root. A continuació del prompt escrivim el comandament date i fem <Intro>, el shell interpreta l'ordre, veu que és simplement executar el comandament date, ho fa mostrant el resultat, i torna a mostrar el prompt esperant la següent ordre:


El shell quan s'inicia sempre ens situa en l'arrel del directori de l'usuari; si ens movem de directori usant comandaments, el prompt canvia:


En el darrer prompt ja no es mostra el caràcter  ~ doncs em sortit de l'arrel del directori de l'usuari. Si entrem com administradors el prompt també canvia:

jordi@jordi-SVE1513C5E:/home$ sudo su
[sudo] contrasenya per a jordi:  
root@jordi-SVE1513C5E:/home#

El caràcter $ ha estat substituit pel # que està reservat per l'administrador. Si l'ordre que escrivim no existeix, el shell ens ho diu i ens proposa comandaments semblants:

jordi@jordi-SVE1513C5E:/home$ whi

No s'ha trobat l'ordre 'whi', volíeu dir:

 l'ordre 'hi' de l'snap hi (1.1)

 l'ordre 'ghi' del deb ghi (1.2.0-1)

 l'ordre 'who' del deb coreutils (8.30-3ubuntu2)

Vegeu 'snap info <nom de l'snap>' per a versions addicionals.


De vegades ens cal escriure com a part del comandament una paraula que conté espais en blanc; per defecte el shell interpreta els espais en blanc com a separadors d'ordres diferents, o de dades diferents; l'ordre cat mostra el contingut d'un fitxer de text, si tenim un que s'anomena "resum Azure AD" i fem:

jordi@jordi-SVE1513C5E:~$ cat resum Azure AD
cat: resum: El fitxer o directori no existeix
cat: Azure: El fitxer o directori no existeix
cat: AD: El fitxer o directori no existeix
jordi@jordi-SVE1513C5E:~$

el shell interpreta que són tres fitxers independents; una solució és escriure cat "resum Azure AD", una altre utilitza el caràcter d'escapament \ que indica que el següent caràcter és "especial" i el shell no l'ha de interpretar, cat resum\ Azure\ AD funcionarà bé doncs cada espai en blanc va precedit de la barra invertida i el shell no la interpreta com separador. 

La combinació de tecles Control + C s'interpreta com ordre d'aturar el comandament en curs; per exemple si llancem el comandament sleep 60 que simplement deixa esperant al shell 60 segons, podem interrompre la espera amb Control + C, que el shell visualitza com ^C:

jordi@jordi-SVE1513C5E:~$ sleep 60
^C
jordi@jordi-SVE1513C5E:~

La combinació de tecles Control + D tanca el shell i acaba la sessió.

El comandament man obre el manual de qualsevol altre comandament, per exemple el manual de date:

jordi@jordi-SVE1513C5E:~man date

DATE(1)                                             User Commands                                             DATE(1)

NAME
      date - print or set the system date and time

SYNOPSIS
      date [OPTION]... [+FORMAT]
      date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

DESCRIPTION
      Display the current time in the given FORMAT, or set the system date.

      Mandatory arguments to long options are mandatory for short options too.

      -d, --date=STRING
             display time described by STRING, not 'now'

      --debug
             annotate the parsed date, and warn about questionable usage to stderr

      -f, --file=DATEFILE

Es poden executar diversos comandaments en una única línia, separant-los per punt i coma; el següent exemple primer espera 6 segons (sleep 6) i després llista el contingut del directori actual

Jordi@jordi-SVE1513C5E:~$ sleep 6; ls
Baixades    Escriptori   Imatges                     Música       Públic            snap    'VirtualBox VMs'
Documents   hola.txt    'Mòduls específics de DAW'   Plantilles  'resum Azure AD'   Vídeos
jordi@jordi-SVE1513C5E:~$





dimarts, 23 de març del 2021

Ús de filtres i expressions regulars del shell bash


Filtres

Molts comandaments, no tots, admeten com a dades d'entrada el resultat d'un altre comandament, al que apliquen alguna transformació ("filtren" el resultat); per exemple sort ordena alfabèticament el resultat s'un altre comandament:

~$ ls
'Welcome to CoCalc.term'   cuatro   dos   tres   uno
~$ ls | sort
Welcome to CoCalc.term
cuatro
dos
tres
uno
~$ ls | sort -r
uno
tres
dos
cuatro
Welcome to CoCalc.term

grep

Examina les dades d'entrada i mostra cada línia que contingui un "patrò", és a dir, una cadena de text que pot incloure caràcters especials. Exemple: tenim un fitxer MAIL amb les capçaleres del correus rebuts al sistema:

~$ cat MAIL
Delivered-To: mary@gmail.com; From: joan@gmail.com
Delivered-To: mary@gmail.com; From: pere@gmail.com
Delivered-To: mary@gmail.com; From: ines@gmail.com
...

Per mostrar els correus rebuts de pere:

$ grep "From: pere" MAIL
Delivered-To: mary@gmail.com; From: pere@gmail.com
~$  
 
Per mostrar els correus NO enviats per pere:

$ grep -v "From: pere" MAIL
Delivered-To: mary@gmail.com; From: joan@gmail.com
Delivered-To: mary@gmail.com; From: ines@gmail.com
~$ 

Podem encadenar filtres: veure correus rebuts per Mary NO enviats per pere:
~$ grep -v "From: pere" MAIL | grep "To: mary"
Delivered-To: mary@gmail.com; From: joan@gmail.com
Delivered-To: mary@gmail.com; From: ines@gmail.com
~$ 
 
Un altre exemple: comprovar si en un servidor amb diversos usuaris connectats ha iniciat sessió mary:

who | grep mary

Les cometes al patrò són opcionals excepte si inclou espais en blanc o caràcters especials que poden ser malinterpretats:
 grep -v "From: pere" MAIL | grep To: mary
grep: mary: No such file or directory
~$  

Les cometes dobles indiquen al shell que si usem variables dins dels patrons les ha de tenir en compte, en canvi si usem cometes simples llavors el shell interpreta la cadena de text literalment, sense fer cas de les variables:

~$ echo "El shell que uses és $0"
El shell que uses és /bin/bash
~$ echo 'El shell que uses és $0'
El shell que uses és $0
~$ 

tail

El filtre tail pren línies concretes d'un fitxer o entrada de dades filtrada; per veure la darrera línia del fitxer MAIL:

~$ tail -n 1 MAIL
Delivered-To: mary@gmail.com; From: ines@gmail.com

O bé veure el darrer correu rebut per Mary i NO enviat per pere:

 grep -v "From: pere" MAIL | grep "To: mary" | tail -n 1
Delivered-To: mary@gmail.com; From: ines@gmail.com

Evidentment tail té moltes més opcions que podem consultar en el manual.

cut

 Aquest filtre extreu parts de línies de text d'un fitxer. És molt útil per administrar fitxers de dades en format CSV. Per exemple, per extreure la part de qui fa l'enviament de correu en el fitxer MAIL:

cat MAIL | cut -d\; -f1
Delivered-To: mary@gmail.com
Delivered-To: mary@gmail.com
Delivered-To: mary@gmail.com

El paràmetre -d seguit de ; indica a cut que el fitxer està organitzat en camps separats per punt i coma, i el paràmetre -f1 li du que d'aquests camps agafi el primer. Es pot dir que prengui una llista de camps com ara f1,2,4 o  un interval com ara -f1-3. La barra invertida en .d\; és necessària per que el ; té un significat especial pel bash. Combinant dos cut obtenim la llista de mails que han enviat correu a mary en el fitxer MAIL:

cat MAIL | cut -d\; -f2 | cut -d: -f2
 joan@gmail.com
 pere@gmail.com
 ines@gmail.com

Ara ens serà fàcil obtenir, amb cut, un llistat dels usuaris del sistema junt amb el seu shell per defecte:

cat /etc/passwd | cut -d: -f1,7

Molts usuaris del sistema en realitat no tenen dret a iniciar sessió, són els que en el seu shell per defecte tenen un "nologin"; combinant amb grep podem veure els usuaris que sí poden iniciar sessió:

cat /etc/passwd | cut -d: -f1,7 | grep -v "nologin"
root:/bin/bash
sync:/bin/sync
salvus:/bin/bash
gdm:/bin/false
postgres:/bin/bash
user:/bin/bash
sbt:/bin/false
rstudio-server:/bin/sh

tr

Aquest filtre transforma caràcters segons el patrò; la forma més simple d'usuar-lo és donant dues cadenes de text:

cat MAIL
Delivered-To: mary@gmail.com; From: joan@gmail.com
Delivered-To: mary@gmail.com; From: pere@gmail.com
Delivered-To: mary@gmail.com; From: ines@gmail.com
~$ cat MAIL | tr mary Mary
Delivered-To: Mary@gMail.coM; FroM: joan@gMail.coM
Delivered-To: Mary@gMail.coM; FroM: pere@gMail.coM
Delivered-To: Mary@gMail.coM; FroM: ines@gMail.coM
~$ 

Per transformar de minúscules a majúscules usem 
cat MAIL | tr a-z A-Z 
DELIVERED-TO: MARY@GMAIL.COM; FROM: JOAN@GMAIL.COM
DELIVERED-TO: MARY@GMAIL.COM; FROM: PERE@GMAIL.COM
DELIVERED-TO: MARY@GMAIL.COM; FROM: INES@GMAIL.COM

També pot eliminar amb l'opció -d. Per treure els ; del text: 
cat MAIL | tr -d \;
Delivered-To: mary@gmail.com From: joan@gmail.com
Delivered-To: mary@gmail.com From: pere@gmail.com
Delivered-To: mary@gmail.com From: ines@gmail.com

Fixeu-vos que tr NO modifica el fitxer original, si no que pren el resultat de mostrar el fitxer per pantalla; si volem deixar el resultat en un fitxer podem fer una redirecció:

cat MAIL | tr -d \; > MAIL2

NO és recomana sobreescriure directament el fitxer font:

cat MAIL | tr -d \; > MAIL     NO recomanable!


Expressions regulars


Els filtres es converteixen en eines potents d'administració quan en els patrons s'inclouen expressions regulars. Una expressió regular serveix per expressar patrons de text que es poden usar en cerques; el patrò més simple és una cadena de text tal qual:

jordi@jordi-sve1513c5e:~$ ls | grep word
password.txt
wordlist

però podem complicar-les mitjançant caràcters especials com ara asterisc, interrogant, etc. El caràcter * significa "qualsevol seqüència de caràcters a continuació", el caràcter . significa "qualsevol caràcter simple a continuació":
jordi@jordi-sve1513c5e:~$ ls | grep h.. 
dashboard-cluster-role-binding.ym 
dashboard-cluster-role-binding.yml 
dashboard-service-account.yml

jordi@jordi-sve1513c5e:~$ ls | grep word*
wordlist


El "*" també es pot usar com prefix d'un caràcter, llavors indica 0 o més ocurrències del caràcter: si el fitxer prova conté:

cat prova
1234
1234aaa
123AAA

llavors 


~$ cat prova | grep '[1-4]a*'
1234
1234aaa
123AAA

retorna les línies que tenen números entre 1 i 4 seguits de zero, una o més d'una "a"; en canvi

cat prova | grep '[1-4]aa*'
1234aaa

mostra només les que com a mínim tenen una "a". 

 
El símbol "^" representa el principi de la línia i el símbol "$" el final; així doncs

 ls -l | grep "^d"
drwxr-xr-x 2 user user   2 Mar 23 18:22 ees
drwxr-xr-x 2 user user   2 Mar 23 18:22 exes
drwxrwxr-x 2 user user   2 Mar 23 18:22 fonts

ens mostra només els directoris; si ho combinem amb el caràcter "." podem obtenir els directoris que tenen permís d'escriptura per el grup d'usuaris del propietari:

ls -l | grep "^d" | grep "^.....w"
drwxrwxr-x 2 user user   2 Mar 23 18:22 fonts

Per trobar línies que només contenen un patró determinat combinem ^ i $:

cat prova | grep '^1234$'
1234

Claudàtors []

Els caràcters que estiguin entre claudàtors són expressions regulars que signifiquen "coincidir amb qualsevol del caràcter de l'interior dels claudàtors".

jordi@jordi-sve1513c5e:~$ ls | grep h[aeiou]
hello.yml
hola
kubectl.sha256
nohup.out
while.sh

S'admeten rangs de valors, com ara:

jordi@jordi-sve1513c5e:~$ ls | grep h[a-i]   
dashboard-cluster-role-binding.ym
dashboard-cluster-role-binding.yml
dashboard-service-account.yml
hello.yml
kubectl.sha256
while.sh

Com a cas especial, [a-zA-Z]  significa qualsevol cadena alfabètica; per exemple, si el fitxer prova conté:
cat prova
1234
1234aaa
123AAA
mary
joan

llavors:

cat prova | grep [a-zA-Z]
1234aaa
123AAA
mary
joan

Repeticions



El caràcter ? significa "el caràcter anterior pot estar o no"; per usar-lo amb cerques cal afegir l'opció -E de grep, o usar el comandament egrep:

jordi@jordi-sve1513c5e:~$ ls | egrep  "as?s"
dashboard-cluster-role-binding.ym
dashboard-cluster-role-binding.yml
dashboard-service-account.yml
password.txt

Veiem que com a mínim ha d'haver una "s", l'altre és opcional. 

Amb el caràcter | expressem "un o l'altre":
jordi@jordi-sve1513c5e:~$ ls | egrep  "prov|pas"
password.txt
prova2
prova3
provadir

Els caràcters especials, que són ^ . [ $ ( ) | * + ? { \, si es volen usar com caràcters normals, s'han "d'escapar", això és, precedir de la barra invertida; per buscar IPs en la xarxa 192.168.1.x
ls | egrep "192\.168\.1"
192.168.1.200
192.168.1.210

sed

Aquest filtre és un editor de text: permet inserir, modificar i eliminar text en un fitxer des de línia de comandaments. Per exemple per substituïr una cadena de text per una altre usem s/cadena/cadena nova

 cat prova | sed 's/1234/192.168.1.100/'

canviarà la cadena 1234 per 192.168.1.100. Al combinar sed amb patrons regulars amplifiquem molt la seva funcionalitat. Per exemple sabem que ls torna el llistat del directori actual en format apaisat

ls
 MAIL   'Welcome to CoCalc.term'   dos   exes    prova   uno
 MAIL2   cuatro                    ees   fonts   tres

Si filtrem amb sed obtenim la llista en vertical
ls | sed 's/  */\n/'
MAIL
MAIL2
Welcome
to CoCalc.term
cuatro
dos
ees
exes
fonts
prova
tres
uno

el patrò regular  's/  */\n/' significa substituïr un blanc seguit de qualsevol nombre de blancs per un salt de línia (caràcter especial \n).
Per esborrar línies usem "d"

cat llista | sed '$d'

salta al final del fitxer (símbol $) i esborra aquella línia ("d"). 

Exercicis

1. Volem obtenir un llistat d'usuaris amb els que darrerament s'ha intentat obrir una sessió sense èxit, pot tenir utilitat per detectar possibles usos no autoritzats de comptes d'usuari. El comandament lastb ja ho fa això:

sudo lastb
mysql    pts/2                         Tue Apr  6 12:29 - 12:29  (00:00)
mysql    pts/2                         Tue Apr  6 12:29 - 12:29  (00:00)
UNKNOWN  pts/2                         Tue Apr  6 12:28 - 12:28  (00:00)
anna     pts/2                         Tue Apr  6 12:28 - 12:28  (00:00)
jcuesta  pts/2                         Tue Apr  6 12:12 - 12:12  (00:00)

btmp begins Tue Apr  6 12:12:06 2021


No obstant volem formatar la sortida de lastb de forma que només mostri el nom de l'usuari, la data i el nombre de intents no autorizats en aquella data, l'anterior llistat s'ha de veure així:

1 anna,Apr,6
1 jcuesta,Apr,6 
2 mysql,Apr,6
1 UNKNOWN,Apr,6

La primera columna mostra el nombre d'intents, la segona columna l'usuari, mes i dia separats per comes. La línia  "btmp begins Tue Apr  6 12:12:06 2021" s'ha filtrat i ja no surt. Escriviu un comandament en línia per aconseguir-ho usant una combinació de filtres i expressions regulars. Ajuda: useu cut per seleccionar els camps usuari, mes i dia, amb sed i una expressió regular podeu eliminar els espais repetits i substituir-los per comes, amb sort i uniq podeu eliminar intents repetits el mateix dia i hora, i comptar-los. Finalment grep us pot ser útil per eliminar la línia que sobra.

2. Escriviu un script bash que, aprofitant el comandament de l'exercici anterior, admeti com a parámetre una llista d'usuaris i mostri només els intents sense èxit d'aquests usuaris:

./exercici.sh jcuesta mysql
     1 jcuesta;Apr;6
     2 mysql;Apr;6


Ajuda: una forma de fer-ho és seguir el següent algorisme:
 
guardar en una variable LOGINS usuaris que han tingut logins fallit
recorrer la llista d'usuaris que ens pasen en la línia de comandament de l'script:
    per cada usuari, 
         buscar-lo en la variable LOGIN
         si el trobem, llavors llistar els seus intents fallits 
    fi-per
    
La llista de usuaris que ens pasen en la línia de comandaments queda respresentada dins de l'script com a vector, anomenat $@, per tant es pot recorrer la llista d'usuaris de la línia del comandament amb un for:

for user in $@; do

Per buscar un usuari en una llista d'usuaris de forma exacta useu grep -w.
Per comprovar si una variable es buida podeu usar el paràmetre -z del if:
 
 if [ -z "$variable" ]
 
serà cert si la variable no conté res.
 
 



















 

Gestió d'usuaris i grups en Linux

Usuaris i grups Linux  Els comptes de Linux són com els comptes de Windows o MacOS; però els detalls no, així que cal explicar alguns detall...