Página principal

De Seguridad y Calidad en Servidores Web
Saltar a: navegación, buscar

Introducción

Wiki de la asignatura Seguridad y Calidad en Servidores Web del Grado de Multimedia de la Universitat Oberta de Catalunya

En este wiki encontraréis las instrucciones básicas de Linux que necesitaréis para poder hacer la práctica de la asignatura.

GNU/Linux

GNU/Linux (aunque habitualmente suele conocerse como Linux) es un sistema operativo (SO) libre. Nació a partir del núcleo Linux creado en 1991 por Linus Torvalds. El núcleo (Linux) junto con el resto de aplicaciones que componen un sistema operativo (creadas en el proyecto GNU) es lo que habitualmente conocemos como GNU/Linux o, simplemente, Linux. Actualmente es ampliamente utilizado como servidor web, entre otras cosas por que puede instalarse en diferentes máquinas, es estable y libre. Así, Facebook, Gmail, LinkedIn o Yahoo utilizan servidores GNU/Linux, lo cual puede dar una idea de la importancia de este SO. Prácticamente todas las empresas de alojamiento web (hosting en inglés) ofrecen planes de alojamiento basados en Linux. También para grandes empresas pueden crearse redes de servidores funcionando con GNU/Linux. Para simplificar, a partir de este momento, nos referiremos a GNU/Linux como Linux, aunque conviene no olvidar que Linux es tan solo el núcleo del sistema.

El sistema operativo

La función de cualquier sistema operativo (SO) es proporcionar una interfaz para utilizar las prestaciones del hardware de un ordenador. Los programadores acceden a estas prestaciones a través del SO y pueden diseñar aplicaciones de propósito específico para usuarios finales. Éstos, a su vez, utilizan el SO para poder ejecutar dichas aplicaciones. Linux pertenece a la familia de sistemas denominada Unix y su filosofía está heredada de este tipo de sistemas. En lo que sigue, cuando definamos muchas de las características, funcionamiento e incluso comandos de Linux, podemos asumir que se puede aplicar a prácticamente cualquier sistema Unix con mínimos cambios. Así por ejemplo, ya podemos decir que Linux es un sistema multiusuario y multitarea, es decir, permite a varios usuarios trabajar simultáneamente y ejecutar diversas aplicaciones a la vez. Estas características determinan de forma importante el funcionamiento del sistema, el cual debe garantizar que toda esta carga de trabajo simultánea se lleve a cabo de forma segura y eficiente. Linux está organizado por capas. La capa más profunda corresponde al hardware, que proporciona una serie de servicios (proceso, gestión de ficheros, impresión, etc.). La única capa que interactúa directamente con el hardware es el núcleo (kernel). De esta manera, los programas no necesitan saber nada sobre el hardware y sólo se comunican con el núcleo. Una de las ventajas de esta estructura es que la mayoría de programas son independientes del hardware y pueden portarse de un modelo de ordenador a otro. Las aplicaciones que funcionan sobre el núcleo constituyen el último nivel y el único visible para los usuarios. Algunas de estas aplicaciones son utilidades básicas para la gestión de la información y la ejecución de programas y ya vienen con el sistema operativo, por lo que es habitual hablar de Linux refiriéndonos no sólo al núcleo, sino también a dicho conjunto de utilidades, desarrolladas por el proyecto GNU.

¿Quién me escucha?

Una de las ideas fundamentales de Linux que deriva de la estructura de capas es que los usuarios no ‘hablan’ directamente con el sistema, sino que lo hacen a través de una aplicación denominada intérprete de comandos (shell). Esta aplicación está constantemente ‘escuchando’ todo lo que el usuario teclea e interpreta (a partir de unas ciertas reglas sintácticas) sus peticiones. El intérprete de comandos dispone de una serie de comandos internos que él mismo ejecuta, pero, asimismo, puede ejecutar otros comandos externos, pasándoles las opciones que el usuario ha especificado. En la imagen vemos el comando cat que permite visualizar el contenido de un fichero especificado por el usuario. Algunos comandos ejecutan aplicaciones que proporcionan sus propia interfaz y conjuntos de órdenes para interactúar con los usuarios, como el editor de textos vi.


El sistema de archivos

Un sistema multiusuario necesita una forma de permitir a los usuarios tener distintos ficheros con el mismo nombre. También debe permitirles organizar los ficheros en grupos lógicos. La mayoría de sistemas operativos resuelven estas cuestiones proporcionando un sistema de ficheros jerárquico. En un sistema de este tipo los ficheros se organizan en directorios, que no son otra cosa que un tipo especial de fichero que agrupa a otros. Puesto que un directorio puede contener también otros directorios, la estructura del sistema de ficheros se asemeja a un árbol.

Como se puede observar en la figura, hay un directorio en la parte superior del árbol con un nombre especial (‘/’) y llamado directorio raíz(root).

Organización del sistema de ficheros

Siguiendo las convenciones habituales en Unix, el sistema de ficheros de Linux se organiza en una serie de directorios estándar de propósito específico. Algunos de los más importantes son los siguientes: /dev Contiene ficheros representando los dispositivos físicos del ordenador. /etc Está reservado para ficheros de configuración del sistema. /lib Contiene las librerías necesarias para ejecutar los programas que residen en /bin. /proc Contiene ficheros especiales que reciben información del núcleo. /sbin Contiene programas que sólo son accesibles para el usuario ‘root’ /usr Contiene los programas de uso común para todos los usuarios y presenta una estructura con directorios /etc, /bin o /lib propios para dichos programas /var Contiene información temporal sobre la ejecución de algunos programas. /home Contiene los directorios personales de los usuarios del sistema.

El directorio personal

A diferencia de otros sistemas operativos donde tras inicializar el ordenador el usuario accede por defecto al directorio raíz, en Linux cada usuario lo hace a un directorio personal (home directory) ubicado en algún lugar de la jerarquía de directorios del sistema. A menudo los directorios personales están ubicados debajo del directorio /home.

Directorios especiales

Existe una notación especial para hacer referencia a dos directorios en particular, el directorio actual y el directorio inmediatamente superior al mismo. El primero, se representa mediante un punto(.), mientras que el segundo se indica mediante dos puntos (..)

Rutas absolutas y relativas

Una ruta es el “nombre completo” de un fichero que incluye no sólo su nombre, sino su situación en la jerarquía, separando cada directorio mediante una barra (/). Por defecto, el intérprete asume que los comandos introducidos y los nombres de ficheros y directorios a los que se hace referencia poseen una ruta relativa al directorio actual. Al conectarnos por primera vez, el directorio actual es el directorio personal. Supongamos que acabamos de hacerlo y que es /home/luis. Si escribimos una orden como lista-ficheros-graficos, el intérprete asumirá que la ruta completa del fichero es /home/luis/lista-ficheros-graficos. La idea es que no es necesario indicar toda la ruta, sino sólo el desplazamiento necesario teniendo en cuenta el punto del sistema de ficheros donde estamos situados. También podemos indicar ficheros situados más arriba en la jerarquía. Por ejemplo, si escribimos la orden anterior como ../../bin/lista-ficheros-gráficos, el intérprete buscará el comando dos niveles por encima y luego bajará a bin. En algunas ocasiones puede ser más conveniente o fácil indicar un nombre completo utilizando una ruta absoluta. Este tipo de rutas comienza siempre por una barra (/) para indicar que la ruta comienza a definirse desde el directorio raíz, independientemente de cuál sea nuestro directorio actual. En el último de los ejemplos anteriores, podríamos especificar la situación del comando como /bin/lista-ficheros-gráficos.

Montaje de unidades de disco

En Linux, a diferencia de otros sistemas, las unidades no se representan con letras (por ejemplo, ‘C:’) sino que se ubican en algún punto de la jerarquía de directorios. La acción de vincular un directorio de la jerarquía a una unidad de disco se denomina montar la unidad. Si añadimos unidades de disco a nuestro sistema, deberemos montarlas para poder usarlas. Sea un disco duro, un CD, o una unidad USB la instrucción a usar será siempre la misma: mount [dispositivo] [punto_de_montaje] Donde dispositivo es el disco que queremos montar y punto_de_montajeel directorio donde queremos montarlo. Los discos duros los encontraremos en /dev/sdXN dónde la X representa el disco (el primero será a, el segundo b, etc.) y N será el número de la partición (en caso de que el disco esté particionado). Así, para montar un segundo disco en el directorio /mnt/discoduro escribiremos: mount /dev/sdb /mnt/discoduro El directorio /mnt/discoduro debe existir y estar vacío. Si tiene datos, no estarán disponibles hasta que no se desmonte la unidad, aunque no se perderán. Para desmontar el disco usaremos la instrucción umount: umount [dispositivo] Evidentemente, el disco duro principal sda siempre estará montado, generalmente con varias particiones (sda1, sda2, sda3) . Por otra parte, cuando estemos trabajando con servidores remotos, normalmente no necesitaremos montar ni desmontar unidades.


El interprete de comandos

El intérprete de comandos es programable

Una característica esencial del intérprete de comandos es que no sólo lee e interpreta las órdenes del usuario, sino que también es un lenguaje de programación bastante sencillo de utilizar. Los programas pueden ser tan sencillos cómo un sólo comando con algunas opciones o contener conjuntos de comandos y sentencias de programación del intérprete.

Los programas están diseñados para colaborar

Una idea básica que distingue Linux de otros sistemas operativos es que los programas son herramientas, y como tales, deben tener una función específica pero han de poder usarse para diferentes propósitos. Tres características son necesarias para conseguir esto: • Los resultados de un programa deben poder usarse como datos de entrada para otros. • Los programas deben estar preparados para trabajar en modo no interactivo, de forma que todas las opciones y datos que necesitan les puedan venir a través de un fichero. • Por defecto, los programas deben leer la entrada estándar (el teclado) y mostrar los resultados en la salida estándar (la pantalla). Cuando los programas pueden usarse de esta forma, es posible indicarle al intérprete que deseamos encadenarlos secuencialmente de forma que la salida de cada uno de ellos constituye la entrada para el siguiente.

Complejidad a la carta

La filosofía de Linux es proporcionar una gran cantidad de utilidades que realizan tareas simples de forma que el usuario básico pueda desenvolverse con comodidad, Pero al mismo tiempo, a través de la combinación de comandos y las capacidades de programación del intérprete, proporciona la posibilidad de crear nuevos comandos más complejos para los usuarios que así lo requieran.

El modo consola

Originalmente la interacción con el intérprete de comandos se realizaba a través de lo que se denominaban consolas (conjunto de teclado y pantalla) introduciendo órdenes en un entorno sin visualización gráfica, únicamente de texto. El intérprete muestra un indicador (prompt) en lalínea de comandos para mostrar al usuario que puede introducir una orden. El formato del prompt es muy flexible, pudiendo mostrar información como el nombre del usuario conectado o el directorio actual, por ejemplo. Actualmente, entornos como XWindow proporcionan interfaces gráficas que evitan muchas de las complejidades de la interacción a través de la consola. Sin embargo, existen todavía comandos (sobre todo de administración del sistema) que no están completamente soportados por aplicaciones gráficas y se hace necesario la interacción a través de lo que denominaremos modo consola o texto en contraste con el modo gráfico. Sin embargo, en el mantenimiento remoto de servidores Linux, suele ser habitual usar el modo consola. Es conveniente, pues, estar familiarizado con su uso si vamos a tener que trabajar con servidores remotos. Cuando tengamos que introducir órdenes, debemos tener en cuenta que los intérpretes de comandos de Linux distinguen mayúsculas y minúsculas.

Variables de entorno

Muchas utilidades de Linux, incluyendo el intérprete de comandos, necesitan información sobre el usuario y sus preferencias. Este tipo de información se almacena en las variables de entorno, que son gestionadas por el intérprete de forma que son accesibles a los programas que las necesitan. Aunque es posible definirlas, existe una serie de variables de entorno predefinidas como por ejemplo las siguientes: • PATH: Contiene la lista de directorios donde el intérprete buscará los comandos que el usuario pida ejecutar. • HOME: Contiene la ruta absoluta hasta el directorio personal del usuario. • PS1: Contiene la definición del prompt principal que muestra el intérprete en modo texto.


La primera interacción

La entrada al sistema

Para poder entrar al sistema, Linux siempre requiere a los usuarios que se identifiquen mediante un nombre y una contraseña para verificar su identidad. Este procedimiento no sólo garantiza la seguridad de acceso al sistema, sino que además permite aplicar los permisos de acceso a la información y de ejecución de programas necesarios para cada usuario.

El usuario root

En Linux existe un usuario especial denominado ‘root’ que es eladministrador del sistema y, por tanto, tiene permisos para realizar cualquier acción. Así, puede acceder a los ficheros de todos los usuarios, ejecutar cualquier programa y tiene permisos para acceder a todos los ficheros de configuración del sistema. Por esta razón, no es conveniente trabajar como ‘root’ cuando no se van a realizar tareas de administración, ya que se corre el riesgo de borrar o modificar algo por accidente. A menudo el usuario root está deshabilitado de manera que no se puede acceder a él. Sin embargo, usuarios con privilegios pueden usar la ordensudo que les permite ejecutar comandos como si fueran el usuario root. Para ello, basta poner sudo delante de la instrucción que se quiera ejecutar. Por ejemplo: sudo mount /dev/sdb1 /mnt/discoduro

Crear un nuevo usuario

Si necesitamos crear un nuevo usuario la intrucción a usar es adduser. Dado que es una intrucción que necesita privilegios de administración para ejecutarse, usaremos: sudo adduser [usuario] El sistema nos pedirá algunos datos del usuario (entre otros su contraseña) y creará el usuario y un directorio para él en /home/usuario Se puede encontrar más información sobre esta instrucción en: enlace


Primeros comandos

Una vez el usuario ingresa correctamente en el sistema, Linux ejecuta el intérprete de comandos, el cual permanecerá aceptando e interpretando órdenes hasta que finalice la sesión. Algunos comandos que podemos usar en Linux están integrados en el propio intérprete y se denominancomandos internos. Para ejecutarlos, el intérprete no necesita transferir el control a ningún programa externo. El resto de comandos externos deben corresponder a algún programa ubicado en algún punto del sistema y que el intérprete sea capaz de localizar. Cuando tecleamos un comando, el intérprete mira primero si es interno, en cuyo caso lo ejecuta de inmediato. Si no, hay dos casos posibles: que especifiquemos el comando con una ruta absoluta o simplemente con el nombre. En el primer caso, tampoco hay problema, ya que el intérprete puede localizar con facilidad el programa y ejecutarlo. En el segundo, necesita buscarlo en alguno de los directorios especificados en la variable de entorno PATH.

El prompt

Como ya hemos comentado, el intérprete de comandos muestra el prompt para indicar al usuario que está listo para recibir comandos. El prompt puede tener formatos muy diversos. Habitualmente suele ser usuario@máquina:directorio$ con algunas particularidades. “máquina” puede ser el nombre que tenga la máquina o su IP si no tiene. “directorio” será el directorio actual o ~ si nos encontramos en el nuestro directorio.

Viendo el contenido de un directorio

Si queremos ver el contenido del directorio actual, podemos utilizar el comando ls. Sin embargo, si lo hacemos la primera vez que hemos entrado en la máquina y estamos en nuestro directorio, posiblemente no veamos nada. En realidad sí que hay archivos en nuestra cuenta, lo que pasa es que están ocultos. Si queremos verlos podemos usar la opción a de la siguiente manera: ls -a El resultado será algo parecido a esto:


Resultado de usar la instrucción ls con la opción a

El archivo en azul no es tal, es un directorio. En este listado tan solo vemos los nombres de los archivos, pero a menudo nos interesará tener más información. Con la opción l obtendremos un listado más completo con información sobre los permisos del archivo, el tamaño en bytes, el propietario del archivo, el grupo al que pertenece, el tamaño y la hora de creación:


Resultado de usar la instrucción ls con las opciones l y a

Finalmente, si tenemos archivos muy grandes, podemos añadir la opciónh que nos muestra el tamaño en Kb











La práctica de esta asignatura la vamos a hacer en máquinas virtuales del servicio ec2 de Amazon. Este servicio ofrece mucha flexibilidad a la hora de crear nuevos proyectos web, pues permite ampliar el número de máquinas conforme se van necesitando.

Como vamos a hacer un uso de las máquinas un poco especial (puesto que no las vamos a poner en producción), el funcionamiento será un poco especial, aunque nada complicado, el proceso será el siguiente:

  • Antes de conectarnos a nuestra máquina deberemos ponerla en marcha a través del enlace correspondiente del aula. Es importante volver a pararla una vez dejemos de usarla.
  • Una vez aparezca como funcionando copiaremos su dirección IP (cambia cada vez que se arranca) y ya podremos conectarnos a ella. Para hacerlos tenemos dos opciones dependiendo del sistema operativo que usemos.
    • En Linux o Mac, basta con abrir una ventana del terminal y poner ssh user@xxx.xxx.xxx.xxx (Deberéis sustituir las x por los números que aparezcan en la IP).
    • En Windows la opción mejor es bajarse la aplicación PuTTy. No necesita instalación y es muy fácil de usar.
  • Se os pedirá una contraseña. La habréis recibido por correo. Es obligatorio cambiar esa contraseña la primera vez que se accede a la máquina.

Como veréis, vamos a trabajar con la línea de comandos, con lo que será necesario que conozcáis al menos los comandos que deberéis usar durante el desarrollo de la práctica.

Algunas ideas básicas

  • Los archivos en Linux, igual que en otros sistemas operativos, se organizan en un árbol de directorios (o carpetas) a partir de una raíz. En Linux el directorio raíz es / (en Windows es \)
  • El camino o ruta (path) es la dirección del directorio donde se encuentra un archivo. Así, un archivo (con nombre nombre_archivo) que esté en el directorio A, que a su vez está en el directorio B, que a su vez está en el directorio raíz, estará en la ruta /B/A/ y nos referiremos a él como /B/A/nombre_archivo
  • En Linux mayúsculas y minúsculas se tratan como letras diferentes. Es importante usarlas correctamente.
  • Si alguna vez listamos algo que no cabe en la pantalla, podemos redireccionarlo (con | ) hacia el comando less para que nos permita subir y bajar por el contenido. Por ejemplo: ls -la | less (la barra la encontraréis en vuestro teclado en la tecla 1)

Enlaces a materiales de referencia

Os pedirá el primer apellido y el DNI (20+DNI) para poder acceder. Es posible que la primera vez no os permita bajar correctamente el archivo que queráis, volver a atrás y volver a entrar soluciona el problema...

Comandos básicos de Linux

Instalando aplicaciones en CentOS

Manuales