%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^%
% Debian server security									  %
% Esta presentación ilustra un poco las técnicas usadas en el manual "debian hardening" 	  %
% disponible en la página oficial del proyecto Debian(http://debian.org)	                  %
% La idea es no incurrir en un set grande de herramientas, sino tomar un par de aplicaciones      %
% sencilla que pueden mejorar en gran medida la seguridad básica en servidores                    %
%												  %
% Copyright (C) 2008 René Mayorga <rmayorga@debian.org.sv>				          %
% Se permite la distribución, copia, y modificación, también trabajos derivados y redistribución  %
% de los mismos, todo esto bajo los términos de la licencia GNU GPL versión 2 o superior a su     %
% elección, el texto completo de la licencia esta disponible en los sistemas operativos Debian en %
% '/usr/share/common-licenses/GPL'.								  %
%_________________________________________________________________________________________________%

\documentclass[hyperref={colorlinks=true}]{beamer}
\usepackage[spanish]{babel}
\usepackage{graphics}
\parskip 10.9pt

\usetheme{CambridgeUS}
\title{Seguridad en Servidores Debian}
\author[rmayorga]{Ren\'e Mayorga \\ \texttt{rmayorga@debian.org}}
\institute{Comunidad de usuarios Debian de El Salvador}


\begin{document}

\begin{frame}
	\titlepage
\end{frame}

\begin{frame}{Esquema}
	\tableofcontents
\end{frame}


\section{Introducci\'on}
\begin {frame}[fragile]
\frametitle{Seguridad}
	\centering
	?`Cu\'al es la mejor t\'ecnica de seguridad disponible?
	\pause

	?`Ideas?
	\pause
	\begin{block}{La mejor t\'ecnica de seguridad:}
		Consiste simplemente en desconectar el cable de energ\'ia, y ni a\'un as\'i 
		podemos estar 100 por ciento seguros, pues todav\'ia existen datos en nuestro
		disco que podr\'ian ser comprometidos por cualquier t\'ecnica.
	\end{block}
	\pause
	\centering
	Pero a pesar de todo, todav\'ia resulta una de las mejores t\'ecnicas para mantener seguro
	mi equipo.

	Trataremos de ver un par de ideas que pueden hacer que duerma m\'as tranquilo.
\end{frame}

\section{Planeaci\'on}
\begin{frame}[fragile]
\frametitle{Pensando antes que todo}
	\centering
	?`Cu\'al ser\'a la funci\'on principal del servidor?
	\pause

	\begin{block}{Es necesario saber que \alert{*que*} quiero hacer}
		Esto influye directamente en las aplicaciones y la manera como voy a instalar
		el servidor. Ejemplo: Para que necesito gnome o KDE en un servidor de correo ?
	\end{block}

	\pause
	\centering
	Recordemos, en el caso especifico de Debian, existe un sistema base, que contiene
	lo necesario, luego de eso, es tarea del administrador instalar lo que requiere para
	su trabajo.
	\pause
	\centering

	En otras palabras, \alert{*NO*} usemos \texttt{tasksel}
\end{frame}

\begin{frame}[fragile]
\frametitle{Pensando antes que todo}
	
	\centering

	Recordemos desactivar Recommends, 
	Justo despu\'es de instalar el servidor con el sistema base
	
	\pause

	\centering
	Como?

	\pause
	\begin{verbatim}
	 	apt-config dump | grep Recom \ 
		| sed 's/1/0/' > /etc/apt/apt.conf.d/02user 
	\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{planeando mis Particiones}
	\centering
	?`Para qu\'e hago diferentes particiones en mi OS ?
	\pause

	\centering
	?`Ideas?
	\pause

	Con las particiones puedo manejar permisos, y hacer mi sistema mucho mas seguro
	es decir, asegurarme que despu\'es de mi instalaci\'on no se pueda instalar nuevo
	software. A menos que el administrador lo requiera.
\end{frame}

\begin{frame}[fragile]
\frametitle{?`C\'omo esta eso de la seguridad en las particiones?}
	\centering
	 a, ver, si ejecutamos \texttt{man mount}
	 Podemos ver algunas cosas interesantes, como :
	 \begin{verbatim}
              rw     Mount the file system read-write.
	      [.....]
              ro     Mount the file system read-only.
	      [....]
              exec   Permit execution of binaries.
	      [.....]
	      noexec  Do not  allow  direct  execution 
	      	      of any binaries.
	 \end{verbatim}
	 \pause

	 \centering
	 Pero, pero!, yo ya conoc\'ia desde antes esa opciones!.
\end{frame}

\begin{frame}[fragile]
\frametitle{Veamos lo de las particiones}
	\centering
	Pensemos en un esquema de particiones b\'asicas:
	\begin{figure}
		\includegraphics[width=3.1in]{serv-parti-1.eps}
		\caption{siempre / }
	\end{figure}
\end{frame}

\begin{frame}[fragile]
\frametitle{Veamos lo de las particiones}
	\centering
	\begin{figure}
		\includegraphics[width=3.1in]{serv-parti-2.eps}
		\caption{que particiones}
	\end{figure}
\end{frame}

\begin{frame}[fragile]
\frametitle{Veamos lo de las particiones}
	\centering
	\begin{figure}
		\includegraphics[width=3.1in]{serv-parti-3.eps}
		\caption{que particiones}
	\end{figure}
\end{frame}


\begin{frame}[fragile]
\frametitle{Veamos lo de las particiones}
	\centering
	\begin{figure}
		\includegraphics[width=3.1in]{serv-parti-4.eps}
		\caption{que particiones}
	\end{figure}
\end{frame}


\begin{frame}[fragile]
\frametitle{y la seguridad}
	\centering
	Pero que tiene que ver todo esto con la seguridad ?
	\pause
	\begin{figure}
		\includegraphics[width=3.1in]{parti-exp-1.eps}
		\caption{que hago con esa partici\'on}
	\end{figure}
\end{frame}


\begin{frame}[fragile]
\frametitle{y la seguridad}
	\begin{figure}
		\includegraphics[width=3.1in]{parti-exp-2.eps}
	\end{figure}
\end{frame}


\begin{frame}[fragile]
\frametitle{y la seguridad}
	\begin{figure}
		\includegraphics[width=3.1in]{parti-exp-3.eps}
	\end{figure}
\end{frame}


\begin{frame}[fragile]
\frametitle{y la seguridad}
	\begin{figure}
		\includegraphics[width=3.1in]{parti-exp-4.eps}
	\end{figure}
\end{frame}


\begin{frame}[fragile]
\frametitle{y la seguridad}
	\begin{figure}
		\includegraphics[width=3.1in]{parti-exp-5.eps}
	\end{figure}
\end{frame}

\begin{frame}[fragile]
\frametitle{Particionando para hacer mi servidor seguro}
	\centering
	Entonces, puedo tener una configuraci\'on que evite:
	\begin{itemize}
		\pause
		\item A un usuario com\'un y silvestre descargar un c\'odigo
		      (exploit) y luego de compilarlo, ejecutarlo en su home o /tmp
		   \pause
		\item un programa instalado no podr\'ia descargar ni modificar
		      bibliotecas del sistema, pues puedo mantener /usr/lib y /lib montados
		      con \alert{ro}
		    \pause
		\item no se podr\'ian agregar programas nuevos o modificar programas
		      en /bin, /sbin, /usr/bin, /usr/sbin, solo el administrador
	\end{itemize}
	\pause
	\centering
	La idea es simple, solo \alert{root} usando mount -o remount puede alterar los flags
	para ejecutar o tomar alguna acci\'on, luego volver al estado anterior para que el usuario
	no pueda tomar ventaja de alg\'un exploit para escalabilidad de permisos.
\end{frame}

\section{Selecci\'on de software}
\begin{frame}[fragile]
\frametitle{Seleccionando mi software}
	\centering
	Primero recordando \alert{*NO*} usar taskel en la instalaci\'on

	\centering
	luego, una vez instalado el OS podemos decirle a APT que no instale
	\alert{Recommends} por defecto, de esta manera nos aseguramos que el software
	instalado en el Servidor sea solo lo necesario y las dependencias correctas.
	Para esto ejecuto:
	\begin{verbatim}
		apt-config dump | grep Recom | sed 's/1/0/' > \
			/etc/apt/apt.conf.d/05userconf
	\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{Software a instalar}
	\centering
	La idea es mantener \alert{*solo*} el software necesario.
	Por defecto en Debian muchos servicios se encuentran desactivados
	y las configuraciones por defecto son \alert{b\'asicas}, por lo que es bueno
	solo instalar software necesario.
\end{frame}

\section{Asegurando los usuarios}
\begin{frame}[fragile]
\frametitle{los usuarios......}
	\centering
	El mayor problema de seguridad, la mayor amenaza potencial, y el mayor riesgo
	de botar todo mi esquema de seguridad, son sin duda alguno los propios usuarios.
	\pause

	\centering
	por tanto existen varias opciones a tomar en cuenta, primero, preguntarme:
	\pause
	\begin{itemize}
		\item Necesita un shell en el sistema?
		\pause
		\item que servicios podr\'an estar disposibles a todos los usuarios
		\pause
		\item voy a necesitar comportam\'e como un BOFH ?
	\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{ahora despu\'es de decidir}
	\centering
	pues el usuario podr\'a entrar, ahora a pensar como hago para que no me arruine la vida
\end{frame}

\subsection{Software para controlar amenazas locales}
\begin{frame}[fragile]
\frametitle{Pensemos que software vamos a usar}
	\centering
	\begin{block}{cracklib}
		Cracklib2 es una librer\'ia en C, su funci\'on principal
		es prevenir al usuario usar passwords sencillos.

		Existe un m\'odulo para PAM, llamado \alert{libpam-cracklib}
	\end{block}
\end{frame}

\begin{frame}[fragile]
\frametitle{cracklib}
	\centering
	Una vez instalado \alert{libpam-cracklib} simplemente es necesario editar
	mi configuraci\'on de PAM.
	\begin{verbatim}
		$EDITOR /etc/pam.d/common-password
		password   required   pam_cracklib.so minlen=6 lcredit=0 \
		ucredit=-1 dcredit=-1 ocredit=0  retry=3
	\end{verbatim}
\end{frame}

\begin{frame}[fragile]
\frametitle{cracklib}
	La documentaci\'on la pueden encontrar con man 8 pam cracklib
	pero, resumiendo PAM-cracklib acepta algunas de estas opciones
	\pause

	\centering
	\begin{itemize}
		\pause
		\item retry, errores del usuario
		\pause
		\item minlen=N, n\'umero de caracteres \alert{minimos} para los passwords
		\pause
		\item dcredit=N, n\'umero de caracteres n\'umericos  requeridos
		\pause
		\item ucredit=N, letras May\'usculas
		\pause
		\item lcredit=N, letras min\'usculas 
		\pause
		\item ocredit=N, Otros caracteres
	\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{/etc/shadow}
	\centering
	En /etc/shadow se guarda \alert{mucha} informaci\'on referente a los usuarios
	y sus passwords, por ejemplo, la \'ultima fecha de cambio de password
	el tiempo necesario para que el password expire, etc.
	\pause
	\centering
	
	Esto es un taller ?`verdad?
	\pause
	\centering
	
	Entonces, todo a leer \texttt{man 5 shadow}
\end{frame}

\begin{frame}[fragile]
\frametitle{/etc/passwd}
	\centering
	Si hacemos un \texttt{cat /etc/passwd} podemos ver algo interesante
	\pause

\begin{verbatim}

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh

\end{verbatim}
\end{frame}

\begin{frame}
\frametitle{/etc/passwd}
	\centering
	
	Estos usuarios necesitan tener shell ?
	\pause
	\centering
	
	Entonces, a quitarlo, como root, cambiemos esos /bin/sh por /bin/false

\end{frame}


\begin{frame}[fragile]
\frametitle{Grupo Wheel}
	\centering
	Wheel es un grupo com\'un en algunos UNIXs como BSD
	pero en GNU/Linux no se encuentra por defecto este famoso grupo.

	\centering
	\pause

	?`Alguien sabe que hace Wheel?
	\pause

	\centering
	B\'asicamente en un UNIX, se permite a \alert{cualquier} usuario que se encuentre
	dentro del grupo Wheel ejecutar \alert{su}.
	Si el usuario no esta en Wheel aunque tenga conocimiento del password de otro 
	usuario(incluido root) no podra hacer \alert{su}
\end{frame}

\begin{frame}[fragile]
\frametitle{Por que Wheel no existe en GNU/Linux y si en BSD}
	\centering
	\pause
	\begin{block}
		" A veces, algunos listillos intentan hacerse con el poder total sobre el
		  resto de usuarios. Por ejemplo, en 1984, un grupo de usuarios del
		  laboratorio de Inteligencia Artificial del MIT decidieron  tomar  el  poder
		  cambiando  el  password  de operador del sistema Twenex y manteniendolo
		  secreto para el resto de usuarios.  (De  todas  maneras,  hubiera  sido
		  posible  desbaratar  la  situación y devolver el control a los usuario
		  legítimos parcheando el kernel,  pero  no  sabría  como  realizar  esta
		  operación en un sistema Unix.)  "
	\end{block}
					-- Richard M. Stallman, Manual de GNU su
						(man 1 su)
\end{frame}

\begin{frame}[fragile]
\frametitle{No me interesan las experiencias juveniles de RMS, yo quiero Wheel!}
	\centering
	F\'acil, simplemente editamos \alert{/etc/pam.d/su} y quitamos el comentario
	\pause
	\begin{verbatim}
	 	auth       required   pam_wheel.so
	\end{verbatim}
	\pause
	\centering

	Despu\'es de esto, nada mas es necesario asegurarnos de agregar a los usuarios
	al grupo \alert{wheel} (si el grupo no existe, no llore, cr\'eelo!)
\end{frame}

\begin{frame}[fragile]
\frametitle{ROOT no se debe de usar}
	\centering
	Puedo restringir los dispositivos tty en los cuales root puede hacer login
	es decir, puedo dejar que root \alert{*solo*} se pueda logear en /dev/tty5.
	Esto se puede hacer usando el archivo \alert{/etc/securetty}

	\pause
	\centering
	Tambi\'en debo evitar vivir validado en el sistema como root, en Debian, existe
	el grupo \alert{adm} si yo soy el administrador del sistema puedo agregar mi usuario
	al grupo \alert{adm} de esta forma podre revisar los logs del sistema, sin necesidad
	de estar como root.
\end{frame}


\section{SSH}
\begin{frame}[fragile]
\frametitle{necesito ssh, pero quiero dormir tranquilo}
	\centering
	ssh puede ser nuestro mejor amigo, o nuestro peor enemigo.
	\pause

	Por ejemplo, tener ssh abierto a \alert{todo} mundo es un problema, pues
	soy un destino para script kiddies y ataques de fuerza bruta.
\end{frame}

\begin{frame}[fragile]
\frametitle{TIPS para SSH}
	\centering
	Un par de cosas \'utiles:
	\begin{itemize}
		\item Deshabilitar el login con root
		\pause
		\item No esconder el puerto, eso no funciona ni ayuda
		\pause
		\item usar timeout
		\pause
		\item \alert{*SOLO*} permitir ssh v2
	\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{Defendiendome de script kiddies que usan fuerza bruta}
	\centering
	Alg\'un que otro software \'util:
	\pause
	\begin{itemize}
		\item fail2ban
		\pause
		\item sshguard
		\pause
		\item auth2db
		\pause
		\item scponly
	\end{itemize}
\end{frame}

\section{Alimentando la parano\'ia}
\begin{frame}[fragile]
\frametitle{Auditando}
	\centering
	Existe una gran cantidad de aplicaciones disponibles, que me pueden ayudar
	a monitorear mis logs, esto da sin duda una mejor perspectiva de que pasa en
	el sistema.

	\begin{itemize}
		\item multitail
		\item acct
		\item fail2ban
		\item syslog
		\item samhain
	\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{Auditando}
	
	\centering

	Como buen BOFH necesito ejecutar de cuando en cuando comandos que me permitan
	ver como esta todo

	\pause

	\centering
	algunos:

	\pause
	\begin{itemize}
		\item ps -fea me puede ayudar para ver que hay interesante
		 se tienen que buscar procesos con SETUID de root y cosas raras
		\pause
		\item netstat -puta me puede ayudar a ver que pasa en mi red
		 si existen conexiones raras y cosas así, es bueno borrarlas o quitarlas
		\pause
		\item last, w, who, history son una man\'ia muy buena en cada login
	\end{itemize}
\end{frame}

\begin{frame}[fragile]
\frametitle{Root no es necesario}
	\centering
	En mi caso, como BOFH, rara vez necesito hacer su o sudo ( si usar sudo es buena idea )
	es un mito que root es necesario
	\pause
	\centering
	por ejemplo, si ejecuto
	\begin{verbatim}
	ls -l /var/log/*.log
	\end{verbatim}
	\pause
	\centering
	Puedo ver que todos los logs pertenecen al grupo adm, por lo que si agrego a un usuario
	a ese grupo, este usuario puede leer y hacer debug con logs, sin necesidad de ser root

\end{frame}

\begin{frame}[fragile]
\frametitle{los chroot son mis amigos}
	\centering
	Si, los chroot son f\'aciles de crear, no requieren mucho y son buena carne de ca\~non
	\pause
	\centering
	por ejemplo, pongamos un chroot para apache
	\begin{verbatim}
	# mkdir -p /srv/chroot/apache
	# debootstrap lenny /srv/chroot/apache
	...
	...
	# cd chroot/dev/
	# cp /dev/MAKEDEV . && ./MAKEDEV generic && cd ..
	# mount -t devpts devpts /dev/pts
	# mount -t proc proc proc/
	# cd && chroot /srv/chroot/apache
	# apt-get install apache2
	\end{verbatim}
	\pause
	Listo,  ahora, en el web http://localhost
	\alert{recuerde que apache no puede estar en el mismo host usando el mismo puerto :)}

	ahora un par de recomendaciones....
\end{frame}

\begin{frame}
\frametitle{chroots, recomendaciones}

	\pause
	Recuerde configurar sus locales y todo, como en un servidor nuevo
	puedo poner ssh a escuchar en un puerto X o puede tambi\'en ponerlo 
	dentro de un screen o automatizar el mount de dev y proc y hacer un script
	que lo haga todo en el arranque.

	\pause

	Puedo poner varios servicios, usar diferentes ramas de la distro
	y cuando algo pase, simplemente copio mis configuraciones, creo otro
	chroot nuevo, y listo :), es m\'as f\'acil de hacer backup tambi\'en

\end{frame}


\section{Comentarios, sugerencias, experiencias}
\begin{frame}[fragile]
\frametitle{\'ultimos detalles}
	\centering
	Recordemos, siempre vamos a estar en la lucha entre seguridad versus usabilidad
	por lo que no vamos a lograr nunca una ni otra, lo importante es estar en un balance 
	optimo.
	\centering

	Ahora, haciendo una peque\~na rese\~na de que quedo y falto:
	
	\pause
	
	Y lo que falto fue:
	\begin{itemize}
		\item El Sistema de archivos
		\pause
		\item Firewalls
		\pause
		\item tcpwrappers
		\pause
		\item archivos con permisos raros (SETUID, SETGID, etc)
		\pause
		\item centralizar nuestros logins (ldap, radius...)
		\pause
		\item etc. etc. etc.
	\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Gracias :)}
	\centering
	Bueno, gracias a todos, esta presentaci\'on se encuentra bajo una licencia
	libre y pueden obtener una copia completa del c\'odigo fuente en:
	http://rmayorga.org/talks.
	
	\pause
	Parches, pu..adas, preguntas y todo es bienvenido en \texttt{rmayorga@debian.org}
	
\end{frame}
\end{document}

