Asegurando Linux, parte 1
by admin on Mar.03, 2009, under GNU/Linux
Si bien es cierto que GNU/Linux es un sistema seguro, no es seguro contra todo, y se trata de que pongamos un poco de nuestra parte para contribuir a la seguridad (en cierto modo, se requiere mucho de nuestra parte).
Habra mas entregas de este tipo, hoy algo basico… empecemos pues:
1.Contraseñas “seguras”:
-Eligiendo una contraseña
Muchos usuarios de a pie, creen que la contraseña carece de importancia y suelen disponer esta clave como : el nombre de el/su_novia/algun_familiar, su fecha de cumpleaños, su direccion, o incluso cosas tan simples como “1234”. (¿memoria pez?)
Craso error ya que esto nunca debe hacerse. Nuestra clave nunca deberia ser algo que nos relacionase y mucho menos claves numericos del estilo “1234”. ¿razones?
1- El primer paso para entrar a un sistema es recolectar tanta informacion como sea posible sobre su dueño, esto implica: Telefonos, nombres, direcciones, fechas de nacimiento, hobbys etc.
2- ¿Cuanto creeis que un crackeador de hash, tipo john the ripper, tardaria en romper “1234” o “9834” ? Nada y menos.
Debemos escoger una clave robusta, minimo 8 digitos, y que contenga caracteres alfanumericos y signos. Una buena practica es usar acronimos cambiando algunas letras por numeros y añadiendo otros simbolos, ejemplo:
No hay menos libre que aquel que se siente libre sin serlo:
.n8m|Q4qs1s5;
Tambien hay aquel que se cree hacker y cree que escribiendo su clave en leet le salvara el culo, pues no. Actualmente las listas de password incluyen este tipo de pass, e incluso claves en hexadecimal, asi que al loro.
Para forzar la creacion de claves robustas puede hacerse uso de PAM (Pluggable Authentication Manager).
En el fichero /etc/pam.d/common-password vemos esto:
#password required pam_cracklib.so retry=3 minlen=12 difok=4
password required pam_unix.so use_authtok shadow md5
Descomentamos la linea, quedando del siguiente modo:
password required pam_cracklib.so retry=3 minlen=12 difok=4
password required pam_unix.so use_authtok shadow md5
Bien, ahora una explicacion sobre esa linea:
pam_cracklib.so : Verifica si la contraseña es facilmente rompible y si puede llegar a salir en un ataque de diccionario.
retry : Son los intentos de los que disponemos para elegir una clave correcta, en este caso 3.
minlen : Longitud minima de la clave, en este caso 12.
difok : cuantos caracteres se permite que hayan en la nueva contraseña que no estuvieran en la vieja.
Ahora nuestra clave sera un poco mas segura.
-Renovar nuestra clave
La mayoria de la gente, cuando tiene una clave mas o menos rebusta, olvida que no es suficiente y que hay que ir cambiando esta clave cada cierto periodo de tiempo.
Comando chage
mm@lee-$ chage
Modo de uso: chage [opciones] [USUARIO]
Opciones:
-d, --lastday ULTIMO_DÍA establecer el último cambio de clave a
ULTIMO_DÍA
-E, --expiredate FECHA_EXP establecer la fecha de expiración de la
cuenta a FECHA_EXP
-h, --help mostrar este mensaje de ayuda y terminar
-I, --inactive INACTIV deshabilitar la cuenta después de INACTIV
días de la fecha de expiración
-l, --list mostrar la información de envejecimiento
de la cuenta
-m, --mindays DÍAS_MIN establecer el número mínimo de días antes
de cambiar la clave a DÍAS_MIN
-M, --maxdays DÍAS_MAXS establecer el número máximo de días antes
de cambiar la clave a DÍAS_MAX
-W, --warndays DÍAS_AVISO set expiration warning days to WARN_DAYS
Para ver el estado de nuestra cuenta, podemos hacer: chage -l [nuestro_usuario], por ejemplo:
mm@lee-$ chage -l $(whoami)
Último cambio de contraseña :mar 03, 2009
La contraseña caduca : mar 23, 2009
Contraseña inactiva : mar 26, 2009
La cuenta caduca : nunca
Número de días mínimo entre cambio de contraseña : 2
Número de días máximo entre cambio de contraseñas : 20
Número de días de aviso antes de que expire la contraseña : 5
Imaginemos que en nuestro sistema hay un usuario llamado: leber
Sabemos que leber es muy olvidadizo y que cambiar la clave no entra en sus hobbys, asi que, le obligaremos a hacerlo:
mm@lee-$ sudo chage -M 30 -W 5 -m 2 -I 2 leber
Debera cambiar la contraseña a los 30 dias, cuando queden 5 dias se le avisara, y sino la cambia se le bloqueara la contraseña.
2.Acceso a cuentas y restricciones:
Existen herramientas que en según que momentos pueden ayudarnos y son realmente utiles, pero que son un arma de doble filo, este es el caso de sudo y su.
Sudo
Sudo es una herramienta muy flexible, pero peligrosa, y mucha gente hace de sudo algo para lo que no se penso, es decir, quitar la password y que todo el mundo pueda ejecutar sudo.
Ante eso, es preferible escribir en el archivo sudoers quien tendra acceso, desde donde, por quien y a que, por ejemplo:
leber localhost = /usr/bin/gcc
Leber tendra acceso a gcc como sudo, siempre y cuando la conexión tenga lugar en localhost.
Pueden crearse alias en los que pueda haber mas de un comando, especificar por quien se identificara, y especificar desde que anfitrion podra hacerse.
Pero iremos mas alla, miremos esta linea:
Defaults !lecture,tty_tickets,!fqdn
Esta linea se parte en 2 configuraciones, default es para el host, y el resto es parte de la configuracion, veamos por ejemplo el mio:
Defaults@10.0.0.2 !lecture,tty_tickets,!fqdn,insults,rootpw,timestamp_timeout=0,lecture=once,passwd_tries=2
Defaults@10.0.0.2: Sudo unicamente es ejecutado por nuestra ip (tambien puedes especificar el hostname)
insults: Si fallamos, nos insulta muy genuinamente, es divertido.
Rootpw: Nos pide la password de root.
timestamp_timeout=n : Indica que cada n minutos nos pedira la contraseña. Valor 0 indica que la pida siempre.
Lecture: Valores-> once(Aviso solo la primera vez de cada sesion)
never(Nunca avisa)
always(Siempre muestra el aviso)
passwd_tires = n : Donde n es el numero de intentos que tenemos para poner bien la clave.
Pueden establecerse muchas mas reglas y demas, cuestion de man sudo.
Es importante que el archivo /etc/sudoers este como 0440, es decir, lectura para root y grupo root.
Su
Debemos restringir el acceso a su, para que solo aquellos usuarios que lo requieran (como el admin), puedan hacer uso de el. Miremos, el archivo /etc/pam.d/su:
auth required pam_wheel.so group=wheel
Esta linea es la que interesa, ¿que quiere decir? Que solo los usuarios que pertenezcan al grupo wheel podran efectuar su. Asi que seria bueno añadir aquellos usuarios que lo necesiten al grupo wheel.
Tambien es bueno activar un fichero de log para su (viene desactivado casi siempre).
En el fichero /etc/login.defs:
#SULOG_FILE /var/log/sulog
Descomentamos la linea, y ya tendremos un log para su, donde podran verse por ejemplo:
SU 02/27 16:57 + pts/1 pepito-root
Lo cual dice que, el dia 27 de Febrero, a las 16:57, el usuario pepito hizo su a root.
Es una buena mania examinar el log habitualmente.
3.¿Necesitamos a root?
Es interesante plantearse esta pregunta. El usuario root es muy poderoso, en cualquier sentido y para cualquier cosa, y muchas veces, por carencia de seguridad en el sistema pueden corrompernos a este usuario y convertirse en Dios (a menos claro que lo tengamos capado, con las capability que se explicaran en otro articulo).
Deshabilitar root:
. Nos basta con cambiarle la shell a /usr/sbin/nologin:
sudo chsh -s $(which nologin) root
Y si probamos a conectarnos ahora como root:
mm@lee-$ su root
Contraseña:
This account is currently not available.
La hemos deshabilitado.
Tambien lo que podemos hacer es restringir a las zonas en las que root podra conectarse. Estas zonas estan en el fichero /etc/securetty, si comentamos por ejemplo:
# Standard consoles
#tty1
Y probamos a conectarnos a esa terminal, nos dara error, ya que deshabilitamos el acceso a root a esa zona. Si queremos que root no se conecte a ningun sitio:
Yo como soy vago y no me va eso de linea a linea:
mm@lee-$ sed -s 's/[a-z]/#&/' securetty > ~/securetty
Y sustituimos los archivos, dandole los permisos adecuados, claro.
Ahora root no podra loguearse a ninguna zona. Mejor así.
4.Asegurar servicios (en este caso ssh)
A veces tenemos servicios como ssh, apache, bind etc. Las configuraciones que vienen con estos servicios suelen ser inseguras por defecto, veremos como asegurar un poco ssh.
1 – Es recomendable cambiar el puerto por defecto. Sin embargo, solo nos evitaremos barridos que se hacen al puerto default, este es el 22, pero un buen scaneo dara con el puerto en cuestion.
Pongamos por ejemplo, 715 (Esto queda a vuestra eleccion)
2 – Deshabilitamos el logeo como root. No es recomendable permitirlo, ademas que, si se necesita, primero puede conectarse al servidor y una vez alli loguearse como root.
3 – Cambiar la v. del protocolo. La version 1 tiene algunos bugs, algunos permiten DoS y otros ejecucion de codigo arbitrario. Las versiones de openssh soportan tanto una como otra, pero sera mucho mejor si solo aceptamos protocolo 2.
4 – No permitamos contraseñas en blanco (¡ POR FAVOR !)
5 - Normalmente, cuando nos conectamos por ssh a una maquina, esta nos muestra un mensaje, incluyendo el saludo, la distribucion y otra información. Este banner lee de /etc/issue.net. Si no queremos que muestre ningun tipo de informacion lo mejor es comentarlo.
6 – Limitar el numero de intentos fallidos.
7 – Limitar el numero de logins por ip.
8 – Especificar que usuarios podran acceder y desde donde.
9 – Desactivar la autentificacion por password. Es mejor hacerlo mediante certificado de ssh.
Un ejemplo:
Port 768
Protocol 2
LoginGraceTime 20
PermitRootLogin no
PasswordAuthentication no
MaxAuthTries 2
MaxStartups 2
#Banner /etc/issue.net
AllowUsers w0wix@10.0.0.3
1.Indica que puerto escuchara
2.Indica que se usara protocolo 2
3.Indica el tiempo que la pantalla de login sera valida para entrar las credenciales
4.Deshabilitamos el logeo como root
5.Deshabilitamos la autentificacion por password (en su lugar haremos servir credenciales)
6.El numero de intentos fallidos que se permite
7.Indica que por IP se podran tener 2 pantallas de login
8.Comenta el banner para que no muestre informacion acerca del sistema
9.La directiva AllowUsers se usa para ver que usuarios son permitidos. En este caso el usuario w0wix es permitido solo desde la IP que se indica, 10.0.0.3 .
Como usar certificados:
1- Creemos par de claves (publica y privada)
ssh-keygen -t dsa
En este caso no creamos ninguna passphrase, asi que lo dejamos en blanco. Y el lugar de las claves dejadlo como os dice:
~/.ssh/
2- Ok, tenemos las claves en su sitio, para comprobar que no nos han timado, cuando terminemos, en la ultima linea, nos saldra el fingerprint , ahora comprobemos que sea el mismo de la llave publica.
ssh-keygen -l -f ~/.ssh/id_dsa
Deberia ser el mismo :_P, ale sigamos
3- Ahora copiemos nuestras llaves al servidor:
ssh-copy-id -i .ssh/id_dsa.pub usuario@servidor
Este comando creara el directorio ssh on permisos 700, dentro de este un archivo llamado authorized_keys, con permisos 600, que contendra las llaves.
4- Configuramos el servidor
Ahora deberemos configurar el servidor para que activar/desactivar algunas directivas:
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no
Lo dejamos asi, es para que no nos pida autentificarnos por pass
#AuthorizedKeysFile %h/.ssh/authorized_keys
La descomentamos, es para decirle donde estan las llaves
#RSAAuthentication yesYa que no haremos autentificacion por RSA, lo dejamos asi. Y ahora, al hacer ssh usuario@host, el servidor nos mandara un id, el cual cifraremos con nuestra clave privada y se lo devolveremos. El servidor tratara de descifrarlo con la clave privada asociada al usuario, si esta es la misma podra recuperar su id y nos dejara pasar. En modo simple podria ser: Clave a usar: 7 Contenido de fichero: hola Servidor envia fichero a cliente Cliente firma el fichero, sumandole 7 a cada letra (valor ascii, claro) y reenvia el fichero Servidor le resta 7 a cada letra del fichero, y si obtiene la palabra de principio, deja pasar. Si la clave del cliente hubiera diferido de la del servidor, en este caso 7, la palabra que hubiera recibido el servidor no seria “hola”, asi que no nos permitiria el acceso. Esto es explicado muy garrulamente y asi en plan mal, pero es para que mas o menos lo entendais. En proximas entregas contare como asegurar otros servicios. 5.Administrar logs del sistema Durante el dia, se van generando logs de distintos temas en el sistema. Durante el arranque del sistema, logs del kernel, logs de mail, logs de ssh, logs de iptables (si tenemos, claro) etc. Estos logs muchas veces pasan al olvido, sin que los revisemos, y es una mala idea, ya que no nos percatamos de lo que de verdad ocurre en nuestro sistema. A veces es algo tedioso ir de log en log, filtrando busquedas y demas, pero tambien podemos hacernos nuestros scripts, o usar alguna herramienta preparada para esto, vease el caso de logwatch. Logwatch es una herramienta pensada para esto. Recoge informacion de los logs, los resume según el nivel de prioridad que le especifiquemos en la configuracion y luego puede hacer esto: O bien lo enseña por stdout O bien lo manda a un fichero O bien lo manda a una cuenta de correo, ya sea local o externa Eso podemos especificarlo en la configuracion. Igual que podemos especificar que tipo de servicios queremos hacer logs (yo prefiero todos), y que mensajes recoger, aquí os dejo mi conf:######################################################## # This was written and is maintained by: # Kirk Bauer# # Please send all comments, suggestions, bug reports, # etc, to kirk@kaybee.org. # ######################################################## # NOTE: # All these options are the defaults if you run logwatch with no # command-line arguments. You can override all of these on the # command-line. # You can put comments anywhere you want to. They are effective for the # rest of the line. # this is in the format of = . Whitespace at the beginning # and end of the lines is removed. Whitespace before and after the = sign # is removed. Everything is case *insensitive*. # Yes = True = On = 1 # No = False = Off = 0 # Default Log Directory # All log-files are assumed to be given relative to this directory. LogDir = /var/log # You can override the default temp directory (/tmp) here TmpDir = /var/cache/logwatch #Output/Format Options #By default Logwatch will print to stdout in text with no encoding. #To make email Default set Output = mail to save to file set Output = file Output = mail #To make Html the default formatting Format = html Format = text #To make Base64 [aka uuencode] Encode = base64 Encode = none # Default person to mail reports to. Can be a local account or a # complete email address. Variable Print should be set to No to # enable mail feature. MailTo = mi@cuenta.com # WHen using option --multiemail, it is possible to specify a different # email recipient per host processed. For example, to send the report # for hostname host1 to user@example.com, use: #Mailto_host1 = user@example.com # Multiple recipients can be specified by separating them with a space. # Default person to mail reports from. Can be a local account or a # complete email address. MailFrom = mi_user # if set, the results will be saved in instead of mailed # or displayed. Be sure to set Output = file also. #Filename = /tmp/logwatch # Use archives? If set to 'Yes', the archives of logfiles # (i.e. /var/log/messages.1 or /var/log/messages.1.gz) will # be searched in addition to the /var/log/messages file. # This usually will not do much if your range is set to just # 'Yesterday' or 'Today'... it is probably best used with # By default this is now set to Yes. To turn off Archives uncomment this. #Archives = No # Range = All # The default time range for the report... # The current choices are All, Today, Yesterday Range = yesterday # The default detail level for the report. # This can either be Low, Med, High or a number. # Low = 0 # Med = 5 # High = 10 Detail = High # The 'Service' option expects either the name of a filter # (in /usr/share/logwatch/scripts/services/*) or 'All'. # The default service(s) to report on. This should be left as All for # most people. Service = All # You can also disable certain services (when specifying all) #Service = "-zz-network" # Prevents execution of zz-network service, which # prints useful network configuration info. #Service = "-zz-sys" # Prevents execution of zz-sys service, which # prints useful system configuration info. #Service = "-eximstats" # Prevents execution of eximstats service, which # is a wrapper for the eximstats program. # If you only cared about FTP messages, you could use these 2 lines # instead of the above: #Service = ftpd-messages # Processes ftpd messages in /var/log/messages #Service = ftpd-xferlog # Processes ftpd messages in /var/log/xferlog # Maybe you only wanted reports on PAM messages, then you would use: #Service = pam_pwdb # PAM_pwdb messages - usually quite a bit #Service = pam # General PAM messages... usually not many # You can also choose to use the 'LogFile' option. This will cause # logwatch to only analyze that one logfile.. for example: #LogFile = messages # will process /var/log/messages. This will run all the filters that # process that logfile. This option is probably not too useful to # most people. Setting 'Service' to 'All' above analyizes all LogFiles # anyways... # # By default we assume that all Unix systems have sendmail or a sendmail-like system. # The mailer code Prints a header with To: From: and Subject:. # At this point you can change the mailer to any thing else that can handle that output # stream. TODO test variables in the mailer string to see if the To/From/Subject can be set # From here with out breaking anything. This would allow mail/mailx/nail etc..... -mgt mailer = /usr/bin/mail # # With this option set to 'Yes', only log entries for this particular host # (as returned by 'hostname' command) will be processed. The hostname # can also be overridden on the commandline (with --hostname option). This # can allow a log host to process only its own logs, or Logwatch can be # run once per host included in the logfiles. # # The default is to report on all log entries, regardless of its source host. # Note that some logfiles do not include host information and will not be # influenced by this setting. # #HostLimit = Yes # vi: shiftwidth=3 tabstop=3 et Es bueno pasarlo unavez al dia, asi que lo podemos añadir con cron para que se ejecute por ejemplo, a las 3 de la mañana.
Tambien existe swatch (herramienta de la que hablare otro dia), que permite ademas, actuar en consecuencia con los logs.
Tambien existen algunos comandos que nos ayudan en cierta manera:
lastlog: Muestra las conexiones a nuestra maquina. El usuario, a donde conecto, desde donde lo hizo, y la fecha.
Ejemplo:
mm@lee-$ lastlog | grep j4ck j4ck pts/4 XX.XXX.XX.XX vie feb 27 18:46:38 +0100 2009last: Muestra la ultima vez que se conecto un usuario
Ejemplo:mm@lee-$ last | tail -1 mm pts/1 :0.0 Sun Mar 1 16:06 - 17:36 (01:30)A veces tambien va bien ver que conexiones tenemos establecidas/escucha etc. Con netstat es sencillo:
netstat -anpY ver que puertos tenemos a la escucha:
nmap -sT -O localhostEsto fue todo por ahi, en la siguiente entrega hablaremos sobre iptables+port knocking, sobre IDS (Sistemas de Deteccion de Intrusos), y sobre otros servicios como vsftp por ejemplo
Espero que os ayude y que os haya gustado, un saludo :P.
mod_evasive Apache
by admin on Feb.26, 2009, under C
Pues si señores, dicho modulo, fue empezado y dejado sin terminar (lo digo porque funciona en versiones <= 2.0), y entre un amigo y yo decidimos cogerlo y adaptarlo a las nuevas versiones.
Antonio (mi amigo) ya empezo a reescribir parte del codigo para ver que tal, y dio buenos resultados, asi que en cuanto tenga el codigo impreso en mis manos (mañana si no me muero), empezare a estudiarlo y a ver que podemos sacar entre los dos.
Para todo el que quiera echarle una ojeada, esta aqui
La web del proyecto inicial es esta
Ire colgando aqui los cambios.
Curriculum
by admin on Feb.17, 2009, under Curriculum
Pues bien, aqui estamos, y por fin actualice mi curriculum para incorporarle nuevas caracteristicas que aprendi, asi que, sin mas, en esta url lo encontrareis:
http://nullbyte.net/Curriculum/curriculum_new.pdf
Argumentos variables
by admin on Dec.23, 2008, under C
Alguna vez os habeis preguntado como es posible que funciones de la familia printf/scanf, como sscanf, snprintf, fscanf … son moldeables en cuanto a argumentos?
Es algo curioso, y que casi siempre usamos; hoy lo explicaremos.
Antes, sin embargo, son necesarias unas clases teoricas a bajo nivel:
Stack (o Pila):
La pila es una zona de memoria temporal y cuando se llama a una funcion, los argumentos que se le pasan, la direccion de retorno, variables automaticas que se crean en la funcion etc son guardados en la pila.
De ahi a que, cuando llamamos a una funcion, si devolvemos una variable automatica, esta se destruya, ya que se destruye todo lo referente a esa funcion en la pila(menos variables de tipo estatico o en heap).
La pila es un mecanismo LIFO(Last In First Out), puede sonar extravagante pero es mas bien bastante sencillo.
Pensemos en una pila de libros, unos encima de otros, y el ultimo en poner, sera el primero en salir. A estas funciones se les denomina push y pop(push - poner | pop - sacar).
Imaginemos algo:
void ejemplo(int num1, int num2)
void ejemplo(int num1, int num2)
{
int resultado;
resultado = num1 + num2;
}
Cuando llamemos a la funcion ejemplo, en la pila se creara una instancia para esta funcion, la cual contendra:
-Variables automaticas
-Argumentos pasados
-Punto de retorno
-Otros
¿Como obtener los argumentos?
Imaginemos que llamamos a la funcion:
ejemplo(30,15);
Pensemos pues, que la direccion de memoria del primer parametro es A, en [A] estara el valor 30, y en [A+sizeof(int)] estara 15. Recordemos que un int ocupa 4 bytes en memoria.
Por lo tanto:
en - AAAA esta 30, AAAA+4bytes estara 15.
Como vemos, las variables estan contiguas en memoria
Ahora imaginemos una funcion de este tipo:
void prueba(char *fmt, ...);
Y su llamada:
prueba("Hola que tal",2,15);
Recordando lo que antes vimos, en [A] se almacena la direccion de memoria de “H”, entonces [A+sizeof(char *)] estara “o” y asi ir haciendo, de este modo es simple sacar todos los argumentos que se pasaron a la funcion.
Un include de mucha ayuda:
stdarg.h
En este fichero de cabecera estan declaradas una serie de macros que nos ayudaran a gestionar este tipo de funciones, primero lo explicaremos un poco por encima y luego veremos un ejemplo:
va_list -> Tipo de dato que define un puntero a la lista de argumentos variables.
va_start-> Esta es una macro que inicializa el puntero “va_list” tomando en cuenta el ultimo argumento pasado
va_arg -> Macro que devuelve el valor del siguiente argumento
va_end-> Macro para finalizar
Veamos un pequeño ejemplo, haremos nuestro propio “printf”:
void myprintf(char *fmt, ...)
{
char *c = NULL;
va_list inicio; /*Puntero a la lista de argumentos*/
va_start(inicio, fmt);
for(c = fmt ; *c ; c++)
{
if(*c != '#') //Si encontramos eso, esque a continuacion puede haber un argumento
{
putchar(*c);
continue;
}
switch(*++c)
{
case 's':
printf("%s",va_arg(inicio,char *)); //Para strings
break;
case 'i':
printf("%d",va_arg(inicio,int)); //Para enteros
break;
case 'o':
printf("%c",va_arg(inicio,int)); //Para char, recordemos que aqui el char a es promovido a entero
break;
default:
putchar(*c); //Si no es ninguno de los 3, imprimimos el caracter
break;
}
}
va_end(inicio);
}
Ahora toca probarlo:
#include
#include
void myprintf(char *fmt, ...); //prototipo
int
main(void)
{
const char *name = "leb3rus";
printf("Demostracion de funcion \"myprintf\"\n\n");
myprintf("Hola, me llamo #s y tengo #i anios y mi nombre empieza por #o\n","Pepe",7,'P');
myprintf("Bueno, espero que lo hayais entendido todo - by #s\n",name);
return 0;
}
Y el resultado es:
< /dev/null > ./myprintf
Demostracion de funcion "myprintf"
Hola, me llamo Pepe y tengo 7 anios y mi nombre empieza por P
Bueno, espero que lo hayais entendido todo - by leb3rus
———-
Espero haber aclarado algunas dudas
Cifrado de particiones en GNU/Linux
by admin on Nov.26, 2008, under GNU/Linux
Hoy en dia, no podemos obviar que la informacion es muy valiosa, y que esta puede ser usada con distintos fines.
A veces, queremos salvaguardar nuestros datos,sean del tipo que sean, de miradas ajenas y de usos indebidos de la informacion que estos contienen, asi que hoy hablare sobre el cifrado de particiones en GNU/Linux.
Empezaremos por lios requisitos:
- Utileria cryptsetup
- Tener activado el soporte para Device Mapper, Crypt target y el algoritmo que deesemos. Vamos a ver donde se encuentra cada uno:
Cargamos la configuracion del nucleo, y nos dirigimos a <Device Drivers> -> <Multiple devices driver support> e integramos al nucleo las opciones “Device mapper support” y “Crypt target support“, o tambien los podemos añadir como modulos, eso es a nuestro gusto.
Luego nos dirigimos a <Cryptographic API> y activamos soporte para el algoritmo que deseemos usar, en mi caso AES.
Los modulos, si asi lo hemos hecho, se llaman: dm-mod, dm-crypt y en mi caso aes-i586.
Bien, si hemos llegado aqui significa que todo ha ido bien, continuemos:
En mi caso, monte un disco ide de 20 gb si mal no recuerdo. Pues bien, al guante:
-Ciframos la particion:
cryptsetup --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/hda1
Analizemos las opciones:
[cryptsetup] - Nombre de la utilidad
[--cipher aes-cbc-essiv:sha256] - Le indicamos el algoritmo de cifrado
[--key-size 256] - Cuantos bits compondran la clave
[luksFormat] - LUKS es un estandart para el cifrado de discos duros , cifra la particion con la llave que o la podemos escribir en un prompt que nos presente, o de un fichero de texto.
[/dev/hda1] - Particion o disco a cifrar.
Se nos abrira un prompt, pidiendos la clave, se la ponemos y todo correcto.(Es importante no olvidar esta clave, luego dire el por que)
Ahora crearemos el volumen logico, que aplica una capa de cifrado encima de /dev/hda1.
cryptsetup create [nombre_que_queremos] [particion], en mi caso seria este:
cryptsetup create unmerciful /dev/hda1
Ahora se nos habra creado el volumen en /dev/mapper, llamado /dev/mapper/unmerciful. Pasemos a darle formato para el fs que queramos, en mi caso ext3.
mkfs.ext3 /dev/mapper/unmerciful
Ahora probemos a montarlo:
mount /dev/mapper/unmerciful /mnt/[directorio_que_hayamoscreado]
Bien, todo funciona correctamente, pero que pasa? Despues de cada reinicio deberemos de crear el volumen logico otra vez, pero esto no es problema si sabemos scriptear ni que sea un poco.
Aviso: Para distribuciones Debian/Ubuntu creo que existe un script llamado cryptdisks.
Asi que, vamos a hacer un script, el mio quedo asi:
#!/bin/bash
#Creacion volumen logico
echo "Se creara el volumen logico"
cryptsetup create unmerciful /dev/hda1
echo "Montando particion cifrada"
mount /mnt/hardf0rce
(Se le pueden incluir mas cosas, pero para el ejemplo nos esta bien)
Demosle permisos de ejecucion, y añadimos al script perteneciente al runlevel, en mi caso es rc.M.
Ahora le añadimos una linea a /etc/fstab, (importante que no se monte automaticamente, ya que nos dara error al no haber creado el volumen logico)
La linea quedaria asi:
/dev/mapper/unmerciful /mnt/hardf0rce ext3 noauto,exec,user,rw 0 0
Importante, quien no conozca la clave, nunca podra crear el volumen logico, y dara un fallo de fs.
Ahora, para controlar el acceso al hd, haremos una cosa. Crearemos un grupo, y meteremos nuestro usuario en el.
groupadd [nombre_grupo]
gpasswd -a [user] [grupo]
Ahora cambiamos el grupo y los permisos de /mnt/[directorio] donde montaremos la particion cifrada.
chgrp [nombre_grupo] [directorio]
>chmod 770 [directorio]
[Como se ve, owner y group pueden hacerlo todo, en mi caso es r00t, y el grupo que cree, mientras que otros no tienen acceso al directorio]
Espero que le sea de utilidad a alguien y que ayude a resolver dudas.
Agradecimientos a:
- Especial mencion a z0t0, por guiarme sobre esto y mas cosas.
- http://www.saout.de/misc/dm-crypt/
- man cryptsetup
Como siempre
by admin on Nov.11, 2008, under Introspeccion
Como siempre, en todo, hay una primera vez, y esta es la mia tocante al tema de los blogs.
Y bien, aqui ire colgando algunos how to’s que, espero, sean de ayuda, sin mas
Saludos