domingo, 9 de marzo de 2008

Compartir una carpeta con NFS en Ubuntu

NFS es un sistema de archivos distribuido para un entorno de red de área local. Posibilita que distintos sistemas conectados a una misma red accedan a ficheros remotos como si se tratara de locales. A continuación se detalla la configuración del cliente y del servidor.

Configuración en el servidor

Los paquetes necesarios para el funcionamiento del servidor son portmap, nfs-kernel-server y nfs-common. Para la descarga de los mismos ejecutaremos los siguientes comandos:

root@mi_equipo:~# aptitude install portmap

root@mi_equipo:~# aptitude install nfs-kernel-server

root@mi_equipo:~# aptitude install nfs-common

Para la configuración de un servidor de NFS se necesitan editar tres ficheros: /etc/exports, /etc/hosts.deny y /etc/hosts.allow.

/etc/exports
Contiene una linea por directorio a compartir. La estructura de dicha línea es:

directorio equipo1(opcion11,opcion12) equipo2(opcion21,opcion22)

donde:

directorio: Es el directorio a compartir.
equipox: Clientes que tendrán acceso al directorio compartido. Estos equipos se podrán indicar por su IP o dirección DNS(por ejemplo: mi_equipo.ral.com o 192.168.0.69). Recomiendo usar la IP.
optionxx: Son las opciones que nos permitirán tener acceso a esos directorios con determinados privilegios.

  • ro | rw : Con la opción ro el directorio será compartido de solo lectura. Esta opción está por defecto.y con la opción rw se permitirá tanto acceso de lectura como de escritura.
  • sync | async : sync es la opción recomendada, ya que se ha de respetar el protocolo NFS, es decir, no se responden a las peticiones antes de que los cambios realizados sean escritos al disco. Con la opción async se permite mejorar el rendimiento y agilizar el funcionamiento global, pero supone un riesgo de corrupción de archivos o del sistemas de ficheros en casos de caidas del servidor y/o errores de éste.
  • root_squash | no_root_squash | all_squash : root_squash indica que un cliente identificado como root tendrá acceso al directorio con privilegios de un usuario anónimo. Si seleccionamos la opción no_root_squash evitaremos esto, y si indicamos all_squash, entonces aplicaremos esto último a todos los usuarios, no sólo root.

Un ejempo de fichero /etc/exports es el siguiente:

/home/usuario/datos 192.168.1.0/24(ro,sync,root_squash)
/tmp 192.168.1.0/24(rw,sync,no_root_squash)

Con este fichero indicaremos que queremos compartir los directorios /home/usuario/datos y /tmp a los hosts de la red 192.168.1.0; /home/usuario/datos se podrá acceder como solo lectura, mientras que al directorio /tmp se tendrá acceso tanto de lectura como de escritura. Se respetará el protocolo NFS, ya que no se responderán a las peticiones que se hagan antes de que los cambios se hayan escrito en disco. Si un usuario root(en el cliente) accede al directorio /home/usuario/datos su privilegios son los mismos que el de un usuario anónimo; todo lo contrario ocurre con el directorio /tmp.

Los ficheros /etc/hosts.allow y /etc/hosts.deny tienen la siguiente estructura:

servicio: host [o red/mascara_subred], host [o red/mascara_subred]

servicio : Es el servicio que estará permitido o denegado para algunas IP’s, en nuestro caso serán portmap y rpc.nfsd.
host [o red/mascara_subred] : Indicará la IP del host de un posible cliente. También pueden indicarse redes con sus correspondientes mascaras de subred.

/etc/hosts.deny
En este fichero pondremos todas las restricciones posibles para hacer mas seguro el sistema. Para ello denegaremos el acceso a portmap, ya que si se deniega portmap, aunque permitas nfs, no se podrá compartir porque éste depende de portmap. Por lo que solo se tendrá acceso a portmap por aquellos equipos que estén definidos en el fichero /etc/hosts.allow. El fichero /etc/hosts.deny quedará:

portmap:ALL

/etc/hosts.allow
En este fichero debe indicar a quienes permitimos el acceso al servicio de nfs y portmap. Se pueden indicar hosts individuales o una red.

portmap:192.168.1.0/255.255.255.0
nfs:192.168.1.0/255.255.255.0

Una vez configurados los ficheros pasamos a arrancar el servicio portmap y rpc.nsfd:

root@mi_equipo:~# /etc/init.d/nfs-common restart
root@mi_equipo:~# /etc/init.d/nfs-kernel-server restart
root@mi_equipo:~# /etc/init.d/portmap restart

NOTA: Tanto el fichero /etc/hosts.deny como el /etc/hosts.allow no es necesario que tengan contenido alguna, pero se recomienda que sean configurados para la seguridad de los datos.

Configuración en el cliente

En el cliente instalaremos los siguientes paquetes:

root@cliente:~# aptitude install portmap

root@cliente:~# aptitude install nfs-common

Después montaremos el directorio exportado por el servidor, para ello ejecutaremos el siguiente comando:

cliente@cliente:~$ sudo mount -t nfs mi_equipo:/tmp /home/cliente/temp

Con el comando anterior montamos el directorio /tmp exportado por el host mi_equipo en el directorio /home/usuario1/temp que previamente habremos creado. A este comando se le puede pasar una serie de opciones, la estructura genérica con las opciones sería:

mount -t nfs -o opcion[:usuario] dir_remoto dir_local

Las opciones son ro, rw, root_squash, no_root_squash, entre otras.

Si queremos que el directorio remoto se monte al arranque del cliente deberemos añadir la siguiente línea al fichero /etc/fstab:

mi_equipo:/tmp /home/cliente/temp nfs defaults,rw 0 0

Esa línea indica que se monte en el directorio /home/cliente/temp el directorio remoto /tmp (el directorio que exporta el servidor que se ha puesto como ejemplo).

NOTA: El nombre de host mi_equipo tiene que poder ser resulto por el cliente (p.ej. mediante fichero hosts o DNS), sino hay que especificar en su lugar la ip.

Compartir una carpeta con Samba en Linux

Vamos a trabajar con un caso muy sencillo: queremos compartir una carpeta en modo lectura/escritura en la que pueda entrar todo el mundo sin que pida usuario o contraseña.

Lo primero que tenemos que instalar es el servidor Samba:

sudo apt-get install samba smbfs

Creamos la carpeta que vamos a compartir:

sudo mkdir /media/compartir

Cambiamos el propietario de la carpeta para que el usuario 'nobody' con el que configuraremos Samba pueda accedar sin restricciones a la carpeta:

sudo chown nobody compartir/

Hacemos una copia de seguridad del archivo de configuración de Samba:

sudo cp /etc/samba/smb.conf /etc/samba/smb.back

Editamos smb.conf:

sudo joe /etc/samba/smb.conf


#
# Archivo de configuración de Samba editado por Manolo
# He realizado una configuración simple
#
#======================= Global Settings =======================
[global]

# Fijamos nuestro grupo de trabajo. En este caso 'WORKGROUP'
workgroup = WORKGROUP

# Configuramos el nombre nuestro servidor en la red Samba
server string = Ubuntu-Server

####### Authentication #######
#Para no utilizar contraseña
security = share
# Asociamos la cuenta de invitado con el usuario 'nobody' de nuestro servidor
guest account = nobody

# Compartimos una carpeta
[compartir]
comment = Carpeta para compartir trabajos
#Permisos de escritura habilitados
writable = yes
path = /media/compartir
#Se permite el acceso al usuario 'invitado'
public = yes
#Sólo se permite el acceso al usuario 'invitado'
guest only = yes
browseable = yes


Para que los cambios se hagan efectivos hay que reiniciar el servicio de Samba:

sudo /etc/init.d/samba restart


martes, 4 de marzo de 2008

Características de los nombres NetBIOS

Las características de los nombres NetBIOS son las siguientes:

  • Los nombres NetBIOS son utilizados por los servicios que requieren NetBIOS. Windows 2003 Server, Windows 2000, y Windows XP utilizan nombres DNS para la mayoría de las funciones, pero tiene que existir un método de resolución de nombres NetBIOS en cualquier red con computadoras que estén ejecutando versiones anteriores de Windows o para aplicaciones que aún dependen de los nombres NetBIOS.
  • Un nombre NetBIOS es un alias que se asigna a un ordenador por un administrador para identificar un servidor NetBIOS sobre un host TCP / IP.
  • El nombre NetBIOS no tiene por qué coincidir con el nombre del host.
  • Los nombres NetBIOS no pueden comenzar con asterisco (*), y consisten sólo en caracteres alfanuméricos estándar (a-z, A-Z, 0-9) y los siguientes: ! @ # $ % ^ & ( ) - ' { } . ~
  • Aunque puedes usar el punto (.) en un nombre NetBIOS, no te lo recomendamos, debido a que esos nombres puede que no funcionen en las futuras versiones de NetBIOS sobre TCP/IP.
  • No se permiten espacios en nombres de NetBIOS a partir de Windows 2000.
  • No es una coincidencia que todos los nombres válidos DNS también sean válidos en NetBIOS. De hecho, el nombre DNS para un servidor Samba es frecuentemente reutilizado como su nombre NetBIOS. Por ejemplo, si tienes una máquina phoenix.ora.com , su nombre NetBIOS podría ser PHOENIX (seguido por 8 espacios en blanco).
  • Los nombres NetBIOS tienen 15 caracteres o menos de longitud, en comparación con los 255 caracteres o menos para los nombres de host de DNS. El nombre de host y el nombre NetBIOS, en un equipo que ejecute Windows Server 2003, se generan juntos. Si el nombre de la máquina es de más de 15 caracteres, el nombre NetBIOS estará formado por los primeros 15 caracteres del nombre de host. [En realidad son 16 caracteres: nombre(15) + sufijo(1) que identifica la funcionalidad del dispositivo registrado]
  • Los nombre NetBIOS deben ser exclusivos en una misma red.
  • Cuando se enciende el ordenador, diversos servicios (tales como el servicio del servidor o el servicio de la estación de trabajo) registran un único nombre NetBIOS basado en el nombre del equipo. El nombre registrado es un nombre NetBIOS de 15 caracteres más un decimosexto carácter (byte) que identifica de forma exclusiva el servicio del servidor.
  • Los nombres NetBIOS también son registrados por los grupos de ordenadores que proporcionan servicios de red. Por ejemplo, si Mickey.Disney.com es un controlador de dominio, registrará el nombre NetBIOS, Mickey, y procederá al registro de los nombres que identifican sus funciones como controlador de dominio en el dominio de Disney al mismo tiempo. Esto permite a los clientes buscar todos los hosts de NetBIOS que proporcionan servicios de controlador de dominio en el dominio Disney, sin que el cliente conozca los nombres reales de los controladores de dominio.
  • Un nombre NetBIOS simplifica la forma en que un usuario identifica a un host TCP / IP, ya que son más fáciles de recordar que las direcciones IP.
  • Un nombres NetBIOS se pueden resolver si el nombre y la dirección IP se encuentran en la base de datos de un servidor WINS o en el archivo LMHOSTS. Un broadcast puede también resolver un nombre NetBIOS.
  • La utilidad nbtstat muestra los nombres NetBIOS que utilizan los servicios de NetBIOS en el equipo.

miércoles, 27 de febrero de 2008

Asegurarnos de que Mutt trabaja en UTF-8

Para conseguir que el cliente de correo Mutt trabaja en UTF-8 y así evitar los dichosos problemas con los acentos, editaremos los siguientes archivos como sigue:

/etc/environment

LC_TYPE=es_ES.UTF-8
LC_MESSAGES=es_ES.UTF-8
LC_ALL=es_ES.UTF-8
LANG="es_ES.UTF-8"
LANGUAGE="es_ES.UTF-8"
...

/etc/inputrc

set input-meta on
set output-meta on
set convert-meta off
...

Ahora lo comprobamos en Mutt escribiendo:
:set &charset ?charset

debe responder con:
charset="utf-8"

Para configurar más opciones utilizaremos el archivo /etc/Muttrc.

martes, 19 de febrero de 2008

Gestión de Grupos de Usuarios en Linux

La gestión de grupos es básica para poder organizar permisos y accesos a recursos de forma adecuada.

La organización consiste en crear un recurso, un directorio por ejemplo, asignarle un propietario y un grupo, asignar los permisos pertinentes al grupo y luego incluir en ese grupo a todos aquellos usuario que queramos que puedan trabajar con él.

Como hemos visto en la gestión de usuarios, un usuario puede pertenecer a múltiples grupos.

Las órdenes para la gestión de grupos son muy parecidas a la gestión de usuarios como veremos a continuación:

Base de datos de grupos del sistema

La base de datos de grupos del sistema se gestionan de una forma muy parecida a como lo hacían los usuarios, un fichero /etc/group similar a /etc/passwd y un nuevo fichero /etc/gshadow similar al /etc/shadow, todos con las mismas restricciones que sus homólogos.

/etc/group

Este fichero está formado por líneas del tipo:

nombre_grupo:contraseña:GID:lista_usuarios

Los tres primeros campos tienen las mismas características que en el fichero /etc/passwd. Si el campo de contraseña aparece vacío no se usa contraseña para este grupo.

La contraseña se solicita con la orden newgrp, que se utiliza para obtener una nueva shell del sistema en la que el grupo principal del usuario es el grupo que se solicitó como argumento de esta orden.

En cuanto a la lista de usuarios, en ese campo aparecerán separados por comas todos los usuarios que pertenezcan al correspondiente grupo.

/etc/gshadow

Las características del fichero /etc/gshadow son similares a las del fichero /etc/shadow salvo unas pequeñas diferencias.

En este fichero existe una campo más, el de los administradores del grupo. Estos usuario podrán añadir, quitar usuarios del grupo, modificar la contraseña del grupo y deshabilitar el acceso mediante newgrp. Además, como en /etc/shadow, sólo tiene permisos de acceso a él el root.

Comprobar los grupos de un usuario: groups

Si un usuario quisiera comprobar a qué grupos pertenece bastaría que ejecutara la orden groups.

Por ejemplo, la usuaria julia ejecuta:

$ groups
julia admin usuarios

lo que quiere decir que su grupo principal es julia y que también pertenece a los grupos admin y usuarios.

Usuarios miembros de un grupo

Un usuario puede pertenecer a varios grupos y puede operar con los recursos que sean propiedad de ese grupo con los permisos que tenga asignados.

Pero para ciertas operaciones como creación de ficheros nuevos o al lanzar un proceso el grupo que se asigna es el grupo principal del usuario; es lógico, por ejemplo un fichero sólo pertenece a un grupo.

Si queremos que los nuevos ficheros que se creen o los procesos que se lancen pertenezcan a otro grupo deberíamos poder cambiar el grupo principal. Este cambio de grupo principal lo realiza la orden

newgrp

Por ejemplo, la usuaria del sistema julia tiene como grupo principal predeterminado el grupo julia y también pertenece al grupo admin.

Si quisiera que su grupo principal fuera admin tendría que ejecutar:

$ newgrp admin

y la ejecución de la orden groups quedaría como:

$ groups
admin julia usuarios

Usuarios no miembros de un grupo

Los usuario no miembros de un grupo también pueden acceder a un grupo al que no pertenecen utilizando la orden

newgrp

En este caso al ejecutar la orden newgrp el sistema le solicita una contraseña para aprobar o no el acceso del usuario.

Para que un grupo admita a usuarios que no son miembros es necesario que el administrador del grupo le haya asignado una contraseña al grupo.

Más adelante veremos como podemos asignar, quitar o deshabilitar una contraseña para un grupo.

Creación de un grupo: groupadd

La orden groupadd añade un nuevo grupo al sistema.

En caso de que sea necesario le podemos incluir la opción -g para indicar un GID concreto que no exista en /etc/group.

Por ejemplo

# groupadd admin

añadiría un nuevo grupo al sistema llamado admin y

# groupadd -g 1000 correo

crearía un grupo llamado correo con GID 1000

Administrar un grupo: gpasswd

La orden gpasswd nos facilita la tarea de administrar un grupo de usuarios con sus diversas opciones que vamos a ver separadas según su utilidad

Añadir administradores de grupo

El root puede utilizar la opción -A para añadir usuarios administradores de grupo.

Estos usuarios tendrán permiso para poder dar de alta otros usuarios, eliminarlos, poner contraseña al grupo, quitar la contraseña o deshabilitar el acceso al grupo.

La forma de uso de la opción -A sería:

# gpasswd -A usuario grupo

por ejemplo:

# gpasswd -A jose admin

con lo que estaríamos añadiendo al usuario antonio como administrador del grupo admin.

Un administrador del grupo no tiene por qué ser miembro de dicho grupo, aunque en cualquier momento podría agregarse a sí mismo.

Añadir miembros al grupo

Ante todo, para agregar un usuario un grupo es necesario que este usuario exista en el sistema.

Hay diversas formas de añadir un miembro al grupo.

Se podría hacer con la orden usermod, pero resulta una tanto incómoda porque tenemos que poner la lista completa de grupos a los que pertenece el usuario; esta orden está pensada para modificar los datos de los usuarios más que para modificar los grupos.

Las otras opciones implican el uso de

gpasswd

El root puede agregar miembros a un grupo con la opción -M.

La forma de uso de esta opción sería:

# gpasswd -M usuario grupo

por ejemplo

# gpasswd -M julia admin

con lo cual estaríamos incluyendo al usuario julia como miembro del grupo admin.

También los administradores de grupo pueden agregar nuevos usuarios con la opción -a de la misma forma que lo hacía el root con la opción -M.

Veámoslo :

# gpasswd -M julia admin

y tendría el msimo efecto de añadir el usuario julia al grupo admin.

Si quien quiere agregar un usuario a un grupo es un administrador de ese grupo tendría que utilizar la opción -a de

gpasswd

Por ejemplo:

$ gpasswd -a sierra admin

y estaría añadiendo al usuario sierra al grupo admin.

Eliminar miembros del grupo

Tanto el root como los administradores de grupo pueden eliminar un usuario de un grupo utilizando la opción -d de

gpasswd

Por ejemplo el usuario jose es administrador del grupo admin y para eliminar de este grupo al usuario juan tendría que ejecutar:

$ gpasswd -d juan admin

Asignar contraseña a un grupo

En principio sólo los miembros de un grupo pueden utilizar la orden

newgrp

para seleccionar un grupo principal alternativo.

Si quisieramos que cualquier usuario pudiera acceder a un grupo sin ser miembro de él, tendríamos que asignarle una contraseña al grupo.

Esto lo pueden hacer el root y los administradores del grupo.

La asignación de contraseña a un grupo se hace con la orden

gpasswd

sin opciones e indicando el nombre del grupo al que le queremos asignar contraseña.

Por ejemplo, para asignarle contraseña al grupo admin tendríamos que ejecutar:

$ gpasswd admin

y el sistema respondería solicitando la contraseña dos veces.

lunes, 18 de febrero de 2008

Cómo descubrir el hardware instalado en nuestro ordenador

En windows podemos utilizar herramientas como SiSoft Sandra y Everest para averiguar las características de nuestro hardware. En el Panel de control/Sistema/Hardware/Administrador de dispositivos de windows también encontramos información pero no tan detallada.

En linux podemos utilizar hwinfo, hardinfo, lshw o mirar en el directorio /proc.
En mi caso hwinfo me ha ofrecido la siguiente información acerca de la memoria:

01: None 00.0: 10102 Main Memory
[Created at memory.59]
Unique ID: rdCR.CxwsZFjVASF
Hardware Class: memory
Model: "Main Memory"
Memory Range: 0x00000000-0x1dfeffff (rw)
Memory Size: 480 MB
Config Status: cfg=no, avail=yes, need=no, active=unknown

Con lshw vemos lo siguiente:

*-memory
description: System Memory
physical id: 1b
slot: System board or motherboard
size: 512MiB
*-bank:0
description: DIMM SDRAM Synchronous
physical id: 0
slot: A0
size: 512MiB
width: 64 bits
*-bank:1
description: DIMM [empty]
physical id: 1
slot: A1
*-bank:2
description: DIMM [empty]
physical id: 2
slot: A2
*-bank:3
description: DIMM [empty]
physical id: 3
slot: A3

viernes, 1 de febrero de 2008

Gestión de usuarios

La base de datos de los usuarios: /etc/passwd


En Linux la base de datos de usuarios se almacena en el fichero /etc/passwd. Este fichero contiene una línea por cada usuario de la siguiente forma

pfabrega:x:500:500:Pedro Pablo:/home/pfabrega:/bin/bash

es decir siete campos distintos separados por el carácter ":" y en el siguiente orden:

  1. nombre de usuario
  2. contraseña cifrada
  3. UID (User IDentifier) o número de usuario
  4. GID (Group IDentifier) o número de grupo primario
  5. Nombre completo
  6. Directorio personal
  7. Shell del usuario

La principal característica del fichero /etc/passwd es que es de lectura pública y sólo el root tiene permiso de escritura. Por este motivo, el programa que escribe en él, /bin/passwd, tiene que tener asignado el bit SUID.


nombre de usuario
Es el primer campo del fichero /etc/passwd.

El nombre de usuario es poco relevante en la gestión interna del sistema, aunque es necesario identificarse con él para iniciar una sesión de trabajo; como veremos más adelante, lo que realmente asigna la identidad es el UID o número de usuario.

Si eliminamos un usuario del sistema del fichero /etc/passwd y quedan ficheros de su propiedad, al hacer un ls -la, en lugar de aparecer el nombre de usuario aparecerá el UID que tuviera ese usuario. Si volvemos a dar de alta otro usuario con ese mismo UID esos ficheros ahora serán de su propiedad; es un detalle a tener en cuenta, tanto para conocer el funcionamiento del sistema como para prevenir posibles problemas de privacidad de la información.

contraseña cifrada
El siguiente campo incluye la contraseña cifrada mediante el algoritmo DES (Data Encryption Standard), un algoritmo de cifrado de una sola vía: una vez cifrado no se puede descifrar. Para verificar que una contraseña cifrada coincide con la que suministramos, primero se cifra y después se compara.

Cada contraseña cifrada consta de 13 caracteres, los dos primeros son un valor semilla y los once restantes son la contraseña cifrada propiamente dicha.

De esta forma una misma contraseña puede tener múltiples valores cifrados.

De todas formas observamos como en el ejemplo de línea del fichero que poníamos anteriormente en este campo aparece una 'x'. Esto se debe a que no resulta aconsejable dejar las contraseñas cifradas al alcance de cualquier usuario; existen programass que probando combinaciones (lo que se conoce como ataque de fuerza bruta) consiguen descifrar algunas contraseñas, comprometiendo a los usuarios y a todo el sistema. Por este motivo, las contraseñas cifradas reales se guardan en el fichero /etc/shadow que además añade nuevas prestaciones a la gestión de usuarios de un sistema Unix.

Si un sistema no tiene activas las shadow password, cosa poco habitual, conviene hacerlo con la orden pwconv. Esta orden pertenece al paquete shadow-utils.

Los sistemas también admiten otros mecanismos de cifrado de contraseñas tales como md5.

UID
Es el número que identifica al usuario. Este número es el que se guarda en cada i-nodo de fichero para determinar quién es su propietario. El UID también se utiliza para identificar al propietario de un proceso.

Es posible tener en un mismo fichero /etc/passwd que tenga dos usuarios con el mismo UID. A todos los efectos son el mismo usuario y tienen los mismos privilegios.

El UID 0 pertenece a root y lo identifica como administrador del sistema concediéndolo todos los privilegios. Ésta es un forma de acceder a privilegios del sistema, editando el fichero y modificando el UID; por este motivo es importante que el root no deje sesiones de trabajo abiertas que permitan a un usuario en un instante modificar el fichero y acceder a privilegios que no le corresponden.

En un sistema Unix existen diversos usuarios propios del sistema y otros que el administrador da de alta. El administrador del sistema, en primer lugar deberá familiarizarse con los usuarios predeterminados del fichero /etc/passwd para evitar que alguien cree un usuario fraudulento que pase inadvertido entre otros usuarios del sistema.

Para facilitar la administración es conveniente crear rangos de usuarios según su tipo. Por ejemplo, los UID desde cero hasta 100 serán los usuarios especiales del sistema, a partir de 500 los usuarios normales, desde 1000 los usuarios del servidor HTTP, desde 5000 los usuarios sólo de correo electrónico, etc.

GID
Este es el número que identifica el grupo principal del usuario. Se utiliza para asignar una serie de propiedades a un conjunto de usuario. Muchos sistema, de forma predeterminada, crean un nuevo grupo exclusivo para cada usuario para garantizar un máximo de privacidad. Además un usuario puede pertenecer a otros grupos alternativos, lo que permite organizar los permisos de acceso a los recursos según las necesidades del sistema.

De la misma forma que el UID, el GID 0 es del grupo root, lo que permite a los miembros de este grupo realizar diversas labores de administración. De todas formas, incluir a un usuario en el grupo root debería hacerse con mucha precaución, si es estrictamente necesario, o mejor, no hacerlo.

nombre completo
Este campo es meramente informativo, y lo utilizan diversas utilidades del sistema. Este campo puede estar vacío sin más repercusiones.

directorio personal
Este campo es importante. Es donde cada usuario tiene permiso para crear sus ficheros y es el directorio activo cuando un usuario inicia una sesión en el sistema. Normalmente este directorio se crea dentro del directorio /home, pero esto no es ninguna exigencia del sistema; si las necesidades son otras también se puede crear el directorio personal en otra ubicación distinta. Por ejemplo, si queremos que un usuario sólo pueda modificar páginas web dentro del directorio /var/www/html, entonces podríamos hacer que éste fuera su directorio personal y asignarle permiso de escritura sobre él.

shell
En general en este último campo se especifica un programa que se ejecutará cuando un usuario inicia una sesión de trabajo en el sistema.

Normalmente este campo especifica una shell, aunque puede ser cualquier otro programa que queramos que se ejecute cuando se conecta un usuario.Por ejemplo, en los casos de usuarios del sistema que nunca iniciarán una sesión de trabajo tienen un /bin/false como campo de shell. Este podría ser el caso de cierto tipo de usuario del sistema, por ejemplo aquéllos que sólo sean usuarios de correo electrónico.

Este campo se puede utilizar para crear un usuario y lanzar un determinado proceso en el sistema de forma remota. Por ejemplo, para lanzar una conexión a internet por módem sólo lo puede lanzar el root o darle privilegios de root a otro usuario. Otra posibilidad sería crear un usuario con los UID y GID adecuados y ponerle en el campo correspondiente a la shell el programa que lanza la conexión. De esta forma sólo tendremos que dar la contraseña de ese usuario a quienes queramos que puedan lanzar la conexión.


Crear un usuario

Para crear un usuario, escribimos, entrando como root, "useradd" o "adduser" sin las comillas más el nombre del usuario. Ej.:

adduser carlos

Habrás creado un usuario sin clave de acceso, y escribiendo al inicio de Linux en login el nombre carlos, entrarás en TU SESIÓN.

De esta forma crearemos un usuario con las características por defecto, que suelen ser las mejores. Pero para crear un usuario a nuestra medida, también podemos escribir:
(Forma general)

[root@Wakitaki /root]# adduser -u 500 -g users carlos
[root@Wakitaki /root]# passwd carlos
(y asignamos la clave para carlos)

[root@Wakitaki /root]# adduser -u 501 -g users javier
[root@Wakitaki /root]# passwd javier
(y asignamos la clave para javier)

o también:

[root@Wakitaki /root]# adduser -u 500 -g 100 -p 123 -r carlos

Ahora ya sabemos que -u 500 -g 100 -p 123 -r son opcionales y no hace falta escribirlos para crear al usuario. Estas son algunas de las características más importantes a la hora de crear usuarios:

  • adduser -u : Indica la UID del usuario, o sea, el número con el que el sistema identificará al usuario. Es conveniente que los números de usuario/cuenta (definidos en el fichero /etc/passwd) sean consecutivos dentro del mismo grupo. Por ejemplo, podemos ponerle 500 para el primer usuario, 502 para el siguiente, 502 el 3º, etc.
  • -g 100. Indica el GID, esto es, el grupo al que ese usuario pertenece. Esto es importante porque en Linux un grupo de usuarios puede compartir una serie de ficheros y directorios. El número ha de ser el mismo para todos los que formen el grupo. Así, el grupo de los que formen el grupo 100 será uno, el 101 será otro, el 102 otro, etc. (TODOS los USUARIOS, deberían estar bajo el mismo grupo, "users", que suele ser el grupo 100). El fichero que identifica a los grupos es: /etc/group.
  • -p 123. Se refiere a la clave del usuario para entrar en el sistema. No es obligatorio ponerla, pero sí muy recomendable.
  • -r carlos. Será el nombre con el que el usuario entre en el sistema.

El usuario creado se guardará en el directorio /home, y con el directorio con el nombre del usuario creado, en este caso será: /home/carlos, con todas las configuraciones por definir, un .bashrc y un fichero .bash_profile, que tienen una mínima configuración, la cual recomendamos (ver capítulos anteriores) para una gestión adecuada.

Editar usuarios

Para editar usuarios, editamos el archivo passwd, con el joe, por ej.: Escribiremos:

cd /etc
joe passwd
joe shadow

o bien:

joe /etc/passwd
joe /etc/shadow

En este fichero la estructura es como sigue:

  • Cada línea de este archivo corresponde con un usuario, y cada uno de sus campos (separados por dos puntos) se refiere a un dato.

  • Los asteriscos (*) en el segundo campo indican las cuentas que no se pueden usar como usuarios normales. Pueden usarse también cuando queremos dar de baja temporalmente a un usuario.

  • Para eliminar una clave (password), podemos borrar lo que viene situado en el segundo campo de cada línea entre los dos puntos (:), o usar el comando:

passwd carlos

para cambiarle la clave a Carlos.

Sólo root puede cambiarle la clave a otros usuarios. Como usuarios normales podemos cambiar nuestra clave escribiendo: passwd

donde se nos preguntará por la antigua contraseña, la nueva y que la verifiquemos.

Si no te acuerdas, o cualquier usuario no se acuerda de su password, root deberá encargarse de editar el fichero /etc/passwd y suprimir la línea donde aparece la clave:

javier:ClaveOlvidada:...

Para quedar:

javier::...

La orden usermod dispone de las mismas opciones que la orden userdd por lo que no vamos a repetirlas por completo, podremos cambiar el directorio personal, la cuenta el UID, la shell, etc.

La opción -L bloquea una cuenta de usuario añadiéndole a la clave cifrada un carácter !

Con la opción -U se levanta el bloqueo de la cuenta.

Por ejemplo:
# usermod -L antonio

y la cuenta antonio permanecería bloqueda en el sistema.

Para desbloquearla usaríamos:

# usermod -U antonio

Cuando se prevea que una cuenta de usuario no va a utilizarse pero no interesa borrarla por cualquier circunstancia lo mejor que podemos hacer es bloquearla para evitar que sea utilizada indebidamente y pueda comprometer otras cuentas o el sistema.


Borrar un usuario

Para eliminar usuarios tenemos la orden userdel.

Si ejecutamos:

# userdel antonio

eliminaríamos de la base de datos la cuenta antonio pero dejaría en el sistema su directorio personal. Si también queremos eliminar el directorio personal tendríamos que utilizar la opción -r

# userdel -r antonio

y en este caso se eliminaría el directorio personal también. El resto de ficheros propiedad de este usuario que hubiera en otros directorios, normalmente en /tmp o en ya que no debería tener permiso de escitura en otros, permanecen y tendría que borrarlos explícitamente el administrador, por ejemplo con:

# find / -uid xxx -exec rm {} \;

donde xxx sería el UID del usuario que hemos borrado.

Antes de utilizar la orden con la opción rm sería conveniente que mostrara los ficheros que vamos a borrar para evitar llevarnos una sorpresa y borrar más de lo que realmente queríamos.



Extraído de:
http://dns.bdat.net/blog/index.php?option=com_content&task=view&id=61&Itemid=15
http://www.linux-party.com/TutorialLinux/linux_files/linux5.html

lunes, 28 de enero de 2008

Instalación de Servidor SSH

Introducción

SSH (Secure SHell) 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 arrancado.
Además de la conexión a otras máquinas, SSH nos permite copiar datos de forma segura (tanto ficheros sueltos como simular sesiones FTP cifradas), gestionar claves RSA para no escribir claves al conectar a las máquinas y pasar los datos de cualquier otra aplicación por un canal seguro tunelizado mediante SSH.
SSH trabaja de forma similar a como se hace con telnet. La diferencia principal es que SSH usa técnicas de cifrado que hacen que la información que viaja por el medio de comunicación vaya de manera no legible y ninguna tercera persona pueda descubrir el usuario y contraseña de la conexión ni lo que se escribe durante toda la sesión; aunque es posible atacar este tipo de sistemas por medio de ataques de REPLAY y manipular así la información entre destinos.

Instalación

Hacemos una simulación para ver qué paquetes nos va a instalar o qué configuraciones automáticas va a realizar.

# apt-get install -s openssh-server

Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Paquetes sugeridos:
molly-guard rssh ssh-askpass
Se instalarán los siguientes paquetes NUEVOS:
openssh-server
0 actualizados, 1 se instalarán, 0 para eliminar y 0 no actualizados.
Inst openssh-server (1:4.7p1-2 Debian:testing)
Conf openssh-server (1:4.7p1-2 Debian:testing)

Una vez que ya hemos comprobado los paquetes que va a instalar, ejecutamos sin la simulación.

# apt-get install -s openssh-server

Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Paquetes sugeridos:
molly-guard rssh ssh-askpass
Se instalarán los siguientes paquetes NUEVOS:
openssh-server
0 actualizados, 1 se instalarán, 0 para eliminar y 0 no actualizados.
Se necesita descargar 0B/244kB de archivos.
Se utilizarán 651kB de espacio de disco adicional después de desempaquetar.
Preconfigurando paquetes ...
Seleccionando el paquete openssh-server previamente no seleccionado.
(Leyendo la base de datos ...
89016 ficheros y directorios instalados actualmente.)
Desempaquetando openssh-server (de .../openssh-server_1%3a4.7p1-2_i386.deb) ...
Configurando openssh-server (1:4.7p1-2) ...
Creating SSH2 RSA key; this may take some time ...
Creating SSH2 DSA key; this may take some time ...
Restarting OpenBSD Secure Shell server: sshd.

Verificamos que el servidor está activado y esperando conexiones.

# ssh localhost

The authenticity of host 'localhost (127.0.0.1)' can't be established.
RSA key fingerprint is ad:fb:82:2f:18:db:7c:d2:e9:0f:24:af:f1:38:b9:47.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.


Configuración básica

Abrimos el archivo de configuración para cambiar algunos parámetros:

# vi /etc/ssh/sshd_config

Puerto
Con la configuración por defecto es bastante común que al revisar los logs de acceso al sistema (por defecto está en /var/log/auth.log), observemos una cantidad desmesurada de intentos fallidos de login a nuestra máquina. Dichos intentos proceden de script-kiddies que escanean rangos de red en busca de servidores ssh a los que poder atacar de forma automática buscando usuarios y probando contraseñas.
En lugar de usar un script que detecte estos intentos y añada esas IPs a una lista negra es más sencillo parametrizar nuestro servidor para eludir esos ataques. Para ello, dentro del archivo de configuración podemos cambiar el puerto en el que escucha nuestro servidor del 22 (por defecto) a otro que tengamos libre.
Cambiaremos la línea que contiene "Port 22" por "Port xxxx" donde xxxx sería el puerto en el que escucharía el servidor ssh después de su reinicio.
Si ya lo teníamos instalado y queremos observar si estamos sufriendo ataques de esta índole, podemos hacernos una idea de su insistencia con:

#cat /var/log/auth.log grep "Failed password"

Login como root
Una recomendación de seguridad, es la de no permitir que el usuario root haga login directamente. En caso de necesitar acceder al servidor como root, lo recomendable es acceder al sistema con otro usuario y una vez dentro, identificarme como administrador. Para ello, deberemos cambiar el valor "PermitRootLogin yes" por "PermitRootLogin no"

Tiempo de espera
Podemos bajar el tiempo que permanecerá el servidor con la conexión activa en espera de que el usuario introduzca sus datos de login, modificando el parametro "LoginGraceTime 120" por "LoginGraceTime xxx" donde xxx se mediría en segundos.

X11Forwarding
Deberíamos cambiarlo a "no" si estimamos que ningún usuario necesitará usar esta característica.

Banner
No es un requisito de seguridad, pero es recomendable poner un banner que aparecerá justo cuando se inicie la conexión a nuestro servidor, en el que podríamos avisar, por ejemplo, de que guardamos los intentos de acceso fallidos o con éxito en nuestra máquina y en diferentes idiomas por si tuviéramos que usarlos en un futuro.

Otras opciones
Existen otras muchas opciones de parametrización, pero ya es labor del administrador ojear la manpage de sshd para ajustar al máximo la configuración de su servidor y adaptarlo a sus necesidades.

Finalizando
Una vez hayamos guardado los cambios efectuados a la configuración, es necesario reiniciar el demonio para que ésta tenga efecto, o iniciarlo si lo teníamos detenido. Para ello, entramos lo siguiente:

# /etc/init.d/ssh restart

Restarting OpenBSD Secure Shell server: sshd.

¡¡IMPORTANTE!!: En caso de que estemos modificando la instalación de un servidor remoto, es MUY IMPORTANTE mantenernos logueados, aplicar los cambios, reiniciar el demonio y NO salir hasta que comprobemos que abriendo una sesión nueva, obtenemos conexión y hacemos el login de forma correcta, ya que si hubiera algún problema aún podríamos buscar el origen, no siendo así si la hubieramos cerrado perdiendo el acceso al servidor.

Extraído de:

http://es.wikipedia.org/wiki/Secure_Shell

http://guia-debian.es/index.php?title=Instalaci%C3%B3n_de_servidor_SSH

Eliminar el 'BEEP' de la consola

La consola en Linux suele tener configurado un molesto 'BEEP' que suena por el altavoz de sistema cada vez que se produce un evento determinado (ej. no puede completar un path con el tabulador o no tiene más caracteres que borrar con el backspace o tecla de retroceso). Para anularlo cuando estás trabajando en modo consola, fuera del modo gráfico, puedes escribir lo siguiente:

~$ setterm -blength 0

Con este comando regulas la duración del pitido, que en este ejemplo fijas en 0.

domingo, 27 de enero de 2008

Instalar paquetes tar.gz

Lo mejor es descomprimir la carpeta con la orden tar xvfz nombre.tar.gz (en un directorio que tengas permisos) y buscar si tiene algún script de instalación tipo install.sh o algún fichero dónde explique cómo se realiza la instalación. Si no hay otra opción, generalmente se puede compilar haciendo lo siguiente:

$tar xvfz nombre.tar.gz
$cd nombre
$./configure
$make
$sudo make install

Cómo cambiar el nombre de las interfaces en Debian

Como tengo que practicar para el examen de DFSI, he copiado la imagen de VMware de Debian que tenía Dani (el profe) en clase. Tras pelearme un poco con ella porque no le gustaba la partición FAT donde la había copiado, he conseguido arrancarla desde una partición NTFS.

El caso es que, al ir a comprobar las conexiones de red del servidor Debian, sólo está activa la loopback. Pues nada, debe ser que eth0 está desactivada. Un sudo ifconfig eth0 up me da por respuesta que no existe tal dispositivo. Tras realizar un sudo ifconfig -a he visto que las interfaces disponibles eran: lo, sit0 y eth2. Vaya, pues todo está configurado para eth0: el Apache, el proFTP, el Squid, el servidor DNS, el servidor DHCP.

Una página de internet (http://www.mstaaravin.com.ar/2008/01/udev-cambiar-nombre-las-interfaces.html) me ha dado la solución. En el archivo /etc/udev/rules.d/z25_persistent_net.rules podemos modificar los nombres de las interfaces de red. En el caso del servidor Debian el archivo contenía lo siguiente:

# This file was automatically generated by the /lib/udev/write_net_rules
# program, probably run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.
# MAC addresses must be written in lowercase.
# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:16:8d:4d", NAME="eth0"
# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:b6:93:7b", NAME="eth1"
# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:b6:1b:12", NAME="eth2"

Podemos ver cómo Debian había asignado eth0 y eth1 a las dos interfaces virtuales asociadas a las físicas del ordenador donde estaba instalado anteriormente. Al ejecutarlo en mi equipo ha encontrado una nueva interfaz virtual que ha asociado a eth2. Por lo tanto la solución a mi problema ha sido borrar las dos primeras entradas y renombrar la última a eth0.

El archivo queda como sigue:

# This file was automatically generated by the /lib/udev/write_net_rules
# program, probably run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.
# MAC addresses must be written in lowercase.
# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:b6:1b:12", NAME="eth0"

viernes, 18 de enero de 2008

Ficheros de configuración de red en Linux

Los principales ficheros de configuración de la red, que varían de nombre y ubicación según la distribución de Linux, son los siguientes:

/etc/host.conf. El fichero /etc/host.conf es el lugar donde se configuran algunos elementos que gobiernan el comportamiento del código de resolución de nombres. El ejemplo siguiente funcionará en casi todas las circunstancias:

order hosts,bind
multi on

La primera línea le dice al resolutor de nombres que examine el fichero /etc/hosts antes de intentar consultar a un servidor de nombres. La segunda configura que se devuelvan todas las direcciones válidas de una máquina que encuentre en el fichero /etc/hosts, y no sólo la primera.

/etc/hosts. El principal propóposito de este archivo es resolver los nombres de hosts en su correspondiente dirección IP. Se puede usar para resolver nombres de hosts en pequeñas redes sin servidor DNS. Sin tener en cuenta el tipo de red en que se encuentre el ordenador, este archivo debe contener un línea que especifica la dirección IP del dispositivo loopback (127.0.0.1) como por ejemplo localhost.localdomain.

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
10.0.0.1 mis0200.dsic.upv.es mis0200

/proc/net/route. Esta tabla contiene columnas que suelen contener al menos tres campos: el primero es una dirección de destino, el segundo es el nombre de la interfaz a la que se va a encaminar el datagrama, y el tercero es (opcionalmente) la dirección IP de otra máquina que cogerá el datagrama en su siguiente paso a través de la red. En Linux puede ver esta tabla usando la siguiente orden:

root# cat /proc/net/route

con cualquiera de estas otras:

root# /sbin/route –n
root# /bin/netstat –r

/etc/resolv.conf. Este archivo especifica las direcciones IP de los servidores DNS y el dominio de búsqueda. Los scripts de inicialización de la red modifican este archivo, aunque es fácilmente editable:

search dsic.upv.es
nameserver 158.42.184.2

/etc/sysconfig/network. [RedHat] Especifica la información de enrutamiento y del host para todas las interfaces de red.

/etc/sysconfig/network-scripts/ifcfg-. [RedHat] Para cada interfaz de red existe un script de configuración de interfaz correspondiente. Cada uno de estos archivos proporcionan información específica para una interfaz de red determinada.

A continuación se muestra un ejemplo de un archivo ifcfg-eth0 para un sistema que usa una dirección IP fija:

DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
NETWORK=10.0.0.0
NETMASK=255.255.255.0
IPADDR=10.0.0.1
USERCTL=no

El fichero ifcfg-eth0 para una interfaz que use DHCP:

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

/etc/network/interfaces. Contiene la configuración de las interfaces de red para los comandos ifup e ifdown. Aquí configuramos cómo se conecta el sistema a la red.

# The loopback network interfaceauto loiface lo inet loopback
# The primary network interfaceauto eth0

auto lo
iface lo inet loopback auto eth0
iface eth0 inet static
address 192.168.1.40
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1

iface eth1 inet static
address 192.168.1.41
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1

La primera interfaz loopback (lo) es una interfaz especial que permite hacer conexiones internas. No debería modificarse bajo ningún motivo.

La segunda interfaz definida es eth0, que corresponde a la primera interfaz Ethernet. El parámetro static especifica que se le asignará una IP estática. La entrada address corresponde al número IP del ordenador y debería ser único en la red a la que está conectado. La entrada netmask corresponde a la máscara de red y es la que define el rango de números IP de la red local. Para una red de clase C ésta debería tener el valor 255.255.255.0, lo que define el rango de 0 a 255 en el último dígito de los números IP de la red local. Las entradas network y broadcast casi siempre corresponden al primer y último número del rango de números IP. La entrada gateway define el número IP del computador que funciona como router de la red local y es quizás el parámetro más importante después del número IP del computador.

Para configurar una IP dinámica tendremos que tener instalados los paquetes dhcp3-client y resolvconf. Un ejemplo de configuración de este tipo en el fichero interfaces es la siguiente:

# The primary network interfaceauto eth0
iface eth0 inet dhcp

/etc/modules.conf. Este fichero mantiene los módulos del kernel que serán cargados en el arranque. No debe editarse a mano. El driver de la tarjeta de red debería aparecer aquí.

alias eth0 e100

Para utilizar la nueva configuración reiniciaremos la conexión de red ejecutando el comando:

# /etc/init.d/networking restart

miércoles, 16 de enero de 2008

Configuración del GRUB

Gestor de arranque grub

Grub es un gestor de arranque para su PC que se distribuye en la dirección http://www.gnu.org/software/grub/

Tradicionalmente LILO era el gestor de arranque que, de forma predeterminada, se instalaba en las distribuciones de linux. Ahora podemos también elegir grub como gestor de arranque y obtener alguna mejora de prestaciones.

Grub puede cargar ditintos sistemas operativos, por ejemplo Linux, Windows, MS-DOS, BeOS, FreeBSD, OpenBSD, GNU Hurd. De hecho, grub nace cn la idea original de cargar un núcleo GNU Hurd.

Instalación

Algunas distribuciones seleccionan grub como gestor de arranque predeterminado durante el proceso de instalación, por ejemplo RedHat. Si queremos elegir LILO como gestor de arranque predeterminado, tendremos que seleccionarlo explícitamente durante el proceso de instalación.

Si la instalación del paquete grub la realizamos en un sistema en funcionamiento y no durante el proceso de instalación hay que tener en cuenta que no sobreescribe el gestor de arranque que tengamos instalado anteriormente. Tendremos que sobreescribir el sector de arranque explícitamente como veremos posteriormente.

Unidades de disco en grub

grub describe los discos duros como (hd0), (hd1), (hd2) y así sucesivamente. grub no hace distinciones entre discos SCSI e IDE. El primer disco que reconoce el BIOS será (hd0), el segundo (hd1), etc. Todas estas anteiores denominaciones hacen referencia al disco duro completo. De la misma forma comienza a numerar las particiones desde cero; así (hd0,0) indica la primera partición del primer disco duro.

Las particiones extendidas linux comienzan a numerarse a partir de 4, independientemente de las particiones primarias existentes. Por ejemplo (hd0,4) sería la primera partición extendida del primer disco duro.

Los disquetes se denominan utilizando el mismo criterio, el primero será (fd0), el segundo (fd1), etc.

Hay que resaltar que las numeraciones siempre comienzan desde cero.

grub en un disquete

Instalación

Es aconsejable disponer de un disquete de arranque para poder iniciar el sistema en caso de fallo en el arranque por una instalación defectuosa en el disco duro o por que otro sistema operativo borre el gestor de arranque durante su instalación.

Para instalar grub en el disquete lo introducimos en la unidad y ejecutamos, como root:

# mkfs -t ext3 /dev/fd0
# mount -t ext3 /dev/fd0 /mnt/floppy
# grub-install --root-directory=/mnt/floppy fd0
# umount /mnt

O también volcando directamente los ficheros:

# dd if=/ruta-acceso/stage1 of=/dev/fd0 count=1
# dd if=/usr/ruta-aceso/stage2 of=/dev/fd0 seek=1

bien

# cat /ruta-acceso/grub/stage{1,2} >> /dev/fd0

en general, escribir los ficheros stage1 y stage2 en el disquete.

Arranque

Para poder arrancar linux con un disquete grub necesitaremos conocer algunos datos, en particular donde está el núcleo y cuale son las particiones de arranque de los distintos sistemas.

Suponiendo que tenemos instalado Linux en /dev/hda3 como partición raíz y Windows en /dev/hda1.

Arrancamos el sistema desde el disquete y nos debe aparecer el indicador:

grub>

lo que quiere decir que grub está esperando nuestra órdenes.

Para iniciar Linux suponiendo que /boot está en una partición independiente (por ejemplo /dev/hda2) tecleamos:

   grub> root (hd0,1)
grub> kernel /vmlinuz-2.4.20-18-8 root=/dev/hda3
grub> initrd /initrd-2.4.20-18-8.img
grub> boot

es decir todas las rutas de acceso a ficheros son relativas a la partición /boot.

Primero indiacamos cual es la partición correspondiente a /boot, que si en nuestro caso es /dev/hda2, entonces en notación "grub" será (hd0,1).

En segundo lugar indicamos el fichero que contiene el núcleo y a continuación le pasamos los parámetros necesarios. En particular root=/dev/hda3 indica cual es la partición raíz del sistema operativo.

Por último boot inicia la carga del sistema.

Si no tuviéramos una partición independiente para /boot, si tuviéramos /boot como un directorio de l patición raíz, entonces deberíamos poner:

   grub> root (hd0,2)
grub> kernel /boot/vmlinuz-2.4.20-18-8 root=/dev/hda3
grub> initrd /boot/initrd-2.4.20-18-8.img
grub> boot

En este caso la partición raíz de grub y la partición raíz del sistema coinciden y en el ejemplo es /dev/hda3 o bien (hd0,2).

Ahora la ruta al fichero que contiene el núcleo debe incluir el directorio /boot, que ya no es una partición independiente. Igual para con initrd.

Como antes, una vez escritos los parámetros procedemos a la carga con boot.

Para arrancar Windows:

    grub> root (hd0,0)
grub> makeactive
grub> chainloader +1
grub> boot

Para evitar errores al teclear podemos usar el tabulador para completar las órdenes que tenemos que introducir.

Hay que tener en cuenta que el teclado que utiliza grub es el US, por lo que puede que la distribución de las teclas tengan algunas diferencias sobre lo que refleja el teclado.

grub en el disco duro

Antes de instalar en el disco duro deberemos aseguranos que el disquete de arranque creado funciona correctamente.

Una vez que nos hemos asegurado que no vamos a perder el arranque ejecutamos:

# /sbin/grub-install --root-directory=/boot /dev/hda

con lo cual estamos reescribiendo el MBR (Master Boot Record) de /dev/hda. En este caso suponemos que /boot está instalado en una partición independiente.

Si /boot es un directorio más de la partición raíz del sistema, tendremos que poner:

# grub-install /dev/hda

Cuando arrancamos nos debe aparecer lo mismo que cuando iniciamos desde el disquete. El proceso posterior es idéntico: tenemos que introducir las órdenes a mano.

Reinstalar grub en el disco duro

Por alguna circunstacia puede que se haya deteriorado el arranque de grub, por ejemplo si hemos alterado las particiones del disco o hemos instalado otro sistema operativo.

Si arrancamos el sistema con un disco de rescate, por ejemplo, el de Fedora, montará el sistema Linux del disco duro bajo /mnt/sysimage. Si arrancamos con alguna distribución en un cd autónomo, también podemos montar el sistema instalado en disco en /mnt/sysimage.

Entonces ejecutamos:

# chroot /mnt/sysimage

# grub-install /dev/hda

Otra posibilidad es arrancar con un cd autónomo, abrir una shell de grub y reinstalarlo en disco desde allí:

Primero buscamos la partición raíz de grub, que puede estár en la partición raíz del sistema o en una partición independiente y a continuación instalamos grub. A continuación un ejemplo de la secuencia de órdenes que tendríamos que realizar:

# grub
GNU GRUB version 0.94 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename.]
grub> find /boot/grub/stage1
Error 15: File not found
grub> find /grub/stage1
(hd0,0)
grub> root (hd0,0)
grub > setup(hd0)

y habríamos instalado GRUB en el MBR.

Si quisiéramos intalarlo en una partición ejecutaríamos, por ejemplo:

grub> setup (hd0,0)

pero teniendo en cuenta que este arranque habría que enlazarlo con otro previo.

Automatización del arranque

Para no tener que introducir la órdenes a mano cada vez que queremos arrancar el sistema editaremos el fichero /boot/grub/grub.conf o menu.lst, esto depende de la denominación que le dé el sistema al fichero de configuración. Hay que tener en cuenta que el fichero tiene que estar en la partición /boot que es la única inicialmente accesible por grub y dónde espera encontrarlo.

Hay una partición /boot. Esto significa que todas las rutas de núcleo e initrd son relativas a /boot/, root (hd0,1).

En /boot/grub/grub.conf o menu.lst escribimos:

default=0
timeout=10
splashimage=(hd0,1)/grub/splash.xpm.gz
title Red Hat Linux (2.4.18-14)
root (hd0,1)
kernel /vmlinuz-2.4.18-14 ro root=/dev/hda3
initrd /initrd-2.4.18-14.img
title Windows 98
rootnoverify (hd0,0)
chainloader +1

Si /boot está en la partición raíz del sistema (/dev/hda3) entonces tendríamos:

default=0
timeout=10
splashimage=/boot/grub/splash.xpm.gz
title Red Hat Linux (2.4.18-14)
root (hd0,2)
kernel /boot/vmlinuz-2.4.18-14 ro root=/dev/hda3
initrd /boot/initrd-2.4.18-14.img
title Windows 98
rootnoverify (hd0,0)
chainloader +1

No es necesario ejecutar grub cada vez que realicemos una modificación de este fichero.

El significado de las línea lo podemos ver en:

  • default=0 indica que el sistema predeterminado que se carga el el primero.

  • timeout=10 deja un margen de 10 segundos para seleccionar un sistema antes de cargar el predeterminado

  • splashimage indica la imagen que se muestra en la pantalla de inicio.

  • title indica el texto que aparece en el menú de pantalla.

  • root indica qué partición contiene el núcleo linux y puede ser o no la partición raíz del sistema (/). Así root (hd0,0) indica a grub que el núcleo se encuentra en la primera partición del primer disco duro (/dev/hda).

  • kernel se utiliza para indicar las carcterísticas de carga del núcleo. Incluye el fichero del núcleo, la partición raíz del sistema y en general los parámetros que queremos pasarle al núcleo.

  • initrd indica donde se localiza la imagen del disco de memoria.

  • map map permite modificar la asignación de particiones.

  • rootnoverify indica a grub que arranque la partición de Windows pero sin intentar montarla.

  • chainloader +1 indica a grub que encadene el cargador propio de otro sistema operativo.


Uso de grub

Pasar opciones al núcleo

Puede que interese pasar opciones al núcleo para el arranque. Estas opciones se pueden pasar tras la orden kernel. Por ejemplo:

kernel /boot/vmlinuz-2.4.19-12m root=/dev/hda1 vga=ask hdc=ide-scsi

Modificar la asignación de particiones

En ciertas ocasiones puede que interese modificar la asignación de particiones predeterminadas. Por ejemplo, Windows no se puede iniciar si no lo tenemos instalado en la primera partición del primer disco duro. Para estos casos usamos la orden map que modifica la asignación. Por ejemplo para que el sistema vea la segunda partición como si fuera la primera ejecutaríamos:

grub> map (hd0) (hd1)

  grub> map (hd1) (hd0)
grub> root (hd1,0)
grub> makeactive
grub> chainloader +1
grub> boot

Esto debería iniciar Windows instalado en la segunda partición.

Instalar Windows en cualquier partición

Suponemos que tenemos linux instalado en nuestro sistema y tenemos la primera partición ocupada y queremos instalar Windows en una partición distinta y vacía o con datos que no queramos conservar, por ejemplo en /dev/hda3.

Tendremos que usar las herramientas del sistema de forma que la distibución de particiones sea algo similar a la siguiente salida de fdisk:

Device       Start          End      System
/dev/hda1 1 3 Linux
/dev/hda2 4 905 Extended
/dev/hda3 906 1222 Win95 FAT32 (LBA)
/dev/hda5 4 36 Linux swap
/dev/hda6 37 905 Linux

En este caso tenemos /boot en /dev/hda1 y la partición raíz del sistema en /dev/hda6.

Es conveniente anotar estos datos de fdisk antes de comenzar la instalación para que en caso de que se borrara la tabla de particiones, poder restaurarla en caso de emergencia.

Ahora editamos el fichero grub.conf o menu.lst:

default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat Linux (2.4.20-18-0)
root (hd0,0)
kernel /vmlinuz-2.4.20-18.8 ro root=/dev/hda6
initrd /initrd-2.4.7-10.img
title Windows 98
map (hd0,0) (hd0,2)
map (hd0,2) (hd0,0)
rootnoverify (hd0,2)
chainloader +1
title Disco arranque DOS
map (hd0,0) (hd0,2)
map (hd0,2) (hd0,0)
chainloader (fd0)+1
title CD arranque DOS
map (hd0,0) (hd0,2)
map (hd0,2) (hd0,0)
chainloader (hd2)+1

Las líneas map de la seccion Windows 98 son básica para que la instalación funcione de forma correcta y poder engañar a Windows para que crea que se está instalado en la primera partción del primer disco duro. Si no lo hacemos así, Windows borrará la tabla de particiones y no podremos arrancar.

La seccion "Disco arranque DOS" es necesaria si se va a arrancar desde un disquete para iniciar la instalación de Windows o arrancar Windows desde un disquete con posterioridad. De la misma forma "CD arranque DOS" es necesaria si queremos iniciar la instalación desde un CD. En este caso suponemos que el CD se corresponde a la unidad /dev/hdc.

Una vez guardado el fichero ya es operativo, como ya hemos visto, no es necesario volver a ejecutar grub.

Antes de continuar debemos comprobar que el nuevo arranque funciona. Reiniciamos el sistema y arrancamos Linux. Si el arranque falla debemos recurrir al disquete de emergencia y corregir el fichero.

Ahora, para la instalación de Windows debemos arrancar con grub. Tenemos que quitar todos los CD o disquetes de sus unidades. Una vez iniciado grub insertamos el medio de instalación en su correspondiente unidad y seleccionamos la opción adecuada de grub, disquete o CD.

Modificar la imagen de inicio

Una imagen de arranque de GRUB puede tener una resolución máxima de 640X480 píxeles, un máximo de 14 colores y formato xpm.

Para conseguir esto en el Gimp sigue los siguientes pasos:

imagen->escalar imagen->y aquí pon la resolución 640X480
imagen->modo->indexado(y aquí pon el número máximo de colores a 14)

Aunque no es estrictamente necesario comprimir la imagen, reducirá el tiempo necesario para cargarla. Para ello utiliza el siguiente comando:

$ gzip nombre_que_hayas_elegido.xpm

esta instrucción creará un archivo de la forma nombre_que_hayas_elegido.xpm.gz.
Ahora copia el fichero
nombre_que_hayas_elegido.xpm.gz en el directorio /boot/grub, para ello teclea en la línea de comandos:

$ sudo cp nombre_que_hayas_elegido.xpm.gz /boot/grub

Ejecuta en línea de comandos:

$ cd /boot/grub
$ sudo nano menu.lst

y ahora añade la siguiente línea al comienzo del fichero menu.lst:

splashimage=(hd0,1)/boot/grub/nombre_que_hayas_elegido.xpm.gz

si fuera necesario, se sustituye (hd0,1) con la notación Grub para el disco duro y la partición en la que está almacenada tu distribución GNU/Linux.

Otros ejemplos de grub

Estos ejemplos están tomados de la página info de grub

Carga GNU/Hurd del primer disco duro.

   # For booting GNU/Hurd
title GNU/Hurd
root (hd0,0)
kernel /boot/gnumach.gz root=hd0s1
module /boot/serverboot.gz

Carga GNU/Linux, pero del segundo disco duro

    title  GNU/Linux
kernel (hd1,0)/vmlinuz root=/dev/hdb1

Carga Match con un núcleo en diquete

    title  Utah Mach4 multiboot
root (hd0,2)
pause Insert the diskette now^G!!
kernel (fd0)/boot/kernel root=hd0s3
module (fd0)/boot/bootstrap

En este caso tenemos el sistema de ficheros raíz en hd0s3. También contiene un línea de pausa que hace que GRUB muestre un texto y espere antes de ejecutar el resto de las órdenes.

Cargar un núcleo FreeBSD

    title  FreeBSD
root (hd0,2,a)
kernel /boot/loader

Carga un núcleo FreeBSD de la partición `a' partition de la tecera parte del primer disco duro.

Cargar OS/2

    title OS/2
root (hd0,1)
makeactive
chainloader +1

Carga el fichero /boot/chain.os2

Cargar Windows NT2000/XP o Windows9X

title Windows NT / Windows 95 boot menu

    root        (hd0,0)
makeactive
chainloader +1

Para instalar Grub en el disco duro

    title Install GRUB into the hard disk
root (hd0,0)
setup (hd0)

Esto reinstala grub en el disco duro.

Cambiar los colores

title Change the colors color light-green/brown blink-red/blue
splashimage = (hd0,1)/boot/grub/inicio.xpm.gz

Seguridad en el arranque

Una cuestión que siempre surge cuando se trata el proceso de arranque es la forma de limitar el acceso a la carga del sistema operativo. Esto tienes que pensarlo bien antes de hacerlo. Piensa que si por ejemplo, se trata de un sistema servidor será necesaria tu presencia para poder reiniciar el equipo que se haya apagado por un fallo en el suministro eléctrico.

Por otro lado, como hemos visto, grub permite una shell y poder editar los parámetros de arranque, cosa que puede que también nos interese limitar; no limitar el arranque, sino limitar las modificación de las características del arranque.

La shell de grub también proporciona acceso al sistema de ficheros, a que se pueda acceder a información almacenada en ficheros del sistema. Por ejemplo cat /etc/passwd mostraría la lista de usuarios.

password: Añadir contraseña general

Las propiedades de contraseña permite limitar el acceso al shell de grub mediante contraseña y así impedir que se puedan realizar operaciones interactivas.

El uso de contraseñas se indica en grub con:

password [--md5] contraseña [fichero_configuración]

De esta forma se elimina el acceso al shell hasta que pulsemos la tecla P en introduzcamos la contraseña correcta.

Como no es buena política almacenar las contraseñas en texto limpio, lo mejor es añador la opción `--md5' y poner una contraseña cifrada md5.

Para obtener el valor cifrado de la contraseña podemos usar la orden `md5crypt' en un shell de grub:

Ejecutamos

$ grub

y nos aparece:

 grub>

Ahora ejecutamos la orden md5crypt e introducimos la contraseña cuando la pida:

grub> md5crypt

Password: ****
Encrypted: $1$VrTfp0$XIHnjm/6MAUPrOzCPHJZ30
grub>

y temos la contraseña cifrada con md5. En este caso la contraseña es "hola". Ahora sólo tenemos que cortar y pegar:

password --md5 $1$VrTfp0$XIHnjm/6MAUPrOzCPHJZ30

Es posible también indicar un fichero de configuración como argumento de password. Este fichero será el que se cargue como fichero de configuración cuando proporcionemos una contraseña válida. Por ejemplo:

    password hola /boot/grub/menu-admin.lst

Observamos que un password global no impide el arranque normal del sistema, simplemente impide que se pueda alterar.

lock: bloquear arranques

En una máquina podemos tener varios sistemas operativos instalados, pero no queremos que todo el mundo pueda utilizarlos todos, queremos que para acceder a cierto sistema haya que introducir una contraseña.

    title Boot DOS
lock
rootnoverify (hd0,1)
makeactive
chainload +1

Debemos poner lock justo tras `title', ya que un usuario podría ejecutar órdenes de una opción del menú hasta encontrar `lock'.

Arranque con contraseña

Cuando poníamos lock estábamos utilizando la contraseña global de grub, pero también existe la posibilidad de agregar "password" a un arranque concreto. En este caso el comportamiento es distinto, se solicita esa contraseña para realizar el arranque. Así podemos tener una contraseña para cada uno de los sistemas operativos que tengamos instalados.

Mensajes de error de grub

El arranque de grub se divide en dos etapas, Stage 1 y Stage 2 y cada una de ellas tiene sus mensajes de error.

En general, los errores en Stage 1 se limitan a mostrar un error y detener el sistema.

Los errores en Stage 2 interrumpen la operación, muestran un mensaje y si es posible continúa con la operación, por ejemplo solicitanmdo al usuario que lo corrija.

Hard Disk Error

El intento de lectura del disco no permite averiguar su geometría y su tamaño.

Floppy Error

Es el mismo error anterior, pero se indica de forma separada por el orden de comprobación.

Read Error

Error de lectura al intentar leer stage2.

Geom Error

La ubicación en disco de stage2 no está en la parte del disco accesible mediatne llamadas al BIOS. Puede deberse a que hayamos modificado la configuración del disco, o que hayamos cambiado el disco de máquina o que grub no esté bien instalado.

1 : Filename must be either an absolute filename or blocklist

Este error se origina cuando un nombre de fichero solicitado por grub no verifica la sintaxis adecuada.

2 : Bad file or directory type

Este error se origina cuando un fichero soliciatado por grub no es un fichero regular sino un enlace simbólico, un directorio o una tubería con nombre.

3 : Bad or corrupt data while decompressing file

Este error se origina cuando el código de descompresión devuelve un error. Normalmente se trata de un fichero dañado.

4 : Bad or incompatible header in compressed file

Este error se origina cuando laa cabecera de un fichero comprimido es incorrecta

5 : Partition table invalid or corrupt

Este error se origina cuando verificación del estado de la tabla de particiones falla. Es un mal síntoma.

6 : Mismatched or corrupt version of stage1/stage2

Este error se origina cuando ela orden de instalación apunta a versiones incompatibles o dañadas de stage1 o stage2. En general no puede detectar los daños y en este caso sólo se trata de los números de versión.

7 : Loading below 1MB is not supported

Este error se origina cuando la dirección más baja de un núcleo está por debajo de la cota de 1MB. El formato zImage de Linux es un caso especial y se puede manejar ya que tiene una dirección de carga fija y tamaño máximo.

8 : Kernel must be loaded before booting

Este error se origina si le decimos a GRUB que ejecute una secuencia de arranque sin haber indicado un núcleo.

9 : Unknown boot failure

Este error se origina por razones desconocidas.

10 : Unsupported Multiboot features requested

Este error se origina cuando las características Multiboot requieren una característica que no se reconoce. El núcleo requiere una gestión especial que GRUB probablemente no tiene.

11 : Unrecognized device string

Este error se origina cuando se espera un nombre de dispositivo y el texto encontrado no cumple las reglas de nombres de dispositivos.

12 : Invalid device requested

Este error se origina cuando un nombre dispositivo es válido y tiene un error no contemplado en otro error.

13 : Invalid or unsupported executable format

Este error se origina cuando la imagen del núcleo cargada no se reconoce como Multiboot o alguno de los formatos nativos admitidos : Linux zImage o bzImage, FreeBSD o NetBSD.

14 : Filesystem compatibility error, cannot read whole file

Alguno de los sistema de fichero que tiene que leer GRUB tiene limitado el tamaño de lectura de ficheros. Se corrige eliminado el límite.

15 : File not found

Este error se origina cuando uno se puede encontrar un fichero solicitado, pero la ruta de acceso es correcta.

16 : Inconsistent filesystem structure

Este error lo devuelve el sistemade ficheros para indicar un error interno debido al estado de la estructrua del sistema de ficheros que no encaja con lo previsto. Puede deberse a un sitema de ficheros dañado o algún bug de GRUB para manejar ese sistema de ficheros

17 : Cannot mount selected partition

Este error se origina cuando una partición existe pero GRUB no la reconoce.

18 : Selected cylinder exceeds maximum supported by BIOS

Este error se origina cuando una lectura intenta ir más alla del área direccionada por el BIOS. Este error se origina cuando se trata de leer bloques lineales. Este problema lo podemos encontrar en dicos (E)IDE mayores 512MB o de 8GB en máquinas antiguas.

19 : Linux kernel must be loaded before initrd

Este error se origina cuando ponemos initrd antes que kernel.

20 : Multiboot kernel must be loaded before modules

Este error se origina cuando la orden de carga de módulos se usa antes que de cargar un núcleo Multiboot. Sólo tiene sentido en este caso ya que GRUB no tiene idea de como comunicar la presencia de tales módulos a un núcleo que no sea Multiboot-aware.

21 : Selected disk does not exist

Este error se origina cuando otodo o parte un nombre de dispositivo referido a disco o dispositivo BIOS no está presente o no se reconoce por la BIOS en el sistema.

22 : No such partition

Este error se origina cuando no existe la partición especificada

23 : Error while parsing number

Este error se origina si GRUB espera leer un número y encuantra datos incorrectos.

24 : Attempt to access block outside partition

Este error se origina cuando una dirección lineal de bloque está fuera de la partición. Normalmente se debe daños en el sistema de ficheros o a algun bug detectado por GRUB.

25 : Disk read error

Se ha producido un error de lectur en el disco.

26 : Too many symbolic links

Demasiados enlaces simbólicos. El número máximo es 5.

Es posible que los enlaces tengan un bucle

27 : Unrecognized command

Este error se origina cuando introducimos un nombre de orden no reconocido por grub. Puede tratarse de un error al escribir.

28 : Selected item cannot fit into memory

Este error se origina cuando tratamos da cargar algo en memoria y no cabe.

29 : Disk write error

Error producido cuando grub trataba de escribir en disco. Normalmente sólo puede ocurrir durante la instalación o con la orden makeactive.

30 : Invalid argument

Este error se origina cuando el argumento para algunaorden es incorrecto.

31 : File is not sector aligned

Este error se origina cuando accede a una partición ReiserFS por lista de bloques (v.g. la orden `install'). En este caso debería montar la artición con la opción `notail'.

32 : Must be authenticated

Este error se origina cuando se trata de acceder a un arranque con "lock". Se debe introducir una contraseña válida.

33 : Serial device not configured

Este error se origina cuando trata de cambiar el terminal a uno serie pero no se ha activado ningún dispositivo serir

34 : No spare sectors on the disk

Este error se origina cuando no queda espacio libre. Sucede intenta introducir Stage 1.5 en los sectores no utilizados tras el MBR, pero la primera partición comienza justo tras el MBR o los está usando EZ-BIOS.


Extraído de:

http://dns.bdat.net/documentos/grub/