Archive for FreeBSD
June 14, 2008 a las 2:41 pm por Edwin Plauchu · Archivado en Ubuntu, Programacion, FreeBSD, Linux
Aqui les hablare de las 3 mas comunes formas de encriptacion de datos, que actualmente conosco.
• Funciones Hash
• Cifradores simetricos
• Cifradores asimetricos
Funciones Hash
Las funciones hash son faciles de computar pero dificil de aplicarles ingenieria en reversa.
Aque me refiero con esto?, lo explicare con un ejemplo sencillito sobre sistemas linux:
$ echo "Esto se encriptara mediante una funcion hash" | md5sum
f538fb4f2360fcbb3af0f31cdd479829
$ echo "Esto se encripta mediante una funcion hash" | md5sum
fa5f1a88d876d3974a501b3a9c140e2a
Observemos que la cadena introducida via pipe a el comando md5sum nos ha generado un valor hexadecimal, este valor dificilmente podria llegar a ser igual a otro, que quiero decir con esto? Que no hay dos cadenas que computen el mismo valor. Matematicamente podrias llegar a la siguiente deduccion:
f(x) = valor_resultante_para_x_unico
o bien
md5sum("cadena_a_encriptar") = valor_resultante_para_cadena_a_encriptar_unico

Uso comun
Un uso muy comun de esto, lo puedes ver cuando te has bajado una distribucion linux. En los servidores ftp donde se pone a disposicion la descarga de las imagenes de los DVDs que componen a una distribucion linux, tambien se te ofrecen los valores hash md5 que corresponden a cada imagen, una vez que has descargado una de las imagenes… Habras de comparar que estas imagenes te den el valor md5 indicado por los fabricantes de dicha distribucion linux.
$ md5sum redhat5.1.iso
fa5f1a88d876d3974a501b3a9c140a2d
Si el valor fa5f1a88d876d3974a501b3a9c140a2d es el que indica el fabricante de la distribucion linux, entonces la imagen que hemos de quemar en un dvd virguen, es la correcta… pero si el valor no es el indicado por el fabricante… lo mas probable sera, que te estes bajando un fichero imagen corrupto, o en el peor de los casos… una copia alterada por alguien que ha vulnerado el servidor ftp.. y te ha colocado un backdoor sobre la distribucion que aun no te has instalado.
Cifrados Simetricos
Un Cifrado Simetrico es una transformacion, que fue llevada a cabo por un llave secreta, Esta llave traduce su entrada conocida como texto plano, a un salida conocida como texto cifrado, de esta manera excluimos el criptoanalisis(accion contraria a la criptografia..) , solo aquella entidades que posean la llave secreta podran recobrar el texto plano que esta oculto sobre el texto cifrado.

Los Cifrados Simetricos tienen una larga historia, y han mutado en variantes de los mismos bastante interesantes.. una de estas variantes es el triple-DES… muy usado por routers de prestigio hoy en dia.
Cifradores Asimetricos
Un cifrador asimetrico es semejante a un cifrador simetrico, pero el asimetrico ejerce su poder en el uso de un par de llaves.. y no solo una llave como lo hace el simetrico.
El par de llaves a las cuales hago referencia son las siguientes:
• Llaves Publicas -- Usadas para encriptar el texto plano
• Llaves Privadas -- Usadas para desencriptar el texto cifrado
Las llaves son generadas de una manera sencilla, lo cual permite deducir cual es la llave privada y cual es la publica. Aplicarle ingenieria en reversa a estas llaves, es algo sumamente dificil.
Esta fabulosa propiedad permite a la gente el intercambiar sus llaves publicas sobre canales o comunidades y mantener conductos de comunicacion completamente privados.
Los mas notables sistemas de cifrado asimetrico inclullen funciones Diffie-Hellman y RSA (como openssl). Los sistemas de encriptacion asimetrica son usados comunmente para intercambiar llaves de sistemas simetricos.
January 11, 2008 a las 12:04 pm por Edwin Plauchu · Archivado en Windows, Programacion, GPL, FreeBSD, Linux, Solaris
Vamos a crear un buscador que busque en una tabla de nuestra base de datos y que según el número de palabras buscadas utilice LIKE o el Full Text Search de MySQL.
Que és Full Text Search?
El Full Text Search utiliza los índices de la tabla para hacer las búsquedas y hace las comparaciones de la misma forma que se hacen en los grandes buscadores y no como una comparación sencilla y costosa en tiempo como la utilizada por el like.
El resultado que devuelve es ordenado por similitud a las palabras o cadena buscada, esto se puede hacer ya que cuando va encontrando los resultados el mismo le asigna un indice de similitud a lo buscado, con lo que podemos saber lo exacto que es el resultado.
Para crear el índice en la tabla a buscar haremos:
ALTER TABLE noticias ADD FULLTEXT(titulo, texto);
Suponiendo que la tabla se llama noticias y los campos que queremos buscar són titulo y texto. Debemos tener en cuenta que los campos del índice solo pueden ser Char, Varchar o TEXT.
Nota: Los índices hacen que las tablas ocupen más espacio en disco peró agilizan mucho las búsquedas.
MATCH … AGAINST
Para buscar en la tabla utilizando el índice, haremos:
SELECT * FROM el índice WHERE MATCH(titulo, texto)
AGAINST ('palabras_a_buscar')
Si queremos saber noticias de similitud del resultado podemos hacer:
SELECT * FROM noticias WHERE MATCH(titulo, texto)
AGAINST ('palabras_a_buscar') AS similitud
Donde similitud sera el valor de aproximación a la busqueda.
Problemas del MATCH … AGAINST
El problema principal es que ens busquedas de una sola palabra acostumbra a fallar, ya que tiene un límite dado por el MySQL de busqueda de palabras mayores o iguales a 4 carácteres, por lo que si buscasemos por ejemplo PHP no tendriamos resultado. Lo que haremos es mirar si la cadena que nos llega es de una sola palabra o de más de una, en caso de ser una haremos la búsqueda usando LIKE y si es más de una usaremos MATCH … AGAINST Buscador con paginación.
//Conectar con la base de datos,
//también podemos poner el ADODB
//Yo utilizo conexiones con código directamente aquí
include ("conexion_bd.php");
if ($p_busca!='')
{ if (!$num) $num=0;
//Separamos las palabras usando cada espacio como separador
//Hacemos la separación de la cadena a buscar
$cadena_buscada=explode(" ",$p_busca);
if (count($cadena_buscada)==1)
{
//Si solo hay una palabra usamos LIKE
$sql=" SELECT SQL_CALC_FOUND_ROWS titulo, texto
FROM noticiasLIKE '%".$p_busca."%' OR texto LIKE '%".$p_busca."%'
WHERE titulo
LIMIT ".$num.",10";
}
elseif (count($cadena_buscada)>1)
{
//Si hay más de una palabra usaremos MATCH AGAINST
$sql=" SELECT SQL_CALC_FOUND_ROWS titulo, texto, MATCH (titulo, texto)
AGAINST MATCH (titulo,AS Score FROM noticias
('".$p_busca."') texto) AGAINST ('".$p_busca."')
WHERE BY Score DESC LIMIT ".$num.",10";
ORDER
}
$rs = $db->Execute($sql);
if (!$rs) echo $conn->ErrorMsg();
else if ($rs->fields["id"])
{ while (!$rs->EOF)
{ echo $rs->fields["titulo"].'‘.$rs->fields[”texto”];
} $rs->MoveNext();
}
else
echo ‘No se han encontrado resultados correspondientes a su búsqueda.’;
//Paginación
$rs_cont=$db->Execute (”select found_rows() as total_filas”);
if ($rs_cont->fields[”total_filas”]>10)
{ for ($i=0; $i<$rs_cont->fields[”total_filas”] && $i<50; $i=$i+10)
{ $a++;
echo '[’.$a.’] ’;
} }
}
December 28, 2007 a las 2:42 pm por Edwin Plauchu · Archivado en FreeBSD, Linux, Solaris
Los siguientes criterios de configuracion, los he aplicado a un servidor de 8 cores y 8 gb en RAM, y la cosa funciona de maravilla.
Sobre el MYSQL que corre en este servidor hay tablas tanto innodb como myisam. incluyo parametros para las dos engines.
[mysqld]
innodb_log_buffer_size=8M
#Explicacion: medida del buffer que innodb usara para su archivo de log.
#Consecuencia:Un buffer de log grande, permite a transacciones extensas ejecutarce, sin necesidad de acceso a disco antes de que la
# transaccion se confirme.
#Criterio de calculo: 1MB por cada GB de RAM.
innodb_buffer_pool_size=4294967296
#Explicacion: Empleado para almacenamiento intermedio de los datos e indices de sus tablas
#Consecuencia: Mientras mas grande sea este valor menos operaciones de IO disco seran necesarias para acceder a los datos de las tablas.
#Criterio de calculo: En un servidor de base de datos dedicado se puede asignar hasta el 80% de la memoria RAM. No dedicados Menos del 50% de RAM.
innodb_buffer_mem_pool_size=16M
#Explicacion: almacena info del diccionario de datos y estructuras internas, el valor por defecto es de 1MB
#Consecuencia: Evita que se haga paginacion a disco cuando, se acaba la memoria de este pool.
#Criterio de calculo: Entre mas tablas se tengan en la aplicacion, mayor debera ser el tamaño de este buffer,.
join_buffer_size=16777216
#Explicacion: buffer que se usa para joins que no usan índices (full joins)
#Consecuencia: obtencion de un full join más rápido ( cuando se añaden índices no es posible.)
#Criterio de calculo:2097152 bytes por cada Gigabyte de RAM.
skip-bdb
skip-ndbcluster
#Explicacion: Deshabilita el soporte para base de datos bdb y ndbcluster
#Consecuencia: Ahorro en la memoria asignada por sistema operativo al proceso mysqld
innodb_data_file_path=/dev/hdc1:250MBraw;/dev/hdc2:250MBraw
#Explicacion: Utilizar dispositivos crudos como Datafiles
#Consecuencia: Aumento en velocidad relacionada a operaciones de IO sobre disco.
query_cache_size=134217728
#Explicacion: Almacena el texto de una consulta SELECT junto con el resultado que se le envió al cliente.
#Consecuencia: Si se recibe una consulta idéntica posteriormente, el servidor devuelve el resultado de la
# caché de consultas en lugar de parsear y ejecutar la consulta de nuevo.
#Criterio de calculo:16777216 bytes por cada Gigabyte de RAM.
query_cache_limit=1M
#Criterio de calculo: consultas menores a 1MB no merecen ser cacheadas.
query_cache_type=1
#Consecuencia: Permite el cacheo excepto para aquellos comandos que empiecen con SELECT SQL_NO_CACHE
key_buffer_size=100663296
#Explicacion: Cachea los bloques de índices para tablas MyISAM. Cada vez que una búsqueda usa un índice,
# MySQL mirará antes de nada a ver si el índice relevante está o no en memoria.
#Consecuencia: Incrementando el valor se obtiene un mejor tratamiento de índices y por consecuencia, mejor rendimiento.
#Criterio de calculo:12582912 bytes por cada Gigabyte de RAM. Pero si solo se utilizan tablas MyISAM utilice 5% a 50% de la RAM.
sort_buffer=67108864
#Explicacion: Búffer de ordenación se usa para responder a búsquedas que involucren el ordenamiento de los datos -aquellas
# con una sentencia ORDER BY en ellas. Además, el búffer de ordenaciónse usa para las búsquedas que involucren
# agrupar datos -aquellas con una sentencia GROUP BY.
#Consecuencia: Reduce dramáticamente la cantidad de tiempo que se usa para ordenar grandes grupos de resultados
#Criterio de calculo: 8388608 bytes por cada Gigabyte de RAM.
read_buffer_size=8M
#Explicacion: Cada thread que realiza un escaneo secuencial reserva un buffer de su tamaño (en bytes) para cada tabla que escanea.
# Si realiza muchos escaneos secuenciales, puede incrementar este valor.
#Consecuencia: Mejora el rendimiento en los escaneos secuenciales.
#Criterio de calculo: 1MB por cada Gigabyte de RAM.
open_files_limit=4096
#Explicacion: limite de archivos abiertos por mysql
#Consecuencia: Ciertas operaciones requeriran mas de 1024 descriptores de archivos abiertos en mysqld, sobre todo aplicaciones web.
#Criterio de calculo: 1024 es el predeterminado, aumente este valor si observa errores referentes a esto en el log de errores de mysql.
# No aumente este valor mas alla de 4kb.
[mysqldump]
quick
Si tienen algo que agregar a esta configuracion, u algun otro criterio, lo anexare a este articulo a la brevedad.
Feliz año nuevo 2007 
November 13, 2007 a las 9:42 am por Edwin Plauchu · Archivado en Ubuntu, FreeBSD, Linux, Solaris
lsof (ls Open Files) o listado de archivos abiertos, es una gran aplicación pero bastante desconocida y que nos puede sacar de muchas dudas o apuros. lsof es una herramienta muy completa, por lo que en éste articulo solo se muestra la información que más vamos a necesitar.
NOTA: Si se quiere saber más sobre el uso de lsof ejecutad “man lsof “.
Utilidad de lsof.
Como he dicho antes, lsof muestra los archivos y procesos abiertos en el moment o del chequeo, por lo que nos será de utilidad para llevar un seguimiento de seguridad o de procesos bloqueados.
Desmontando un CD rebelde.
# umount /cdrom
umount: /cdrom: device is busy
Vaya, ¡¿por qué no se desmonta y me dice que el dispositivo está ocupado?! No se ha desmontado porque algun proceso esta haciendo uso del CDROM y hasta que no lo libere no podremos desmontarlo, el problema es que desconocemos que aplicacion se encuentra usando dicho CDROM, mediante lsof podremos conocerlo.
# lsof +D /cdrom
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
konqueror 621 zx80 cwd DIR 3,64 2048 57344 /cdrom
lsof nos dice que el proceso konqueror está usando el directorio /cdrom con el usuario zx80. La solución es sencilla entoces, basta con cerrar konqueror y problema resuelto. Para los que usamos mucho la consola y llegamos a tener unas cuantas sesiones abiertas pasa que en vez de konqueror puede salir bash. Esto es debido a que alguna de las consolas está dentro del directorio activo del cd-rom, por lo que bastaría salirse del directorio de trabajo del CD o cerrar ese bash.
# kill 621
Ya podemos desmontar.
Quien está detrás de una conexión ?
Esta vez usamos la herramienta netstat. Para quien no conozca esta herramienta decir que es un monitor de red. Nos dirá qué conexiones activas tenemos y mucha inform ación sobre ellas. Vamos a ver qué conexiones tenemos activas:
# netstat - n
Active Internet connections (only servers)
Proto Recv- Q Send - Q Local Address Foreign Address
tcp 0 0 *:printer *:* LISTEN
tcp 0 0 localhost:www *:* LISTEN
tcp 0 0 *:6000 *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
Nos muestra información sobre algunos puertos en espera (Listen) pero desconocemos qué aplicación está detrás. Me llama la atención el puerto TCP 6000, así que voy a ver quien está detrás:
# lsoft - i :6000
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
X 279 root 3u Ipv4 349 TCP *:3000 (LISTEN)
Vemos que la aplicacion X es la culpable de que el puerto 6000 esté abierto y a la espera.
Qué procesos están usando un directorio.
Una de las utilidades que más se usan es averiguar qué aplicaciones están trabajando en un directorio concreto. Se usa esta opción sobre todo para vigilar el uso de troyanos o espias. SI quisiera saber qué procesos están usando mi directorio pondría lo siguiente:
pianodaemon@pianodaemon-laptop:~$ lsof +D /home/pianodaemon/
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
x-session 5962 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
compiz 6013 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
gnome-pan 6015 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
nautilus 6017 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
emerald 6127 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
compiz.re 6128 pianodaemon cwd DIR 8,1 4096 6684674 /home/pianodaemon/
................ ...
Otros usos.
Estos son otros usos de la herramienta lsof, que aunque son algo menos usados nos pueden sacar de algun apuro o duda.
# lsof - g n: Donde n es un ID de grupo.
Esto muestra los archivos abiertos por un grupo que queramos. Si quisieramos ver los archivos de varios grupos a la vez, los separariamos por comas:
# lsof - g wheel,users
# lsof - u n: Donde n es un ID de usuario, lo que nos mostrará los archivos abiertos por ese usuario. Al igual que con los grupos, se pueden especificar varios usuarios de una vez.
# lsof - l: Para no convertir el ID a nombre de usuario, útil en casos de logeos corruptos o sistemas lentos.
# lsof - N: Nos muestra los archivos NFS abiertos.
November 12, 2007 a las 11:56 am por Edwin Plauchu · Archivado en Programacion, FreeBSD, Linux, Solaris
Introducción
Como muchos ya saben, muchas cosas se manejan en Unix, y en consecuencia en Linux, como si fueran archivos, se abren, se cierran, se escribe en ellos, etc. Este pequeño artículo hace referencia a las marcas de tiempo que ponen los Unix en dichos archivos. Al menos los que estan basados en inodes.
Viendo las marcas de tiempos
Para el principiante el comando ls es su primera opción pero si entra en problemas, como yo lo hice, puede que se frustre con dicho comando. Ejemplo:
root@pianodaemon-laptop:/home/pianodaemon# ls -l proto.sh
-rw-r--r-- 1 pianodaemon pianodaemon 4878 2007-11-09 12:44 proto.sh
¿ En este caso qué marca de tiempo estamos viendo ?
Las tres marcas
Unix pone tres marcas de tiempo a un archivo:
stat el comando
stat es parte del paquete coreutils de GNU. Por favor, instalatelo si esta disponible para tu plataforma, hasta donde se, Linux, AIX, Solaris, y otros sabores de Unix, Esto te va a ahorrar muchos dolores de cabeza.
Cuando se crea por primera vez un archivo, por ejemplo con el comando touch, las tres marcas tienen el mismo valor. Miremos ahora la salida de stat del mismo archivo ejemplo:
root@pianodaemon-laptop:/home/pianodaemon# stat proto.sh
File: `proto.sh'
Size: 4878 Blocks: 16 IO Block: 4096 archivo regular
Device: 801h/2049d Inode: 6685006 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/pianodaemon) Gid: ( 1000/pianodaemon)
Access: 2007-11-09 17:27:44.000000000 -0600
Modify: 2007-11-09 17:27:44.000000000 -0600
Change: 2007-11-09 17:27:44.000000000 -0600
¡Esto si es información completa ! Vemos reportado, el nombre, el tamaño, los bloques, el tipo de archivo (regular), información física de donde se encuentra (dispositivo/inode), los permisos estandar, los dueños del archivo y las tres marcas de tiempo Unix.
Opciones interesantes de formato de salida del comando stat:
- %X Time of last access as seconds since Unix Epoch
- %x Time of last access
- %Y Time of last modification as seconds since Unix Epoch
- %y Time of last modification
- %Z Time of last change as seconds since Unix Epoch
- %z Time of last change
Las opciones en mayúscula nos imprimen la marca de tiempo transcurrido desde la Epoca Unix, y las opciones en minúscula imprimen la marca de tiempo legible para el humano.
Ejemplo:
root@pianodaemon-laptop:/home/pianodaemon# stat --format=%X proto.sh
1194650864
root@pianodaemon-laptop:/home/pianodaemon# stat --format=%x proto.sh
2007-11-09 17:27:44.000000000 -0600
Ambos “números” son equivalentes m¡s el primero es un número absoluto, el segundo es interpretado ya que muestra la configuración de la zona horaria (-0600). Mi configuración de hora/fecha es zona America/Mexico y uso UTC.
Marca de Tiempo
Las marcas de tiempo se almacenan en el inode del archivo correspondiente con, hasta donde he confirmado, 32 bits de codificacion. Estos enteros son con signo, los negativos representan fechas en el pasado de la época Unix, y los positivos, fechas futuras desde la época Unix. La época Unix es la hora/fecha 00:00:00 UTC del 1ero de Enero de 1970.
Algunos datos para desarrolladores Python
En lo personal prefiero el desarrollar scripts sobre el interprete Python a bash. Asi que uso stat sobre el mismo:
import os, glob
from stat import *
for folder in glob.glob( base_path ):
for file in glob.glob( folder + '/*.mp3' ):
print file
# retrieves the stats for the current file
# return the last-modified-date
last_mod_date = os.stat( file )[ST_MTIME]
print last_mod_date
June 12, 2007 a las 10:46 am por Edwin Plauchu · Archivado en FreeBSD
Buenos Dias
La razon de este “How to” es a razon de un amigo que tengo en Guadalajara, (y eso que wey!, jajaj), el cual me comento si podia recolectar datos como el Uptime, procesos corriendo, bytes tranferidos entrantes y salientes en ciertas tarjetas de red, de un servidor con sistema FreeBSD 6.2 Stable.
Le comente que para esto requeria SNMP (Simple Network Management Protocol), windows tiene SNMP, linux lo tiene, solaris lo tiene, y FreeBSD lo tiene… lo podemos instalar utilizando el arbol de ports.
mayte# cd /usr/ports/net-mgmt/net-snmp && make install clean
Ya instalado, procedemos a llenar el archivo de configuracion de el nuevo demonio SNMPD:
mayte# edit /usr/local/share/snmp/snmpd.conf
###################################################
#Comunidades permitidas
com2sec local 127.0.0.1/32 public
com2sec localnet 192.168.192.0/24 public
#grupos con acceso RW(Read/Write) version snmp 1, y 2c
group MyRWGroup v1 local
group MyRWGroup v2c local
# grupos con acceso modo RO(Read Only)
group MyROGroup v1 localnet
group MyROGroup v2c localnet
#desplegar todo la info del arbol snmp con mascara 80
view all included .1 80
# Lista de control de acceso
access MyROGroup “” any noauth exact all none none
access MyRWGroup “” any noauth exact all all all
syslocation FreeBSD 6.2 Server on mayte.oxkintok.com.mx #datos del host
syscontact Ing. Edwin Plauchu pianodaemon@hotmail.com
###################################################
Ahora agrega el demonio de SNMPD al arranque de nuestro FreeBSD, para esto agrega las siguientes lineas al /etc/rc.conf
snmpd_enable=”YES”
snmpd_flags=”-a -p /var/run/snmpd.pid”
snmptrapd_enable=”YES”
snmptrapd_flags=”-a -p /var/run/snmptrapd.pid”
Ahora reinicia y has la prueba de pedir info al demonio SNMPD 
Aqui yo le pido el tiempo que lleva prendido nuestro servidor FreeBSD
mayte# snmpget -v 2c -c public localhost sysUpTime.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (167665) 0:27:56.65