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. 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:
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
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
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
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.
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:
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