Hardening Kernel ovh con Lxc y grsecurity


Hola, he andado liada y no podía escribir pero aquí estoy de vuelta para compartir mis experiencias como bof.

Hoy tengo un cliente me ha pedido que le securice un server dedicado para montarle unos servicios y vamos a empezar por compilarle el kernel adecuadamente para su máquina, instalando le el módulo de grsecurity, que está alojada en ovh lo cual ya nos supone un reto debido a lo especialito que es este proveedor.

Bueno como algunos de vosotros sabréis los servidores de ovh no permiten lxc, para poderlo usar debemos compilarlo nosotros nuestro kernel y luego instarse lo y bueno ya que estamos en ello vamos a securizarlo

 

Quien no conozca grsecurity es un parche de seguridad para los kernels de linux podeis visitrar su wiky en Wiky Grsecurity

Manos al teclado, comencemos nuestra tarea

Primero descargamos el kernel apropiado tenéis que fijaros que coincida la versión del parche con la del kernel con la del fichero de configuración de ovh;

Hay 3 forma de bajarse un kernel, por lo menos que yo conozca:

  1. bajárselo de https://www.kernel.org/
  2. bajarsélo de los repositorios: aptitude install linux-source
  3. bajárselo de git o de algún repositorio específico de nuestro proveedor de housing

1. Los kernel de kernel.org se consideran vanilla kernel ya que no están adaptados a ninguna distribución son el kernel puro y duro, después cada una de las distribuciones va añadiendo sus parches al kernel para funciones espécificas.

2. Los kernels de los sources ya han sido adaptados a la distribución y tienen ciertos parches de seguridad

3 Los kernel de git vienen directamente de Linux torvals y los de los proveedores de housing están adaptados.

Los paquetes previos que necesitamos para compilar el kernel son:

aptitude install dpkg-dev lzma patch bin86 kernel-package build-essential

Nos bajamos el kernel de kernel.org en este caso vamos a compilar el 3.2.58 porque es el último coincidente con la versión de nuestro parche de grsec

wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.2.58.tar.xz

Si nos da algún error podemos bajarlo también con:

wget --no-check-certificate https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.2.58.tar.xz
wget http://grsecurity.net/stable/grsecurity-3.0-3.2.58-201405092334.patch
wget-c ftp://ftp.ovh.net/made-in-ovh/bzImage/2.6.38.2/2.6-config-xxxx-std-ipv6 -64
tar Jxvf linux-3.2.58.tar.xz
cd linux-3.2.58
make mrproper #Limpiamos toda configuración anterior y nos traemos los parches 
cp  ~/grsecurity-3.0-3.2.58-201405092334.patch .
cp ~/cp-config-xxxx-std-ipv6-64
patch -p1 < grsecurity-3.0-3.2.58-201405092334.patch
cp-config-xxxx-std-ipv6-64 config.
make menuconfig

Se nos abrirá una interfaz de ncurses con la siguiente apariencia:

make menu config

Para Lxc haremos la siguiente configuración, las opciones pueden estar en diferente posición según la versión del kernel:

Parte 1 General setup

General setup --->
	[*] Control Group support --->
		[*] Example debug cgroup subsystem
		[*] Namespace cgroup subsystem   
		[*] Freezer cgroup subsystem  
		[*] Device controller for cgroups   
		[*] Cpuset Support   
		[*] Include legacy / proc /  / cpuset file 
		[*] Simple CPU accounting cgroup subsystem   
		[*] Resource counters  
		[*] Memory Resource Controller for Control Groups  
		[*] Memory Resource Controller Swap Extension
		[*] Memory Resource Controller Swap Extension enabled by default (NEW)   
		[*] Enable perf_event per-cpu per-container group (cgroup) monitoring   
		[*] Group CPU scheduler --->
			[*] Group scheduling for SCHED_OTHER
			[*] Group scheduling for SCHED_RR / FIFO
		<*> Block IO controller   
		[*] Enable Block IO controller debugging
	- * - Namespaces support --->
    	[*] UTS namespace
		[*] IPC namespace
		[*] User namespace (EXPERIMENTAL)
		[*] PID Namespaces
		[*] Network namespace


compilar kernel para lxc Sección General Setup

Volvemos al menú inicial y entramos en network support, las opciones a marcar son las siguientes:

[*] Networking support ---> Networking options ---> <*> 802.1d Ethernet Bridging [*] IGMP / MLD snooping [] Distributed Switch Architecture support ---> <*> 802.1Q VLAN Support [*] GVRP (GARP VLAN Registration Protocol) Support


networkSupportNetworkOptions

Ahora toca device drivers donde marcamos las siguientes opciones:

 

Device Drivers ---> 
	[*] Network device support --->
		Network device support ---
		<> Intermediate Functional Block support (NEW)
		<> Dummy net driver support (NEW)
		<> Bonding driver support (NEW)
		<*> MAC-VLAN support (EXPERIMENTAL)
		<*> MAC-based VLAN tap driver (EXPERIMENTAL)
		<> EQL (serial line load balancing) support (NEW)
		<> Universal TUN / TAP device driver support (NEW)
		<*> Virtual ethernet pair device
		<> 1000 General Instruments Surfboard (NEW)

	Character devices --->    
		- * - Unix98 PTY Support
		[*] Support multiple instances of devpts

Compilar kernel para lxc Device Drivers

Desactivamos todas las opciones de kernel hacking ya que esta parte sirve para debuguear el kernel excepto la última que hace referencia a gcc

Parte 2 Grsecurity

Ahora pasamos a la parte de seguridad, el resto de partes no las vamos a tocar porque al ser la infraestructura de ovh desconocemos los detalles del hardware por ello han queda configuradas por el ellos cuando hemos hecho el cp-config-xxxx-std-ipv6-64 config.


Opciones seguridad kernel

Entramos en Grsecurity:


Y seleccionamos custom, luego entramos en custom options y la primera opción es memory protections

Las opciones a configurar son las siguientes:

 

Memory Protections:

[*] Deny reading/writing to /dev/kmem, /dev/mem, and /dev/port
[  ] Disable privileged I/O
[*] Harden ASLR against information leaks and entropy reduction
[*] Deter exploit bruteforcing
[*] Harden module auto-loading
[*] Hide kernel symbols
[*] Active kernel exploit response


Role Based Access Control (RBAC): 

[  ] Disable RBAC system
[*] Hide kernel processes
(3) Maximum tries before password lockout
(30) Time to wait after max password tries, in seconds


Filesystem Protections:

[*] Proc restrictions
[*] Restrict /proc to user only
[*] Additional restrictions
[*] Linking restrictions
[*] FIFO restrictions
[  ] Sysfs/debugfs restriction     -Breaks Sound on Ubuntu
[  ] Runtime read-only mount protection   -For servers, not users.
[*] Chroot jail restrictions
[*] Deny mounts
[*] Deny double-chroots
[*] Deny pivot_root in chroot
[*] Enforce chdir(“/”) on all chroots
[*] Deny (f)chmod +s
[*] Deny fchdir out of chroot
[*] Deny mknod
[*] Deny shmat() out of chroot
[*] Deny access to abstract AF_UNIX sockets out of chroot
[*] Protect outside processes
[*] Restrict priority changes
[*] Deny sysctl writes
[*] Capability restrictions


Kernel auditing 

[*] Single group for auditing (1007) GID for auditing 
[*] Exec logging
[*] Resource logging
[ ] Log execs within chroot  
[*] Ptrace logging 
[ ] Chdir logging 
[*] (Un)Mount logging 
[*] Signal logging
[*] Fork failure logging
[*] Time change logging 
[*] /proc//ipaddr support 
[*] Denied RWX mmap/mprotect logging


Y por último:

 

Executable Protections:

[*] Dmesg(8) restriction
[*] Deter ptrace-based process snooping
[*] Require read access to ptrace sensitive binaries
[*] Enforce consistent multithreaded privileges
[*] Trusted Path Execution (TPE)
[*] Partially restrict all non-root users -This is one option that I use. It may break things and it’s not a critical feature so you may consider removing it.

Network Protections:

[*] Larger entropy pools
[*] TCP/UDP blackhole and LAST_ACK DoS prevention
[  ] Socket restrictions

SysCtl Support:

[  ] Sysctl support
[  ] Turn on features by default

 

Ahora vamos con Pax


PaX Control:

[  ] Support soft mode By leaving this off we have PaX system wide.
[  ] Use legacy ELF header marking
[  ] Use ELF program header marking
[  ] Use filesystem extended attributes marking

 

Non-Executable Pages:

[*] Enforce non-executable pages
[*] Paging based non-executable pages
[*] Emulate trampolines
[*] Restrict mprotect() This will break X.
[  ] Use legacy/compat protection demoting (read help)
[  ] Allow ELF text relocations (read help)
[*] Enforce non-executable kernel pages (Requires  you disabled Xen)
Return Address Instrumentation Method (bts) —>


Address Space Layout Randomization:

[*] Address Space Layout Randomization
[*] Randomize kernel stack base
[*] Randomize user stack base
[*] Randomize mmap() base

Miscellaneous Hardening Features: (Note: Users of ATI SPUs must use my settings here. Users with other GPUs should enable all ** settings.)

[*] Sanitize all freed memory
[*] Sanitize kernel stack
[*] Prevent various kernel object reference counter overflows  **
[*] Harden heap object copies between kernel and userland  **
[*] Prevent various integer overflows in function size parameters

**As of version 12.8 the closed source ATI FGLRX drivers are compatible with the above. Earlier versions will NOT work.


Bien pues ya está, salimos y guardamos.

Si no da ningún error compilamos con los pasos de más abajo, en mi caso sí dió errores debido a algunas opciones de ovh:

 

                                                                                                                                               warning: (GFS2_FS) selects DLM which has unmet direct dependencies (EXPERIMENTAL && INET && SYSFS && CONFIGFS_FS && (IPV6 || IPV6=n))
warning: (ACPI_HOTPLUG_CPU) selects ACPI_CONTAINER which has unmet direct dependencies (ACPI && EXPERIMENTAL)
warning: (ACPI_HOTPLUG_CPU) selects ACPI_CONTAINER which has unmet direct dependencies (ACPI && EXPERIMENTAL)

 

Con el carázter / se pueden realizar búsquedas así que volvemos a make menuconfig.

Estos dos errores hacen referencia dependencias no resueltas y se solucionan configurándolo como en las imágenes a continuación:


Dlm error ovh kernel
Acpi Errors Ovh Kernel

make -j8       #j8 es el número de procesadores, ajustarlo a vuestro caso
cp arch/x86/boot/bzImage /boot/bzImage-CUSTOMIZE 
cp System.map /boot/System.map-CUSTOMIZE
update-grub
reboot

Y voilá, kernel compiladito con linux container disponible y securizadito!! en estos momentos, ¿No sentís que la vida es bella? ;)

Publicado el 15/05/2014 a las 13:15

Comentarios en el post


Esta web utiliza cookies, puedes ver nuestra la política de cookies, aquí Si continuas navegando estás aceptándola
Política de cookies +