Sistemas operativos, seguridad, redes, programación, robótica y astronomía
sistemas operativos
Distribución del espacio en linux
10 mar 2010
Sabemos de la importancia que tiene el tener el sistema de archivos organizado en varias particiones, a ser posibles que estén en discos diferentes por cuestiones de rendimiento. Por ejemplo tener /home en una partición nos permitirá mantener nuestros datos personales, configuraciones. Otro ejemplo es /usr que es donde se instalan la mayoría de los programas. De esta forma podemos separar sistema de programas, permitiendo las lecturas y escrituras en paralelo tanto del sistema operativo como de las aplicaciones.
Hasta aquí más o menos todos coincidimos, el problema viene a la hora de decidir el espacio a dedicarle a cada partición. Si asignamos demasiado desperdiciaremos espacio, y si nos quedamos cortos el problema será peor. El programa de instalación de cada distribución de linux suele hacer una propuesta al particionar el disco, pero los valores aconsejados distan mucho de la realidad. Para tener una orientación en futuras instalaciones he decidido obtener estadísticas de ocupación de cada una de las carpetas importantes del sistema. Para ello he utilizado la aplicación baobab (presente en casi todas las distribuciones) que realiza muy bien este cometido.
El sistema sobre el cual he obtenido las estadísticas es un sistema de escritorio Ubuntu Karmic 9.10 con algunas aplicaciones extra instaladas que suelo utilizar frecuentemente. La distribución del espacio es la siguiente:

Como podemos apreciar las carpetas de mayor tamaño son /usr, /home, /opt y /var. Esto puede variar considerablemente dependiendo del uso que se le de a /home. En mi caso no suelo guardar archivos de gran tamaño ahí. Para eso suelo tener otra partición dedicada exclusivamente a datos.
Las conclusiones que he llegado, sin contar con la partición de datos y sin la partición de swap, es que es conveniente tener al menos 4 particiones con los siguientes tamaños en porcentajes respecto del total de espacio disponible:
- /usr entre un 35% y un 40%. Como he dicho esto puede variar en función del uso que se le de a /home
- /home con un 30% aproximadamente. Si no se tiene una partición de datos el tamaño deberá ser mayor.
- /var con un 8%
- Y otra partición que contendrá el resto de carpetas del sistema
Como he comentado no se ha tenido en cuenta la partición de swap, una regla que solía seguirse era tener el doble de swap que de memoria RAM. Actualmente con las cantidades de memoria que suelen tener los equipos está un poco desfasada. Con 1GB para swap debería ser más que suficiente para cualquier sistema de escritorio.
Incrementado la seguridad en SSH
6 mar 2010
SSH (Secure SHell, en español: intérprete de órdenes segura) es el nombre de un protocolo y del programa que lo implementa, y sirve para acceder a máquinas remotas a través de una red. Permite manejar por completo la computadora mediante un intérprete de comandos, y también puede redirigir el tráfico de X para poder ejecutar programas gráficos si tenemos un Servidor X (en sistemas Unix y Windows) corriendo.
Cuando instalamos un servidor de ssh, por ejemplo OpenSSH (sudo aptitude install ssh), en ocasiones solemos dejarlo con las opciones de configuración que vienen por defecto, sobre todo en entornos domésticos, asumiendo que como ssh es un shell seguro, no necesitamos realizar más ajustes que los que vienen por defecto. Nada más lejos de la realidad. Vamos a ver algunas de las opciones del archivo de configuración (/etc/ssh/sshd_config) que nos pueden ayudar a comprender mejor como funciona ssh y lo expuestos que podemos estar frente a ataques basados en diccionario si no se toman las medidas oportunas.
Para editar el archivo necesitamos permisos de administrador:
sudo gedit /etc/ssh/sshd_config
Al editarlo podremos observar hay multitud de opciones de configuración, pero sólo nos vamos a centrar en las siguientes:
Port 20022 Protocol 2 LoginGraceTime 30 PermitRootLogin no MaxAuthTries 2 MaxStartups 1 AllowUsers pepito AllowUsers juanito@80.25.14.14
Veámos el significado de ellas:
- Port 20022 indica el puerto de escucha de ssh, es decir, donde estará esperando conexiones el servicio de ssh. El puerto por defecto es el 22 y es importante cambiarlo, ya que muchos scripts de ataques están dirigidos a este puerto. Cambiar de puerto no garantiza que no pueda ser localizado por dichos scripts, pero desde luego se lo ponemos más complicado. ¿Piensas que no es necesario cambiar el puerto? ¿Por qué no le hechas un vistazo a los registros de log de autentificación en /var/log/auth.log? ¿Sorprendido? Si tienes una máquina conectada a Internet, con el puerto 22 abierto y redirigido a una máquina con acceso ssh, seguro que tienes mucho que mirar en dicho fichero, como por ejemplo intentos de conexión fallidos. Por ejemplo, unas cuantas líneas como estas:
Feb 28 11:57:04 distantsuns sshd[25055]: Invalid user kid from 220.108.89.55
Feb 28 11:57:13 distantsuns sshd[25111]: Failed password for root from 220.108.89.55 port 44336 ssh2
Feb 28 11:58:25 distantsuns sshd[25775]: Failed password for invalid user kes from 220.108.89.55 port 48097 ssh2
Mi recomendación es que utilicéis un puerto alto, por encima del 10000. La mayoría de los escaners de puertos buscan por defecto en los puertos bien conocidos (hasta el 1024) y algunos puertos por encima, pero no los revisan todos.
Evidentemente, cambiar el puerto no nos asegura nada, pero pone las cosas un poco más difíciles a los scripts automáticos. - Protocol 2 existen 2 versiones de ssh, versión 1 y versión 2. La primera se mantiene sólo por compatibilidad y no debería ser usada ya que está obsoleta y tiene algunas vulnerabilidades bien conocidas.
- LoginGraceTime 30 indica el número de segundos que estará disponible la pantalla de login. Pasados los segundos la conexión se cerrará. De esta forma evitamos que alguien esté intentando acceder mediante un script varias veces para adivinar un usuario y contraseña. El valor por defecto de este campo es 130, demasiado tiempo en mi opinión, se pueden realizar muchas pruebas automáticas en ese tiempo. Para cualquier ser humano con 30 segundos debería ser más que suficiente.
- PermitRootLogin no muy importante no permitir conexiones remotas con el usuario root. Todos los ataques basados en diccionario saben que en los sistemas en UNIX, existe un usuario en el sistema llamado root. Por tanto una parte de la combinación usuario-contraseña ya la tendrían y no sólo eso, sino con acceso de administrador. Sorprendentemente esta opción estaba por defecto en mi máquina con el valor yes. Desde luego es un agujero de seguridad tremendo. Si necesitamos acceder vía ssh con permisos de administrador, podemos entrar al sistema con cualquier usuario estándar y una vez dentro cambiamos a root con el comando su.
- MaxAuthTries 2 indica la cantidad de veces que podemos equivocarnos al validarnos como usuario, en este caso después de dos intentos, se perderá o cerrará la conexión. Si se diera el caso podemos volver a intentarlo, pero de esta forma evitamos ataques basados en la persistencia de la conexión.
- MaxStartups 1 indica la cantidad de conexiones simultáneas de login que permitirá el sshd por ip que intente conectarse. Muchos de los ataques dividen su esfuerzo abriendo múltiples pantallas de login, llegando incluso a saturar el sistema. Es decir, el ataque se divide en una gran cantidad de logins, aumentando las posibilidades de obtener un usuario y contraseña más rápidamente. Tener este parámetro con el valor 1 no significa que no podamos tener varios shells remotos abiertos, simplemente cuenta pantallas de login. Una vez validados, podemos abrir otro shell sin problemas.
- AllowUsers indica los usuarios que tienen permiso para acceder por ssh al sistema. Muy útil cuando tenemos muchos usuarios en el sistema y no podemos tener un control sobre la seguridad de las contraseñas que se hayan puesto dichos usuarios. Por tanto sólo daremos permiso a aquellos usuarios que sepamos que tienen una combinación de usuario y contraseña fuertes. Con esta opción también podemos indicar desde que máquinas permitimos el acceso. Por ejemplo podríamos hacer que el usuario juanito sólo pudiése acceder desde la ip 80.25.14.14 añadiendo la siguiente línea:
AllowUsers juanito@80.25.14.14
También podemos usar comodines para indicar que se permite acceso desde una red entera. Por ejemplo supongamos que nuestra red privada utiliza direcciones ip privadas de clase C del tipo 192.168.0.X (máscara por defecto 255.255.255.0). Podríamos añadir la siguiente línea para indicar que se permite el acceso al usuario alicia únicamente desde la red privada:
AllowUsers alicia@192.168.0.*
Con este mini tutorial sobre la configuración podremos tener un sistema más seguro que unido al tutorial de verificación de rootkits, nos permite estar un poco más tranquilos.
Crear nuestra propia distribución basada en Ubuntu en un pendrive
6 dic 2009
Motivación
¿Por qué hacerlo? En primer lugar para aprender. Existen muchos sistemas hechos para instalar en pendrive, ¿pero donde estaremos más cómodos que en el nuestro propio? Como instalaremos sólo lo que necesitemos, podemos reducirlo a un sistema minimalista que entre en un Pendrive de 1GB, o un sistema completo para Pendrives de mayor capacidad.
Además bastará con crear una imagen del pendrive (mediante ‘cat’ o ‘dd’) para clonarlo las veces que queramos y en el número de memorias USB que deseemos (sería un buen regalo para un amigo: “un pendrive con una mini distribución hecha por ti mismo” xD).
Requisitos
Preparando el Pendrive
ATENCIÓN: Todos los datos que contenga el pendrive serán destruidos. Así que guárdate la información importante antes de empezar con el proceso. Introducimos el Pendrive en la ranura USB, suponemos que esta en /dev/sdc1 pero esto puede variar de un sistema a otro. Para asegurarte del dispositivo que es, una vez hayas insertado el pendrive se montará automáticamente. Ejecuta la orden mount desde la consola y verás el dispositivo que corresponde al pendrive.
Particionamos mediante fdisk, creamos 1 sola partición de tipo Linux (83), formateamos en ext2 y montamos en /mnt. Para ello seguimos los siguientes pasos:
- En primer lugar debemos desmontar el pendrive, ya que de lo contrario no nos dejará formatear y modificar las particiones. Para ello ejecutamos:
- sudo umount /dev/sdc1
- En segundo lugar creamos las particiones:
- sudo fdisk /dev/sdc1
- Pulsamos p para imprimir la tabla de particiones.
- Borramos todas las particiones, para ello pulsamos d e indicamos la partición a borrar. Repetimos este proceso tantas veces como particiones tengamos.
- Creamos una partición nueva, para ello pulsamos n y aceptamos los valores por defecto que son el principio y el fin, es decir, nuestra partición nueva ocupará toda la capacidad del pendrive.
- Guardamos y salimos con la opción w.
- sudo fdisk /dev/sdc1
- Formateamos con el sistema de archivos nativo de Linux:
- sudo mkfs.ext2 /dev/sdc1
- Montamos el dispositivo (pendrive) en /mnt:
- mount /dev/sdc1 /mnt
Instalando el sistema base
Esto nos lo hará la genial herramienta debootstrap. Sólo necesitamos indicarle la arquitectura y la versión de Ubuntu a usar.
En nuestro caso sera ‘i386′ y ‘karmic’, pero podéis variarlo según queráis. También le indicamos que incluya algunas herramientas extras y los paquetes de idioma en español.
- sudo debootstrap –include=language-pack-es,language-pack-es-base,initramfs-tools,nano,linux-image –components=main,universe –verbose –arch i386 karmic /mnt http://archive.ubuntu.com/ubuntu
Customizando el sistema
Ahora ya tenemos un sistema mínimo en el Pendrive. Vamos a instalar las herramientas que encontremos necesarias, y a personalizarlo un poco a nuestro gusto.
- En primer copiamos el archivo de resolución de las dns:
- sudo cp /etc/resolv.conf /mnt/etc/resolv.conf
- Luego montamos /proc
- sudo mount -t proc none /mnt/proc
- Ahora montamos /dev
- sudo mount -o bind /dev /mnt/dev
- Realizamos el cambio de sistema (chroot).
- sudo chroot /mnt
- Puede que de algún error del tipo “groups: no se puede encontrar el nombre para el grupo con ID 124″. Pero no hay que darle importancia.
- Instalamos unos paquetes extras.
- aptitude install joe screen ssh less openssl console-data console-common
- Instalamos el paquete de sistema
- aptitude install syslinux
- Establecemos una contraseña para root
- passwd
- Añadimos un usuario al sistema (substitye <nombre_usuario> por el nombre de usuario que desees).
- adduser <nombre_usuario>
Para poder usar el Pendrive en cualquier PC, necesitamos algun método que nos permita detectar en que unidad lo ha detectado la BIOS. Es decir sda,sdb,sdc… Para ello utilizaremos las etiquietas de disco (Label). Para asignar una etiqueta a un disco utilizaremos tune2fs. La etiqueta puede llamarse como queramos.
- tune2fs -L G3X /dev/sdc1
Configuramos los archivos básicos. El contenido de estos depende de nuestro caso en particular. Para editarlos podemos usar nano por ejemplo.
nano /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp nano /etc/hostname G3X nano /etc/hosts 127.0.0.1 localhost G3X nano /etc/fstab proc /proc proc defaults 0 0 LABEL=G3X / ext2 defaults,rw 0 1
Creamos el archivo mtab, e instalamos extlinux en el disco y mbr. ¡Mucho cuidado con este último paso!
- grep -v rootfs /proc/mounts > /etc/mtab
- mkdir -p /boot/extlinux
- extlinux -zi /boot/extlinux
-
CUIDADO: El siguiente comando es importante que te fijes en el dispositivo al cual redireccionamos. Si nuestro pendrive estaba en /dev/sdc1 redireccionaremos a /dev/sdc (es decir sin el número). Si el pendrive fuese /dev/sdb1 redireccionaríamos a /dev/sdb.-
cat /usr/lib/syslinux/mbr.bin > /dev/sdb
-
Ahora creamos el archivo de configuración de extlinux.hora creamos el archivo de configuración de extlinux.
- nano /boot/extlinux/extlinux.conf
default G3X prompt 1 timeout 5 display /boot/extlinux/hola.msg label G3X kernel /boot/vmlinuz-2.6.31-14-generic append initrd=/boot/initrd.img-2.6.31-14-generic rw root=LABEL=G3X
Los parámetros señalados en azul deben obtenerse haciendo un ls sobre /boot
Evitar ventanas maximizadas en UNR
22 oct 2009
Hace unos dias fuí a descargar la última versión de Ubuntu para instalarla en mi Samsung NC10 y me llevé una grata sorpresa al ver que disponen de una versión especial para Netbook. La descargué al momento y la probé desde el pendrive siguiendo los pasos de instalación.
Me sorprendió la fluidez con la que funcionaba así que decidí instalarla en el disco duro. La único que no me convencía era la capa que añade al interfaz gráfico de Gnome, supuestamente para “facilitar” el uso del sistema operativo a aquellas personas que no están familiarizadas con los entornos linux. Lo deshabilité, desde la opción cambiar modo de escritorio, y me quedé con la interfaz de Gnome.
Hasta aquí todo perfecto, pero al poco tiempo de estar trabajando con él, me percaté que al cerrar una ventana y luego volverla a abrir no “recordaba” el tamaño, siempre las abría maximizadas. Investigando descubrí que el motivo es el paquete maximus que instala la versión UNR para que todas las aplicaciones se abran maximizadas en la interfaz gráfica adaptada.
Hay 2 soluciones:
- La primera, abrir el editor de configuración (ALT+F2 gconf-editor) ir a apps –> maximus y marcar la casilla no_maximize. (es la opción que he utilizado)
- La segunda, desinstalar el paquete maximus.