tutorial hardening v1.1

37
Reforzando la instalación de GNU/Linux versión 1.1 Temas Introducción................................................................................... 2 Pre-Instalación................................................................................ 2 Instalación..................................................................................... 4 Sistema de archivos........................................................................4 Usuarios......................................................................................7 Selección de paquetes.................................................................... 7 Ajuste del boot............................................................................. 8 Configuración..................................................................................8 Boot Loader................................................................................. 8 Limpieza..................................................................................... 9 Paquetes.................................................................................. 9 Servicios................................................................................. 13 Mounts................................................................................... 14 Selección de Paquetes................................................................... 15 Usuarios, permisos y configuraciones................................................. 16 Usuarios................................................................................. 16 Permisos................................................................................. 17 Configuración del Kernel............................................................. 19 Reboot mediante CTRL-ALT-Del..................................................... 19 Crontab.................................................................................. 20 Manejo de Logs......................................................................... 20 Administración remota.................................................................. 21 SSH....................................................................................... 21 Root login............................................................................... 23 Actualización................................................................................. 24 Mantenimiento............................................................................... 28 Otras Tareas y Herramientas.............................................................. 28 Backup................................................................................... 28 Bastille Linux........................................................................... 29 Paquetes Harden....................................................................... 30 Sudo...................................................................................... 30 Auditoría interna.......................................................................31 Integridad............................................................................... 33 NTP....................................................................................... 35 Firewall.................................................................................. 35 Otras fuentes de información............................................................. 35 CheckList..................................................................................... 36 Pre-instalación.......................................................................36 1

Upload: emmanuelx7

Post on 28-Oct-2015

89 views

Category:

Documents


3 download

DESCRIPTION

Tutorial de Hardening en servidores Linux

TRANSCRIPT

Page 1: Tutorial Hardening v1.1

Reforzando la instalación de GNU/Linuxversión 1.1

TemasIntroducción................................................................................... 2Pre-Instalación................................................................................ 2Instalación..................................................................................... 4

Sistema de archivos........................................................................4Usuarios......................................................................................7Selección de paquetes.................................................................... 7Ajuste del boot............................................................................. 8

Configuración..................................................................................8Boot Loader................................................................................. 8Limpieza.....................................................................................9

Paquetes..................................................................................9Servicios.................................................................................13Mounts................................................................................... 14

Selección de Paquetes................................................................... 15Usuarios, permisos y configuraciones................................................. 16

Usuarios................................................................................. 16Permisos.................................................................................17Configuración del Kernel............................................................. 19Reboot mediante CTRL-ALT-Del..................................................... 19Crontab..................................................................................20Manejo de Logs.........................................................................20

Administración remota.................................................................. 21SSH....................................................................................... 21Root login............................................................................... 23

Actualización.................................................................................24Mantenimiento...............................................................................28Otras Tareas y Herramientas.............................................................. 28

Backup...................................................................................28Bastille Linux........................................................................... 29Paquetes Harden.......................................................................30Sudo......................................................................................30Auditoría interna.......................................................................31Integridad............................................................................... 33NTP.......................................................................................35Firewall..................................................................................35

Otras fuentes de información............................................................. 35CheckList..................................................................................... 36

Pre-instalación.......................................................................36

1

Page 2: Tutorial Hardening v1.1

Instalación............................................................................36Configuración........................................................................ 36Otras tareas y herramientas.......................................................36Mantenimiento.......................................................................37

Introducción¿Por qué necesitamos reforzar la instalación de un sistema operativo?Salvo raras excepciones1, los sistemas operativos en general no dedican un granesfuerzo en la seguridad al momento de la instalación.¿Y cuál es el resultado de este hecho?Con el crecimiento que ha tenido Internet en los últimos años, la ventana detiempo entre que un sistema operativo recién instalado (sin parches) se conectaa Internet, y que el mismo sufre una intrusión, ha bajado de días a mediados delos 90’, a horas en el 2000, y minutos en la actualidad.En este documento nos ocuparemos de mejorar la seguridad en una instalaciónde GNU/Linux. Utilizaremos como base la distribución Debian, versión sarge (otesting), por ser una de las más usadas en ambientes de servidor, y porque laconsideramos como una de las más adecuadas para esa misma función.Todos los conceptos vertidos en esta guía podrán ser aplicados a cualquierdistribución de Linux, o sistema operativo tipo Unix (*BSD, Solaris, etc.). Sinembargo, se deberán tomar los recaudos necesarios para que dicha adaptaciónno deje “puertas abiertas” debido a las diferencias entre las distintasdistribuciones.

Pre-InstalaciónComenzaremos por considerar dos temas esenciales.Se dice que quien tiene acceso físico a un equipo tendrá acceso total al mismo.Si bien ésta afirmación no siempre es exacta, y algunas de las tareas querealizaremos tienen por objetivo contrarrestarla, es absolutamenterecomendable que el acceso físico al servidor y su consola esté restringido alpersonal autorizado.Como segundo recaudo, el equipo no deberá conectarse a la red hasta haberfinalizado con las tareas de aseguramiento. En caso de ser necesario algún tipode conexión (por ejemplo, porque el equipo debe iniciarse mediante netboot),estas tareas deberán realizarse en una red cerrada, asegurada, ypreferentemente aislada.

Antes de realizar la instalación del sistema operativo elegido, hay algunas tareasque podemos realizar. En particular, mediante la configuración del BIOS del1 Por ejemplo, OpenBSD. http://www.openbsd.org

2

Page 3: Tutorial Hardening v1.1

equipo en cuestión, podremos restringir algunos puntos de entrada que no seannecesarios para la operatoria normal del sistema. Entre otros, podemos nombrarlos siguientes.v Puertos paralelos y serialesv Puertos USBv Disqueteras y lectoras de CD/DVD

En la Figura 1 podemos observar un ejemplo de cómo se deshabilitan algunospuertos innecesarios en el BIOS.

Figura 1 - Dispositivos en el BIOS

Otra tarea importante consiste en configurar el orden de selección dedispositivos para el boot del equipo. Para poder realizar la instalación,deberemos seleccionar el medio disponible para la misma, normalmente CD-ROM, pero una vez finalizada la misma, deberemos seleccionar únicamente eldisco de arranque del sistema. En caso de no ser posible, como en el ejemplo dela Figura 2, deberemos ordenar los dispositivos para que el elegido sea elprimero de la lista. Inclusive podemos deshabilitar todos los dispositivos dealmacenamiento menos el dispositivo de boot. Por ejemplo, una vez instalado el

3

Page 4: Tutorial Hardening v1.1

sistema operativo, se puede deshabilitar el CD-ROM del BIOS, ya que el mismoserá detectado de todas maneras por el sistema operativo.

Figura 2 - Orden de boot

Por último, deberemos configurar, si el BIOS así lo permitiese, una contraseñapara restringir la realización de cambios en la configuración del mismo.

InstalaciónPara realizar un buen proceso de aseguramiento de un servidor GNU/LinuxDebian, incluiremos su instalación. Durante el proceso de instalación, cuyadescripción completa puede encontrarse en la bibliografía, deberemos tener encuenta algunos detalles que nos permitirán asegurar un resultado exitoso.

Sistema de archivosEn primer lugar, deberemos diseñar cuidadosamente el sistema de archivos. Noexiste una regla general, pero podemos seguir algunos consejos para mejorartanto la seguridad como el rendimiento.Algunos de estos consejos consisten en:

4

Page 5: Tutorial Hardening v1.1

v Si el sistema va a alojar múltiples usuarios interactivos, /home debería tenersu propia partición.

v En equipos que brinden servicios críticos, /var/log podría llenarse yperjudicar el buen funcionamiento de los mismos, por lo que podríasepararse.

v Por esta misma razón, /tmp utilizará una partición separada.v En general, /var (pensado para todas las operaciones más “dinámicas”) y /

usr (donde normalmente se alojan los archivos menos susceptibles a cambios)tendrán su propio espacio.

v Las particiones pueden montarse con ciertas opciones que restringen sufuncionalidad (ver Figura 3). Las restricciones más interesantes para nuestroobjetivo son:Ø nodev: No permite la creación de dispositivos (devices).Ø nosuid: No permite la utilización de los bits suid y sgid.Ø noexec: No permite la ejecución de archivos

En general, podemos definir que:Ø En ninguna partición, salvo /, se necesitan dispositivos.Ø /, /usr, y /var, en general, son las únicas particiones desde las cuales se

debería poder ejecutar archivos. Además, sólo /usr y /var puedennecesitar el uso de suid. Estas restricciones pueden y suelen variar segúnlas diferentes distribuciones de GNU/Linux.

Ø En algunos casos puede ser recomendable instalar /usr como RO (sólolectura), pero esto puede traer (y en este caso traerá) problemas durantela instalación.

5

Page 6: Tutorial Hardening v1.1

Figura 3 - Opciones de montado de particiones

En la Figura 4 podemos ver una posible distribución de las particiones que secrearán durante la instalación.

6

Page 7: Tutorial Hardening v1.1

Figura 4 - Particiones

UsuariosComo veremos más adelante, el uso del usuario root se deberá restringir lo másposible, por lo que la instalación es el momento correcto para la creación de almenos un usuario no privilegiado.

Selección de paquetesPara finalizar la instalación, saltearemos la fase de selección de paquetes, comolo indica la Figura 5, al no escoger ningún paquete ni grupo de paquetes en estaetapa.

7

Page 8: Tutorial Hardening v1.1

Figura 5 - Selección de paquetes

Ajuste del bootEsta etapa de instalación no estará completa sin ajustar las opciones de boot delequipo. Por ejemplo, si para poder realizar la instalación se habilitó del boot porCD-ROM, éste es el momento para deshabilitarlo.

Configuración

Boot LoaderComenzando con la configuración del equipo, vamos a asegurar el boot loader,en nuestro caso el grub, programa encargado de ejecutar inicialmente el kernelde Linux.Para evitar que alguien con acceso a la consola de nuestro equipo (situación quede todas maneras debería ser restringida) pueda modificar los parámetros deinicialización del kernel, protegeremos el boot loader contra modificaciones.Primero, generaremos un hash del pasword que utilizaremos:

hardened:~# grub-md5-cryptPassword:Retype password:$1$/eQbw0$IRWJlRW4DoFmPUkDykONW/

8

Page 9: Tutorial Hardening v1.1

Una vez obtenido el hash, procederemos a insertar la siguiente línea en elarchivo /boot/grub/menu.lst:

hardened:~# vi /boot/grub/menu.lst

## password ['--md5'] passwd# If used in the first section of a menu file, disable all interactiveediting# control (menu entry editor and command-line) and entries protected by the# command 'lock'# e.g. password topsecret# password --md5 $1$gLhU0/$aW78kHK1QfV3P2b2znUoe/# password topsecret

password -–md5 $1$/eQbw0$IRWJlRW4DoFmPUkDykONW/

En este mismo archivo, editaremos el valor de la variable lockalternative, paraque el password que acabamos de crear no sólo se aplique a las modificacionesexplícitas de los parámetros de boot del kernel, sino que además sea necesariapara elegir el modo single user, también conocido como Recovery Mode.

## should update-grub lock alternative automagic boot options## e.g. lockalternative=true## lockalternative=false# lockalternative=true

Para completar este proceso, deberemos ejecutar el comando update-grub parahacer efectivo el último de los cambios realizados.

hardened:~# update-grub Searching for GRUB installation directory ... found: /boot/grub .Testing for an existing GRUB menu.list file... found: /boot/grub/menu.lst .Found kernel: /boot/vmlinuz-2.6.8-1-686-smpUpdating /boot/grub/menu.lst ... done

hardened:~#

LimpiezaPara continuar con la configuración del equipo vamos a revisar que tan mínimaes la instalación que acabamos de realizar.

PaquetesVeamos que paquetes están realmente instalados en nuestro servidor. Utilizandoel comando dpkg podremos averiguar algunos datos:

9

Page 10: Tutorial Hardening v1.1

hardened:~# dpkg -lDesired=Unknown/Install/Remove/Purge/Hold| Estado=No/Instalado/Config-files/Unpacked/Failed-config/Half-installed|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: mayúsc.=malo)||/ Nombre Versión Descripción+++-==============-==============-============================================ii adduser 3.59 Add and remove users and groupsii apt 0.5.27 Advanced front-end for dpkgii apt-utils 0.5.27 APT utility programsii aptitude 0.2.15.2-1 curses-based apt frontendii at 3.1.8-11 Delayed job execution and batch processingii base-config 2.40.4 Debian base system configuratorii base-files 3.1 Debian base system miscellaneous filesii base-passwd 3.5.7 Debian base system master password and groupii bash 2.05b-15 The GNU Bourne Again SHellii bsdmainutils 6.0.15 collection of more utilities from FreeBSDii bsdutils 2.12-7 Basic utilities from 4.4BSD-Liteii console-common 0.7.46 Basic infrastructure for text console configii console-data 2002.12.04dbs- Keymaps, fonts, charset maps, fallback tableii console-tools 0.2.3dbs-54 Linux console and font utilitiesii coreutils 5.2.1-2 The GNU core utilitiesii cpio 2.5-1.1 GNU cpio -- a program to manage archives of ii cramfsprogs 1.1-6 Tools for CramFs (Compressed ROM File Systemii cron 3.0pl1-86 management of regular background processingii dash 0.5.1-3 The Debian Almquist Shellii debconf 1.4.30.5 Debian configuration management systemii debconf-i18n 1.4.30.5 full internationalization support for debconii debianutils 2.8.4 Miscellaneous utilities specific to Debianii dhcp-client 2.0pl5-19 DHCP Clientii diff 2.8.1-6 File comparison utilitiesii discover1 1.6.6 hardware identification systemii discover1-data 1.2004.08.11 hardware lists for libdiscover1ii dpkg 1.10.23 Package maintenance system for Debianii dselect 1.10.23 a user tool to manage Debian packagesii e2fslibs 1.35-6 The EXT2 filesystem librariesii e2fsprogs 1.35-6 The EXT2 file system utilities and librariesii ed 0.2-20 The classic unix line editorii eject 2.0.13deb-7 ejects CDs and operates CD-Changers under Liii exim4 4.34-4 An MTA (Mail Transport Agent)ii exim4-base 4.34-4 EXperimental Internal Mailer -- a Mail Transii exim4-config 4.34-4 Debian configuration for exim4ii exim4-daemon-l 4.34-4 Lightweight version of the Exim (v4) MTAii fdutils 5.4-20040228-1 Linux floppy utilitiesii findutils 4.1.20-4 utilities for finding files--find, xargs, anii gcc-3.3-base 3.3.4-6sarge1. The GNU Compiler Collection (base package)ii gettext-base 0.14.1-5 GNU Internationalization utilities for the bii grep 2.5.1.ds1-3 GNU grep, egrep and fgrepii groff-base 1.18.1.1-1 GNU troff text-formatting system (base systeii grub 0.95+cvs200406 GRand Unified Bootloaderii gzip 1.3.5-9 The GNU compression utilityii hostname 2.13 A utility to set/show the host name or domaiii hotplug 0.0.20040329-1 Linux Hotplug Scriptsii ifupdown 0.6.4-4.8 High level tools to configure network interfii info 4.7-2.1 Standalone GNU Info documentation browserii initrd-tools 0.1.74 tools to create initrd image for prepackagedii initscripts 2.86-1 Standard scripts needed for booting and shutii ipchains 1.3.10-15 Network firewalling for Linux 2.2.xii iptables 1.2.9-10 Linux kernel 2.4+ iptables administration toii iputils-ping 20020927-2 Tools to test the reachability of network hoii iso-codes 0.40-1 ISO language, territory, currency codes andii kernel-image-2 2.6.8-2 Linux kernel image for version 2.6.8 on PProii klogd 1.4.1-15 Kernel Logging Daemonii language-env 0.57.2 simple configuration tool for native languagii libacl1 2.2.23-1 Access control list shared libraryii libattr1 2.4.16-1 Extended attribute shared libraryii libblkid1 1.35-6 Block device id library

10

Page 11: Tutorial Hardening v1.1

ii libc6 2.3.2.ds1-16 GNU C Library: Shared libraries and Timezoneii libcap1 1.10-14 support for getting/setting POSIX.1e capabilii libcomerr2 1.35-6 The Common Error Description libraryii libconsole 0.2.3dbs-54 Shared libraries for Linux console and font ii libdb1-compat 2.1.3-7 The Berkeley database routines [glibc 2.0/2.ii libdb3 3.2.9-20 Berkeley v3 Database Libraries [runtime]ii libdb4.2 4.2.52-17 Berkeley v4.2 Database Libraries [runtime]ii libdiscover1 1.6.6 hardware identification libraryii libgcc1 3.4.1-4sarge1 GCC support libraryii libgcrypt7 1.1.90-9 LGPL Crypto library - runtime libraryii libgdbm3 1.8.3-2 GNU dbm database routines (runtime version)ii libgnutls10 1.0.4-3 GNU TLS library - runtime libraryii libgpg-error0 1.0-1 library for common error values and messagesii liblocale-gett 1.01-17 Using libc functions for internationalizatioii liblockfile1 1.06 NFS-safe locking library, includes dotlockfiii liblzo1 1.08-1.2 A real-time data compression libraryii libncurses5 5.4-4 Shared libraries for terminal handlingii libnewt0.51 0.51.6-5 Not Erik's Windowing Toolkit - text mode winii libopencdk8 0.5.5-8 Open Crypto Development Kit (OpenCDK) (runtiii libpam-modules 0.76-22 Pluggable Authentication Modules for PAMii libpam-runtime 0.76-22 Runtime support for the PAM libraryii libpam0g 0.76-22 Pluggable Authentication Modules libraryii libpcap0.7 0.7.2-7 System interface for user-level packet captuii libpcre3 4.5-1.1 Perl 5 Compatible Regular Expression Libraryii libpopt0 1.7-4 lib for parsing cmdline parametersii libsigc++-1.2- 1.2.5-1 Type-safe Signal Framework for C++ - runtimeii libss2 1.35-6 Command-line interface parsing libraryii libssl0.9.7 0.9.7d-4 SSL shared librariesii libstdc++5 3.3.4-6sarge1. The GNU Standard C++ Library v3ii libtasn1-2 0.2.10-3 Manage ASN.1 structures (runtime)ii libtext-charwi 0.04-1 get display widths of characters on the termii libtext-iconv- 1.2-3 Convert between character sets in Perlii libtext-wrapi1 0.06-1 internationalized substitute of Text::Wrapii libtextwrap1 0.1-1 text-wrapping library with i18n - runtimeii libusb-0.1-4 0.1.8-16 Userspace USB programming libraryii libuuid1 1.35-6 Universally unique id libraryii libwrap0 7.6.dbs-6 Wietse Venema's TCP wrappers libraryii locales 2.3.2.ds1-16 GNU C Library: National Language (locale) daii login 4.0.3-30.1 System login toolsii logrotate 3.7-2 Log rotation utilityii mailx 8.1.2-0.200405 A simple mail user agentii makedev 2.3.1-75 Creates device files in /devii man-db 2.4.2-19 The on-line manual pagerii manpages 1.67-2 Manual pages about using a GNU/Linux systemii manpages-es 1.28-13 Spanish man pagesii mawk 1.3.3-11 a pattern scanning and text processing languii module-init-to 3.1-pre5-7 tools for managing Linux kernel modulesii modutils 2.4.26-1 Linux module utilitiesii mount 2.12-7 Tools for mounting and manipulating filesystii nano 1.2.4-2 free Pico clone with some new featuresii ncurses-base 5.4-4 Descriptions of common terminal typesii ncurses-bin 5.4-4 Terminal-related programs and man pagesii net-tools 1.60-10 The NET-3 networking toolkitii netbase 4.18 Basic TCP/IP networking systemii netkit-inetd 0.10-9 The Internet Superserverii nvi 1.79-21 4.4BSD re-implementation of viii passwd 4.0.3-30.1 Change and administer password and group datii pciutils 2.1.11-15 Linux PCI Utilitiesii perl 5.8.4-2.2 Larry Wall's Practical Extraction and Reportii perl-base 5.8.4-2.2 The Pathologically Eclectic Rubbish Lister.ii perl-modules 5.8.4-2.2 Core Perl modules.ii ppp 2.4.2+20040428 Point-to-Point Protocol (PPP) daemonii pppconfig 2.3.6 A text menu based utility for configuring ppii pppoe 3.5-3 PPP over Ethernet driverii pppoeconf 1.0.4 configures PPPoE/ADSL connectionsii procps 3.2.1-2 The /proc file system utilities

11

Page 12: Tutorial Hardening v1.1

ii psmisc 21.5-1 Utilities that use the proc filesystemii sed 4.1.2-1 The GNU sed stream editorii setserial 2.17-36 Controls configuration of serial portsii slang1a-utf8 1.4.9dbs-6 The S-Lang programming library with utf8 supii sysklogd 1.4.1-15 System Logging Daemonii sysv-rc 2.86-1 Standard boot mechanism using symlinks in /eii sysvinit 2.86-1 System-V like initii tar 1.13.93-4 GNU tarii tasksel 2.12 Tool for selecting tasks for installation onii tcpd 7.6.dbs-6 Wietse Venema's TCP wrapper utilitiesii telnet 0.17-24 The telnet client.ii usbutils 0.11+cvs200403 USB console utilitiesii util-linux 2.12-7 Miscellaneous system utilitiesii util-linux-loc 2.12-7 Locales files for util-linuxii wget 1.9.1-4 retrieves files from the webii whiptail 0.51.6-5 Displays user-friendly dialog boxes from sheii zlib1g 1.2.1.1-7 compression library - runtimehardened:~#

Como verán, hemos marcado en rojo unos cuantos paquetes, que deberemosdesinstalar. Esta lista no es exhaustiva, y puede cambiar con las diferentesversiones del instalador de Debian. Por este motivo, deberemos utilizar nuestraexperiencia e imaginación para detectar los paquetes innecesarios, siguiendoalgunas reglas de sentido común. Por ejemplo:

v Si sólo vamos a utilizar ethernet, todos los paquetes que tengan que ver conppp no serán necesarios.

v Si utilizaremos IP estático, no es necesario el DHCP.v En general, todos los paquetes de internacionalización son innecesarios.v La automatización de detección de hardware normalmente no es necesaria, y

hasta puede ser perjudicial.v Los paquetes relacionados con dispositivos que no tenemos o no utilizamos,

pueden borrarse.

Una mención especial merece el paquete gcc-3.3-base, que sólo contienedocumentación descriptiva y se incluye únicamente por razones de dependenciasde paquetes, por lo que puede ser ignorado sin mayores problemas.

El siguiente paso será desinstalar los paquetes seleccionados. Para ello,utilizaremos el siguiente comando:

hardened:~# dpkg –P aptitude dhcp-client […]

que eliminará tanto los paquetes como sus archivos de configuración.De esta manera, reducimos la base de programas instalados, y así logramosbajar, el menos levemente, la probabilidad de que un bug afecte nuestrainstalación.

12

Page 13: Tutorial Hardening v1.1

Como hemos desinstalado los programas que realizaban la detección automáticade hardware, es posible que parte del mismo deje de ser reconocido. Parasolucionar este problema, deberemos forzar su detección. Por ejemplo, para quefuncione correctamente la interface ethernet, deberemos editar el archivo /etc/modprobe.d/aliases:

hardened:~# vi /etc/modprobe.d/aliases

#alias net-pf-10 ipv6alias net-pf-10 off

alias eth0 pcnet32

reemplazando pcnet32 por el módulo correspondiente a nuestra interface.Aprovechamos la edición de este archivo para deshabilitar, siempre y cuando nosea necesario en nuestro entorno, el protocolo IPV6.

ServiciosDe la misma manera que la instalación nos dejó con una importante cantidad depaquetes innecesarios, que pasará con los servicios? Veamos:

hardened:~# netstat -tulpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Programname tcp 0 0 *:time *:* LISTEN 608/inetdtcp 0 0 *:discard *:* LISTEN 608/inetdtcp 0 0 *:daytime *:* LISTEN 608/inetdtcp 0 0 localhost.localdom:smtp *:* LISTEN 602/exim4udp 0 0 *:discard *:* 608/inetdudp 0 0 *:bootpc *:* 708/dhclienthardened:~#

Como podemos observar, los servicios time, discard y daytime se encuentranhabilitados. En la última columna podemos ver que todos corresponden alprograma inetd. Para deshabilitarlos, procederemos a editar el archivo /etc/inetd.conf, y comentar las líneas correspondientes:

hardened:~# vi /etc/inetd.conf

#:INTERNAL: Internal services#echo stream tcp nowait rootinternal#echo dgram udp wait rootinternal#chargen stream tcp nowait rootinternal#chargen dgram udp wait rootinternal

13

Page 14: Tutorial Hardening v1.1

#discard stream tcp nowait rootinternal#discard dgram udp wait rootinternal#daytime stream tcp nowait rootinternal#daytime dgram udp wait rootinternal#time stream tcp nowait rootinternal#time dgram udp wait rootinternal

Y para activar estos cambios, reiniciamos el servicio inetd.hardened:~# /etc/init.d/inetd restartRestarting internet superserver: inetd.hardened:~# netstat -tulpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Programname tcp 0 0 localhost.localdom:smtp *:* LISTEN 619/exim4udp 0 0 *:bootpc *:* 467/dhclienthardened:~#

Todavía podemos observar dos servicios:v SMTP, que está asociado únicamente a la interface loopback, y

mantendremos como sistema de mail local, yv BOOTPC, que corresponde al cliente DHCP. Si no utilizaremos DHCP en

nuestro sistema, éste es el momento de desinstalarlo, al igual que concualquier otro servicio que encontremos en esta etapa.

MountsPara finalizar esta etapa, revisaremos la tabla de sistemas de archivos a montar:

hardened:~# vi /etc/fstab

# /etc/fstab: static file system information.## <file system> <mount point> <type> <options> <dump><pass>proc /proc proc defaults 0 0/dev/sda1 / ext3 nosuid,errors=remount-ro 01/dev/sda8 /home ext3 nodev,nosuid,noexec 0 2/dev/sda7 /tmp ext3 nodev,nosuid 0 2/dev/sda5 /usr ext3 nodev 0 2/dev/sda6 /var ext3 nodev 0 2/dev/sda9 none swap sw 0 0/dev/hdc /media/cdrom0 iso9660 ro,user,noauto 0 0/dev/fd0 /media/floppy0 auto rw,user,noauto 0 0

14

Page 15: Tutorial Hardening v1.1

Si no utilizaremos el CD-ROM o la disquetera, podemos eliminar las últimas doslíneas de este archivo. Pero si decidimos conservar alguna de las dos, al menosdeberemos eliminar la opción user, que cumple la función de permitir a unusuario no privilegiado montar y desmontar dicho dispositivo.Como podemos observar, en la columna options de las particiones del discorígido, se han incluido las opciones de nodev, nosuid y noexec que seleccionamosdurante la etapa de instalación.

Selección de PaquetesEn esta etapa debemos tener en especial consideración que fines va a cumplir elequipo, y seleccionar el software a instalar en consecuencia. La principalsugerencia para esta etapa consiste en instalar únicamente el softwareestrictamente necesario. Por ejemplo, en este caso utilizaremos el equipo comoservidor Web. ¿Que tipo de servidor Web? Supongamos que sólo necesitamos unservidor Web con páginas estáticas. ¿Es necesario instalar un apache con PHP? Larespuesta claramente es NO. En este caso, no sólo no vamos a instalar PHP, sinoque utilizaremos una alternativa más pequeña y segura: el thttpd.

hardened:~# apt-get install thttpd

Además, el programa thttpd nos permitirá de manera muy simple restringir elacceso al sistema de archivos del proceso thttpd, aprovechando la funcionalidadchroot del sistema operativo. Esta selección puede realizarse durante lainstalación como lo muestra la Figura 6.

15

Page 16: Tutorial Hardening v1.1

Figura 6 - chroot thttpd

Siguiendo este ejemplo, deberemos considerar las necesidades defuncionamiento del equipo, e instalar únicamente el software necesario.

Usuarios, permisos y configuraciones

UsuariosComenzaremos por revisar los usuarios creados durante el proceso deinstalación:

hardened:~# cat /etc/passwdroot:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/bin/shbin:x:2:2:bin:/bin:/bin/shsys:x:3:3:sys:/dev:/bin/shsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/bin/shman:x:6:12:man:/var/cache/man:/bin/shlp:x:7:7:lp:/var/spool/lpd:/bin/shmail:x:8:8:mail:/var/mail:/bin/shnews:x:9:9:news:/var/spool/news:/bin/shuucp:x:10:10:uucp:/var/spool/uucp:/bin/shproxy:x:13:13:proxy:/bin:/bin/shwww-data:x:33:33:www-data:/var/www:/bin/shbackup:x:34:34:backup:/var/backups:/bin/shlist:x:38:38:Mailing List Manager:/var/list:/bin/shirc:x:39:39:ircd:/var/run/ircd:/bin/shgnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/shnobody:x:65534:65534:nobody:/nonexistent:/bin/shDebian-exim:x:102:102::/var/spool/exim4:/bin/false

16

Page 17: Tutorial Hardening v1.1

oper:x:1000:1000:Operador del Sistema,,,:/home/oper:/bin/bashhardened:~#

Como podemos observar, existen varios usuarios, todos considerados del sistema(en el caso de Debian, se caracterizan por tener un user id menor que 1000), queposeen como shell a /bin/sh, siendo totalmente innecesario dado que ninguno deestos usuarios será utilizado de manera interactiva. Utilizaremos el siguientecomando para modificar esta situación:

hardened:~# chsh -s /bin/false daemon

Y así para cada uno de los usuarios identificados.

Además, queremos restringir el grupo de usuarios que puedan convertirse en rootmediante el comando su.

hardened:~# vi /etc/pam.d/su

# Uncomment this to force users to be a member of group root# before they can use `su'. You can also add "group=foo" to# to the end of this line if you want to use a group other# than the default "root".# (Replaces the `SU_WHEEL_ONLY' option from login.defs)auth required pam_wheel.so

Ahora sólo los usuarios que pertenezcan al grupo wheel podrán utilizar elcomando su. ¡No debemos olvidarnos de crear el grupo y agregar los usuariosnecesarios al mismo!

hardened:~# addgroup --system wheelAdding group `wheel' (104)...Hecho.hardened:~# usermod -G wheel oper

PermisosVamos a revisar algunos permisos importantes en los archivos. Uno de losprincipales “peligros” que encontramos en los permisos de los archivosejecutables es el suid bit, que permite a cualquier usuario que tenga permiso deejecución sobre este archivo, ejecutarlo como si realmente fuese el usuariodueño del archivo, en lugar de él mismo. Un problema muy común, es que unprograma comúnmente utilizado por los usuarios tenga como dueño a root, ytenga prendido el bit suid. Si este programa llegase a tener un bug, por ejemploun buffer overflow o un stack overflow, podría llegar a convertirse en la

17

Page 18: Tutorial Hardening v1.1

herramienta que necesita un posible atacante que haya logrado ingresar alsistema para convertirse en root. Veamos que podemos encontrar en el sistemaque acabamos de instalar.

hardened:~# find / -path /proc -prune -o -type f -perm +6000 -ls168101 10 -rwxr-sr-x 1 root tty 9816 may 2 2004 /usr/bin/wall168156 24 -rwsr-xr-x 1 root root 22872 sep 8 2004 /usr/bin/newgrp168167 36 -rwxr-sr-x 1 root shadow 34936 sep 8 2004 /usr/bin/chage168169 29 -rwsr-xr-x 1 root root 28056 sep 8 2004 /usr/bin/chfn168172 29 -rwsr-xr-x 1 root root 28088 sep 8 2004 /usr/bin/chsh168173 18 -rwxr-sr-x 1 root shadow 16696 sep 8 2004 /usr/bin/expiry168174 36 -rwsr-xr-x 1 root root 34904 sep 8 2004 /usr/bin/gpasswd168175 27 -rwsr-xr-x 1 root root 26616 sep 8 2004 /usr/bin/passwd168301 35 -rwsr-xr-x 1 root root 34488 ene 18 2002 /usr/bin/at168408 8 -rwxr-sr-x 1 root tty 7992 ago 26 2004 /usr/bin/bsd-write168457 28 -rwxr-sr-x 1 root crontab 26872 jul 28 2004 /usr/bin/crontab168513 10 -rwxr-sr-x 1 root mail 9860 jun 4 2004 /usr/bin/dotlockfile 77879 57 -rwxr-sr-x 1 root ssh 57304 jul 29 2004 /usr/bin/ssh-agent418049 6 -rwsr-xr-x 1 root root 5672 ago 9 2004 /usr/lib/pt_chown340055 634 -rwsr-xr-x 1 root root 644472 jul 27 2004 /usr/sbin/exim4 16086 36 -rwsr-xr-x 1 root root 35512 sep 8 2004 /bin/login 16087 24 -rwsr-xr-x 1 root root 23416 sep 8 2004 /bin/su 16089 77 -rwsr-xr-x 1 root root 76888 may 2 2004 /bin/mount 16090 40 -rwsr-xr-x 1 root root 39928 may 2 2004 /bin/umount 16107 32 -rwsr-xr-x 1 root root 30764 dic 22 2003 /bin/ping 16108 27 -rwsr-xr-x 1 root root 26604 dic 22 2003 /bin/ping6 4020 16 -r-sr-xr-x 1 root root 15000 jun 28 2004 /sbin/unix_chkpwdhardened:~#

Veamos cuales de estos programas realmente necesitan ser ejecutados porusuarios no privilegiados, si los hubiese:

v passwd: para que los usuarios puedan cambiar su password.v exim4: para el correcto funcionamiento del mail interno.v login: para que los usuarios puedan ingresar al sistema.v unix_chkpwd: se utiliza para que los programas puedan verificar el password

ingresado por el usuario, sin la necesidad de tener cada uno el bit suid.v su: para que usuarios no privilegiados puedan convertirse en root.

El resto de los programas son prescindibles, salvo en casos particulares en losque habrá que evaluar los beneficios y desventajas (por ejemplo, el uso decrontabs por parte de los usuarios). Para el resto:

hardened:~# chmod ug-s /usr/bin/wall /usr/bin/newgrp /usr/bin/chage /usr/bin/chfn /usr/bin/chsh /usr/bin/expiry /usr/bin/gpasswd /usr/bin/at /usr/bin/bsd-write /usr/bin/crontab /usr/bin/dotlockfile /usr/bin/ssh-agent /usr/lib/pt_chown /bin/mount /bin/umount /bin/ping /bin/ping6hardened:~# hardened:~# find / -path /proc -prune -o -type f -perm +6000 -ls168175 27 -rwsr-xr-x 1 root root 26616 sep 8 2004 /usr/bin/passwd340055 634 -rwsr-xr-x 1 root root 644472 jul 27 2004 /usr/sbin/exim4 16086 36 -rwsr-xr-x 1 root root 35512 sep 8 2004 /bin/login 16087 24 -rwsr-xr-x 1 root root 23416 sep 8 2004 /bin/su 4020 16 -r-sr-xr-x 1 root root 15000 jun 28 2004 /sbin/unix_chkpwdhardened:~#

18

Page 19: Tutorial Hardening v1.1

Configuración del KernelVamos además a ajustar algunos parámetros del kernel. Para ello utilizaremos elarchivo /etc/sysctl.conf:

hardened:~# vi /etc/sysctl.conf

# Ignorar el uso de la tecla “Petición de sistema”kernel.sysrq=0# Normalmente, no hay razón para utilizar broadcasts ICMPnet.ipv4.icmp_echo_ignore_broadcasts=1# Tampoco debemos hacerle caso a respuestas ICMP que no # pedimosnet.ipv4.icmp_ignore_bogus_error_responses=1# Los ICMP redirects son necesarios en escasasexcepcionesnet.ipv4.conf.all.accept_redirects=0net.ipv4.conf.default.accept_redirects=0# Tampoco aceptamos paquetes con “source route”net.ipv4.conf.all.accept_source_route=0net.ipv4.conf.default.accept_source_route=0

Y para hacer efectivos los cambios inmediatamente:

hardened:~# sysctl -p

Reboot mediante CTRL-ALT-DelÉste método de reinicializar el equipo siempre a sido útil y atractivo enGNU/Linux, pero realmente queremos que cualquiera con acceso a la consolapuede utilizarlo? Mejor lo vamos a deshabilitar comentando la líneacorrespondiente en el archivo /etc/inittab:

hardened:~# vi /etc/inittab

# What to do when CTRL-ALT-DEL is pressed.#ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

Sólo resta avisarle al proceso init que debe releer el archivo de configuración.

hardened:~# telinit q

19

Page 20: Tutorial Hardening v1.1

CrontabSi bien ya anteriormente le sacamos el bit SUID al programa crontab, no estaráde más restringir qué usuarios pueden tener acceso a su uso.

hardened:~# vi /etc/cron.allow

root

Manejo de LogsLos Logs del sistema serán seguramente una de las herramientas más valiosas a lahora de atender un intento de intrusión al equipo, exitoso o no.En la mayoría de los sistemas tipo UNIX, y por supuesto también en GNU/Linux,se utiliza el sistema syslog para manejar los logs del sistema. Este sistemaconsiste en un demonio que recibe los diferentes mensajes de las aplicaciones yel sistema operativo.Los dos conceptos fundamentales del syslog.conf son facility y level. Elprimero es la aplicación o el componente del sistemas operativo que genera logs.level hace referencia a la severidad del mensaje. Por cada combinación deestos se realiza una acción. El formato entonces quedaría:

facility.level <Tab><Tab> acción

Así, según lo indicado en el archivo /etc/syslog.conf para cada tipo y severidad,los logs serán tratados, por ejemplo, escribiendo un mensaje en un archivo.Estos archivos, normalmente residen en el directorio /var/log. Comomencionamos en apartados anteriores, será conveniente que estos mensajessean “guardados” en un repositorio externo, para evitar que sean falseados encaso de una intrusión. La forma más común de realizar esta tarea es enviarlos aotro host mediante el mismo protocolo syslog, de la siguiente manera:

hardened:~# vi /etc/syslog.conf

*.* @loghost.ourdomain

De esta manera, todos los mensajes (de cualquier tipo y nivel), serán reenviadosal host loghost.ourdomain. Una alternativa mucho más segura, aunque pocasveces utilizada, es enviar los mensajes a través de un puerto serial a un loghosttotalmente desconectado de la red.

Otra opción al sistema syslog es el syslog-ng, que permite mucha mayorflexibilidad en las acciones a tomar con los mensajes recibidos.

20

Page 21: Tutorial Hardening v1.1

Por último, mencionaremos una herramienta que puede ayudar a la lectura delos logs almacenados, que suelen tener un volumen importante. Estaherramienta es logcheck. La misma se basa en varias reglas, alojadas en eldirectorio /etc/logcheck, que definen por medio de expresiones regulares quémensajes son importantes, y cuáles son inofensivos. Luego de seleccionar losmensajes según las reglas definidas, un resumen es enviado por mail. De lamisma manera que en los casos anteriores, podría ser conveniente que estereporte sea enviado a un host remoto.

Administración remotaVamos a ocuparnos de la administración de nuestro equipo. En este caso, vamosa suponer que es necesario acceder remotamente al equipo. Por lo tanto, comoprimera medida, vamos a ocuparnos de este importante tema.

SSHVamos a instalar el servidor SSH.

hardened:~# apt-get install ssh

Este paquete instalará tanto el cliente como el servidor ssh. Durante suinstalación, deberemos responder algunas preguntas. Como vemos en la Figura 7,elegimos sólo permitir la versión 2 del protocolo SSH. Las versiones anteriorestienen importantes defectos de diseño que pueden comprometer la seguridaddel equipo.

Figura 7 - SSH versión 2

21

Page 22: Tutorial Hardening v1.1

La siguiente opción será no instalar el programa ssh-keysign con el bit SUID(Figura 8). Por un lado, no utilizaremos el método de autenticación basada enhost, y por otro, intentamos evitar el uso de SUID.

Figura 8 - ssh-keysign sin SUID

Y como mencionamos antes, este paquete incluye tanto el cliente como elservidor, y nosotros necesitamos instalar el servidor, que es opcional (Figura 9).

Figura 9 - Servidor SSH

22

Page 23: Tutorial Hardening v1.1

Por ahora no es necesario ajustar la configuración del servidor SSH.Sin embargo, si utilizaremos SSH sólo con propósitos administrativos, seráconveniente restringir desde dónde se puede acceder a dicho protocolo.

hardened:~# vi /etc/hosts.deny

sshd : ALL

hardened:~# vi /etc/hosts.allow

sshd : 192.168.31.0/24

Este método también puede utilizarse con cualquier servicio que utilice lalibrería libwrap (hoy incluida en la libC), o mediante la utilización del programatcpd.

Root loginContinuamos tomando algunos recaudos con respecto al usuario root.Como primera medida, desde donde puede acceder el usuario root? Decidimosque sólo podrá convertirse en root un usuario previamente autenticado, o que,para casos de emergencia, sólo pueda acceder mediante el uso de la consola.Para lograr este debemos restringir el acceso del usuario root a través delprotocolo SSH.

hardened:~# vi /etc/ssh/sshd_config

# Authentication:LoginGraceTime 600PermitRootLogin noStrictModes yes

hardened:~# /etc/init.d/ssh restart

De esta manera, para acceder remotamente al equipo deberemos utilizar algúnusuario.

23

Page 24: Tutorial Hardening v1.1

ActualizaciónAhora que ya tenemos el sistema medianamente asegurado, es el momento deactualizar los paquetes instalados. A menos que tengamos disponible una copiadel sitio de distribución de Debian (cosa poco común y un tanto extensa),deberemos obtener las actualizaciones a través de Internet. Por esta razón, éstees el momento de conectar nuestro equipo a la red.A continuación, vamos a editar el archivo que indica dónde encontrar lasactualizaciones.

hardened:~# vi /etc/apt/sources.list

Aquí vamos a realizar una distinción entre las diferentes versiones de Debian. Enel caso de la versión stable (Woody), las actualizaciones de seguridad secorresponden con los boletines de seguridad emitidos por Debian (DSA, o DebianSecurity Announce), y se localizan en un sitio especial de distribución llamadosecurity.

deb http://security.debian.org/ stable/updates main contrib

En el caso de la versión sarge (testing), si bien existe el mismo sitio securitypersonalizado para esta versión, las actualizaciones toman un camino diferente,y con una demora de aproximadamente 10 días, se incorporan directamente enla fuente principal de paquetes. Por lo tanto, deberemos incorporar la misma ala lista de sitios.

deb http://ftp.debian.org/debian/ sarge main contribdeb http://security.debian.org/ sarge/updates main contrib

Una vez agregadas estas referencias, debemos actualizar la base de datos localde paquetes.

hardened:~# apt-get update

24

Page 25: Tutorial Hardening v1.1

Des:1 http://ftp.debian.org sarge/main Packages [3292kB]Obj http://security.debian.org sarge/updates/main PackagesObj http://security.debian.org sarge/updates/main ReleaseObj http://security.debian.org sarge/updates/contrib PackagesObj http://security.debian.org sarge/updates/contrib ReleaseDes:2 http://ftp.debian.org sarge/main Release [81B]Des:3 http://ftp.debian.org sarge/contrib Packages [61,3kB]Des:4 http://ftp.debian.org sarge/contrib Release [84B]Descargados 3354kB en 5m49s (9595B/s)Leyendo lista de paquetes... Hechohardened:~#

Y ahora veremos qué paquetes necesitan actualizarse.

hardened:~# apt-get upgrade -sLeyendo lista de paquetes... HechoCreando árbol de dependencias... HechoLos siguientes paquetes se han retenido: exim4 exim4-base exim4-config exim4-daemon-light libopencdk8 ltraceSe actualizarán los siguientes paquetes: adduser apt apt-utils base-config base-files base-passwd bash binutils bsdmainutils bsdutils chkrootkit console-common console-data console-tools cpio dash debconf debconf-i18n dhcp-client diff dpkg dselect file findutils gcc-3.3-base gettext-base grep groff-base grub ifupdown initrd-tools initscripts iptables iso-codes klogd libc6 libconsole libdb3 libdb4.2 libgcc1 libmagic1 libnewt0.51 libpopt0 libsigc++-1.2-5c102 libssl0.9.7 libstdc++5 libusb-0.1-4 libwrap0 login lsof mailx makedev man-db manpages module-init-tools modutils mount netbase netkit-inetd nvi passwd perl perl-base perl-modules sed slang1a-utf8 ssh sysklogd sysv-rc sysvinit tar tcpd telnet thttpd tiger usbutils util-linux wget whiptail zlib1g80 actualizados, 0 se instalarán, 0 para eliminar y 6 no actualizados.Inst libc6 [2.3.2.ds1-16] (2.3.2.ds1-20 Debian:testing)Conf libc6 (2.3.2.ds1-20 Debian:testing)Inst base-passwd [3.5.7] (3.5.9 Debian:testing)Conf base-passwd (3.5.9 Debian:testing)Inst base-files [3.1] (3.1.2 Debian:testing)Conf base-files (3.1.2 Debian:testing)Inst login [1:4.0.3-30.1] (1:4.0.3-31sarge1 Debian:testing)Conf login (1:4.0.3-31sarge1 Debian:testing)Inst passwd [1:4.0.3-30.1] (1:4.0.3-31sarge1 Debian:testing)Conf passwd (1:4.0.3-31sarge1 Debian:testing)Inst bash [2.05b-15] (2.05b-26 Debian:testing)Conf bash (2.05b-26 Debian:testing)Inst bsdutils [1:2.12-7] (1:2.12-10 Debian:testing)Conf bsdutils (1:2.12-10 Debian:testing)Inst diff [2.8.1-6] (2.8.1-11 Debian:testing)Conf diff (2.8.1-11 Debian:testing)Inst dpkg [1.10.23] (1.10.27 Debian:testing)Conf dpkg (1.10.27 Debian:testing)Inst findutils [4.1.20-4] (4.1.20-6 Debian:testing)Conf findutils (4.1.20-6 Debian:testing)Inst grep [2.5.1.ds1-3] (2.5.1.ds1-4 Debian:testing)Conf grep (2.5.1.ds1-4 Debian:testing)Inst mount [2.12-7] (2.12-10 Debian:testing)Conf mount (2.12-10 Debian:testing)Inst perl-modules [5.8.4-2.2] (5.8.4-8 Debian:testing)Inst libdb4.2 [4.2.52-17] (4.2.52-18 Debian:testing)Inst perl [5.8.4-2.2] (5.8.4-8 Debian:testing) []Inst perl-base [5.8.4-2.2] (5.8.4-8 Debian:testing)Conf perl-base (5.8.4-8 Debian:testing)Inst sed [4.1.2-1] (4.1.2-8 Debian:testing)Conf sed (4.1.2-8 Debian:testing)Inst sysvinit [2.86-1] (2.86.ds1-1 Debian:testing)Conf sysvinit (2.86.ds1-1 Debian:testing)

25

Page 26: Tutorial Hardening v1.1

Inst tar [1.13.93-4] (1.14-2 Debian:testing)Conf tar (1.14-2 Debian:testing)Inst util-linux [2.12-7] (2.12-10 Debian:testing)Conf util-linux (2.12-10 Debian:testing)Inst debconf-i18n [1.4.30.5] (1.4.30.13 Debian:testing)Inst debconf [1.4.30.5] (1.4.30.13 Debian:testing)Inst console-data [2002.12.04dbs-43] (2002.12.04dbs-49 Debian:testing)Inst console-tools [1:0.2.3dbs-54] (1:0.2.3dbs-56 Debian:testing) []Inst libconsole [1:0.2.3dbs-54] (1:0.2.3dbs-56 Debian:testing)Conf debconf-i18n (1.4.30.13 Debian:testing)Conf debconf (1.4.30.13 Debian:testing)Inst console-common [0.7.46] (0.7.49 Debian:testing)Inst dash [0.5.1-3] (0.5.2-4 Debian:testing)Inst libgcc1 [1:3.4.1-4sarge1] (1:3.4.3-12 Debian:testing)Conf libgcc1 (1:3.4.3-12 Debian:testing)Inst gcc-3.3-base [1:3.3.4-6sarge1.2] (1:3.3.5-8 Debian:testing)Inst libstdc++5 [1:3.3.4-6sarge1.2] (1:3.3.5-8 Debian:testing)Conf gcc-3.3-base (1:3.3.5-8 Debian:testing)Conf libstdc++5 (1:3.3.5-8 Debian:testing)Inst apt [0.5.27] (0.5.28.1 Debian:testing)Conf apt (0.5.28.1 Debian:testing)Inst dselect [1.10.23] (1.10.27 Debian:testing)Conf dselect (1.10.27 Debian:testing)Inst initscripts [2.86-1] (2.86.ds1-1 Debian:testing)Conf initscripts (2.86.ds1-1 Debian:testing)Inst slang1a-utf8 [1.4.9dbs-6] (1.4.9dbs-8 Debian:testing)Conf slang1a-utf8 (1.4.9dbs-8 Debian:testing)Inst sysv-rc [2.86-1] (2.86.ds1-1 Debian:testing)Conf sysv-rc (2.86.ds1-1 Debian:testing)Inst zlib1g [1:1.2.1.1-7] (1:1.2.2-3 Debian:testing)Conf zlib1g (1:1.2.2-3 Debian:testing)Inst adduser [3.59] (3.63 Debian:testing)Inst bsdmainutils [6.0.15] (6.0.17 Debian:testing)Inst cpio [2.5-1.1] (2.5-1.2 Debian:testing)Inst groff-base [1.18.1.1-1] (1.18.1.1-7 Debian:testing)Inst ifupdown [0.6.4-4.8] (0.6.4-4.12 Debian:testing)Inst iptables [1.2.9-10] (1.2.11-8 Debian:testing)Inst sysklogd [1.4.1-15] (1.4.1-16 Debian:testing)Inst klogd [1.4.1-15] (1.4.1-16 Debian:testing)Inst libpopt0 [1.7-4] (1.7-5 Debian:testing)Inst libwrap0 [7.6.dbs-6] (7.6.dbs-8 Debian:testing)Inst mailx [1:8.1.2-0.20040524cvs-1] (1:8.1.2-0.20040524cvs-4 Debian:testing)Inst man-db [2.4.2-19] (2.4.2-21 Debian:testing)Inst manpages [1.67-2] (1.70-1 Debian:testing)Inst netkit-inetd [0.10-9] (0.10-10 Debian:testing)Inst tcpd [7.6.dbs-6] (7.6.dbs-8 Debian:testing)Inst netbase [4.18] (4.21 Debian:testing)Inst nvi [1.79-21] (1.79-22 Debian:testing)Inst libdb3 [3.2.9-20] (3.2.9-22 Debian:testing)Inst makedev [2.3.1-75] (2.3.1-77 Debian:testing)Inst module-init-tools [3.1-pre5-7] (3.2-pre1-2 Debian:testing)Inst modutils [2.4.26-1] (2.4.26-1.2 Debian:testing)Inst binutils [2.14.90.0.7-8] (2.15-5 Debian:testing)Inst file [4.09-1] (4.12-1 Debian:testing) []Inst libmagic1 [4.09-1] (4.12-1 Debian:testing)Inst gettext-base [0.14.1-5] (0.14.1-10 Debian:testing)Inst libnewt0.51 [0.51.6-5] (0.51.6-20 Debian:testing)Inst libssl0.9.7 [0.9.7d-4] (0.9.7e-3 Debian:testing)Inst lsof [4.71-1] (4.74.dfsg.3-2 Debian:testing)Inst ssh [1:3.8.1p1-8] (1:3.8.1p1-8.sarge.4 Debian:testing)Inst telnet [0.17-24] (0.17-29 Debian:testing)Inst whiptail [0.51.6-5] (0.51.6-20 Debian:testing)Inst apt-utils [0.5.27] (0.5.28.1 Debian:testing)Inst base-config [2.40.4] (2.53.7 Debian:testing)Inst chkrootkit [0.43-1] (0.44-2 Debian:testing)Inst dhcp-client [2.0pl5-19] (2.0pl5-19.1 Debian:testing)Inst grub [0.95+cvs20040624-8] (0.95+cvs20040624-16 Debian:testing)

26

Page 27: Tutorial Hardening v1.1

Inst initrd-tools [0.1.74] (0.1.78 Debian:testing)Inst iso-codes [0.40-1] (0.44-1 Debian:testing)Inst libsigc++-1.2-5c102 [1.2.5-1] (1.2.5-4 Debian:testing)Inst libusb-0.1-4 [1:0.1.8-16] (2:0.1.10a-6 Debian:testing)Inst thttpd [2.23beta1-2.5] (2.23beta1-3 Debian:testing)Inst tiger [1:3.2.1-14] (1:3.2.1-22 Debian:testing)Inst usbutils [0.11+cvs20040318-3] (0.70-5 Debian:testing)Inst wget [1.9.1-4] (1.9.1-8 Debian:testing)Conf libdb4.2 (4.2.52-18 Debian:testing)Conf perl (5.8.4-8 Debian:testing)Conf perl-modules (5.8.4-8 Debian:testing)Conf libconsole (1:0.2.3dbs-56 Debian:testing)Conf console-tools (1:0.2.3dbs-56 Debian:testing)Conf console-common (0.7.49 Debian:testing)Conf console-data (2002.12.04dbs-49 Debian:testing)Conf dash (0.5.2-4 Debian:testing)Conf adduser (3.63 Debian:testing)Conf bsdmainutils (6.0.17 Debian:testing)Conf cpio (2.5-1.2 Debian:testing)Conf groff-base (1.18.1.1-7 Debian:testing)Conf ifupdown (0.6.4-4.12 Debian:testing)Conf iptables (1.2.11-8 Debian:testing)Conf klogd (1.4.1-16 Debian:testing)Conf sysklogd (1.4.1-16 Debian:testing)Conf libpopt0 (1.7-5 Debian:testing)Conf libwrap0 (7.6.dbs-8 Debian:testing)Conf mailx (1:8.1.2-0.20040524cvs-4 Debian:testing)Conf man-db (2.4.2-21 Debian:testing)Conf manpages (1.70-1 Debian:testing)Conf netkit-inetd (0.10-10 Debian:testing)Conf tcpd (7.6.dbs-8 Debian:testing)Conf netbase (4.21 Debian:testing)Conf nvi (1.79-22 Debian:testing)Conf libdb3 (3.2.9-22 Debian:testing)Conf makedev (2.3.1-77 Debian:testing)Conf module-init-tools (3.2-pre1-2 Debian:testing)Conf modutils (2.4.26-1.2 Debian:testing)Conf binutils (2.15-5 Debian:testing)Conf libmagic1 (4.12-1 Debian:testing)Conf file (4.12-1 Debian:testing)Conf gettext-base (0.14.1-10 Debian:testing)Conf libnewt0.51 (0.51.6-20 Debian:testing)Conf libssl0.9.7 (0.9.7e-3 Debian:testing)Conf lsof (4.74.dfsg.3-2 Debian:testing)Conf ssh (1:3.8.1p1-8.sarge.4 Debian:testing)Conf telnet (0.17-29 Debian:testing)Conf whiptail (0.51.6-20 Debian:testing)Conf apt-utils (0.5.28.1 Debian:testing)Conf base-config (2.53.7 Debian:testing)Conf chkrootkit (0.44-2 Debian:testing)Conf dhcp-client (2.0pl5-19.1 Debian:testing)Conf grub (0.95+cvs20040624-16 Debian:testing)Conf initrd-tools (0.1.78 Debian:testing)Conf iso-codes (0.44-1 Debian:testing)Conf libsigc++-1.2-5c102 (1.2.5-4 Debian:testing)Conf libusb-0.1-4 (2:0.1.10a-6 Debian:testing)Conf thttpd (2.23beta1-3 Debian:testing)Conf tiger (1:3.2.1-22 Debian:testing)Conf usbutils (0.70-5 Debian:testing)Conf wget (1.9.1-8 Debian:testing)hardened:~#

Como podemos ver, la lista de actualizaciones es bastante grande. Un casoparticular son los paquetes resaltados, que han tenido algún problema dedependencias, y no podrán ser actualizados. Para ello, deberemos actualizarlos

27

Page 28: Tutorial Hardening v1.1

manualmente, mediante el comando apt-get install [paquete], o bien utilizandoel comando apt-get dist-upgrade, teniendo en cuenta que para esta últimaopción será conveniente revisar qué paquetes nuevos se instalarán parasatisfacer las dependencias.Para el resto de las actualizaciones, procederemos mediante la actualizaciónhabitual.

hardened:~# apt-get upgrade

Con este último paso podemos considerar que hemos finalizado la instalación delsistema operativo, y estamos listos para comenzar a utilizarlo.El siguiente paso consistirá en configurar y asegurar los servicios que este equipodeba brindar (Web, Mail, etc.), pero eso lo dejamos para otros documentos.Luego de configurados los servicios, será el momento de realizar un Backupcompleto del sistema.

MantenimientoEl sistema que acabamos de instalar no está terminado, ya que evolucionará conel tiempo. Seguramente se le incorporará, quitará o modificará algún servicio oalguna configuración. Por este motivo, habrá que tener en cuenta los conceptosde esta guía durante toda la vida del servidor. En particular, no debemosolvidarnos de realizar las actualizaciones de seguridad como se describe en lasección anterior.

Otras Tareas y HerramientasEn esta sección describiremos algunas herramientas que pueden colaborar con latarea de mantener seguro el servidor.

BackupDentro de las tareas de mantenimiento, se encuentra la realización de backupsperiódicos del equipo. La discusión sobre los diferentes métodos existentespuede ser muy amplia. Sin embargo presentamos algunas recomendaciones parasu ejecución:v Para realizar backup de muchos equipos de manera combinada, será

necesario contar con un buen gestor de archivos de respaldo.Lamentablemente, no hay ningún sistema de backup multiplataformaconveniente que sea libre. Pero si nos restringimos a un ambiente Linux,amanda es una opción.

v La practicidad de las cintas nunca será superada por los medios ópticos (amenos que estos crezcan en capacidad más de lo que lo han hecho en losúltimos años), o poseamos un intercambiador de CDs de gran capacidad.

28

Page 29: Tutorial Hardening v1.1

v Es recomendable realizar backups “full” de manera periódica, e intercalarloscon backups parciales.

v Para que un backup sea útil, es indispensable que pueda ser recuperado. Ypara estar seguros que nuestro juego de backups es útil, es indispensable quela política de backup incluya testing de los mismos.

v Considerar la posibilidad de guardar copias de los backups en sitios remotos,para contingencias mayores.

v Tener en cuenta que la sensibilidad de la información contenida en una cintade backup es igual a la información más sensible que haya sido almacenada,por lo que habrá que tomar los recaudos del caso.

v Los métodos más comunes de backup en GNU/Linux son utilizar tar, cpio, odump. Si no utilizamos un gestor de backup, dump es una opción muyinteresante por su manejo de niveles para copias incrementales y suintegración con el sistema de archivos ext2. Como desventajas, tiene sulentitud, y que no es compatible con todas las opciones de filesystemexistentes.

v La única forma de obtener una imagen exacta del disco, con la certeza deque no contendrá ningún tipo de inconsistencia, ni a nivel lógico del disco, nia nivel transaccional de las aplicaciones, es realizar backups offline.

Bastille LinuxEsta herramienta, con bastante historia en GNU/Linux, consiste en una serie depreguntas que habrá que responder, para luego automatizar varias de las tareasque hemos realizado en este manual, y algunas otras que no hemos cubierto. Serecomienda utilizar el mismo como una guía para ayudar a estas tareas, peronunca para reemplazar la inspección personal de las mismas.Para instalar esta herramienta, al igual que con todos los paquetes, realizaremosla siguiente operación:

hardened:~# apt-get install bastille

Luego de finalizada la instalación, podemos ejecutar el modo interactivomediante el siguiente comando:

hardened:~# InteractiveBastille

A continuación, se nos presentarán una serie de preguntas sobre las tareas arealizar, con una explicación de sus efectos posteriores. Por ejemplo, en laFigura 10 se observa a la aplicación consultando sobre la deshabilitación del bitSUID en diversos programas.

29

Page 30: Tutorial Hardening v1.1

Figura 10 - Bastille

Paquetes HardenLos paquetes Harden de Debian son una serie de paquetes que, al igual queBastille Linux, nos ayudarán a asegurar un sitio, pero no reemplazarán una buenaconfiguración. Entre otros, podemos encontrar harden-tools, que incluye algunasherramientas como el Tiger, harden-doc, con documentación sobre seguridad, yharden-servers, harden-clients, harden-remoteflaws y harden-localflaws, queeliminan o limitan la instalación de paquetes con conocidos problemas deseguridad.

SudoEn la sección Administración remota mencionamos la herramienta su para elevarlos privilegios de un usuario. Una alternativa interesante que permite tener uncontrol mucho más estricto sobre las tareas que realizan los usuarios querequieran privilegios administrativos es sudo. Con esta herramienta podremosconfigurar:v Qué usuarios pueden elevar sus privilegios (o simplemente ejecutar acciones

como otros usuarios).v Qué tareas pueden realizar.v Si necesitan ingresar un password, y si es el suyo propio o el del usuario

impersonado.v Restricciones horarias.v Lugar desde donde está conectado el usuario.v Registro de las acciones realizadas.

30

Page 31: Tutorial Hardening v1.1

Y mucho más.

Auditoría internaUna aplicación interesante para revisar la seguridad de nuestro servidor es Tiger.Esta herramienta realiza diversas verificaciones sobre la configuración y elestado de varios elementos del sistema operativo. La forma más recomendadapara su instalación es junto con algunos paquetes auxiliares:

hardened:~# apt-get install binutils chkrootkit lsof file libmagic1tiger

Con su instalación por defecto, Tiger realizará diariamente las verificaciones yenviará un reporte de los problemas encontrados. Al igual que con lasverificaciones de integridad y logs que mencionamos más adelante, seráconveniente arbitrar los medios necesarios para que dicho reporte sea enviado aun equipo remoto con las medidas de seguridad del caso. La opción más comúnpara este tipo de reportes es el envío por mail, pero también podrían utilizarseotros medios más seguros, como por ejemplo líneas seriales unidireccionales.A continuación mostramos un ejemplo de un reporte enviado por estaherramienta.Security scripts *** 3.2.1, 2003.10.10.18.00 ***Thu Apr 21 13:51:44 ART 200513:51> Beginning security report for localhost.localdomain (i686 Linux 2.6.8-1-686-smp).

# Performing check of passwd files...# Checking entries from /etc/passwd.--WARN-- [pass014w] Login (backup) is disabled, but has a valid shell. --WARN-- [pass014w] Login (list) is disabled, but has a valid shell. --WARN-- [pass014w] Login (nobody) is disabled, but has a valid shell. --WARN-- [pass006w] Integrity of password files questionable (/usr/sbin/pwck -r).

# Checking the format of passwd and group files.--FAIL-- [pass009e] Group Debian-exim has more than 8 characters. --FAIL-- [pass009e] Login Debian-exim has more than 8 characters.

# Performing check of group files...

# Performing check of user accounts...# Checking accounts from /etc/passwd.--WARN-- [acc022w] Login ID nobody home directory (/nonexistent) is not accessible. --WARN-- [acc023w] Login ID oper's parent directory (/home/) has group `staff' write access. --WARN-- [acc021w] Login ID sshd appears to be a dormant account.

# Performing check of /etc/hosts.equiv and .rhosts files...

# Checking accounts from /etc/passwd...

# Performing check of .netrc files...

# Checking accounts from /etc/passwd...

31

Page 32: Tutorial Hardening v1.1

# Performing common access checks for root (in /etc/default/login, /securetty,and /etc/ttytab...--WARN-- [root001w] Remote root login allowed in /etc/ssh/sshd_config

# Performing check of PATH components...# Only checking user 'root'

# Performing check of anonymous FTP...

# Performing checks of mail aliases...# Checking aliases from /etc/aliases.

# Performing check of `cron' entries...--WARN-- [cron004w] Root crontab does not exist

# Performing check of 'inetd'...# Checking inetd entries from /etc/inetd.conf

# Performing check of services with tcp wrappers...# Analysing inetd entries from /etc/inetd.conf

# Performing check of 'services' ...# Checking services from /etc/services.--WARN-- [inet003w] The port for service postgres is also assigned to service postgresql. --WARN-- [inet003w] The port for service postgres is also assigned to service postgresql.

# Performing NFS exports check...

# Performing check of system file permissions...

# Checking for known intrusion signs...# Testing for promiscuous interfaces with /sbin/ifconfig# Testing for backdoors in inetd.conf

# Performing check of files in system mail spool...

# Performing check for rookits...# Running chkrootkit (/usr/sbin/chkrootkit) to perform further checks...--WARN-- [rootkit004f] Chkrootkit has detected a possible rootkit installation Warning: Possible LKM Trojan installed

# Performing system specific checks...# Performing checks for Linux/2...

# Checking for single user-mode password...

# Checking boot loader file permissions...--WARN-- [boot02] The configuration file grub.conf has group permissions. Should be 0600 --FAIL-- [boot02] The configuration file grub.conf has world permissions. Should be 0600

# Checking for vulnerabilities in inittab configuration...

# Checking for correct umask settings for init scripts...

# Checking Logins not used on the system ...

# Checking network configuration

# Checking OS release...

# Checking installed packages vs Debian Security Advisories...

# Checking md5sums of installed files

32

Page 33: Tutorial Hardening v1.1

# Checking installed files against packages...--WARN-- [lin001w] File `/usr/sbin/ssh' does not belong to any package.

# Performing check of root directory...

# Checking device permissions...--WARN-- [dev003w] File /dev/core is a regular file in a device directory. --WARN-- [dev003w] The directory /dev/i2o resides in a device directory. --FAIL-- [dev002] /dev/log has world permissions --WARN-- [dev003w] The directory /dev/shm resides in a device directory. --WARN-- [dev003w] File /dev/stdout is a regular file in a device directory.

# Checking for existence of log files...--FAIL-- [logf005f] Log file /var/log/btmp permission should be 660 --FAIL-- [logf005f] Log file /var/log/messages permission should be 640

# Checking for correct umask settings...

# Checking listening processes --WARN-- [lin002i] The process `dhclient' is listening on socket 68 (UDP) on every interface. --WARN-- [lin003w] The process `exim4' is listening on socket 25 (TCP on loopback interface) is run by Debian-exim. --WARN-- [lin002i] The process `sshd' is listening on socket 22 (TCP) on every interface.

# Checking sshd_config configuration files...

# Checking printer configuration files...--ERROR-- [init006e] `/etc/printcap' does not exist (file src).--ERROR-- [init006e] `/etc/printcap' does not exist (file infile).

# Performing common access checks for root...--FAIL-- [netw020f] There is no /etc/ftpusers file.

# Checking ntpd configuration...

# Checking setuid executables...--WARN-- [fsys002w] setuid program /usr/sbin/exim4 has relative pathnames.

-rwsr-xr-x root root /usr/sbin/exim4

# Checking setgid executables...

# Checking unusual file names...

# Looking for unusual device files...

# Checking symbolic links...

# Checking for writable directories...--INFO-- [fsys008i] The following directories are world writable:/dev/shm//var/lock//var/log/debian-installer/cdebconf/

# Performing check of embedded pathnames...13:53> Security report completed for localhost.localdomain.

Integridad¿Cómo podemos descubrir si eventualmente el equipo resulta comprometido?

33

Page 34: Tutorial Hardening v1.1

Un excelente método es verificar la integridad de los archivos existentes en elsistema de archivos. Existen varias herramientas para realizar esta tarea:v Tripwire, prácticamente la más antigua de todas (sólo de uso libre para

Linux, y bajo ciertas condiciones de licenciamiento)v Integrit.v Debsums, que verifica la integridad de los archivos en base al hash contenido

en el paquete Debian que lo provee. No todos los paquetes tienen los hashesnecesarios, por lo que no resulta práctica la herramienta.

v AIDE, o Advanced Intrusion Detection Environment, actualmente una de lasmás usadas y recomendables para su uso.

En general estas herramientas proveen varias opciones de verificación,incluyendo hashes con uno o más algoritmos criptográficos, verificación de MACtime (Modificación, Acceso y Creación), permisos, tamaño, etc. Todas proveenuna configuración de ejemplo (en el caso de AIDE, /etc/aide/aide.conf) queservirá de punto de partida para una configuración adecuada al sistema queacabamos de instalar.Algunas de las cosas que habrá que modificar seguramente incluirán:v Ni /etc, donde se encuentran todos los archivos de configuración, ni /boot,

donde se encuentran los archivos de inicio del sistema operativo, estáncontemplados en el archivo de ejemplo.

v /var/log tiene algunas configuraciones específicas, que seguramentecausarán varios falsos positivos si la actividad de nuestro host modifica loslogs constantemente.

v /home sólo está contemplado como un ejemplo. Si el sistema posee muchosusuarios independientes, seguramente querremos verificar como mucho queno cambie el dueño (owner) de los archivos. Si no tiene usuarios además deladministrador, vamos a querer observar cualquier tipo de cambio.

Un buen método para ajustar la configuración es agregar todos los directoriosdependientes del raíz faltantes (/boot, /home/, etc.) con todas lasverificaciones posibles, e ir ajustándolas a medida que recibimos las alertas.Como mencionamos en caso de la auditoría interna, será conveniente que losreportes de estas verificaciones sean recibidos en un host remoto, donde setenga la seguridad de que podrán ser recuperados en caso de una intrusiónintente borrarlos.Además, para el caso de las verificaciones de integridad de los archivos, todoslos métodos se basan en la creación de una base de datos con el estado inicialdel sistema, y la posterior comparación con ésta. Si queremos que estaverificación sea efectiva, y no pueda ser falseada durante una intrusión,deberemos montar la base de datos en un dispositivo de sólo lectura. Porejemplo, en un CD-ROM (o alguna clase de dispositivo al que se le pueda

34

Page 35: Tutorial Hardening v1.1

bloquear la escritura por hardware: un disquete, un pen-drive, una tarjeta flash,etc.).

NTPEn las últimas secciones insistimos en la importancia de enviar a un host remotoy seguro los mensajes generados por el sistema. La única manera decorrelacionar los eventos que observemos en diferentes equipos, será si susrelojes están perfectamente sincronizados.Por ello, es recomendable establecer un esquema de sincronización de relojesutilizando el protocolo NTP.

FirewallUna herramienta que no mencionamos durante la instalación y el aseguramiento,pero que es casi obligatoria en cada host, es el firewall, muchas veces llamado“personal firewall”. Como en todas las instalaciones de GNU/Linux, laherramienta utilizada para filtrar los paquetes de red en el host será iptables.Para facilitar la configuración, una opción es utilizar la herramienta shorewall,que si bien los ejemplos están pensados para un firewall en el sentido clásico (ungateway con filtrado de paquetes), es perfectamente adaptable al uso como“firewall personal”.

Otras fuentes de informaciónPara obtener más información sobre seguridad en la distribución Debian:http://www.debian.org/doc/manuals/securing-debian-howto/.

El manual completo de instalación de Debian puede obtenerse en:http://www.debian.org/releases/sarge/installmanual.

35

Page 36: Tutorial Hardening v1.1

CheckListA continuación, se incluye un resumen de las tareas descriptas en estedocumento, a modo de lista de verificación para el aseguramiento de unservidor.

Pre-instalación¨ Restringir el acceso a consola.¨ Aislar de la red.¨ Deshabilitar puertos innecesarios.¨ Deshabilitar dispositivos de almacenamiento, salvo el de boot.¨ Selección de dispositivo de boot.¨ Configurar password para cambios al BIOS.

Instalación¨ Particionado.¨ Opciones de montado (nodev, nosuid y noexec).¨ Creación de usuario/s no privilegiado/s.¨ Selección de paquetes: mínima.¨ Ajuste de opciones de boot en el BIOS (quitar CD-Rom).

Configuración¨ Password y restricciones en el boot-loader.¨ Desinstalación de paquetes innecesarios.¨ Ajuste para la correcta detección de hardware (módulos).¨ Inspección y deshabilitado de servicios innecesarios.¨ Ajuste /etc/fstab.¨ Instalación de paquetes (servicios a brindar por el host).¨ Ajuste de propiedades de los usuarios (shell).¨ Eliminación de suid en ejecutables.¨ Ajustes sysctl (/proc/sys).¨ Deshabilitación de CTR-ALT-DEL.¨ Restringir el uso de crontab.¨ Instalación y ajuste de SSH

¨ Sólo versión 2.¨ Restricción de acceso (/etc/hosts.deny y hosts.allow)¨ Restringir login como root.

¨ Restricción del uso de su (wheel).¨ Actualización de paquetes.

Otras tareas y herramientas¨ Backup.¨ Hardening extra automatizado (Bastille Linux, paquetes “harden”).

36

Page 37: Tutorial Hardening v1.1

¨ Sudo.¨ Autitoría interna e integridad (Tiger, AIDE)¨ Logs y reportes remotos.¨ Sincronización de relojes.¨ Firewall.

Mantenimiento¨ Backup¨ Revisión de logs.

37