viernes, 29 de mayo de 2009

La realidad del sistema de archivos

Para la mayoría de las tareas realizadas por usuarios y administradores de sistemas, es suficiente con aceptar que los archivos y directorios estan estructurados en forma de arbol. Sin embargo, la computadora no entiende que es un arbol.

Cada particion tiene su propio sistema de archivos. Imaginando todos esos sistemas de archivos juntos, podemos formarnos una idea de estructura ramificada del sistema entero, pero no es tan simple como eso. En un sistema de archivos, un archivo esta representado por un inodo, una especie de numero de serie conteniendo información acerca de los datos reales que forman un archivo: a quien pertenece y donde esta localizado fisicamente en el disco duro.

Cada particion tiene su propio set de inodos; a traves de un sistema de multiples particiones, pueden existir archivos con el mismo número de inodo.

Cada inodo describe una estructura de datos en el disco duro, almacenando las propiedades de un archivo, incluyendo la ubicación fisica de los datos. Cuando un disco rigido es formateado, un número fijo de inodos por partición es creado. Este número es el máximo de archivos, no importa el tipo (incluyendo directorios, archivos especiales, enlaces, etc.) que pueden existir en la misma partición al mismo tiempo. Tipicamente se utiliza 1 inodo cada 2 a 8 kilobytes.

Cuando un archivo es creado, este toma un inodo libre. Ese inodo contiene la siguiente información:


  • Usuario y Grupo a quien pertenece el archivo.

  • Tipo de archivo (regular, directorio, etc.)

  • Permisos del archivo.

  • Fecha y hora de creación, última lectura y último cambio.

  • Cantidad de enlaces apuntando al archivo.

  • Tamaño del archivo.

  • Ubicación fisica del archivo.

La única información que no es ncluida en un inodo, es el nombre del archivo y del directorio. Este, es almacenado en el archivo especial de directorio. Comnparando nombres de archivo y números de inodos, el sistema puede crear una estructura ramificada (o tipo arbol) que el usuario pueda entender. los usuarios pueden visualizar el número de inodo usando

$ ls -i

El inodo tiene su propio espacio separado en el disco.

jueves, 28 de mayo de 2009

Puntos de Montaje

Todas las particiones estan "enganchadas" al sistema por medio de un punto de montaje.
Los puntos de montaje definen el lugar que ocupa un set de datos en particular dentro del sistema de archivos. Usualmente, todas las particiones estan conectadas a travez del la particion raiz (o root en ingles). Sobre esta partición, la cual es indicada por una barra "/", los directorios son creados. Durante el inicio del sistema, todas las particiones descritas en /etc/fstab son montadas automaticamente.
La infomacion acerca de las particiones del sistema pueden ser visualizadas usando:

$ df

(por "disk full" o "disk free"). Para que la formacion sea mas "legible" se utiliza la opcion:

$ df -h

(h por "human readable") El comando, solo muestra información acerca de particiones no SWAP activas. Lo cual incluye particiones de otros sistemas de la red, como por ejemplo los directorios "home" que son montados de un servidor. La salida del comando sera algo similar a:


Filesystem Size Used Avail Use% Mounted on
/dev/hda8 496M 183M 288M 39% /
/dev/hda1 124M 8.4M 109M 8% /boot
/dev/hda5 19G 15G 2.7G 85% /opt
/dev/hda6 7.0G 5.4G 1.2G 81% /usr
/dev/hda7 3.7G 2.7G 867M 77% /var
fs1:/home 8.9G 3.7G 4.7G 44% /.automount/fs1/root/home


Que muestra el dispositivo, tamaño, utilizado, disponible, porcentaje usado y punto de montaje respectivamente.

miércoles, 27 de mayo de 2009

Nmap (2)

Opciones Generales

No se requiere ninguna pero algunas de ellas pueden resultar de gran utilidad.


-p0 No intenta hacer ping a un servidor antes de escanearlo. Esto permite el escaneo de redes que no permiten que pasen peticiones (o respuestas)de ecos ICMP a traves de su firewall. microsoft.com es un ejemplo de una red de este tipo, y, por lo tanto, deberia usarse siempre -p0 o -PT80 al escanear microsoft.com.

-PT Usa el ping TCP para determinar que servidores estan activos. En vez de enviar paquetes de peticion de ecos ICMP y esperar una respuesta, se lanzan paquetes TCP ACK a traves de la red de destino (o a una sola maquina) y luego se espera a que lleguen las respuestas. Los servidores activos responden con un RST. Esta opcion mantiene la eficiencia de escanear unicamente aquellos servidores que se encuentran activos y la combina con la posibilidad de escanear redes/servidores que bloquean los paquetes ping. Para los usuarios no root se usa connect(). Para establecer el puerto de destino de los paquetes de prueba use -PT <numero de puerto). El puerto por defecto es el 80, dado que normalmente este puerto no es un puerto filtrado.

-PS Esta opcion usa paquetes SYN (peticion de conexion) en vez de los paquetes ACK para usuarios root. Los servidores activos deberian responder con un RST (o, en raras ocasiones, un SYN|ACK).

-PI Esta opcion usa un paquete ping (peticion de eco ICMP) verdadero. Encuentra servidores que estan activos y tambien busca direcciones de broadcast dirigidas a subredes en una red. Se trata de direcciones IP alcanzables desde el exterior que envian los paquetes IP entrantes a una subred de servidores. Estas direcciones deberian eliminarse, si se encontrase alguna, dado que suponen un riesgo elevado ante numerosos ataques de denegacion de servicio (el mas corriente es Smurf).

-PB Este es el tipo de ping por defecto. Usa los barridos ACK ( -PT ) e ICMP ( -PI ) en paralelo. De este modo se pueden alcanzar firewalls que filtren uno de los dos (pero no ambos).

-O Esta opcion activa la deteccion remota del sistema operativo por medio de la huella TCP/IP. En otras alabras, usa un punado de tecnicas para detectar sutilezas en la pila de red subyacente del sistema operativo de los servidores que se escanean. Usa esta informacion para crear una 'huella' que luego compara con una base de datos de huellas de sistemas operativos conocidas (el archivo nmap-os-fingerprints) para decidir que tipo de sistema se esta escaneando.

-I Esta opcion activa el escaneo TCP de identificacion contraria. Tal y como comenta Dave Goldsmith en un correo Bugtrat de 1996, el protocolo ident (rfc 1413) permite la revelacion del nombre del usuario propietario de cualquier proceso conectado via TCP, incluso aunque ese proceso no haya iniciado la conexion. De este modo se puede, por ejemplo, conectar con el puerto http y luego usar identd para descubrir si el servidor esta ejecutandose como root. Esto solo se puede hacer con una conexion TCP completa con el puerto de destino (o sea, la opcion de escaneo -sT). Cuando se usa -I, se consulta al identd del servidor remoto sobre cada uno de los puertos abiertos encontrados en el sistema. Por supuesto, esto no funcionara si el servidor en cuestion no esta ejecutando identd.

-f Esta opcion hace que el escaneo solicitado de tipo SYN, FIN, XMAS, o NULL use pequenos paquetes IP fragmentados. La idea consiste en dividir la cabecera TCP en varios paquetes para ponerselo mas dificil a los filtros de paquetes, sistemas de deteccion de intrusion y otras inconveniencias por el estilo que tratan de saber lo uno esta haciendo. iTenga cuidado con esto! Algunos programas tienen problemas a la hora de manejar estos paquetes tan pequenos. Mi sniffer favorito produjo un error de segmentacion inmediatamente despues de recibir el primer fragmento de 36 bytes. ¡Despues de este viene uno de 24 bytes! Mientras que este metodo no podra con filtros de paquetes y firewalls que ponen en cola todos los fragmentos IP (como en el caso de la opcion CONFIG_IP_ALWAYS_DEFRAG en la configuracion del kernel de Linux), tambien es verdad que algunas redes no pueden permitirse el efecto negativo que esta opcion causa sobre su rendimiento y por lo tanto la dejan desactivada.
Notese que no he coseguido que esta opcion funcione con todos los sistemas. Funciona bien con mis sistemas Linux, FreeBSD y OpenBSD y algunas personas han informado de exitos con otras variantes *NIX.

-v Modo de informacion ampliada. Esta opcion resulta muy recomendable y proporciona gran cantidad de informacion sobre lo que esta sucediendo. Puede usarla dos veces para un efecto mayor. iUse -d un par veces si lo que quiere es volverse loco haciendo scroll en su pantalla!

-h Esta opcion tan practica muestra una pantalla de referencia rapida sobre las opciones de uso de nmap. Quizas haya notado que esta pagina de manual no es precisamente una "referencia rapida" :)

-o <nombre_de_archivo_de_registro>
Esta opcion guarda los resultados de sus escaneos en forma humanamente inteligible en el archivo especificado como argumento.

-m <nombre_de_archivo_de_registro>
Esta opcion guarda los resultados de sus escaneos en un formato comprensible para una maquina en el archivo especificado como argumento.

-i <nombre_de_archivo_de_entrada>
Lee especificaciones de servidores o redes de destino a partir del archivo especificado en vez de hacerlo de la linea de comandos. El archivo debe contener una lista de expresiones de servidores o redes separadas por espacios, tabuladores o nuevas lineas. Use un guion (-) como nombre_ de_archivo_de_entrada si desea que nmap tome las expresiones de servidores de stdin. Vease la seccion Especificacion de Objetivo para mas informacion sobre expresiones con las que poder completar este archivo.

-p <rango de puertos>
Esta opcion determina los puertos que se quieren especificar. Por ejemplo, '-p 23' probara solo el puerto 23 del servidor(es) objetivo. '-p 20-30,139,60000-' escanea los puertos del 20 al 30, el puerto 139 y todos los puertos por encima de 60000. Por defecto se escanean todos los puertos entre el 1 y el 1024 asi como los que figuran en el archivo /etc/services.

-F Modo de escaneo rapido.
Implica que solo se desean escanear aquellos puertos que figuran en /etc/services. Obviamente esto resulta mucho mas rapido que escanear cada uno de los 65535 puertos de un servidor.

-D <senuelo1 [,senuelo2][,ME],...>
Especifica que se desea efectuar un escaneo con senuelos, el cual hace que el servidor escaneado piense que la red destino del escaneo esta siendo escaneada tambien por el servidor(es) especificados como senuelos. Asi, sus IDs pueden informar de entre 5 y 10 escaneos procedentes de direcciones IP unicas, pero no sabran que direccion IP les estaba escaneando realmente y cuales eran senuelos inocentes.
Separe cada servidor senuelo con comas, y puede usar opcionalmente 'ME' como senuelo que representa la posicion que quiere que ocupe su direccion IP. Si coloca 'ME' en la sexta posicion o superior, es muy poco probable que algunos escaneres de puertos comunes (como el excelente scanlogd de Solar Designer) lleguen incluso a mostrar su direccion IP. Si no se usa 'ME', nmap le colocara a usted en una posicion aleatoria. Notese que aquellos servidores usados como senuelos
deben escontrarse activos, o, de lo contrar o podria provocar un desbordamiento (flood) SYN en su objetivo. Por otra parte, resultara bastante facil saber que servidor esta escaneando si unicamente hay uno activo en la red.
Notese tambien que algunos (estupidos) "detectores de escaneres de puertos" opondran una firewall o bien denegaran el rutaje a aquellos servidores que intenten escanear sus puertos. De este modo se podria provocar inadvertidamente que la maquina que se esta intentando escanear perdiese contacto con los servidores usados como senuelos. Esto podria causarles a los servidores escaneados verdaderos problemas si los servidores senuelo fuesen, por ejemplo, su gateway a internet o incluso "localhost".
Deberia usarse esta opcion con extremo cuidado. La verdadera moraleja de este asunto es que un detector de escaneos de puertos que aparenten tener intenciones poco amistosas no deberia llevar a cabo accion alguna contra la maquina que aparentemente le esta escaneando. iPodria no ser mas que un senuelo! Los senuelos se usan tanto en el escaneo ping inicial (usando ICMP, SYN, ACK, o lo que sea) como en la fase de escaneo de puertos propiamente dicha. Tambien se usan los senuelos en la fase de deteccion remota del sistema operativo ( -O ).
Vale la pena destacar que el uso de demasiados senuelos puede ralentizar el proceso de escaneo y, potencialmente, hacer que sea menos exacto. Por otra parte, algunos ISPs filtraran los paquetes manipulados y los desecharan, aunque muchos (actualmente la mayoria) no ponen restricciones a este tipo de paquetes.

-S <Direccion_IP>
En determinadas circunstancias, es posible que nmap no sea capaz de determinar su (de usted) direccion IP de origen ( nmap se lo hara saber si este es el caso). En este caso, use -S con su direccion IP (del interfaz a traves del cual desea enviar los paquetes).
Otro posible uso de esta opcion es el de manipular el escaneo para hacer creer a los servidores de
destino que alguien mas les esta escaneando.
¡Imaginese a una compania escaneada repetidamente por una compania rival! Esta no es la funcion para la que se ha disenado esta opcion (ni su proposito principal). Simplemente pienso que revela una posibilidad que la gente deberia tener en cuenta antes de acusar a los demas de escanear sus puertos. La opcion -e sera necesaria en general para este tipo de uso.

-e <interfaz>
Le dice a nmap que interfaz ha de usar para enviar y recibir paquetes. El programa deberia detectar esto por si mismo, pero le informara si no es asi.

-g <numero_de_puerto>
Establece el numero de puerto de origen a usar en los escaneos. Muchas instalaciones de firewalls y filtros de paquetes inocentes hacen una excepcion en sus reglas para permitir que las atraviesen y establezcan una conexion paquetes DNS (53) o FTPDATA (20). Evidentemente esto contraviene completamente las ventajas en materia de seguridad que comporta una firewall dado que los intrusos pueden enmascararse como DNS o FTP con una simple modificacion de su puerto de origen. Por supuesto, deberia probarse primero con el puerto 53 para un escaneo UDP y los escaneos TCP deberian probar el 20 antes del 53.
Notese que el uso de esta opcion penaliza levemente el rendimiento del escaneo, porque a veces se almacena informacion util en el numero de puerto de origen.

-M <max sockets>
Establece el numero maximo de sockets que se usaran en paralelo para un escaneo TCP connect() (escaneo por defecto). Resulta util a la hora de ralentizar ligeramente el proceso de escaneo con el fin de evitar que la maquina de destino se cuelgue. Otra manera de hacerlo es usar -sS, que normalmente les resulta mas facil de asumir a las maquinas de destino. Especificacion de Objetivo Cualquier cosa que no es una opcion (o el argumento de una opcion) en namp se trata como una especificacion de servidor de destino. El caso mas simple consiste en especificar servidores aislados o direcciones IP en la linea de comandos. Si pretende escanear una subred de direcciones IP, entonces se puede anadir '/mask' a la direccion IP o al nombre del servidor. mask debe estar entre 0 (escanea toda Internet) y 32 (escanea unicamente el servidor especificado). Use /24 para escanear una direccion de clase 'C' y /16 para la clase 'B'. Nmap dispone tambien de una notacion mucho mas potente que permite la especificacion de direcciones IP usando listas/rangos para cada elemento.
De este modo, se puede escanear la red de clase 'B' completa 128.210.*.* especificando '128.210.*.*' o '128.210.0-255.0-255' o incluso notacion de mascara: '128.210.0.0/16'. Todas ellas son equivalentes. Si se usan asteriscos ('*'), ha de tenerse en cuenta que la mayoria de los shells requieren que se salga de ellos con caracteres / o que se les proteja con comillas.
Otra posibilidad interesante consiste en dividir Internet en el otro sentido. En vez de escanear todos los servidores en una clase 'B', se puede escanear '*.*.5.6-7' para escanear todas las direcciones IP terminadas en .5.6 o .5.7 Escoja sus propios numeros.

martes, 26 de mayo de 2009

Nmap (1)

Nmap es una herramienta de exploracion de red y escaner de seguridad.

$ nmap [Tipos(s)de escaneo] [Opciones] <servidor o red>

DESCRIPCION

Nmap ha sido disenado para permitir a administradores de sistemas y gente curiosa en general el escaneo de grandes redes para determinar que servidores se encuentran activos y que servicios ofrecen. nmap es compatible con un gran numero de tecnicas de escaneo como: UDP, TCP connect(), TCP SYN (half open), ftp proxy (bounce attack), Reverseident, ICMP (ping sweep), FIN, ACK sweep, Xmas Tree, SYN sweep, and Null scan. nmap proporciona tambien caracteristicas avanzadas como la deteccion remota del sistema operativo por medio de huellas TCP/IP , escaneo tipo stealth (oculto), retraso dinamico y calculos de retransmision, escaneo paralelo, deteccion de servidores inactivos por medio de pings paralelos, escaneo con senuelos, deteccion de filtrado de puertos, escaneo por fragmentacion y especificacion flexible de destino y puerto.

Se han hecho grandes esfuerzos encaminados a proporcionar un rendimiento decente para usuarios normales (no root). Por desgracia, muchos de los interfaces criticos del kernel (tales como los raw sockets) requieren privilegios de root. Deberia ejecutarse nmap como root siempre que sea posible.

OPCIONES

En general, pueden combinarse aquellas opciones que tengan sentido en conjunto. Algunas de ellas son especificas para ciertos modos de escaneo. nmap trata de detectar y advertir al usuario sobre el uso de combinaciones de opciones sicoticas o no permitidas.

Tambien puede ejecutar el comando $ nmap -h para una pagina de referencia rapida con un listado de todas las opciones.


Tipos de Escaneo

-sT Escaneo TCP connect(): Es la forma mas basica de escaneo TCP. La llamada de sistema connect() proporcionada por nuestro sistema operativo se usa para establecer una conexion con todos los puertos interesantes de la maquina. Si el puerto esta a la escucha, connect() tendra exito, de otro modo, el puerto resulta inalcanzable. Una ventaja importante de esta tecnica es que no resulta necesario tener privilegios especiales. Cualquier usuario en la mayoria de los sistemas UNIX tiene permiso para usar esta llamada.
Este tipo de escaneo resulta facilmente detectable dado que los registros del servidor de destino
muestran un monton de conexiones y mensajes de error para aquellos servicios que accept() (aceptan) la conexion para luego cerrarla inmediatamente.

-sS Escaneo TCP SYN: A menudo se denomina a esta tecnica escaneo "half open" (medio abierto), porque no se abre una conexion TCP completa. Se envia un paquete SYN, como si se fuese a abrir una conexion real y se espera que llegue una respuesta. Un SYN|ACK indica que el puerto esta a la escucha. Un RST es indicativo de que el puerto no esta a la escucha. Si se recibe un SYN|ACK, se envia un RST inmediatamente para cortar la conexion (en realidad es el kernel de nuestro sistema operativo el que hace esto por nosotros). La ventaja principal de esta tecnica de escaneo es que sera registrada por muchos menos servidores que la anterior. Por desgracia se necesitan privilegios de root para construir estos paquetes SYN modificados.

-sF -sX -sN Modos Stealth FIN, Xmas Tree o Nul scan: A veces ni siquiera el escaneo SYN resulta lo suficientemente clandestino. Algunas firewalls y filtros de paquetes vigilan el envio de paquetes SYN a puertos restringidos, y programas disponibles como Synlogger y Courtney detectan este tipo de escaneo. Estos tipos de escaneo avanzado, sin embargo, pueden cruzar estas barreras sin ser detectados.
La idea es que se requiere que los puertos cerrados respondan a nuestro paquete de prueba con un RST, mientras que los puertos abiertos deben ignorar los paquetes en cuestion (vease RFC 794 pp 64). El escaneo FIN utiliza un paquete FIN vacio (sorpresa) como prueba, mientras que el escaneo Xmas tree activa las flags FIN, URG y PUSH. El escaneo NULL desactiva todas las flags. Por desgracia Microsoft (como de costumbre) decidio ignorar el estandar completamente y hacer las cosas a su manera. Debido a esto, este tipo de escaneo no funcionara con sistemas basados en Windows95/NT. En el lado positivo, esta es una buena manera de distinguir entre las dos plataformas. Si el escaneo encuentra puertos cerrados, probablemente se trate de una maquina UNIX, mientras que todos los puertos abiertos es indicativo de Windows. Excepcionalmente, Cisco, BSDI, HP/UX, MVS, y IRIX tambien envian RSTs en vez de desechar el paquete.

-sP Escaneo ping: A veces unicamente se necesita saber que servidores en una red se encuentran activos. Nmap puede hacer esto enviando peticiones de respuesta ICMP a cada direccion IP de la red que se especifica. Aquellos servidores que responden se encuentran activos. Desafortunadamente, algunos sitios web como microsoft.com bloquean este tipo de paquetes. Nmap puede enviar tambien un paquete TCP ack al puerto 80 (por defecto). Si se obtiene por respuesta un RST, esa maquina esta activa. Una tercera tecnica implica el envio de un paquete SYN y la espera de de un RST o un SYN/ACK. Para usuarios no root se usa un metodo connect().
Por defecto (para usuarios no root), nmap usa las tecnicas ICMP y ACK en paralelo. Se puede cambiar la opcion -p descrita mas adelante.
Notese que el envio de pings se realiza por defecto de todas maneras y que solamente se escanean aquellos servidores de los que se obtiene respuesta. Use esta opcion solamente en el caso de que desee un ping sweep (barrido ping) sin hacer ningun tipo de escaneo de puertos.

-sU Escaneo Udp: Este metodo se usa para saber que puertos UDP (Protocolo de Datagrama de Usuario, RFC 768) estan abiertos en un servidor. La tecnica consiste en enviar paquetes UCP de 0 bytes a cada puerto de la maquina objetivo. Si se recibe un mensaje ICMP de puerto no alcanzable, entonces el puerto esta cerrado. De lo contrario, asumimos que esta abierto.
Alguna gente piensa que el escaneo UDP no tiene sentido. Normalmente les recuerdo el reciente agujero Solaris rcpbind. Puede encontrarse a rcpbind escondido en un puerto UDP no documentado en algun lugar por encima del 32770. Por lo tanto, no importa que el 111 este bloqueado por la firewall. Pero, cquien puede decir en cual de los mas de 30000 puertos altos se encuentra a la escucha el programa? iCon un escaner UDP se puede! Tenemos tambien el programa de puerta trasera cDc Back Orifice que se oculta en un puerto UDP configurable en las maquinas Windows, por no mencionar los muchos servicios frecuentemente vulnerables que usan UDP como snmp, tftp, NFS, etc.
Por desgracia, el escaneo UDP resulta a veces tremendamente lento debido a que la mayoria de los servidores implementan una sugerencia recogida en el RFC 1812 (seccion 4.3.2.8) acerca de la limitacion de la frecuencia de mensajes de error ICMP. Por ejemplo, el kernel de Linux (en /ipv4/icmp.h) limita la generacion de mensajes de destino inalcanzable a 80 cada cuatro segundos, con una penalizacion de 1/4 de segundo si se rebasa dicha cantidad.
Solaris tiene unos limites mucho mas estrictos (mas o menos 2 mensajes por segundo) y por lo tanto lleva mas tiempo hacerle un escaneo. nmap detecta este limite de frecuencia y se ralentiza en consecuencia, en vez de desbordar la red con paquetes inutiles que la maquina destino ignorara. Como de costumbre, Microsoft ignoro esta sugerencia del RFC y no parece que haya previsto ningun tipo de limite de frecuencia para las maquinas Windows. Debido a esto resulta posible escanear los 65K puertos de una maquina Windows muy rapidamente.

iWoop! -b <ftp relay host> Ataque de rebote FTP: Una caracteristica "interesante" del protocolo FTP (FRC 959) es la posibilidad de realizar conexiones ftp tipo "proxy". En otras palabras, me resultaria posible conectarme desde malvado.com al servidor ftp de destino.com y pedirle a ese servidor que enviase un archivo a CUALQUIER PARTE de Internet! Aun asi, esto podria haber funcionado bien en 1985 cuando se escribio el RFC, pero en la Internet actual, no podemos permitir que la gente vaya por ahi asaltando servidores ftp y pidiendoles que escupan sus datos a puntos arbitrarios de Internet. Tal y como escribio *Hobbit* en 1985, este defecto del protocolo "puede usarse para enviar mensajes de correo y noticias cuyo rastro sera virtualmente imposible de seguir, machacar servidores en varios sitios web, llenar discos, tratar de saltarse firewalls y , en general, resultar molesto y dificil de detectar al mismo tiempo." Nosotros explotaremos este defecto para (sorpresa, sorpresa) escanear puertos TCP desde un servidor ftp "proxy". De este modo nos podriamos conectar a un servidor ftp tras una firewall, y luego escanear aquellos puertos que con mas probabilidad se encuentren bloqueados (el 139 es uno bueno). Si el servidor ftp permite la lectura y escritura en algun directorio (como por ejemplo /incoming), se pueden enviar datos arbitrarios a puertos que se encuentren abiertos (aunque nmap no realiza esta funcion por si mismo).
El argumento que se pasa a la opcion 'b' es el host que se pretende usar como proxy, en notacion URL estandar. El formato es: nombre_de_usuario:password@servidor:puerto. Todo excepto servidor es opcional. Para determinar que servidores son vulnerables a este ataque, vease mi articulo en Phrack 51. Se encuentra disponible una version actualizada en la URL de nmap (http://www.insecure.org/nmap).

viernes, 22 de mayo de 2009

Sistema de Archivos

"en sistemas UNIX todo es un archivo; si algo no es un archivo, entonces es un proceso"

En lo sistemas tipo UNIX (como linux) no existe diferencia entre un archivo y un directorio, ya que un directorio es un archivo que contiene una lista de los archivos que contiene. Tanto programas, servicios, texto, imagenes, etc. son todos archivos.
Los dispositivos de entrada y salida, y en general, cualquier dispositivo, es considerado como un archivo dentro del sistema.

Tipos de archivos

La mayoria de los archivos son solo archivos (llamados "archivos regulares") que contienen datos normales: como texto o programas ejectutables. entre los demas archivos podemos encontrar:

  • Directorios: Archivos que listan otros archivos.
  • Archivos especiales: La mayoria los encontramos en el irectorio /dev (por "device" en inglés)
  • Enlaces (links): es el mecanizmo que permite visualizar el mismo archivo en diferentes lugares del sistema.
  • Sockets (dominios): Provee a los procesos interactivos de red cierta proteccion soportado por el control de acceso del sistema de archivos.
  • Named Pipes: similar a Sockets, pero para procesos interactivos dentro del sistema.

Cuando utilizamos el comando $ ls -l , el primer caracter de la lista nos muestra el tipo de archivo:

(-) Archivo regular
(d) Directorio
(l) Enlace
(c) Archivo especial
(s) Socket
(p) Named Pipe
(b) Dispositivo

jueves, 21 de mayo de 2009

Servicios y Seguridad

El archivo /etc/inetd.conf contiene los puertos con servicios activos. Cuantos menos servicios TCP habilitados tengamos, mejor.
La forma de deshabilitar un servicio es comentar la linea (agregando un #). Algunos servicios a deshabilitar seran: fingerd y talkd. Tambien sera oportuno deshabilitar servicios de acceso remoto como telnet (en su lugar es preferible usar SSH).

miércoles, 20 de mayo de 2009

Programas para la red en modo texto

La mayoría de estos programas puedes encontrarlos en tu propio CD de linux o a través del servidor ftp de tu distribución.
El uso de estos programas en lugar de sus equivalentes gráficos tiene como resultado un aprovechamiento mucho mas eficiente de nuestros recursos locales (al no necesitar entorno gráfico) y de los recursos de la red (pues en general están mucho mas optimizados).
Sin embargo las desventajas son claras, nada de multimedia (al menos no tan fácil como en programas gráficos) y la dificultad inicial para los usuarios provenientes de sistemas operativos
gráficos.
Personalmente creo que vale la pena usarlos, y si tenemos necesidad de un entorno gráfico siempre estamos a tiempo de lanzarlos desde una xterm o cualquier otro terminal X.

pppd

Este es el demonio que gestiona las conexiones point-to-point, o sea, las normales a infovia. Recomiendo tenerlo siempre actualizado a la ultima versión, creo que ahora va por la 2.3.5, al menos esa es la que yo uso. Para una configuración optimizada/personalizada os recomiendo que leáis detenidamente el

$ man pppd

y el pppd-como que podéis encontrar en LuCAS

Para iniciar una conexión (configurada correctamente) basta con escribir

$ pppd

y para desconectar poner

$ pppd

de nuevo, así de simple.

lynx

Es el mejor navegador en modo texto. Mucha gente prefiere no usarlo o ni siquiera cree que exista. Pues bien, existe, es rapidísimo y muy fácil de usar. Sencillamente hay que teclear

$ lynx URL

para acceder a esa URL, se navega usando los cursores:

flecha arriba/abajo para cambiar el link activo.
flecha izquierda para acceder al link activo.
flecha derecha para volver a la pagina anterior.

Así de simple. Sirve tanto para http como ftp, ficheros locales como remotos, soporta frames, cookies, formularios, bookmarks, etc. ademas es ideal para pasar archivos html a txt, con la orden

$ lynx -crawl -dump archivo.htm > archivo.txt

Limitaciones: no muestra imágenes, no es compatible Java ni JavaScript, no ve mapas. Aunque todas estas limitaciones serian fácilmente solucionables si los programadores hiciesen mejores
webs. No cuesta nada detectar que el navegador no es gráfico y mostrar una pagina especial solo texto.

ncftp

Un cliente de ftp basado en ncurses, muy sencillo y eficaz, soporta reget (retomar downloads abortados), bookmarks, accesos anónimos y no anónimos, programación de scripts y alias .Todos los comandos tienen una ayuda que se puede leer tecleando (desde dentro del programa) /help/ o /help comando/ La forma de arrancarlo es con

$ ncftp

o

$ ncftp FTP-SERVER

wget

Este sencillo programa sirve para bajar archivos de la red, ya sean de ftp o http. Tiene muchas posibilidades y es lo mas eficiente que he visto bajando archivos. Permite reget, bajar webs enteras, comodines, conexión automática. Se ejecuta con el comando

$ wget URL

Limitaciones: no sirve para navegar (no esta hecho para eso).

BitchX

Posiblemente el mejor cliente de IRC, es una evolución del clásico ircii con soporte de color, gráficos ansi. Al ser uno de los mas extendidos abundan scripts para el BitchX (aunque para mi gusto no los necesita).
Es fácilmente programable y configurable, soporta todos los comandos básicos del irc, la mayoría de comandos y teclas del mirc mas muchos propios, múltiples canales, múltiples ventanas, múltiples servidores. La forma básica de ejecutarlo es

$ bitchx NICK IRC-SERVER

mutt

Es un sencillo lector de correo basado en ncurses, puede leer el correo de la mayoría de buzones estándar. Permite leer tanto correo normal como news, listas, gestiona varios buzones.
Para ejecutarlo basta con la orden

$ mutt

después podemos seleccionar el menú de ayuda para ver un listado de sus posibilidades.
NOTA: requiere agentes de correo tipo sendmail (enviar) y fetchmail (recoger).

Herramientas

Existe un gran numero de sencillas herramientas de red que mucha gente no usa pero son tremendamente útiles:

Ping: detecta si existe una determinada URL o IP.

$ ping IP

Traceroute: sigue la pista de la ruta que siguen los paquetes TCP dentro de la red.

$ traceroute -OPCIONES IP

Nslookup: transforma URLs en IPs y viceversa.

$ nslookup

ifconfig/route: configuran interfaces de red, su sintaxis es mas compleja debido al gran numero de parámetros que pueden gestionar tcp_wrappers/tcpdump y otros analizadores del trafico a través de una red.

Telnet: la herramienta básica para conexiones TCP.

$ telnet IP PUERTO

martes, 19 de mayo de 2009

Montando unidades

Las unidades en linux son tratadas como ficheros, concretamente como ficheros de dispositivo y se encuentran dentro del directorio

/dev.

Los nombres son:


/dev/fd0 -> Primera disketera
/dev/fd1 -> Segunda disketera ( ... y así con todas las que haya)
/dev/hda -> Primer disco del primer canal IDE
/dev/hdb -> Segundo disco del primer canal IDE
/dev/hdc -> Primer disco del segundo canal IDE
/dev/hdd -> Segundo disco del segundo canal IDE
/dev/sda -> Primer disco SCSI
/dev/sdb -> Segundo disco SCSI ( ... y así con todos los que haya)

Ademas, los discos duros (tanto IDE como SCSI) tienen particiones, a las que llamamos:


/dev/hda1 -> Primera partición del primer disco del primer canal IDE
/dev/hda2 -> Segunda ...
/dev/hdb1 -> Primera partición del segundo disco ...

Para saber que unidades i particiones reconoce el sistema haremos

$ dmesg

Fijandonos especialmente en las lineas que definen las unidades, como por ejemplo:


hda: ST33210A, ATA DISK drive
hdb: ACER CD-910E/JAS, ATAPI CDROM drive
hda: ST33210A, 3098MB w/256kB Cache, CHS=787/128/63, (U)DMA
Partición check:
hda: hda1 hda2 hda3

Podemos ver como el sistema reconoce un disco duro (hda) con tres particiones (hda1, hda2 y hda3) y un CD-ROM (hdb) Vamos a ver como acceder a las unidades de almacenamiento, ya sean floppys, CDs, otros HDDs o unidades de red.
Los comandos son mount y umount para montar y desmontar unidades. La sintaxis general es:

$ mount -t tipo -o opciones /dev/dispositivo /directorio_de_montaje

y

$ umount /directorio_de_montaje

Tipo

Es el sistema de ficheros que contiene la unidad: MS-DOS, ext2, iso9660, etc.

Opciones

Son parámetros como lectura/escritura, montar automáticamente, etc

Dispositivo

Es el nombre que da linux a la unidad (hda1, hdb, fd0,etc)

Directorio de montaje

Es el directorio desde donde será accesible el sistema de archivos montado, debe existir antes de intentar montarlo y debe estar vacío, ademas ningún usuario debe estar en el momento de montaje en ese directorio.
El comando mount sin parámetros nos da una lista de las unidades montadas.
Las unidades montadas no pueden extraerse (ojo con los diskette!), antes hay que desmontarlas. Y para montar un sistema de archivos antes hay que tener un disco dentro (recordad que se montan los discos, no las unidades lectoras). Mas información en

$ man mount
$ man umount
$ man fstab

En todos los casos (menos ext2) es requisito indispensable haber recompilado el kernel con soporte para el sistema de ficheros que queremos montar.

Montar un diskette

$ mount -t tipo /dev/fd0 /mnt/floppy

El tipo generalmente es ext2 (disco linux) o vfat (disco DOS/WIN). No requiere mas parámetros.

Montar un CD-ROM

$ mount -t iso9660 /dev/XXX /mnt/cdrom

El dispositivo depende de donde tengamos instalado el CD-ROM, puede ser hda, hdb. El comando

$ dmesg | grep CD

nos informa de eso:


hdb: ACER CD-910E/JAS, ATAPI CDROM drive

En este caso el CD esta en /dev/hdb.

Montar otras unidades de disco

$ mount -t tipo /dev/XXX/mnt/directorio

De nuevo el tipo y la unidad dependen de nuestro sistema y para el directorio de montaje se suele usar un nombre que identifique el sistema montado, por ejemplo, para montar una unidad Windows que se encuentra en la primera partición del primer disco:

$ mount -t vfat /dev/hda1 /mnt/win

Y para montar un segundo disco con linux instalado en la primera partición:

$ mount -t ext2 /dev/hdb1 /mnt/linux

Montar unidades de red

$ mount -t nfs host:/directorio /mnt/host

Este caso es un poco diferente, host es el nombre de la máquina remota y directorio es el nombre del directorio de la máquina remota que queremos (y se nos permite) montar. De manera que para montar el directorio /usr de la máquina Storm en nuestro sistema haremos:

$ mount -t nfs Storm:/usr /mnt/Storm

En este caso puede ser necesario especificar algunas opciones. Ahora vamos a ver como automatizar la mayoría de estos comandos para no tener que teclearlos cada vez.

El archivo /etc/fstab

Este archivo contiene una lista de unidades y todos los parámetros necesarios para su montaje, la sintaxis es sencilla:

"# Unidad Punto de montaje Tipo Opciones"

Un ejemplo:

/dev/hda1 /mnt/dos vfat defaults 0 0

Para montar una unidad definida en el fstab basta con la orden:

$ mount /directorio_de_montaje

Para montar a la vez todas las unidades:

$ mount -a

Las unidades definidas en el fstab intentan montarse durante el arranque a menos que pongamos como opción noauto (muy aconsejable en CDs y floppys). Si queremos poner mas de una opción estas se separan por comas sin espacios entre ellas.

Funciones Avanzadas con el Teclado

Podemos usar el teclado para mucho mas que para escribir, hay funciones complejas que podemos hacer fácilmente pulsando un par de teclas.

Cambiando de consola

Una consola es un terminal en el que pueden escribirse ordenes, por defecto la mayoría de distribuciones incluyen 6 consolas (tty) mas todas las sesiones telnet (ttyp) mas todos los emuladores de terminal para las X (xterm, rxvt, eterm,etc). Para cambiar de consola en modo local basta con pulsar la combinación [Alt]+[FX] donde X es el numero de la consola a la que queremos movernos (FX son las teclas de función!) Algunos programas "atrapan" esta combinación de teclas asignandoles otra función, es el caso de las X, el DOSEmu, el DOOM

La combinación de teclas para cambiar de consola en estos casos es [Ctrl]+[Alt]+[FX].
Nota: la consola en la que se proyectan las X es la primera libre, en la mayoría de los casos la 7 (tty7).

Reiniciar/cerrar

La combinación [Ctrl]+[Alt]+[Supr] provoca un reinicio del ordenador, aunque este comportamiento se puede modificar llegando a realizar cualquier acción tras esta combinación simplemente editando el archivo /etc/inittab, buscaremos unas lineas como estas:

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

El ultimo campo es la acción a realizar. Podemos substituir -r por -h para que cualquier usuario pueda cerrar la máquina.

Completado

Podemos usar la tecla [TAB] (tabulador, la tecla sobre el Bloq Mayus) para completar comandos y nombres de archivos, tan solo hay que teclear las primeras letras de la orden y pulsar [TAB] para que el sistema intente completarla. Por ejemplo, podemos pulsar:

$ da [TAB]

Para que en la linea aparezca:

$ date

Lo mismo pasa con los nombres de archivos, por ejemplo, desde / podemos hacer:

$ cd r[TAB]

El resultado es:

$ cd /root

Si existen coincidencias de nombres, de manera que el sistema no sabe cual queremos completar, nos avisa parándose en el punto en el que las dos o mas ordenes empiezan a diferenciarse y emite un pitido. En este caso si volvemos a pulsar TAB se nos muestra una lista de todas las ordenes que coinciden con el patrón dado.
Por ejemplo, si pulsamos:

$ mak[TAB]

Veremos en el terminal:

$ make

Si volvemos a pulsar [TAB]:

make
makedepend
makewhatis
make-ssh-known-hosts
makeg
makedb
makeinfo

Editar la linea de comandos

Puede editarse la linea de comandos como si de un editor normal se tratase, a diferencia de MS-DOS que borra los caracteres por los que pasa el cursor.

Historial

Con las teclas de cursor de Arriba y Abajo podemos movernos por el historial de los últimos comandos tecleados. Muy útil para tareas repetitivas de sintaxis compleja.

Compilar

En pocas palabras compilar es pasar de las fuentes del programa a un fichero ejecutable. Este proceso no es ni sencillo ni fácil, por lo que es frecuente que aparezcan fallos. Por suerte existen algunas herramientas (Makefiles, configures) que nos van a facilitar la vida.

Requisitos

La verdad es que los requisitos para compilar son bastante altos, hay que tener instalados el gcc, el make, las libc-devel, libg++-devel, libstdc++-devel, todas las versiones de desarrollo de las librerías que usa el programa que vayamos a compilar, las X-devel si el programa va ejecutarse bajo el entorno gráfico, opcionalmente otros paquetes de control, revisión de versiones, comandos especiales y todo lo que nos pida la documentación del programa que vayamos a compilar.

Como se hace?

Después de descomprimir el paquete lo primero que hay que hacer es leer la documentación (casi siempre hay algún README o INSTALL) y asegurarnos de que tenemos todo lo que necesitamos para compilar y que nuestro sistema esta soportado por las fuentes, es decir de nada nos sirve tener las fuentes de un programa que usa unas librerías que no tenemos o que no compila en Linux. Un proceso semi-estandar entre el software mas reciente es tener que poner solo esto para conseguir compilar e instalar el programa:

$ ./configure
$ make
$ make install

Todo esto dentro del directorio donde se encuentran las fuentes. Aunque en muchos casos no existe el "configure" y deberemos editar a mano el archivo Makefile para adecuarlo a nuestro sistema (Definir PATHs, comandos, opciones especificas de plataforma,etc.)

Compilar un solo archivo (*.c)

Si lo que queremos compilar es un solo archivo el proceso es mucho mas sencillo, basta con la orden:

$ gcc -O2 -Wall -o nombre_del_ejecutable archivo.c

Variables de entorno

En ocasiones es necesario cambiar los parámetros del sistema, ya sea para adecuarlos a nuestro lenguaje, a nuestras necesidades, para acceder a nuevo software, localizar librerías, etc.

Que variables tengo definidas?

Con el comando:

$ env

Veremos un listado de todas las variables que usa el sistema.

Donde se definen?

Esto ya no es tan sencillo, hemos de plantearnos si queremos hacer cambios permanentes o temporales, para un usuario o para todos. Los cambios temporales podemos hacerlos directamente en la linea de comandos, los permanentes los haremos en algún archivo de inicio, en uno global si es para todos (por ejemplo en /etc/bashrc) o dentro del directorio del usuario para el que queremos definirla (por en ~/.bashrc)
NOTA: los cambios en archivos de inicio no se reflejan hasta que se haga un nuevo login o con la orden:

$ source archivo_de_inicio

Como se definen?

Tanto si lo ponemos en algún guión de inicio, como desde la linea de comandos la sintaxis es la siguiente:

$ export VARIABLE="valor"

Modificando el PATH

Si queremos añadir una entrada al PATH no nos basta con la orden: (Peligro! no realizar)

$ export PATH="/home/dani/bin"

Pues esto elimina del PATH todas las demás entradas como /bin, /usr/bin La orden correcta seria:

$ export PATH="$PATH:/home/dani/bin"

Que indica al sistema que mantenga el PATH y añada la nueva entrada.

Grupos, usuarios y Permisos

Todo sistema linux permite el uso del mismo ordenador por diferentes usuarios. Para mantener una cierta seguridad de los datos de cada uno se asignan una serie de permisos y grupos.

Que usuarios necesito?

Como mínimo 2, root y otro mas, root ya existe y lo usaremos SOLAMENTE! para las tareas de mantenimiento del sistema, nunca para leer documentación, jugar, navegar por internet, experimentar comandos, para todo esto se usan los demás usuarios.

Creando usuarios

Hay varios comandos, el mas sencillo es

$ useradd nombre_de_usuario ; passwd nombre_de_usuario

Que crea un nuevo usuario con una serie de opciones predefinidas, estas opciones pueden cambiarse manualmente editando el archivo /etc/passwd (ATENCIÓN! un mal uso de este archivo puede llevar a la imposibilidad total de hacer un login en el sistema).

Comandos relacionados

$ users

Lista los nombres de los usuarios conectados al sistema,

$ w

y

$ who

Lista los usuarios e informa sobre la consola en la que están, el tiempo que llevan conectados y mas.

$ userdel nombre_de_usuario

Elimina un usuario

$ su

Salta de modo usuario a modo root.

Usuarios de sistema

Ademas de root y los usuarios que hayamos creado, el sistema tiene un grupo de usuarios que son necesarios y no debemos eliminar, son por ejemplo: bin, mail, news, operator, games,etc.

Grupos

Los grupos son una forma de dar los mismos permisos a un conjunto de usuarios, de manera que puedan trabajar en grupo.
Por defecto se crea un grupo por cada usuario, y esa política es la mejor en la mayoría de los casos, ademas existen grupos de sistema como: lp, mem, ftp, etc.

Permisos

Los permisos son necesarios para saber que usuarios pueden hacer ciertas cosas y cuales no. Por ejemplo, no es normal que dejemos entrar alguien por telnet y que nos modifique el /etc/passwd,
por ejemplo. El permiso de ejecución para un directorio significa que se puede acceder al contenido de ese directorio.

Los permisos de un link son los del archivo al que apunta.

Viendo y reconociendo permisos

Los permisos de un archivo se ven con la orden

$ ls -l

El formato de salida se parece a esto:

drwx------ 5 dani dani 1024 Jan 5 00:54 Desktop
drwx------ 2 dani dani 1024 Jan 2 19:48 Mail
drwxr-xr-x 2 dani dani 1024 Dec 27 16:27 docs

Lo mas importante son esas primeras letras ilegibles de cada linea. La primera letra indica el tipo de archivo (- archivo normal, d directorio, l link, b dispositivo). Las demás letras se leen de tres en tres, des esta manera:


d/rwx/r-x/r-x
El primer trío se refiere al propietario del archivo, el segundo a los demás miembros del grupo del propietario y el tercero al resto. Las letras son: r (permiso de lectura), w (permiso de escritura), x (permiso de ejecución).
Después los dos nombres se refieren al nombre del propietario y nombre del grupo al que pertenece el archivo, de esta manera nuestro archivo docs del ejemplo quedaría así:

drwxr-xr-x 2 dani dani 1024 Dec 27 16:27 docs

Que significa:

d: se trata de un directorio
rwx: permiso de lectura/escritura/ejecucion para el propietario
r-x: permiso de lectura/ejecución para el grupo
r-x: permiso de lectura/ejecución para el resto
Numero de inodos
dani: nombre del propietario
dani: nombre del grupo
1024: bytes (tamaño)
Dec 27 16:27: fecha de creación o de ultima modificación
docs: nombre

Cambiando permisos

El comando es

$ chmod permisos fichero

La forma de indicar los permisos es sencilla, se usa una letra para designar a quien se le quieren cambiar los permisos ("a" todos, "u" propietario, "g" grupo, "o" otros) después se pone un símbolo + (para dar el permiso) o - (para quitarlo) y finalmente se pone el permiso o los permisos que queremos cambiar ("r" lectura, "w" escritura, "x" ejecución).
Un ejemplo sencillo seria dar permiso de ejecución para todos a un fichero, la orden seria:

$ chmod a+x archivo

Cambiando grupo y propietario

Las ordenes son

$ chown usuario archivo

Para cambiar el propietario y

$ chgrp grupo archivo

Para cambiar el grupo.

Permisos especiales

A parte de los permisos básicos existen otros dos permisos, el sticky bit (completamente desfasado) y el SUID o SETUID. El SUID es un permiso que da permisos de root a un proceso aunque haya sido lanzado por un usuario, esto es necesario, por ejemplo para que usuarios normales puedan arrancar el entorno gráfico o puedan conectarse a internet. Este permiso se simboliza con la letra "s" y se aplica así:

$ chmod a+s archivo

Empaquetadores y Compresores

Linux entiende todos los formatos de compresión mas extendidos, como son ZIP, RAR, TAR; y tiene herramientas para su gestión, pero aquí voy a centrarme en los mas usados: tar, gzip y bzip2.

Tar

Es el empaquetador estándar de linux, empaquetador significa que no comprime, si no que junta un grupo de archivos en un solo archivo con extensión .tar, que es mas fácil de transportar o intercambiar entre sistemas o por la red. Es la herramienta ideal para las copias de seguridad. Tiene multitud de modificadores aunque los usos mas frecuentes son:

$ tar cvf archivo.tar archivos_a_comprimir

Para crear (empaquetar) archivos tar

$ tar xvf archivo.tar

para desempaquetar un tar.

Generalmente se usa junto a gzip con la orden:

$ tar xvfz archivo.tar.gz

Donde la z indica a tar que use compresión zip.

También se puede usar junto a bzip2 con la orden:

$ bzip2 -d * archivo.tar.bz2 | tar xfv -

Gzip

Es el compresor estándar de linux, en general se usa junto a tar, para comprimir un grupo de archivos empaquetados. La extensión de los archivos comprimidos con gzip es .gz, y la de los empaquetados y comprimidos es .tar.gz o .tgz. Gzip solo puede comprimir los archivos de uno en uno por lo que no es adecuado para compactar grupos de archivos. La orden es:

$ gzip -c archivo

Para comprimirlo, y

$ gzip -d archivo.gz

Para descomprimirlo.

Bzip2

Es el nuevo compresor sucesor del gzip, con ratios de compresión que lo superan en un 10% aproximadamente. La extensión es .bz2, y los comandos equivalentes al gzip:

$ bzip2 -c archivo

y

$ bzip -d archivo.bz2

Las ayudas de Linux

Hasta ahora todo parece bastante complicado y si no te lo has tomado con mucha calma seguramente no te has enterado de nada. Vamos a ver que se puede hacer cuando todo parece perdido.

Ayudas de comando

Muchos comandos incluyen pantallas de ayuda cuando son lanzados sin parámetros (si los requieren) o con la opción -h o --help.
Si la pantalla de ayuda es demasiado larga puedes usar [Shift]+[RePag] [Shift]+[AvPag] para moverte por el bufferde pantalla.

Por ejemplo:

$ cp --help

La Opcion help muestra ayuda sobre el comando que se le pasa como parámetro, para saber que comandos conoce help, lanzalo sin parámetros.

Por ejemplo:

$ help jobs

Paginas de Manual

$ man

Es la ayuda mas usada, muestra un manual sobre el comando que se le pasa como parámetro, estos manuales son muy completos y es el primer lugar donde se debe acudir para solucionar cualquier problema. Hay una versión para las X un poco mas intuitiva llamada xman.

Por ejemplo:

$ man bash

El comando info

$ info

Con una finalidad similar a la de man aunque algo menos estandarizado, teclea

$ info comando

Puede leer archivos man, y tiene multitud de opciones.

Por ejemplo:

$ info syslog

El directorio /usr/doc

Contiene documentación sobre la mayoría de paquetes instalados en el sistema. Es una base de datos muy amplia y que puede ser muy útil para aquellas cosas que el /man/ no acaba de aclararnos.

Internet

El volumen de información sobre linux en internet es inmenso, tan inmenso que google ha creado una seccion especial en su buscador:

www.google.com/linux

Información del sistema

Linux informa de prácticamente todo lo relacionado consigo mismo y con los programas que esta ejecutando, solo hay que saber donde mirar.

Información básica sobre nuestra máquina

$ uname -a

Nos informa sobre el sistema operativo, la versión del kernel, el nombre asignado a la máquina, el tipo de procesador instalado.

El arranque

Durante el arranque el kernel detecta gran cantidad de hardware de nuestro sistema, aportando información importante, como nombre de las unidades detectadas, puertos, protocolos de red activados, periféricos. Esta información suele salir muy rápido, para verla con mas tranquilidad solo hay que teclear:

$ dmesg | more

El entorno

$ env

Nos muestra todas las variables de entorno definidas y sus valores.

Memoria

$ free

Nos da un informe sobre el estado de la RAM física, así como de la swap, el parámetro -m muestra los datos en megas.

$ top

Tambien nos indica lo que esta consumiendo cada proceso activo y el estado global de la CPU.

El directorio /proc

Es una imagen de la memoria, y en ella hay gran cantidad de información valiosa, la mayoría de los archivos que contiene son de texto, muy informativos y su nombre es autodescriptivo, por ejemplo el archivo /prot/interrupts muestra información muy valiosa sobre las IRQs, para ver el contenido de estos archivos basta con usar:

$ cat /proc/archivo

Procesos

Un proceso es cualquier programa ejecutandose, son procesos todos los programas que lancemos, las consolas, los demonios de sistema .
La multitarea real de Linux unido al gran numero de procesos (mas de 20) que pueden estar corriendo a la vez en un sistema "normal" hacen que conocer el control de procesos (o tareas) sea
importante.


Listando procesos

$ ps

Lista procesos. Opciones interesantes son (no llevan "-" delante!) a (muestra todos los procesos, aunque sean de otro usuario), u (información adicional del usuario y del proceso). Ademas de ps, podemos usar la orden

$ top

Nos informa de los procesos actuales y aparte indica los recursos que consumen, la memoria libre, la hora y otros datos de interés. El PID: es el numero con el que el sistema identifica un proceso. Es muy importante conocerlo, pues se usa para referenciar procesos en multitud de comandos. Es la primera columna del comando

$ ps au

Controlando procesos

$ kill SIGNAL PID

o

$ killall SIGNAL nombre_de_proceso

Envía la señal SIGNAL al proceso, SIGNAL puede ser -9 (matar proceso), -1 (reiniciar proceso). Por ejemplo

$ killall -9 sendmail

Elimina el programa sendmail de la memoria.

Interrumpir procesos

[Ctrl]+[c] mata el proceso actual que se encuentra en primer plano, [Ctrl]+[z] envía el proceso actual a segundo plano y para su ejecución, aunque no lo elimina de la memoria.

Moviendo procesos

Los procesos lanzados por el usuario pueden moverse de primer a segundo plano, para permitir seguir usando la consola aun cuando el proceso no ha acabado. La manera mas sencilla de lanzar un proceso a segundo plano es lanzandolo como

$ proceso &

Para listar los procesos en segundo plano usamos la orden

$ jobs

Para devolver un proceso en segundo plano a primer plano se usa la orden

$ fg numero

Donde numero es el primer parámetro que jobs asigna a cada proceso.

lunes, 18 de mayo de 2009

Comandos de disco

A parte de archivos y directorios, hay mas cosas en el disco que debemos conocer:

Espacio disponible

$ df

Nos da información sobre la unidad actual, el nombre de la unidad, la capacidad total, el uso, el espacio libre ... la opción mas importante es -h que hace que la salida sea mas legible (usa unidades fáciles de leer).

Espacio usado

$ du

Indica cuanto espacio usa el directorio actual y todos sus subdirectorios. De nuevo una buena opción es -h (mas legible) y -s para hacer solo un sumario y no dar información de todos los subdirectorios.

Sistema de archivos

ATENCIÓN! estos comandos son peligrosos, y por lo tanto, solo pueden realizarlos root.

$ fsck /dev/dispositivo

Chequea la integridad del sistema de archivos del dispositivo.

$ mkfs -t tipo /dev/dispositivo

Crea un sistema de archivos del tipo especificado en el dispositivo (Por ejemplo: $ mkfs -t ext2)

$ dev/fd0

Formatea un disket con el sistema de archivos de linux.

viernes, 15 de mayo de 2009

Logs

Linux ofrece algunos comandos que permiten a los administradores tener acceso a los archivos de Log. Dos comandos de interes son last y lastlog.
El comando last muestra datos como quien esta logeado en el sistema, quien se logeo recientemente, y cuando el sistema ha sido rebooteado. Por ejemplo:
root tty1     Fri May 25 13:53  still logged on
frank pts/0 209.113.84.112 Fri May 25 12:13 14:36 (02:22)
reboot system boot 2.2.12-20 Fri May 25 12:06 (04:18)

El comando lastlog muestra los usuarios y servicios que tienen una cuenta en el sistema. Tambien lista la ultima vez que cada cuenta ha sido utilizada, o si a sido utilizada alguna vez. Cada
servicio de Linux tiene una cuenta asociada. Esto es muy util porque si una servicio se ha logeado sin concentimiento, entonces puede ser debido a la accion de un hacker. Podria indicar que un hacker controla el sistema, o que otro administrador inicio en servicio.
El archivo "messages" contiene la actividad reciente del sistema. Por ejemplo, los ultimos cambios de password y quien lo ha hecho. Tambien identifica los usuarios que han habierto o cerrado sesiones de trabajoy tiemo e informacion de los eventos que han sucedido en el sistema. Puede ser visto con el comando:

$ cat /var/log/messages

Moviéndonos por el disco

Listando archivos

La orden básica es:

$ ls

aunque es posible que al escribirlo no pase nada, ya que el directorio donde estamos puede estar vacío. Este comando tiene opciones muy interesantes, aunque las mas útiles son

$ ls -a # para ver los archivos ocultos.
$ ls -l # para ver los datos de los archivos, tamaño, permisos.
$ ls --color # para ver los archivos en colores según
# sean ejecutables, directorios, archivos comprimidos

Cambiando de directorio

La orden básica es

$ cd /directorio

los directorios se referencian con "/" y no con "\" como pasa en MS-DOS. Existen una serie de palabras clave para acelerar el uso del comando cd:

$ cd ~ # nos lleva al directorio raíz de cada usuario,
$ cd .. # baja un directorio,
$ cd / # te sitúa en el archivo raíz del sistema,
$ cd # (sin parámetros) es equivalente a cd ~.

La orden /pwd/ nos indica en que directorio estamos actualmente.

Creando y eliminado directorios

$ mkdir directorio # crea un directorio,
$ rmdir directorio # lo elimina solo si el directorio no contiene nada.

Para eliminar directorios enteros se usa el comando

$rm -rf directorio # ATENCIÓN! este es uno de los
#comandos mas peligrosos para el sistema,
#piensa bien lo que haces antes de ejecutarlo.

Copiar, mover, eliminar archivos

$ cp archivo destino # copia archivo en destino, destino puede ser
# un directorio u otro archivo.
$ mv archivo destino # mueve archivo a destino, el efecto es
#igual al anterior pero eliminando el archivo de origen.
$ rm archivo # elimina archivo.

Opciones interesantes para los tres es -i para confirmar siempre, y -f para forzar la acción. Recomiendo el uso de -i siempre.

Identificando archivos

Estamos acostumbrados a distinguir los archivos por su extensión, pero Linux no impone ninguna restricción a los nombres de los archivos por lo que el archivo "archivo" podría ser tanto un ejecutanle, como un fichero de texto o una foto. Para averiguar el tipo de archivo usaremos el comando

$ file

Este comando busca cadenas especificas dentro de los archivos que determinan su tipo y por tanto el tratamiento que les vamos a dar. Por ejemplo el archivo:

-rw-r--r-- 1 root root 6842843 Jan 16 16:20 linux-2.0.34

No parece tener un formato conocido, aplicamos file:

[root:/usr/src]# file linux-2.0.34 linux-2.0.34: gzip compressed data, deflated, last modified: Thu Jun 4 06:44:55 1998, max compression, os: Unix

Ahora ya sabemos que se trata de un archivo comprimido con gzip y como tratarlo.

Links o Enlaces

Un enlace es una imagen de un archivo o directorio en otra parte del disco, la ventaja de esto es tener accesible un mismo archivo o directorio desde diferentes puntos del árbol de directorios, algo parecido a un acceso directo. La orden básica es

$ ln origen destino

Se pueden linkar tanto archivos como directorios y principalmente con las opciones -s (solo crea un puntero que apunta al origen) y -h (crea imágenes totales del origen).
Por ejemplo, tenemos el directorio /usr/src/linux-2.2.0/ y queremos que el sistema también lo vea como /usr/src/linux/, en este caso el comando seria:

$ ln -s /usr/src/linux-2.2.0 /usr/src/linux/

Buscar archivos

$ find -name archivo

Busca recursivamente el archivo desde el directorio actual. Tiene muchas opciones que pasan por buscar con comodines, por permisos, por fechas de modificación, por propietario, etc.

Viendo archivos

Las ordenes básicas son

$ cat archivo
$ more archivo
$ less archivo

Recomiendo que proveis los tres y veáis cual os gusta mas.
Tambien pueden probar tuberías (prometo escribir otro post sobre el tema), por ejemplo, si tienen demasiados archivos en un directorio como que entren en pantalla con ls pueden probar con:

$ ls | more

Donde el caracter | es un caño (o pipe)

Editando archivos

Esta es una de las operaciones mas comunes dentro del mundo linux, pues casi todo se configura a partir de archivos de texto modificables por el usuario. Hay muchos editores de texto, uno de los más extendidos es vim, aunque también se puede usar nano. En general la mayoría de editores se lanzan con la orden "editor archivo". por ejemplo

$ vim archivo

jueves, 14 de mayo de 2009

Shell Scripts

Se trata de agrupar comandos de consola dentro de un archivo para ejecutarlos secuencialmente. El archivo se convierte en un comando que ejecuta los comandos contenidos en el mismo. De hecho, la consola provee un lenguaje de programación versátil y poderoso; ya que contiene estructuras similares a las que se encuentran en otros lenguages de programación como loops o condicionales. Por lo que, estructurando la secuencia de ejecucion de ciertos comandos dentro de un archivo y dandole permisos de ejecución (con chmod) podemos crear programas para casi cualquier proposito.
Para crear un Shell Script, primero hay que crear un archivo de texto con los comandos en la secuencia que le daríamos si los estuvieramos typeando en la consola. Podemos usar cualquier editor de texto plano. Como gedit en Gnome, o alguno directamente desde la consola: como Nano, Vim o Emacs. En mi caso en particular, me gusta trabajar desde la consola, por lo que estoy aprendiendo a utilizar el editor de texto estructurado Vim, con el objetivo de pasarme a Emacs.
Como ejemplo, crearemos un Shell Script que busque errores en el log del servidor Apache y reporte la cantidad de errores por tipo (las lineas que proceden al simbolo # son comentarios, y no afectan la secuencia del programa).
Con un editor de texto creamos un archivo y lo llamamos "logapchk.sh", dentro de el escribimos lo siguiente:

#!/bin/sh
# La primer linea indica el shell que estamos utilizando.
#
# Este Shell Script busca en el log del apache y genera un reporte
#
# Imprime un mensaje en la salida estandar para informar a
# quien ejecute el programa
que es lo que estamos haciendo

echo "Buscando errores en Apache log ..."
echo ""

# Usamos el comando "grep" para contar (-c) la cantidad de
# lineas que contienen

# la palabra buscada y guardamos el resultado como una variable.

notice='grep -c notice /var/log/apache/error.log'
warning='grep -c warning /var/log/apache/error.log'
error='grep -c error /var/log/apache/error.log'

# damos salida a la pantalla

echo "Cantidad de notices " $notice
echo "Cantidad de warnings "$warning
echo "Cantidad de errores "$error

Luego de crear este archivo le damos permiso de ejecución con

$ chmod u+x logapchk.sh

Ejecutamos el archivo con:

$ logapchk.sh

y deberia aparecer algo como:

Buscando errores en Apache log ...

Cantidad de notices 3
Cantidad de warnings 6
Cantidad de errores 12