OpenBSD: Hardening alla grsec...

Diverso tempo fa analizzammo la security kernel patch Grsecurity nell'ottica di hardenizzare un sistema montante sistema operativo GNU/Linux.
In questa sede andremo, invece, a scoprire un'interessantissima patch per il kernel di OpenBSD.
Sembra strano ma vedremo come, attraverso la stessa, si possa rendere maggiormente sicuro l'OS "sicuro di default".
Proiettiamoci dunque nell'ottica di Zophie (http://www.0penbsd.com/zophie.html).

Zophie, come detto, implementa alcune features per l'OpenBSD kernel che permettono di rafforzare la sicurezza della nostra macchina, nello specifico esse sono:

1) Trusted Path Execution - kern.zophie.tpe e kern.zophie.tpe_gid
    
Delimitando una locazione arbitraria identificata col nome di TPE possiamo consentire l'esecuzione binaria nella stessa esclusivamente all'utente root o in gruppi creati per la fattispecie.

2) Privacy processi, utenti e connessioni - kern.zophie.privacy

E' possibile, molto similmente a quanto visto con Grsecurity, limitare la scrutabiltà dei processi, delle connessioni e delle utenze ai non relativi owners.
Suddetto viene quindi gestito attraverso le modiche delle utility ps, w, netstat, last, finger e who.

Le impostazioni descritte, come facilmente intuibile, vengono gestite attraverso sysctl(8); conseguentemente le direttive impostabili per il TPE e per il kernel privacy sono:

1) kern.zophie.privacy

Impostabile ad 1 (attivo) e 0 (disattivo).

2) kern.zophie.tpe

Impostabile anch'esso ad 1 e 0.

3) kern.zophie.tpe_gid

Consente l'impostazione dei Gruppi "speciali" a cui consentire l'esecuzione binaria all'interno del TPE.

-- Installazione:

Prima di tutto scarichiamo e decomprimiamo nella nostra home il tarball di zophie.
In quest'articolo analizzeremo la patch per l'OpenBSD Kernel 3.8 sebbene sia disponibile la patch per 3.9.

    # cd ~/ && wget http://www.0penbsd.com/Zophie-3.8.tgz
    # tar zxvf Zophie-3.8.tgz

Nel caso non l'avessimo già fatto (orrore!), scarichiamo i sorgenti del progetto OpenBSD:

    # export [email protected]:/cvs
    # export CVS_RSH=/usr/bin/ssh
    # cd /usr
    # cvs -q get -rOPENBSD_3_8 -P src

Rechiamoci in /usr/src ed applichiamo la patch:

    # cd /usr/src
    # patch -p0 < ~/3.8/Zophie-3.8.patch

Ricompiliamo il kernel:

    # rm -rf /usr/obj
    # mkdir /usr/obj
    # cd /usr/src
    # make obj

    # cd /usr/src/sys/arch/i386/conf
    # cp GENERIC SECURED
    # vi SECURED        -> include "../../../conf/GENERIC" => "../../../conf/SECURED"
    # config SECURED
    # cd ../compile/SECURED

    # make clean
    # make depend
    # make
    # cp /bsd /bsd.nozophie
    # cp bsd /bsd
    # reboot

Bootato il nostro nuovo kernel, ci occuperemo di sistemare Zophie:

Copiamo i nuovi header per sysctl da /usr/src/sys/sys/sysctl.h a /usr/include/sys/:

    # cp /usr/src/sys/sys/sysctl.h /usr/include/sys/

Installiamo il file zophie.7:

    # /usr/bin/nroff -Tascii -mandoc ~/3.8/zophie.7 > zophie.cat7
    # /usr/bin/install -c -o root -g bin -m 444 zophie.cat7 /usr/share/man/cat7/zophie.0

Ricompiliamo le utility incriminate per il "kernel privacy" (finger, last, netstat, w, who) nonchè sysctl:

    # cd /usr/src/usr.bin/finger
    # make clean obj depend && make && make install
    # cd /usr/src/usr.bin/last
    # make clean obj depend && make && make install
    # cd /usr/src/usr.bin/netstat
    # make clean obj depend && make && make install
    # cd /usr/src/usr.bin/w
    # make clean obj depend && make && make install
    # cd /usr/src/usr.bin/who
    # make clean obj depend && make && make install
    # cd /usr/src/sbin/sysctl
    # make clean obj depend && make && make install

Infine modifichiamo il file /etc/sysctl.conf aggiungendo le opzioni di nostro interesse:

    # sysctl -w kern.zophie.privacy=1

Proviamo la patch:

    # su - mozako
    $ ps aux
    USER       PID %CPU %MEM   VSZ   RSS TT   STAT STARTED       TIME COMMAND
    root         1  0.0  0.1   356   308 ??  Is     2:42PM    0:00.01 /sbin/init
    root     25350  0.0  1.1  1852  4460 ??  Ss     2:42PM    0:00.21 httpd: parent (httpd)
    root     26608  0.0  0.1   276   512 ??  Is     2:42PM    0:00.01 inetd
    root      7775  0.0  0.3   572  1120 ??  Is     2:42PM    0:00.32 /usr/sbin/sshd
    root      6908  0.0  0.5  3260  2076 ??  Ss     2:44PM    0:00.33 sshd: root@ttyp0 (sshd)
    root     23390  0.0  0.1   416   492 p0  Ss     2:44PM    0:00.05 -ksh (ksh)
    mozako   11826  0.0  0.1   484   432 p0  S      2:45PM    0:00.02 ksh
    mozako    3566  0.0  0.1   320   204 p0  R+     2:45PM    0:00.00 ps -aux
    root      7074  0.0  0.1   444   480 C0  Is+    2:43PM    0:00.08 -ksh (ksh)

    $ exit
    # sysctl -w kern.zophie.privacy=1
    kern.zophie.privacy: 0 -> 1
    # su - mozako
    $ ps aux
    USER       PID %CPU %MEM   VSZ   RSS TT   STAT STARTED       TIME COMMAND
    mozako    5785  2.0  0.1   504   464 p0  S      2:45PM    0:00.02 ksh
    mozako    6808  0.0  0.0   416   188 p0  R+     2:45PM    0:00.00 ps -aux
    

Per quanto riguarda i processi sembra funzionare egregiamente, vediamo le connessioni:

    # netstat -na
    Active Internet connections (including servers)
    Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
    tcp        0      0  192.168.1.190.22       192.168.1.103.59507    ESTABLISHED
    tcp        0      0  *.21                   *.*                    LISTEN
    tcp        0      0  *.22                   *.*                    LISTEN
    tcp        0      0  *.37                   *.*                    LISTEN
    tcp        0      0  *.13                   *.*                    LISTEN
    tcp        0      0  *.113                  *.*                    LISTEN
    tcp        0      0  *.80                   *.*                    LISTEN
    Active Internet connections (including servers)
    Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
    udp        0      0  127.0.0.1.512          *.*
    udp        0      0  *.514                  *.*
    Active Internet connections (including servers)
    Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
    tcp6       0      0  *.22                   *.*                    LISTEN
    tcp6       0      0  *.37                   *.*                    LISTEN
    tcp6       0      0  *.13                   *.*                    LISTEN
    tcp6       0      0  *.113                  *.*                    LISTEN
    Active Internet connections (including servers)
    Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
    udp6       0      0  ::1.512                *.*
    Active UNIX domain sockets
    Address    Type   Recv-Q Send-Q      Inode       Conn       Refs    Nextref Addr
    0xd657e330 stream      0      0        0x0 0xd0df0040        0x0        0x0
    0xd657e264 stream      0      0        0x0 0xd0df0240        0x0        0x0
    0xd657e198 dgram       0      0 0xd6552a18        0x0        0x0        0x0 /var/empty/dev/log
    0xd657e0cc dgram       0      0 0xd6552978        0x0        0x0        0x0 /dev/log

    # su - mozako
    $ netstat -na
    Active Internet connections (including servers)
    Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
    tcp        0      0  192.168.1.190.50000    192.168.1.103.41005    ESTABLISHED
    tcp        0      0  192.168.1.190.9445     195.110.105.18.6667    ESTABLISHED
    tcp        0      0  *.50000                *.*                    LISTEN
    Active Internet connections (including servers)
    Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
    tcp6       0      0  *.50000                *.*                    LISTEN


Anche le connessioni sono mostrate unitamente all'owner del socket, si noti infatti che ambedue le connessioni stabilite nonchè quelle in ascolto appartengono al bouncer IRC volutamente eseguito a mò d'esempio.

Privacy Policy