Grub: configurando el gestor de arranque
Post dedicado al colo que hoy me preguntó cómo recuperar grub una vez instalado el maleducado de Windows que sobreescribe el MBR sin preguntar >=(
El artículo lo escribí hace un par de años y ya que estoy le adhiero algunas cosas de configuración de Grub, todo esto lo publiqué hace un año en el foro linuxespanol aquí. Que lo disfruten.

----------------------------------------------------------------------------------------
Instale Windows y ahora no puedo iniciar Linux! Cómo recupero el grub???
La indignación que esto produce es muy grande, pero por suerte tiene una solución muy sencilla.
Lo que hace windows al instalarse es sobre-escribir el MBR (Master Boot Record) con su propio gestor de arranque sin siquiera preguntar al usuario para saber si lo debe hacer o no >=(
Hay varias formas de recuperar grub, siendo quizas la más sencilla usando SuperGrub (http://www.supergrubdisk.org/)
Otra forma bastante simple (suponiendo que la partición donde esta instalado grub esta mapeado a /dev/sda1) es la siguiente:
1 iniciar el sistema con algun live-cd (knoppix, ubuntu, etc)
2 crear un directorio para montar la partición donde se encuentra instalado grub:
mkdir /media/linux
3 montar la partición donde se encuentra instalado grub
mount /dev/sda1 /media/linux
4 hacer un bind del /dev del live cd, al /dev de la particion recien montada
mount --bind /dev /media/linux/dev
5 cambiar el origne del directorio raíz
chroot /media/linux
6 instalar grub en el MBR del disco de arranque
grub-install /dev/sda


Cómo modificar la configuración de grub?

Como casi todo en linux, para editar algún programa, debemos editar un archivo, en este caso, el archivo en cuestión es /boot/grub/menu.lst
Este archivo es muy fácil de editar dado q en él vienen ejemplos de como hacerlo, las lineas que vienen como comentarios son aquellas precedidas por un #. Toda linea que pongamos de esta forma, no sera tomada en cuenta a la hora de ejecutarse.
Ahora bien, voy a describir:

Como cambiar el formato predefinido de arranque
Como agregar una entrada al grub
Como agregar una imagen al grub

Cómo cambiar el formato predefinido de arranque?
El grub al instalarse, definirá un sistema operativo como predeterminado, que sera el que se cargara en el caso de q el usuario no elija una opción después de un cierto tiempo.
Nosotros podemos cambiar tanto el sistema operativo predeterminado, como el tiempo que deberá esperar grub antes de arrancar el sistema predeterminado.
Para cambiar el sistema que se cargara predeterminadamente, debemos cambiar el valor de la linea que lleva el parámetro default.
Predeterminadamente, el grub suele tener estas líneas así:
## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
# WARNING: If you are using dmraid do not change this entry to 'saved' or your
# array will desync and will not let you boot your system.
default 0
El numero que debemos poner, es el numero que tiene el sistema operativo en la lista de sistemas. Si por ejemplo tenemos:
title Debian GNU/Linux, kernel 2.6.17.6
root (hd0,2)
kernel /boot/vmlinuz-2.6.17.6 root=/dev/sda3 ro
initrd /boot/initrd.img-2.6.17.6
savedefault
boot

title Debian GNU/Linux, kernel 2.6.8-2-386
root (hd0,2)
kernel /boot/vmlinuz-2.6.8-2-386 root=/dev/sda3 ro
initrd /boot/initrd.img-2.6.8-2-386
savedefault
boot

title Knoppix, kernel 2.6.11 Default
root (hd0,3)
kernel /boot/vmlinuz root=/dev/sda4 ro ramdisk_size=100000 lang=es apm=power-off nomce vga=791
initrd /boot/initrd.img
savedefault
boot

# This entry automatically added by the Debian installer for a non-linux OS
# on /dev/sda1
title Microsoft Windows XP Professional
root (hd0,0)
savedefault
makeactive
chainloader +1
Cada entrada tiene un numero asociado, la primera es la 0, la segunda es la 1, y así sucesivamente.
Si en este caso, quisiera que mi sistema arranque con Knoppix, kernel 2.6.11 Default, en el parámetro default, debería poner:
default 2
Si quisiera que arranque con windows, debería poner:
default 3
Se entiende?

Ahora, para cambiar el tiempo que queremos que grub espere antes de arrancar con la opción predeterminada, debemos cambiar el parámetro timeout, con este parámetro se indican los segundos que se deben esperar. Poniendo por ejemplo, timeout 10, va a esperar 10 segundos, poniendo timeout 15, va a esperar 15.
Un ejemplo es:
## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout 10

Cómo agregar una entrada al grub?
Para agregar una entrada al grub, debemos agregar en /boot/grub/menu.lst una entrada de la forma:
title Debian GNU/Linux, kernel 2.6.17.6
root (hd0,2)
kernel /boot/vmlinuz-2.6.17.6 root=/dev/sda3 ro
initrd /boot/initrd.img-2.6.17.6
savedefault
boot
Donde lo que nos interesa saber es, que:
- tittle es el titulo que aparecerá en el menu de selección al encender la maquina
- root indica cual es la partición donde esta el sistema
- kernel indica donde está la imagen del kernel y donde está el directorio raíz.
- initrd indica donde esta el initrd.
Hay q aclarar que para indicar una dirección en una partición, se hace a través del mapeo (hd*,nro), donde hd* indica en qué disco tenemos ese sistema, si el sistema lo tenemos en el disco 0, entonces el formato será (hd0, nro). Si el sistema esta en el disco 1, el formato será (hd1,nro). El nro es el número de nuestro dispositivo menos uno, es decir, si por ejemplo, el dispositivo asociado a nuestra partición es sda3 (donde sda suele ser el disco 0, sdb el disco 1, etc), la dirección de la partición será de la forma (hd0,2) como en nuestro ejemplo.

Para agregar una entrada para bootera algún windows, el formato es distinto, dado que no indicamos donde esta el kernel o el initrd.
El formato de una entrada para un windows que está instalado en la particion sda3 (aunque puede tener alguna opción más o alguna opción menos) es:
# This entry automatically added by the Debian installer for a non-linux OS
# on /dev/sda3
title Microsoft Windows XP Professional
root (hd0,2)
savedefault
makeactive
chainloader +1

Como agregar una imagen al grub?
Para agregar una imagen a nuestro grub, lo hacemos agregando el parametro splashimage, con este parametro y la direccion de una imagen, logramos q nuestro grub tenga de fondo una imagen, y asi queda muy cool =)
Algo para tener en cuenta es q la imagen debe ser de 640x480, de 16 colores y debe tener la extencion .xpm.gz, es decir, debe ser de formato xpm, y debe estar comprimido con gzip.
Ahora si, un ejemplo de como debemos escribir la linea con el parametro splashimage es:
splashimage=(hd0,2)/boot/grub/tux.xpm.gz
Donde al igual q antes (hd0,2) indica q la imagen se encuentra en el dispositivo sda3, en la direccion /boot/grub/tux.xpm.gz
Construyendo un Bootstrap
El siguiente tutorial era parte de lo que pretendía ser un gran proyecto, detallar los pasos para construir un kernel...
Todo arrancó con la idea de crear solo un bootstrap y luego se fue ampliando, aunque avancé más con la programación que con la bitácora que pensaba llevar, es decir, un informe detallado sobre lo que iba haciendo. El problema es que tuve que abandonar el proyecto por falta de tiempo y un día en un cortocircuito mental borré la carpeta donde tenia todo... por suerte la explicación se salvó, aunque como dije, no está todo lo que había logrado.
En fin, en esta entrega coloco la explicación de cómo crear un bootstrap. Como verán es mucho más sencillo de lo que suena, aunque hay que tener conocimiento de cómo funciona el hardware y de programación en assembler.
------------------------------------------------------

Construir un bootstrap es relativamente facil, sólo hay q saber ciertas cosas.
La primera es que el BIOS (Basic Input Output System) lo que hace al arrancar la máquina es buscar un bootstrap en algun medio de almacenamiento no volatil, como ser un floppy un cd-rom o el disco duro.
En los casos de los discos como floppy o hard disk, el BIOS lee el primer bloque de 512 Bytes q se encuentra en la ubicacion cabeza cero, cilindro cero, sector uno. El ultimo word de este bloque debe contener un identificador de booteo, en el caso de la arquitectura x86 este identificador es AA55h (palabra en hexa). Si encuentra este identificador, entonces el BIOS carga en algun lugar de memoria este bloque. En el caso de las x86, la posicion donde carga este programa es en 07C00h, es decir en 07C0:0000. Una vez cargado en la memoria, el BIOS salta a esa direccion y entonces el programa empieza a ejecutarse.
Un ejemplo basico sobre como debe ser la forma de un bootstrap, es la siguiente (usando NASM Netwide Assembler):
; boot1.asm
[BITS 16] ; Seteo a modo de 16bits q es como se encuentra el procesador al inicio
[ORG 0] ; Pongo el codigo desde el principio del segmento

jmp main
; declaracion de variables u otros datos

main:
jmp main ; simplemente ciclamos

TIMES 510-($-$$) DB 0 ; Hace q el archivo sea de 512 bytes de longitud
dw 0AA55h ; Indica al bios q es un bootstrap

Para compilar el programa simplemente hacemos:
$nasm boot1.asm -o boot1
Para colocar esto en un diskete si utilizamos linux (como en mi caso =P) podemos usar el comando dd. El comando dd es sencillo de utilizar, le damos un archivo de entrada y el lugar donde lo queremos copiar. El manual de dd explica bien su uso, asi que omitiré más detalles.
Para nuestro caso que queremos copiar el programa al primer sector de la cabeza cero, cilindro cero, lo unico que debemos escribir es:

$dd if=boot1 of=/dev/fd0
Si tenemos un emulador como el qemu o el bochs se puede usar el emulador en lugar de tener que resetear la maquina a cada rato. Usando el qemu podemos hacer pruebas de la siguiente forma, usando el comando:
$cat boot1 | dd of=floppy conv=notrunc
Esto nos crea un archivo llamado floppy con las caracteristicas que necesitamos para que funcione, en realidad es una imagen de diskete lo que creamos. Ahora usamos qemu de la siguiente manera:
$qemu floppy
Eso es todo, veran que como anda su programa sin la necesidad de reiniciar.
Vale una advertencia, a mi no me funciona del todo bien con ciertas interrupciones el qemu, asi q a prestar mucha atencion.
De ahora en mas, para todos los ejemplos usaremos esta sentencia, asi q no la volveré a copiar, a menos que la deba cambiar, como sucedera más adelante.

El siguiente paso que se debe dar, es hacer que el programa haga algo, como imprimir un mensaje. Hay que tener en cuenta que no tenemos las librerias de ningun sistema operativo porque no estamos corriendo ningun SO aun. Por ahora la unica herramienta que se tiene son las interrupciones de nuestro amigo el BIOS. Hay interrupciones para hacer un monton de cosas, pero las que más nos interesan son las interrupciones para imprimir un mensaje en la pantalla y las de leer y escribir datos de un dispositivo. Estas son, las int 10h y las int 13h respectivamente. De la 10h lo que mas usaremos es la 0E para imprimir texto, y de la 13h la 02 que es para leer de un dispositivo.
Para ilustrar esto, doy un ejemplo sobre como imprimir un mensaje en la pantalla:

; boot2.asm
[BITS 16] ; Seteo a modo de 16bits q es como se encuentra el procesador al inicio
[ORG 0] ; Pongo el codigo desde el principio del segmento

jmp inicializar

; datos
mensajeInicial db "Este es mi primer bootstrap!",0x0D,0x0A,0 ; 0x0D,0x0A es un enter, 0 indica final de la cadena

; ---------------------------------------------------------------------------------
impMensaje:

imprimir:
lodsb ; Carga el byte q esta en ds:si en al
or al,al ; Mira si el caracter es 0 (fin)
jz finImpMensaje
mov ah,0x0E ; Indica q la interrupcion sera para imprimir por pantalla
mov bx,0x0009 ; Se indica pagina base y color de fondo
int 10h ; Llamada al BIOS
jmp imprimir

finImpMensaje: ret
; ---------------------------------------------------------------------------------

inicializar:
;el BIOS me pone en el segmento 07C0h, asi q seteo los segmentos a mi posicion actual
;Asi no tenemos q añadir 07C00h a todos nuestros datos
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax

cli ;desabilito las interrupciones
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
sti ;habilito nuevamente las interrupciones

main:
mov si, mensajeInicial ; Muestro el mensaje por pantalla
call impMensaje

ciclar:
jmp ciclar

TIMES 510-($-$$) DB 0 ; Hace q el archivo sea de 512 bytes de longitud
dw 0AA55h ; Indica al bios q es un bootstrap

El código es bastante autoexplicativo, pero voy a aclarar un par de cosas. Como se ve, primero setea los segmentos para que reflejen su posicion actual, dado q el BIOS nos pone en el segmento 07C0, actualizo los segmentos de datos y los seteo para que esten superpuestos con el segmento de codigo. La otra es el seteo de la pila, como con los demas segmentos, el de la pila tambien lo coloco en la misma direccion que el de codigo y pongo el puntero de la pila apuntando a la ultima direccion del segmento, dado q la pila crece hacia las direcciones mas chicas.
El uso de la interrupcion 10h es sencillo, primero indico en ah que operación voy a realizar, en este caso eligo 0E que indica q voy a imprimir en la pantalla; y en "al" pongo el caracter que deseo mostrar. En "bx" van los atributos de la impresion, es decir en que pagina imprimir, el color de fondo y el color del texto.

El siguiente paso a lograr es cargar un ejecutable al que despues saltaremos y que sera nuestro kernel. Este puede estar tambien en modo de 16 bits, o se puede construir de 32 bits, para ello hay q cambiar a modo protegido, cosa que explicaré en otro momento.
Para leer algo de un dispositivo hay que tener en cuenta cómo se pide a bajo nivel que se cargue un bloque de datos en la memoria. Los discos se direccionan mediante número de cabeza, número de cilindro y número de sector. Esto es asi por el motivo de que un disco puede tener varios platos, cada plato o conjunto de platos se divide en cilindros y cada cilindro se divide en sectores. A su vez, cada plato tiene como mínimo dos cabezas (puede tener mas) que leen el dato, una del lado de arriba y una del lado de abajo. Entonces con el número de cabeza indicamos que plato leeremos, con el número de cilindro decimos la ubicacion en el plato que leeremos y con el número de sector dentro del cilindro tendremos nuestro bloque.
Como dije anteriormente, en la cabeza cero, cilindro cero y sector uno tenemos nuestro bootstrap, asi que los demas datos y programas que queramos guardar en nuestro disco, deberan estar ubicados en cualquiera de los demas lugares.
Para explicar mejor me apoyo en un ejemplo sobre como cargar el programa que se encuentra en el floppy:

; boot3.asm
[BITS 16] ; Seteo a modo de 16bits q es como se encuentra el procesador al inicio
[ORG 0] ; Pongo el codigo desde el principio del segmento

jmp inicializar ; Voy al inicio del programa, salto todo lo q es declaraciones

;--------------------------------------------------------------
; Datos usados en el proceso de boot-loading
;--------------------------------------------------------------

mensajeInicial db "Que buen bootstrap!", 0x0D,0x0A,0

;--------------------------------------------------------------
; impMensaje imprime un mensaje en ascii por pantalla
;--------------------------------------------------------------

impMensaje:
imprimir:
lodsb ; Carga el byte q esta en ds:si en al
or al,al ; Mira si el caracter es 0 (fin)
jz finImpMensaje
mov ah,0x0E ; Indica q la interrupcion sera para imprimir por pantalla
mov bx,0x0009 ; Se indica pagina base y color de fondo
int 10h ; Llamada al BIOS
jmp imprimir

finImpMensaje: ret

;--------------------------------------------------------------
; Procedimiento que carga un programa contenido en el floppy
;--------------------------------------------------------------

cargarKernel:
reset:
mov ax, 0x0000 ; opcion para resetear el dispositivo
mov dl, 0x00 ; drive=0 floppy
int 0x13 ; interrupcion 13 del bios
jc reset ; si hay carry es q ocurrio un error, entonces intento de nuevo

cargar:
mov ax, 0x1000 ; ES:BX es donde se carga lo leido por la interrupcion
mov es, ax ; por lo que pongo en ES 1000
mov bx, 0x0000 ; y pongo en bx la dir 0000

mov ah, 0x02 ; con ah=2 digo q voy a leer
mov al, 0x05 ; con al indico la cantidad de sectores a leer
mov ch, 0x00 ; cilindro=0
mov cl, 0x02 ; sector=2 (en el 1 tengo el booteable)
mov dh, 0x00 ; cabeza=0
mov dl, 0x00 ; drive=0 es el floppy
int 13h ; invoco la interrupcion
jc cargar ; si ocurrio un error (carry=1), intento de nuevo

jmp 0x1000:0x00 ; salto a la direccion donde cargue el programa

ret ; nunca va a llegar a ejecutarse

;--------------------------------------------------------------
; Procedimiento que inicializa los registros
;--------------------------------------------------------------
inicializar:
;el BIOS me pone en el segmento 07C00h, asi q seteo los segmentos a mi posicion actual
;Asi no tenemos q añadir 07C00h a todos nuestros datos
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax

;call inicializar
;Salvo la direccion del dispositivo desde el que estoy booteando
mov [bootdrv], dl

;inicializo los valores para la pila
cli ;desabilito las interrupciones
mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF
sti ;habilito nuevamente las interrupciones
jmp main

;--------------------------------------------------------------
; main del programa
;--------------------------------------------------------------

main:
mov si, mensajeInicial ; Muestro el mensaje por pantalla
call impMensaje

call cargarKernel

TIMES 510-($-$$) DB 0 ; Hace q el archivo sea de 512 bytes de longitud
dw 0AA55h ; Indica al bios q es un bootstrap

Los detalles que debo aclarar son los de la interrupcion 13h. A esta interrupcion hay que pasarle varios parametros, lo primero que hago es resetear el dispositivo, esto es recomendable, y lo hago eligiendo la opcion de resetear de la interrupcion (ah=00) y diciendo que dispositivo voy a resetear (dh=00 indica el floppy). Luego lo que hago es cargar mi programa, para esto necesito pasar mas parametros, el que indica que voy a realizar una lectura (ah=02), la cantidad de sectores que quiero leer (al=05), que cilindro voy a leer (ch=00), que sector voy a leer (cl=02), de que cabeza (dh=00) y de que drive (dl=00 indica el floppy).
Los datos que cargue la interrupcion los cargará en la direccion ES:BX, por lo que lo primero que hago es setear estos valores a los que yo deseo. En este caso quiero que cargue mi programa en 1000:0000.
Luego de cargar el programa lo que hago es saltar a la direccion donde cargue el programa, asi comienza a ejecutarse.
Para hacer un ejemplo sencillo de programa a cargar, hago uno que imprima un caracter. Creo un programa simple en assembler que se llame kernel1.asm lo compilo y lo coloco en el sector dos de la cabeza cero, cilindro cero:

; kernel1.asm
[BITS 16]
[ORG 0]

mov al, 'd' ; voy a imprimir una d
mov ah, 0x0E ; indico q voy a usar la opcion 0E de la interrupcion, para imprimir por pantalla
mov bx, 0x0007 ; atributos de la impresion
int 10h

ciclar:
jmp ciclar ; ciclo

Lo compilamos con:

$nasm kernel.asm -o kernel
Y lo copiamos al segundo sector del disco con:
$dd if=kernel of=/dev/fd0 seek 1
El parametro seek 1 le indica a dd que salte el primer sector del disco y que lo empiece a grabar a partir del segundo sector. Esto lo hacemos porque en el primer sector se encuentra el bootstrap.
O bien, para usar el qemu, podemos hacer:
$cat boot3 kernel1 | dd of=floppy conv=notrunc
Y como antes:
$qemu floppy


Eso es todo por ahora. Con ello ya tenemos un "decente" bootstrap. Como siempre, espero que les haya resultado interesante.
Algunos artículos que me ayudaron en su momento a entender todo esto son:
BootStrap Tutorial - Matthew Vea
The booting process - por Gregor Brunmar
Lástima que los links que tenía ya no funcionan más...
Por otro lado, es super interesante la documentación encontrada en la página http://www.osdever.net/ hay de todo para aquellos aventureros.
Links: GNU/Linux para novatos en español
Si bien hay mucha documentación en blogs, no hay tantos manuales completos para principiantes en español, así que para aquellos que no se animen a usar linux o para los que no encuentran info en español, les dejo los siguientes enlaces. No son muchos, pero son muy completos:

http://bibliaubuntu.a.wiki-site.com/index.php/Indice (la llamada biblia de ubuntu, completísimo manual con información sobre cada aspecto del sistema, si bien hace referencia a ubuntu, casi toda la info es aplicable a cualquier distro)

http://shadowsecurity.150m.com/CursoLinux/index.html (curso para novatos, incluso cuenta con tests al final de los capítulos, muy interesante)

http://structio.sourceforge.net/guias/AA_Linux_colegio/AA_Linux_colegio.html (guía para colegios, algo vieja, pero con mucha info aplicable actualmente)

http://cs.uns.edu.ar/~ags/linux/ (página del curso con el que me inicié en Linux hace ya unos cuantos años, la página cuenta con transparencias creadas para el curso y enlaces a manuales para novatos)

Si se animan a entrar al maravilloso mundo de Linux, lean un poco antes de preguntar en foros, hay mucha información disponible en la red, ayuda para solucionar los problemas, esto es de las mejores características de la comunidad, la predisposición a ayudar.
Evaluando Antivirus
Una pregunta recurrente en el mundo de la seguridad es ¿qué antivirus instalo? a lo que uno podría responder "pues el mejor!". Dejando las respuestas obvias de lado, el verdadero problema es definir "mejor". La característica que suele utilizarse para definir la calidad de un antivirus es la cantidad de malware que detecta, el que más malware detecta, es mejor. A partir de esto se han armado diferentes rankings en distintos sites. El problema es que según el lugar que visitemos, el resultado es distinto... estén o no influenciados económicamente por las empresas, claramente los reviews no se ponen de acuerdo ni siquiera en qué antivirus detecta más malware, por lo que es muy difícil armar un ranking real.

A partir de lectura de distintos comentarios y de charlas con gente que conoce del tema (incluido mi sensei Javier), y a partir de mi sentido común, armé la siguiente lista con las características que se deberían evaluar en un antivirus:

- facilidad de uso: nombrado siempre entre las características deseadas y por una buena razón: no sirve de nada tener el mejor antivirus si nadie sabe cómo usarlo. Es importante que el sistema oriente al usuario sobre los pasos aconsejables a seguir cuando se detecta algún malware.

- efectividad identificando malware: como mencionó en la introducción, es la característica más buscada y de mejor propaganda para los antivirus. El antivirus debe identificar la mayor cantidad de malware posible, tratando de mantenerse lo más cercano al 100% como sea posible. Para lograr éste cometido es importante que el antivirus soporte la mayor cantidad de métodos de detección posibles (basados en la firma, actividades maliciosas, heurísticas, análisis de archivo, emulación de archivo).

- bajo nivel de falsos positivos: algo no muy nombrado pero altamente importante es que el antivirus no reporte cualquier cosa como virus. Siempre los falsos positivos llevan a cansar al usuario y desestimar la importancia de las alertas, por lo que a la larga pueden terminar ignorando alarmas de virus reales. Si sólo se tuviera en cuenta el punto anterior, el mejor antivirus es el que reporta todo como virus!, porque claro, no se le escapa ningún virus n_n

- efectividad limpiado y aislando archivos infectados: esto es, resolver el problema del archivo infectado. En muchos casos no nos alcanza con que el antivirus reporte el virus, sino que sea capaz de eliminarlo del archivo para que podamos volver a usarlo. Por otra parte, es importante que si no se puede limpiar el archivo, que se aisle correctamente para que éste no pueda seguir infectando otros archivos.

- tiempo de respuesta ante la salida de nuevo malware: es importante que el fabricante del antivirus responda rápidamente ante la salida de un virus. De nada sirve que nuestro antivirus reconozca millones de virus si los reconoce cuando ya llevan meses dando vueltas y nos infectaron la máquina hace tiempo. Por esto, el tiempo transcurrido entre que se toma conocimiento del virus y que sale el antídoto debe ser lo más mínimo posible.

- facilidad para detectar nuevo malware: muchos virus son simplemente mutaciones de otros virus, por lo que detectar esas mutaciones es muy importante. De esta manera no hay que esperar a que el fabricante nos envíe updates con el fingerprint de los virus para detectarlos, sino que es posible detectarlos de antemano, sin que siquiera el fabricante se entere de la existencia de tales virus. Se utilizan motores de máquinas virtuales para simular reacciones de programas para detectar funcionamientos sospechosos.

- reporte activo: cuando el antivirus detecta algún malware, éste debe reportarlo inmediatamente al usuario para que decida qué hacer.

- escaneo bajo demanda y por acceso: El escaneo bajo demanda está presente en todos los antivirus y quiere decir que el antivirus escanee el/los dispositivo/s en el momento que el usuario se lo indique. Pero es muy importante que también se provea escaneo por acceso. El escaneo por acceso se encarga de que si intentamos abrir un archivo infectado éste nos avise antes de que nos infecte.

- paquete de detección: actualmente existen muchísimo malware en la red, mientras más soporte pueda dar el antivirus para mitigarlo, mejor. La mayoría de los antivirus actuales proveen, además de la detección de virus, troyanos y worms, protección contra spyware, adware, rootkits, spam, etc.

- bajo consumo de recursos: el consumo de recursos no es un problema menor. Muchos usuarios prefieren deshabilitar el antivirus porque la máquina se vuelve una carreta. El antivirus no debe consumir demasiados recursos, no debe estorbar en el trabajo cotidiano del usuario, debe ser lo más imperceptible posible.


A partir de todo esto viene a la mente la clara necesidad de definir un estándar para la prueba de antivirus que cumpla con todo lo anteriormente mencionado, y tal vez algunas cosas más que esté pasando por alto. El problema es cómo probar algunos puntos, como "facilidad de uso" que depende del usuario y "nivel de falsos positivos" que depende de los datos de muestra.

En este punto dirán, y bien? cuál es entonces el mejor antivirus?... bueno, desgraciadamente, no tengo la respuesta. Hay muchas soluciones dando vuelta, algunas más costosas que otras, e incluso algunas libres como el caso de ClamAV. Sería interesante que alguien con tiempo tomara los puntos antes mencionados y evalúe los antivirus más conocidos (Karpersky, Mcafee, Norton, NOD32, Avas, AVG, etc), comparándolos en cada punto para que el usuario pueda tomar su decisión.
Por ahora sólo puedo ofrecerles un ranking armado por la página www.virus.gr el año pasado, el cuál está basado sólo en la cantidad de malware detectado. Al parecer la página tiene el prestigio de no estar corrompida por el dinero de las empresas de antivirus por lo que el resultado es relativamente fiable, aunque como destaco en el artículo, sólo se basa en uno de los puntos importantes.
El resultado lo pueden observar en: http://www.virus.gr/portal/en/content/2008-06%2C-1-21-june y lo copio debajo:

Rank

1. G DATA 2008 version 18.2.7310.844 - 99.05%
2. F-Secure 2008 version 8.00.103 - 98.75%
3. TrustPort version 2.8.0.1835 - 98.06%
4. Kaspersky version 8.0.0.357 - 97.95%
5. eScan version 9.0.742.1 - 97.44%
6. The Shield 2008 - 97.43%
7. AntiVir version 8.1.00.331 Premium - 97.13%
8. Ashampoo version 1.61 - 97.09%
9. Ikarus version 1.0.82 - 96.05%
10. AntiVir version 8.1.00.295 Classic - 95.54%
11. AVG version 8.0.100 Free - 94.85%
12. BitDefender 2008 version 11.0.16 - 94.70%
13. Avast version 4.8.1201 Professional - 93.78%
14. Nod32 version 3.0.650.0 - 93.36%
15. F-Prot version 6.0.9.1 - 91.87%
16. BitDefender version 10 Free - 91.32%
17. ArcaVir 2008 - 88.65%
18. Norman version 5.92.08 - 87.72%
19. Vba32 version 3.12.6.6 - 87.21%
20. McAfee Enterpise version 8.5.0i - 86.57%
21. McAfee version 12.0.177 - 86.39%
22. Rising AV version 20.46.52 - 85.87%
23. Norton 2008 - 83.34%
24. Dr. Web version 4.44.5 - 82.87%
25. Antiy Ghostbusters version 5.2.3 - 80.23%
26. VirusBuster version 5.002.62 - 77.19%
27. Outpost version 6.0.2294.253.0490 - 75.35%
28. V3 Internet Security version 2008.05.31.00 - 75.23%
29. ViRobot Expert version 5.5 - 74.50%
30. Virus Chaser version 5.0a - 73.65%
31. A-squared Anti-Malware version 3.5 - 71.66%
32. PC Tools version 4.0.0.26 - 69.82%
33. Trend Micro Antivirus+Antispyware 2008 version 16.10.1079 - 67.28%
34. Iolo version 4.325 - 63.98%
34. Panda 2008 version 3.01.00 - 61.41%
36. Sophos Sweep version 7.3.2 - 54.71%
37. ClamWin version 0.93 - 54.68%
38. CA Anti-Virus version 9.00.170 - 51.08%
39. Quick Heal version 9.50 - 47.97%
40. Comodo version 2.0.17.58 - 43.15%
41. Trojan Hunter version 5.0.962 - 31.39%
42. Solo version 7.0 - 21.10%
43. Protector Plus version 8.0.C03 - 20.14%
44. PCClear version 1.0.8.0 - 19.63%
45. AntiTrojan Shield version 2.1.0.14 - 14.74%
46. Trojan Remover version 6.6.9 - 13.49%
47. VirIT version 6.2.94 - 8.63%
48. True Sword version 4.2 - 3.42%
49. Abacre έκδοση version 1.4 - 0.00%

También es interesante el ranking planteado en http://mtc.sri.com/live_data/av_rankings/ donde se rankean los antivirus en base a la cantidad de detecciones de nuevos malwares.

Un excelente libro (el mejor que he encontrado en el rubro de virus) es "The Art of Computer Virus Research and Defense" de Peter Szor un investigador de seguridad y virus que trabajó en los importantes productos AVP, F-PROT, y Symantec Norton AntiVirus, además de haber desarrollado su propio antivirus.
También es interesante recordar que algunos de los puntos que planteo ya fueron planteados en sites como http://anti-virus-software-review.toptenreviews.com/ y http://hubpages.com/hub/Antivirus-software-ranking y varios otros. Lo interesante del último link es que presenta las características de los antivirus más conocidos actualmente.
Por último y no menos importante es interesante leer como punto de partida el wiki http://en.wikipedia.org/wiki/Antivirus_software

Espero que lo descripto los ayude a decidir sobre el software antivirus a utilizar, recuerden no mirar sólo la cantidad de detecciones sino también el resto de las características.
Como palabras finales, e inevitables para mi, quiero remarcar la capacidad de GNU/Linux frente al malware. En las máquinas que ejecutan GNU/Linux es muy extraño ver software antivirus (es más creo que hay que buscar mucho para encontrar una). Esto no se debe sólo a que la cantidad de usuarios es significativamente menor o que todos son gurús, sino a la forma en que está diseñado y a la educación del usuario que fuerza el sistema. En Linux es extraño que un usuario navegue por la web estando logueado como root (el equivalente al administrador en Windows), algo muy común en Windows y que lleva a miles de problemas. Por otro lado, no existen tantas vulnerabilidades graves en el software. Vulnerabilidades hay como en todo sistema, pero no hay tanta cantidad y la mayoría no son tan graves como las que se suelen ver en los boletines oficiales de Microsoft. Además la continua contribución por parte de usuarios de todo el mundo lleva a que el tiempo de respuesta ante una vulnerabilidad sea mínimo.
Puedo seguir alabando Linux por horas, pero espero que con el comentario anterior se entienda el punto... osea, si les interesa realmente la seguridad, instalen GNU/Linux o algún otro sistema Unix cómo los *BSD, Solaris, etc.

Como siempre, los comentarios y sugerencias son bienvenidos. Espero que les haya resultado interesante =)
Certificados Digitales
A continuación voy a describir los pasos necesarios para crear un certificado autofirmado y también cómo hacer para crear uno firmado por una autoridad certificante (CA) de confianza.

Los certificados sirven para validar quienes somos, es decir, que una tercera parte puede estar tranquilo de que está tratando con la entidad que cree y no con un atacante que la está falsificando. Además los certificados contienen la clave pública de la entidad con la que estamos tratando así que es posible crear una conexión segura (los datos viajan encriptados) a partir de una negociación previa utilizando dicha clave.
Los certificados suelen encontrarse frecuentemente al navegar por la web, cada vez que el browser accede a un sitio https un certificado es transmitido y usado para autenticar y transmitir los datos de forma segura. Si queremos montar una conexión segura entre nuestro servidor web y un usuario, necesitamos crear un certificado y configurar dicho servidor para que lo utilice.
La confianza de un certificado se logra gracias a que una Autoridad Certificante en la que confiamos (los navegadores cuentan con certificados de Autoridades Certificantes de confianza) firma nuestro certificado con su clave privada. El browser puede comprobar que un certificado fue firmado por una dada CA porque cuenta con su clave pública. Una CA de confianza sólo firmará nuestro certificado una vez que compruebe que somos quienes decimos ser.


El formato de los certificados encontrados comúnmente siguen la recomendación X.509 de la serie de recomendaciones X.500 de ITU-T, e incluye:

- Versión: el identificador del certificado.
- Algoritmo de firma: el algoritmo utilizado para firmar el certificado.
- Nombre del emisor: nombre X.500 de la CA que creó y firmó el certificado.
- Período de validez: consiste en dos fechas que indican el período de validez del certificado.
- Nombre de la entidad: nombre del usuario al que hace referencia el certificado.
- Información de la clave pública de la entidad: clave pública de la entidad junto con un identificador del algoritmo que debe usarse para esta clave.
- Identificador único del emisor (opcional): identifica unívocamente la CA que firma en el caso que el nombre X.500 se halla reusado para distintas entidades.
- Identificador único de la entidad (opcional): identifica unívocamente a la entidad en el caso que el nombre X.500 se halla reusado para distintas entidades.
- Extensiones: conjunto de uno o más campos de extensión.
- Firma: cubre todos los otros campos del certificado, ésta contiene el código hash de todos los otros campos, encriptado con la clave privada de la CA. Este campo incluye el identificador del algoritmo usado para firmar.


Entonces, qué necesitamos para crear nuestro certificado?
Antes que nada, necesitamos crear un requerimiento de certificado que enviaremos a la CA. La CA firmará nuestro requerimiento y con esto obtendremos nuestro certificado.
Ahora, las CAs de confianza cobran por este trabajo (y si, el mundo es así), por lo que tenemos dos opciones:
1) pagarle a una CA de confianza para que nos firme el certificado.
2) firmar nosotros mismos el certificado y ahorrarnos el gasto.
La solución 2 parece genial, no gastamos un peso y tenemos nuestro certificado... bueno, no es tan así. El problema es que los browsers no confían en nuestra firma (sería bastante feo que lo hicieran), por lo que los clientes verán un hermoso cartel de advertencia y deberán agregar nuestro certificado a su browser para que éste les permita seguir navegando por el sitio. Una vez que el cliente confíe en nuestro certificado, los datos viajarán encriptados de forma segura. Pues bien, el factor clave está en que el cliente confíe en nuestro certificado... piensen que como nosotros firmamos nuestro certificado, cualquier otra persona podría hacer exactamente lo mismo (decir que somos nosotros) y el cliente no podría distinguir entre quién miente y quién dice la verdad. Esta solución es perfecta si sólo necesitamos que los datos viajen encriptados.
Si necesitamos que nuestro servidor se autentique para que el cliente confíe en nosotros, deberemos pagarle a una CA.

NOTA: Para una explicación más extensa sobre los certificados X.509, pueden leer el capítulo 14.2. "X.509 Authentication Service" del libro "Cryptography and Network Security Principles and Practices - 4th edition", de William Stallings.
También está interesante el capítulo 8.5 "Management of Public Keys" del libro "Computer Networks - 4th edition", de Andrew S. Tanenbaum.


Cuánto cobran las CAs?
Depende de la CA. Hay CAs que son más confiables que otras, y por lo tanto, cobran mucho más.
Una lista reducida con algunas de las CAs que reconoce Firefox (e Internet Explorer) como confiables es:
http://www.entrust.net
http://www.geotrust.com
http://www.globalsign.com
http://www.rapidssl.com
http://www.verisign.com/
http://www.thawte.com/
http://www.godaddy.com <--- el más barato! Para saber cuáles otras reconoce firefox, pueden visitar http://www.mozilla.org/projects/security/certs/included/


Ya me leí toda la intro y tengo re claro como son los certificados (o bien no entendi un pedo pero sigo leyendo), cómo creo un certificado?

La solución que voy a mostrar es para un sistema GNU/Linux. Utilizaremos openSSL para crear los certificados y Apache como servidor web (clásica combinación linuxera). Si quieren saber cómo hacerlo en Windows, lo lamento pero nunca lo he hecho, así que tendrán que buscar ustedes mismos, el formato general será el mismo, pero las herramientas usadas pueden variar.

Los pasos a seguir son:
1) Generar una clave para el servidor útil para el algoritmo RSA, protegido con una frase de paso y de 4096 bits:
# openssl genrsa -des3 -out server.key 4096
Generating RSA private key, 4096 bit long modulus
.............++
...........................................++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
2) Crear un pedido de firma de certificado:
# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:AR
State or Province Name (full name) [Some-State]:Buenos Aires
Locality Name (eg, city) []:Capital Federal
Organization Name (eg, company) [Internet Widgits Pty Ltd]:itfreekzone
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:itfreekzone.blogspot.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:mipassword
An optional company name []:
Como pueden observar, este comando nos pide una serie de datos. Algunos son opcionales (los que finalizan con []) y otros son mandatorios. Entre los datos tenemos, el código de dos letras de nuestro país, el nombre de la provincia o estado, el de la ciudad, el de la organización, el de la unidad dentro de la organización. Hay que prestar especial atención al Common Name, el nombre que pongamos acá deberá coincidir con la dirección DNS que queremos autenticar. En mi caso la dirección que quiero certificar es itfreekzone.blogspot.com. Pongan la dirección exacta, o en caso contrario el certificado no servirá. Luego podemos colocar una dirección de email, y a continuación un password y un nombre de compañía opcionales.

A partir de acá tenemos dos caminos, uno es enviar el pedido recien generado a una Autoridad Certificante para que nos firme el certificado. Si enviamos el pedido a una CA, ésta comprobará nuestra identidad (dependiendo de la CA pueden requerir más o menos datos) y luego nos devolverá el certificado firmado para que podamos utilizarlo. En este caso, saltar al paso 4. Caso contrario, pasar a 3.

3) Vamos a auto-firmar nuestro certificado con validez de 365 días. Para auto firmarnos necesitamos ejecutar el siguiente comando:
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=AR/ST=Buenos Aires/L=Capital Federal/O=itfreekzone/CN=itfreekzone.blogspot.com
Getting Private key
Enter pass phrase for server.key:
Con esto obtenemos server.crt el cual es el certificado ya firmado y listo para usar.

4) Ya tenemos nuestro certificado firmado, ya sea porque lo auto-firmamos o porque una CA nos firmó y ya nos entregó el certificado. El siguiente paso es hacer que Apache vea el certificado y lo utilice. A esta altura debemos tener lo siguiente:
server.key - la clave del servidor
server.crt - el certificado firmado
Si nuestro certificado está firmado por una CA de confianza, tal vez también necesitemos un nexo con nuestra CA para que los browsers confíen en nuestro certificado. En nexo se llama CA bundle y los CAs lo entregan junto con nuestro certificado firmado. En este caso, además de los archivos anteriores, también tendremos el ca-bundle.crt.
Por otra parte, si no queremos que cada vez que carguemos Apache éste nos pida la clave de paso de server.key, sería conveniente eliminar la encripción sobre la clave. Esto puede resultar peligroso, dado que si se roban este archivo, tendrán la clave, pero se torna muy complicado estar ingresando la clave cada vez que el server deja de funcionar. Si por ejemplo tenemos la configuración para que nuestro servidor se auto-recupere, o que alguien más pueda levantar el servidor, la página no funcionará con ssl a menos que se provea la clave. Yo elijo dejar la clave sin encripción.
Para desencriptar el archivo server.key, ejecutamos lo siguiente:
# openssl rsa -in server.key -out server.key.insecure
Enter pass phrase for server.key:
writing RSA key
Ahora, con todos estos archivos podemos configurar Apache. Primero colocaremos los archivos en un lugar seguro, no accesible a través de la web, por ejemplo en /etc/ssl/crt/, luego cambiamos los permisos para que sólo el usuario apache pueda accederlos y modificamos la configuración de Apache. Dependiendo la distribución que utilicemos el archivo de configuración de ssl puede estar en distintos lugares, por ejemplo en debian, la configuración de la página default está en /etc/apache2/sites-available/default-ssl. Igualmente podemos cambiar las configuraciones de Apache, editando el archivo /etc/apache2/apache2.conf o bien /etc/httpd/httpd.conf en distros basadas en Red Hat.
En fin, en el lugar que puedan configurar ssl, coloquen las siguientes líneas:
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key.insecure
# SSLCertificateChainFile /etc/apache2/ssl/ca-bundle.crt # si tienen un certificado firmado por una CA, descomentar esta línea
Luego reiniciamos Apache:
apache2ctl restart
o bien con:
service httpd restart
si usan algún derivado de Red Hat.


Con esto terminamos con la creación del certificado y la configuración de apache. Sólo restaría la prueba de fuego. Ejecuten un browser y coloquen la dirección de su página anteponiendo https en lugar de http. Si arranca, quiere decir que vamos bien. Vean las propiedades del certificado para comprobar.


Referencias:
Los comandos que utilicé fueron extraídos de http://www.tc.umn.edu/~brams006/selfsign.html
Para saber mejor cómo funciona openSSL pueden visitar http://www.madboa.com/geek/openssl/
Una explicación extra sobre cómo crear un certificado firmado por Go Daddy está en http://www.my-whiteboard.com/ecommerce/how-to-generate-an-ssl-certificate-from-godaddy.html
Si les interesa conocer cómo es la negociación de las claves al utilizar https, pueden seguir ésta página http://www.ourshop.org/resources/ssl_step1.html


Espero que les haya resultado tan interesante como a mi. En su momento tuve que leer varias páginas para encontrar toda ésta información y perder un par de días para poder armar un servidor seguro con un certificado firmado por una CA. Mi intensión es que con este artículo puedan hacer el mismo trabajo y a su vez puedan entender la forma en que funciona. Igual siempre es interesante leer artículos extra para sacarse dudas.
La parte teórica siempre es la base para entender un mecanismo, pero hasta que no lo implementan no se chocan con realidad, osea, el cómo lo hago. Por eso es que incluí tanto teoría como un ejemplo práctico, para que puedan tener el concepto completo.

Espero comentarios y sugerencias.
Popularidad de lenguajes de programación
Hace un tiempo atrás en el foro del departamento de computación de la universidad a la que asistí publicaron un interesante link donde se compara la popularidad de los lenguajes de programación.
Si bien la popularidad (como bien dicen en el site) no es un indicador de cuál es el mejor lenguaje, sí nos da una pauta de los lenguajes que se están utilizando a nivel mundial. El ranking se arma a partir de los datos de búsquedas obtenidos de Google, Yahoo! y Youtube.
Lo que más me sorprendió de la gráfica la primera vez que la vi, es que el amado/odiado C está 2do en nivel de popularidad. Aunque después de analizarlo un poco, es bastante lógico. Todo sistema necesita de un lenguaje de bajo nivel, flexible y eficiente. Los kernels están programados en C, como también los drivers, y casi cualquier otro programa que necesite acceso a las entrañas del SO o del hardware.

La página en cuestión es http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
La gráfica del top 20 para el mes de mayo es:Como se observa, Java viene reinando en popularidad (y lo viene haciendo hace tiempo). Le sigue de cerca C, C++ un poco más alejado y luego tenemos el omnipresente PHP.
Aunque parezca mentira, (Visual) Basic sigue encabezando como uno de los lenguajes más usados. Y como vengo viendo hace tiempo, Python viene pisando duro.

En fin, recorran la página que tiene info interesante, y vean si el lenguaje que aman es de los más buscados =)
Añadir fuentes de paquetes para apt

La idea de este articulo es explicar brevemente la forma de añadir nuevas fuentes de paquetes a nuestro sistema.
Los paquetes se pueden instalar:

  • desde internet
  • desde cd-rom
  • desde un directorio local

Archivo /etc/apt/sources.list

Para añadir fuentes de paquetes se debe editar el archivo /etc/apt/sources.list
Este es el archivo que le indica a apt donde buscar paquetes, por eso es que se añaden aquí las fuentes.

El formato de las entradas del archivo sources.list es:

deb uri distribución [componente1] [componente2] [...]

donde uri es la dirección del servidor donde se encuentra el mirror en formato uri, esto es, anteponiendo el protocolo, luego la dirección dns y luego el path hasta el directorio base (el clásico http://mymirror.com/dir/).

distribución es el nombre de la distribución que estamos usando, esto puede ser, stable, testing, unstable, o bien con el nombre que distingue la versión, como ser lenny, squeeze, sid. Todo depende como este armado el mirror.

componente1, componente2, etc son opcionales y se utilizan para especificar parámetros como la rama de paquetes que usamos. Esto se verá mejor con los ejemplos.

Siempre que actualizamos el sources.list es necesario luego ejecutar el comando

#apt-get update

Para más información sobre el archivo sources.list pueden leer su manual ejecutando "man sources.list"

Fuentes de internet

Esta es la forma de instalar paquetes encontrada por defecto en la mayoría de las distribuciones. Los paquetes se descargan desde mirrors ubicados en algún sitio de internet y luego se instalan.

Si se cuenta con una buena conexión a internet, es altamente recomendable utilizar estos mirrors, debido a que los paquetes se van actualizando continuamente, y de esta forma podemos mantener el sistema al día. Además estos repositorios contienen una basta cantidad de programas para instalar.

Como expliqué en la sección anterior, para añadir una fuente de internet, editaremos el archivo sources.list con el formato indicado. Si buscamos en internet, las páginas suelen dar la entrada completa para que simplemente copien la línea y la peguen en el archivo.

Si por ejemplo, queremos añadir un servidor de debian que se encuentra en Brasil, se debe añadir la siguiente línea:

deb http://ftp.es.debian.org/debian/ stable main contrib
donde, la uri es http://ftp.es.debian.org/debian/, la distribución es stable y los componentes son main y contrib.

Guardamos el archivo, y ejecutamos:

#apt-get update
Con esto ya tenemos nuestra base de datos actualizada, y podemos instalar los paquetes que se encuentren en ese servidor.

Fuentes en un cd-rom
Si contamos con cd-roms con paquetes, como ser la serie de cds que vienen con debian, o alguna otra distribución que tenga paquetes que nos interese, podemos agregar estos cds a nuestra base de paquetes.

Para añadir un cd-rom, debemos ingresar el cd-rom en la lectora y ejecutar:

#apt-cdrom add
En caso de que no encuentre nuestra lectora, porque quizás estemos usando una lectora que no es la predeterminada donde monta apt, debemos especificar la ruta:
#apt-cdrom -d /dev/hda add
donde -d sirve para indicar que le vamos a pasar la ruta del dispositivo, y /dev/hda es el controlador de la lectora.

Fuentes en un directorio
Si hemos descargado paquetes a nuestro disco y queremos aprovechar estos para no tener que bajarlos nuevamente cada vez que instalemos el sistema (o en caso de haber desinstalado los paquetes), podemos juntar estos paquetes en un directorio, crear el archivo necesario para que apt reconozca los paquetes y con esto tendremos estos paquetes en nuestro repositorio.

La receta para hacer esto es:

  • crear una carpeta "debCarpeta" con todos los binarios .deb
  • ubicados un lugar arriba de la carpeta recien creada, ejecutar el comando:
    #dpkg-scanpackages debCarpeta /dev/null | gzip > debCarpeta/Packages.gz
    esto creara el archivo Packages.gz necesario para cualquier utilidad de apt-get
  • agregar en /etc/apt/sources.list la linea:
    deb file:/pathAlaCarpeta/ debCarpeta/
  • ejecutar:
    #apt-get update
Con esto cubrimos las formas de agregar nuevas fuentes de paquetes a nuestro sistema. Si queremos mantener nuestro sistema actualizado, podemos ejecutar cada cierto tiempo "apt-get upgrade".
Recuerden que siempre es interesante leer los manuales de los comandos utilizados, en este caso "man apt-get" y "man apt-cdrom" nos puede dar una buena idea de lo que estamos haciendo.

Como siempre, son bienvenidos los comentarios y dudas.
winmodem -> linmodem

Para la primer entrada con información útil del blog elegí este artículo que escribí hace unos 4 años, cuando recién me iniciaba en el mundo GNU/Linux. Es el primer artículo importante que escribí. Si bien ya casi todos tienen banda ancha, aún hay gente que sólo tiene conexión dial-up, y muchos de los modems usados son winmodems.

Para aquellos que aún deben padecer los winmodems, les dedico este artículo. Puede que algunos links no funcionen, no los he revisado, recuerden que tiene 4 años... cualquier duda, comentario, etc, usen los coments de blogger.

Sin más intro, con ustedes, el artículo:

------------------------------------------------------

Para empezar, y fundamental asegurense te tener instalado:
- El compilador gcc, lo pueden hacer con: apt-get install gcc , aunque seria aconsejable que instalen todos los compiladores con: apt-get install build-essential.
- Las cabeceras del kernel, lo pueden hacer con: apt-get install linux-headers-2.6.10-5-386 (aunque deberian cambiar el nro de kernel, por el correspondiente al que tienen instalado).
Lo anterior también se puede hacer desde el manejador de paquetes, simplemente busquen build-essential y linux-headers o kernel-headers (depende la distro) y ya lo tienen.

La pagina que esta dedicada a este tipo de modems con mucha ayuda de como hacerlos funcionar en linux: http://linmodems.org/
La definicion de winmodem y linmodem sacada de esta pagina es:

A Winmodem is a combination of hardware known as chipset (much less than in a true pure hardware modem) and software (written for the infamous Windows operating systems family).
A Linmodem is a Winmodem working under the famous Linux operating system.

De la pagina pueden bajar un programita llamado scanmodem http://linmodems.technion.ac.il/packages/scanModem.gz, este les va a ayudar a saber cual es el chipset de su modem. Al ejecutarlo crea una carpeta llamada Modem y adentro crea varios archivos .txt, si estan apurados y quieren ir al grano, lean el q se llama ModemData.txt, aqui se indica el chipset y de donde pueden descargar los archivos y parches necesarios para la instalacion.

NOTA ESPECIAL: Parece que se solucionaron los problemas de los chipset PCTel corriendo en kernels 2.6 (hasta ahora no andaban), la noticia esta publicada en http://linmodems.technion.ac.il/pctel-linux/welcome.html al igual q la solucion.

Lo anterior explicado es la base para la instalación de cualquier winmodem.
Lean bien el archivo ModemData.txt pq yo no lo hice y estuve casi 2 semanas buscando en internet y todo lo que encontré estaba en ese archivo. La unica critica es q la explicación es un poco pobre en ese archivo y por eso capaz uno se pierde, pero haciendo uso de la pagina de linmodems, creo q ya hacen andar casi todo.
Ahora voy a ser mas especifico y voy a explicar como hice andar un NetoDragon con chipset SmartLink. Si bien el driver q tengo es original de la pagina y lo q voy a explicar es basado en este driver, supongo q todo lo que diga va a servir para cualquier modem con chipset SmartLink pq la base es la misma.

El driver del NetoDragon se baja desde http://www.netodragon.com/downloadpage.htm
Tambien van a tener que bajar un par de parches (esto para cualquier driver SmartLink) si tienen kernel 2.6.10 o mayores:
http://www.mwmu.com/mw/computers/linux/dell600m/slmodem-2.9.10-abby.diff y http://linmodems.technion.ac.il/packages/smartlink/ungrab-winmodem.tar.gz
Descomprimen el driver del modem y adentro de la carpeta q se crea copian el archivo slmodem-2.9.10-abby.diff y con este deben parchar para instalar. Esto lo hacen con: $patch -p1 < country="ARGENTINA">

Luego ejecutan:

#make
#make install
Con esto se instala el controlador, pero cuando lo intenten cargar van a tener problemas, los cuales se solucionan con el otro parche.
Descomprimen el archivo ungrab-winmodem.tar.gz . Dentro de la carpeta q se crea deben realizar nuevamente:
#make
#make install
Ahora deben cargar el parche con:
#modprobe ungrab-winmodem
Ahora si, pueden cargar el modem con:
#modprobe slamr
Ahora configuran el modem con su pais:
#/usr/sbin/slmodemd --country=ARGENTINA /dev/slamr0 &
Esto crea un dispositivo, que puede tener distintos nombres, en mi caso se llama /dev/ttySL0. Esto se los tira automáticamente cuando ejecutan el comando anterior.

Para no tener que cargar a mano los módulos ungrab-winmodem y slamr todas las veces q vamos a usar el modem, lo que podemos hacer es agregarlos a los modulos q carga el kernel cuando inicia. Esto lo hacemos editando el archivo /etc/modules agregando al final los modulos deseados, es decir ungrab-winmodem y slamr.

Con todo lo anterior ya deberían tener el modem andando, ahora para configurar una conexión, a mi no me anduvo kppp ni otros q son gráficos, solamente pude hacer andar la conexión con wvdial o con pon. Básicamente todos actuan sobre lo mismo ppp, asi q la razon de pq algunos andan y otros no, no la conozco.
Para wvdial deben configurar un archivo q creo va en /etc/wvdial.conf escribiendo ciertas lineas q indican al controlador q hacer. Yo tenia lo que habia q escribir pero ya me olvide y encontré otra aplicación q lo facilita todo. Esta es ejecutando $pppconfig . Con esto Pueden crear una cuenta muy fácilmente.

Para hacer andar la cuenta creada con pppconfig, hacen
$pon nombre_cuenta
Para ver el estado de cuando esta conectando:
$plog
Para desconectarse hacemos:
$poff

Un link interesante donde se da una ayuda para configurar una conexión a internet (y otras cosas) es:
http://www.nautopia.net/archives/es/linux_distribuciones/slacksinx/slackware_sin_x_ii.php

Con esto completamos lo que es la conexión. Si llegaron hasta aca es porque ya se pudieron conectar y estoy muy feliz, caso contrario tirenme el error q tienen y capaz se los pueda solucionar.
Yo estoy escribiendo esto conectado desde Ubuntu 5.04, asi q soy un claro ejemplo de q al menos a alguien lo que antes escribi le anda =P

Algo interesante q estuve buscando es que el modem tiene un altavoz (casi todos lo tienen), y cuando nos conectamos mete un quilombo monumental q lo escuchan hasta los vecinos. Hice una simple búsqueda y encontré lo siguiente:

Para quitar el molesto ( para otros agradable :P ) pitido que hace el modem al marcar, si hemos usado el programa pppconfig que viene con Debian para la configuración de la conexión, bastará con editar el archivo /etc/chatscripts/nombre_conexion y añadir la línea:

OK-AT-OK ATM0

antes del número de marcado, con lo que quedaría así:

...

OK-AT-OK ATM0

OK-AT-OK ATDTNum_Marcado

...

Guardamos y al ejecutar de nuevo

pon nombre_conexion

veremos como el modem se conecta sin hacer el más mínimo ruido :)

Fuente: http://eghost.deusto.es/phpwiki/index.php/ReceTasEusk1-10?PHPSESSID=1ebc4d6c4cbd6c75b444873ced7a1caf#x38.x2e._Errezeta

Ahora con esto soy casi completamente feliz, dado q ese ruido me taladraba la cabeza.

Ahh el texto es de libre distribucion siempre q nombren al autor y a los links citados :P
Suerte a todos! :D

uno más del monton?
Antes de realizar un post que realmente valga la pena, primero quería introducir este blog que he denominado IT Freek Zone... por qué el nombre? pues porque es lo primero que se me ocurrió, acaso pensaban algo distinto?
En fin, la idea del blog es ir posteando información relacionada con el mundo IT. En un principio contará mayoritariamente con artículos de GNU/Linux y del fascinante mundo de seguridad de la información (el cual me da de comer actualmente), pero la idea es agregar artículos sobre cualquier cosa relacionada con la informática.
De a poco iré incorporando los artículos que desarrollé para mi difunta página dlinux y para el foro www.linuxespanol.com. La idea era revivir dlinux, pero me doy cuenta que con el poco tiempo que tengo, lo mejor es tener un blog y tirar lo que va apareciendo de forma sencilla.

Espero que les resulte interesante, y que si bien es un blog más del montón, tenga información que sea valuable.
d3m4s1@d0v1v0