Recomenacions de Seguretat pels UNIX (ETSE/ETSEQ)


Cada cop hi ha més equips UNIX personals administrats pel propi usuari. Si bé és relativament sencill instalar el SO, sovint s'oblida fer un bon repas al procés de post-instalació.

L'objectiu d'aquest document és el de donar unes recomenacions generals per tal que els usuaris que hagin optat per instalar-se un UNIX als seu equip personal, o siguin administradors d'algún servidor UNIX puguin protegir-lo mínimament.

Cada recomenació ve acompanyada d'exemples d'aplicació en diferents SO UNIX, però cal tindre en compte que un canvi de versió d'un determinat SO pot variar el mètode d'aplicació en aquell SO, o inclús invalidar-lo.

A banda d'això, és una bona mesura el no instalar ni activar aquells serveis aplicatius que no s'hagin d'utilitzar (tftpd, httpd, ftpd, finger, rpc, nfs, ...).



Índex

Mesures per limitar el perill d'entrada d'usuaris no autoritzats

Permetre l'entrada directa com a "root" sols des de la consola
Permetre l'accès a root sols a un grup d'usuaris (su)
Permetre "su" sols durant determinats dies/hores
Permetre l'accès via FTP sols a certs usuaris
Autologout per evitar sessions obertes
Permetre l'accés sols a uns pocs ordinadors 'amics' (tcp-wrapper)
Limitació d'entrades root via XDM

Protecció dels fitxers

Sistema de permisos del Unix, umask,chgrp, ...

Mesures per evitar que ens descubreixin les paraules clau

Ocultació de Passwords via "shadow"
SSH; Telnet encriptat

Com saber si tenim visitants

Syslog com a mitjà per recollir informació
Control de directoris "pirates"
Detecció de Cavalls de Troia via setuid




Permetre l'entrada directa com a "root" sols des de la consola

Tot i que un determinat usuari conegui la password de root, necessitarà accés físic a la consola (teclat connectat directament a la CPU) per poder-lo utilitzar.

Solaris, IRIX:

Editar /etc/default/login i revisar les variables CONSOLE i PASSREQ per tal que quedin tal com segueix:

# If CONSOLE is set, root can only login on that device.
# Comment this line out to allow remote login by root.
#
CONSOLE=/dev/console
# PASSREQ determines if login requires a password.
#
PASSREQ=YES
HP/UX:

Editar /etc/securetty i definir-hi els accessos que permetrem com a root.

Exemple:

# accès limitat a la consola:
console
Linux:

Editar /etc/securetty, i per limitar els accessos a la consola cal indicar-hi:

#acces limitat a la consola i a algunes sessions X
/dev/console
local:0
:0
nom_maquina:0

Si necessitem accés a root encara el podem aconseguir des d'un compte d'usuari utilitzant la comanda "su -" (el hacker necessitaria conèixer 2 passwords).




Permetre l'accès a root sols a un grup de usuaris (su)

Utilitzant la comanda "su - root" es pot acconseguir accès a root si es sap la password. El que volem és restringir aquesta possibilitat a un grup de usuaris de forma que la resta, tot i adivinant la password, no la puguin utilitzar.

SunOS, OSF/1:

Editar el fitxer /etc/group i afegir una línea amb identificador de grup 0, ón hi haurà la llista de usuaris autoritzats a fer `su - root'.

system:*:0:usuari1,usuari2,usuari3
HP:

No existeix l'opció de fer-ho via el grup 0 del /etc/group però es pot fer amb les ACL.

Les Access Control List permeten donar permisos sobre un fitxer especificant una llista de usuaris o grups. Així es pot limitar qui utilitza el binari "su", però la limitació serà per fer su a qualsevol usuari. No sols a root.

La manera de fer-ho seria:

chacl `(%.g1,r-x)(%.g2,r-x)' /bin/su
Així sols podrien utilitzar "su" els dels grups g1 i g2.

Solaris, IRIX:

No funciona aquesta opció del /etc/group. Es pot fer que la comanda /bin/su pertanyi a un determinat grup de usuaris, que serien els únics amb dret a utilitzar-la.

Adicionalment utilitzant el fitxer /etc/default/su es pot enviar un avís a consola cada cop que algú utilitzi amb èxit la comanda "su" per obtindre accès a root:

# CONSOLE determines whether attempts to su to root should be logged to the named device
#
CONSOLE=/dev/console
Linux:

La utilitat "sudo" ens permet executar comandes de superusuari desde un usuari qualsevol. Es configura en el fitxer /etc/sudoers i allí especificarem quins programes es podran utilitzar en modus root als usuaris autoritzats.

Aquesta utilitat la combinariem amb un "chmod o-x /bin/su", i després, fent "sudo su", els usuaris autoritzats podran fer "su root".




Permetre "su" sols durant determinats dies/hores

Tot i tindre limitada la utilització de la comanda "su", és possible que ens accedeixin a un dels comptes que tenen aquest privilegi.

Limitarem aquest cas a les hores laborables, durant les que quals amb mètodes que explicarem més endavant podrem advertir aquests accessos.

#!/bin/sh
# NOM FITXER: nom_script_que_treu_la_prohibicio
# Eliminar la possibilitat de que es pugui fer "su root" a base de
# canviar la llista de usuaris autoritzats a sols "root".
# S'executa amb un cron a les 20:00 dels dies laborables
#
\cp -f /etc/group /etc/group.bak
cat /etc/group | 
        sed 's/system:\*:0:root,usuari1,usuari2/system:\*:0:root/g' 
        > /etc/group.1
\mv /etc/group.1 /etc/group

#!/bin/sh
# NOM_FITXER: nom_script_que_prohibeix_utilitzar_su
# Donar dret de fer "su root" a un grup de usuaris a base de canviar
# "root" per la llista de usuaris que ens interessi.
# S'activa amb un cron a les 8:30 dels dies laborables
#
\cp -f /etc/group /etc/group.bak
cat /etc/group |
        sed 's/system:\*:0:root/system:\*:0:root,usuari1,usuari2/g'
        > /etc/group.1
\mv /etc/group.1 /etc/group
I les líneas a afegir al crontab de root són:

    30 8 * * 1-5 nom_script_que_treu_la_prohibicio 
0 20 * * 1-5 nom_script_que_prohibeix_utilitzar_su 



Permetre l'accès via FTP sols a certs usuaris

Per tal de limitar quins usuaris poden utilitzar l'FTP es pot definir un fitxer amb la llista de usuaris a qui els hi volem denegar aquesta opció.

Una bona norma pot ser denegar l'accès de root via FTP, ja que sovint sols ens cal llegir, i si necessitem escriure la sol.lució és executar l'FTP desde root i entrar a la màquina remota com a un usuari sense privilegis.

SunOS, OSF/1, Solaris, AIX, Linux, IRIX:

/etc/ftpusers

# Llista de usuaris a qui deneguem l'entrada via FTP
root
usuari-malevol-1
usuari-malevol-2



Autologout per evitar sessions obertes

Es important no marxar deixant l'ordinador amb una sessió oberta, més encara si és de root. Si som descuidats podem utilitzar sistemes automàtics que ens ajudin, però dependran de la "shell" i del SO que utilitzem.

Amb tcsh:

L'ordre de execució dels fitxers de configuració en SunOS, Solaris, Linux, IRIX i OSF/1 és: /etc/csh.cshrc, /etc/csh.login, $HOME/.tcshrc, $HOME/.cshrc (si no existeix el $HOME/.tcshrc) i $ HOME/.login.

  # /bin/tcsh
  #
  # Autologout als 45 minuts com a variable no modificable
  set -r autologout = 45
Amb zsh i bash:

Els fitxers de configuració són /etc/zshrc (que afecta a tots els usauris), i $USER/.zlogin.

# desconnexió després de 600 segons d'inactivitat
TMOUT=600
Solaris 2.X & IRIX:

Editar el fitxer /etc/default/login.

  # TIMEOUT sets the number of seconds (between 0 and 900) to wait before
  # abandoning a login session.
  #
  TIMEOUT=300



Permetre l'accés sols a uns pocs ordinadors 'amics' (tcp-wrapper)

Convé no permetre que sigui possible connectar-se al nostre ordinador des de qualsevol altre ordinador de la internet, sinó que sols sigui possible fer-ho des d'uns pocs ordinadors als que considerem de confiança. Per a fer-ho es poden utilitzar els "tcp-wrapper". Aquest aplicatiu s'ha convertit en estandard i sovint es inclòs directament en la instal.lació del SO., de forma que sols cal editar els fitxers "hosts.allow" i "hosts.deny".

Un exemple per permetre sols connexions -de qualsevol tipus- als ordinadors "amic1" i "amic2" seria el que s'indica. Es important posar el nom complert (amic1.organitzacio.pais) o molt millor la adreça IP.

/etc/hosts.allow

ALL: LOCAL, amic1.etse.urv.es, amic2.etse.urv.es
I deixar el /etc/hosts.deny amb ALL: ALL per denegar a tots els restants.

Ho podem aplicar també per protocols, per exemple per permetre sols connexions ssh des de determinats ordinadors
/etc/hosts.allow

sshd: ord1.etse.urv.es, ord2.etse.urv.es

I amés podem utilitzar el /etc/hosts.deny per fer log de les connexions denegades:

ALL: ALL: ( /usr/bin/logger -p local1.notice "%a - %c -%u" ) &




Limitació d'entrades root via XDM

Si activem les XWindows per permetre connexions remotes, les entrades a traves de XDM no acostumen a quedar registrades en last, wrappers, syslog, ... I no estan controlades pels sistemes habituals de limitar entrades com a root.
Per limitar desde quines pantalles es pot conenctar com a root es pot:

SunOS, Solaris, IRIX:
Com aquests sistemes no tenen cap fitxer especial per definir les pantalles Xsegures cal implementar-ho en el propi xdm. Ho aprofitarem per fer logging de les connexions.
Si els logs detecten intents d'entrada com a root es que saben la password i per tant cal canviar-la.

   (xdm-config)
        ...
        DisplayManager*startup:         /usr/openwin/lib/xdm/Xstartup
        
#!/bin/sh # # Xstartup # This program is run as root after the user is verified # ----- -------- if [ -f /etc/nologin ]; then exit 1 fi # /usr/ucb/logger -p local1.info "(XLogin) $USER desde $DISPLAY" if [ $USER = "root" ] && [ $DISPLAY <> ":0" ] then # Sovint aquest logger NO surt, problemes amb el "exit 1" (?) /usr/ucb/logger -p local1.info "(XLogin Frustrat) $USER desde $DISPLAY" exit 1 fi # exit 0




Ocultació de passwords via "shadow"

Qualsevol usuari d'un compte d'un ordinador UNIX, així com usuaris remots utilitzant serveis de xarxa mal configurats (HTTP, tftp, ...) pot llegir el fitxer de passwords /etc/passwd. Un cop el té pot utlitzar programes "craker" per descubrir les passwords dels diferents comptes. Per evitar-ho convé utilitzar les "shadow passwords".
Consisteix en desplaçar el camp on hi ha la password encriptada a un fitxer protegit contra lectura excepte per l'usuari root.

Solaris, Linux:

La instalació del SO ja genera un /etc/shadow per /etc/passwd.




Syslog com a mitjà per recollir informació

Utilitzant el fitxer /etc/syslog.conf podem definir avisos que ens resultaran útils per controlar l'activitat del sistema. Per a que siguin realment útils convé consultar-los periòdicament.

Cal revisar que tant els fitxers generats com el /etc/syslog.conf estan protegits contra escriptura per a la resta del mon.

Exemples:

# Per rebre informació d'errors de "su" a la primera, de "telnet" a 
# la cinquena i alguns errors de ftp
daemon,auth,user,kern,*.emerg;*.alert;*.crit /security/nom-maquina
daemon,auth,user,kern,*.emerg;*.alert;*.crit root,usuari1,usuari2

# Avís quan algú es connecta com a root amb èxit (no avisar a root!)
auth.notice            user1, user2

# Definició d'alarmes locals que s'activaran amb :
# % logger -p local0.info "....."
# pot servir també per enviar avisos als usuaris.
local0.info            /security/locals
local1.info            usuari1,usuari2,usuari3

# Els avisos del sendmail sols es rebran si s'engega el
# sendmail amb l'opció de debugger "-dX" ón X és un numero.
# L'exemple següent envia les logs al fitxer de la maquina 
# declarada com a `loghost'. I aquella els redistribueix.
# atenció al bug de Solaris 2.4 sobre els "loghost".
mail.debug            ifdef(`LOGHOST', /var/log/syslog, @loghost)
Com a protecció adicional és interessant protegir el fitxer de syslog:

chmod 640 syslog.conf



Control de directoris "pirates"

Típicament, un pirata que hagi aconseguit accès il.legal a un compte hi crearà directoris el més ocults possible, per exemple amb noms no visibles (espais en blanc, tabulats, ...). Per tal de ajudar a l'usuari a que els detecti es pot modificar el "ls" per tal que després del nom del fitxer posi un caràcter especial indicant-ne el tipus (/per directoris, @ per executables, ...) així els noms invisibles queden fàcilment detectats.

# Alias del `ls' per tal de detectar fitxers `ocults'
# alias ls = 'ls -F'
Aquest codi cal posar-lo al .login, .cshrc, /etc/csh.cshrc, .zlogin ... o qualsevol altre fitxer similar.




Detecció de Cavalls de Troia via setuid

Un hacker que hagi aconseguit accés al nostre ordinador pot posar-hi fitxers amb el bit "setuid" activat per tal que des d'un usuari sense privilegis es puguin executar comandes suplantant a root.
Per tal de controlar quins fitxers tenen activat el "setuid" es poden utilitzar varies comandes que poden ser executades periòdicament o quan hi ha sospita de problemes. Exemples de comandes serien:

# cerca de fitxers amb user ID en execució
find / -name root -perm +4000 -print
# cerca de qualsevol fitxer amb la `s' en un file system
ncheck -s /dev/...