martes, 30 de junio de 2015

Instalar GNS3 en Ubuntu14

Instalar GNS3 en Ubuntu 14 para poder virtualizar los laboratorios de cisco






Aca les dejo los pasos a seguir



1- Primero debemos asegurarnos que nuestro sistema este actualizado

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

2-Instalar las dependecias para GNS3

sudo apt‐get install python3‐zmq
 sudo apt‐get install python3‐tornado
 sudo apt‐get install python3‐netifaces
 sudo apt‐get install python3‐setuptools
 sudo apt‐get install python3‐pyqt4
 sudo apt‐get install python3‐ws4py

3-Instalar las dependencias de Dynamips hypervisor
  sudo apt‐get install uuid‐dev
  sudo apt-get install cmake
  sudo apt‐get install libelf‐dev
  sudo apt‐get install libpcap‐dev

4-descargar GNS3 de la siguiente direccion, yo tuve que crearme una cuenta
para poder descagar GNS3

https://community.gns3.com/community/software/download


5- Descomprimir el archivo GNS3


  • dynamips-0.2.14.zip
  •  gns3-server-1.2.3.zip,
  •  gns3-gui-1.2.3.zip,
  •  iouyap-0.95.zip,
  • vpcs-0.6.zip

una vez que ya hayamos llegado hasta este punto ya podemos proceder con la instalacion

6- Instalar GNS3



$ cd GNS3-1.2.3-source
$ unzip gns3-server-1.2.3.zip
$ cd gns3-server-1.2.3
$ sudo python3 setup.py install
$ cd .. 

7-  Instalar GNS3 GUI

$ unzip gns3-gui-1.2.3.zip
$ cd gns3-gui-1.2.3
$ sudo python3 setup.py install
$ cd ..

8- Compilar e instalar Dynamips


Dynamips nos permite virtualizar muchos IOS

$ unzip dynamips-0.2.14
$ cd dynamips-0.2.14
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ sudo setcap cap_net_admin,cap_net_raw=ep /usr/local/bin/dynamips
$ cd ../..

9- Preparamos los requisitos para instalar IOU

$ sudo apt-get install libssl1.0.0:i386
$ sudo ln -s /lib/i386-linux-gnu/libcrypto.so.1.0.0 /lib/libcrypto.so.4
$ sudo apt-get install bison
$ sudo apt-get install flex
$ sudo apt-get install git
$ git clone http://github.com/ndevilla/iniparser.git
$ cd iniparser
$ make
$ sudo cp libiniparser.* /usr/lib/
$ sudo cp src/iniparser.h /usr/local/include
$ sudo cp src/dictionary.h /usr/local/include

10- Instalar GNS3 IOUYAP app which provide network support for IOU

$ unzip iouyap-0.95.zip
$ cd iouyap-95
$ sudo make install
$ sudo cp iouyap /usr/local/bin
$ cd ..


11- Instalar VPCS

$ unzip vpcs-0.6.zip
$ cd vpcs-0.6
$ cd src
$ ./mk.sh
$ sudo cp vpcs /usr/local/bin/
$ cd ../.. 

12- Una vez llegado hasta aca es hora que iniciemos GNS3

escribimos en la consola

#gns3 


y a jugar 








viernes, 1 de mayo de 2015

Cómo instalar y usar Tmux

¿Qué es Tmux?

Su nombre es el diminutivo de terminal multiplexer (multiplicador de terminal), y nos permite habilitar múltiples sesiones, ventanas y paneles para ser controladas mediante el mismo terminal. Es compatible con plataformas Linux, Mac OS X, FreeBSD, OpenBSD, NetBSD y Solaris.

¿Cómo lo instalo?

En Mac OS X el proceso de instalación recomendado es mediante el uso de Homebrew, con solo una línea ya estaremos listos para usar la herramienta:
$ brew install tmux
En otros sistemas que soportan el comando apt-get, la instalación es igual de sencilla:
$ apt-get install tmux

¿Cómo lo uso?

Para comenzar creemos una sesión nueva:
$ tmux new -s primera_sesion

Esto iniciará una nueva sesión del terminal tmux con el nombre primera_sesion. Notemos que en la barra inferior del terminal podemos apreciar además del nombre de la sesión, lo siguiente: 0:-\, esto se traduce en que tenemos una ventana en la sesión (ventana 0), como estamos en el directorio raíz del usuario la ruta es únicamente el guión (-), y el asterisco () nos indica que es la ventana activa
Debemos resaltar que el funcionamiento de tmux está enfocado a atajos de teclado, para ejecutar una funcionalidad debemos presionar Ctrl-b (accionador por defecto), luego los soltamos y presionamos la tecla de la acción que deseamos.
Por ahora creemos un nuevo panel en nuestra ventana, esto dividirá nuestra ventana horizontal o verticalmente para crear el otro panel, para hacerlo verticalmente presionemos Ctrl-b % y horizontalmente Ctrl-b ". Hagamos ambos para ver que pasa:

Notemos que creamos 2 paneles adicionales, uno al dividir el original verticalmente en 2 y el otro al dividir el nuevo vertical derecho en 2 horizontales. Para poder ciclar entre los diferentes paneles podemos presionar Ctrl-b o o si queremos ir a alguno en particular podemos presionar Ctrl-b q lo cual nos dirá los números de cada panel y si rapidamente presionamos el número del que deseamos podremos ir a él.
Si estas trabajando en un ambiente que te permite hacer uso de un ratón, más adelante explicaremos como configurar tmux para que lo soporte y hacer que el cambio de paneles sea más sencillo.
Digamos que no necesitamos estos 3 paneles ahora, así que desechemos este último presionando Ctrl-b x.
Ahora creemos una nueva ventana presionando Ctrl-b c:

Notemos que hemos creado una nueva ventana de terminal, podemos apreciar en la barra inferior que ahora tenemos la ventana 0 y la 1, el asterisco nos indica la ventana en la cual nos encontramos actualmente.
Para ciclar entre las diferentes ventanas podemos presionar Ctrl-b n para ir a la próxima ventana, Ctrl-b p para ir a la anterior o simplemente especificar la ventana que queremos, por ejemplo si quisiéramos ir a la ventana 0 presionaríamos Ctrl-b 0.

Estado de sesión

Una de las grandes ventajas de tmux es su habilidad de desatarnos de la sesión, todo lo que la sesión contiene se mantendrá intacto. Hagamos una prueba de esto.
Conectemonos a un servidor por SSH mediante Tmux:

Ahora presionemos Ctrl-b d para desatarnos de la sesión.
Notaremos que hemos vuelto a nuestro terminal común con el mensaje [detached]; sin embargo todo lo que dejamos corriendo en la sesión sigue ejecutandose, nuestra conexión SSH no está cerrada, volvamos a atar la sesión para comproblarlo:
$ tmux list-sessions
primera_sesion: 2 windows (created Sat Jul 27 18:04:37 2013) [104x31]

$ tmux attach-session -t primera_sesion
Esto reanudará nuestra sesión tal cual como la dejamos.
Debemos tener en cuenta que si el computador en el que estamos trabajando es apagado las sesiones se perderán.

Programación en pareja

Otro de los usos más interesantes que se le da a Tmux es la programación remota en pareja.
Para esto se recomienda construir una sesión de usuario aparte de la que usamos convencionalmente en el computador ya que no queremos que alguien acceda a nuestra información. En este caso lo haremos con nuestro usuario normal para la demostración.
Debemos crear la sesión especificando el socket que usará, lo cual permitirá compartirla entre varios usuarios, para dar acceso a otros usuarios al socket debemos otorgarle los permisos necesarios:
$ tmux -S /tmp/emparejado
$ chmod 755 /tmp/emparejado
Ahora en nuestro otro computador nos conectamos por SSH al equipo anfitrión y nos atamos a la sesión (recuerda que debes tener habilitado este tipo de acceso remoto en la configuración de tu computador anfitrión).

Ahora ambos equipos se encuentran conectados a la misma sesión de Tmux y lo que uno escriba se verá reflejado en el otro:
Podemos notar una especie de puntos rellenando el fondo de la ventana más grande, esto se debe a que el terminal toma el tamaño de la ventana más pequeña (en este caso la del invitado) con el fin de que ambos puedan ver la misma información.
Si quieres adentrarte más en la programación en pareja por terminal, te recomendamos que le eches un vistazo a Tmate y Wemux basadas en Tmux, los cuales ofrecen varias ventajas relacionadas a este fin particular.

Hoja de atajos

Especifiquemos algunos de los atajos más comunes.
Acción Atajo
Crear nueva ventana Ctrl-b c
Eliminar ventana actual Ctrl-b &
Mover a ventana siguiente Ctrl-b n
Mover a ventana anterior Ctrl-b p
Mover a ventana especifica Ctrl-b <num ventana>
Mover a ultima ventana seleccionada Ctrl-b l
Mostar ventanas (al seleccionar una se irá a ella) Ctrl-b w
Dividir panel verticalmente Ctrl-b %
Dividir panel horizontalmente Ctrl-b "
Ciclar entre paneles Ctrl-b o
Mostar paneles (al seleccionar uno rapidamente, se irá a él) Ctrl-b q
Mover panel actual a la derecha Ctrl-b }
Mover panel actual a la izquierda Ctrl-b {
Eliminar panel actual Ctrl-b x
Eliminar todos los paneles excepto el actual Ctrl-b !
Mostrar la hora Ctrl-b t
Desatar de la sesión Ctrl-b d
Mostar sesiones (al seleccionar una se irá a ella) Ctrl-b s
Renombrar sesión Ctrl-b $
Escribir en consola de comandos (comandos avanzados) Ctrl-b :
Mostar atajos Ctrl-b ?


lunes, 13 de abril de 2015

Detalles que debes saber si tienes un sitio con muchas visitas

Como configurar el apache de tal forma que pueda servir su contenido de una forma mucho mas eficiente.
Cuando tenemos un servidor apache sirviendo nuestro blog que apenas visitan una decena de personas al día esto no nos tiene que preocupar, pero si tenemos que hacerlo si en este mismo servidor hay un numero mucho mas alto de visitas diarias.


En realidad lo que significa configurar un apache para alto rendimiento es primero de todo, saber qué tipo de datos vas a transferir y segundo el ancho de banda y capacidad de hardware de qué dispones.

 La idea es que el sistema pueda recibir muchas visitas sin que se sature ni la memoria ni el ancho de banda, a partir de ello aquí tenéis algunas ideas de por donde empezar.

1. Cargar sólo los módulos necesarios

Es estúpido tener encima de la mesa libros que no vas a usar para el trabajo que estás haciendo, así que lo mejor es sacarlo de ahí, para ello tenemos el comando a2dismod, que desahabilita los módulos que tenemos instalados.
Como anotación, para cargar módulos es con el a2enmod. Estos dos comandos la única cosa que hacen son links simbólicos de /etc/apache2/mods-available a /etc/apache2/mods-enabled.
Para añadir mas módulos basta consultar nuestro gestor de paquetes o la web de apache.

2. Usar los módulos de multiprocesing apropiados
Apache es un servicio que ofrece el servicio creando nuevos procesos para cada una de las tareas a realizar, desde servir una imágen, escribir una línea a log, etc.
En apache hay 2 versiones de multi processing, la worker y la prefork. La worker por ejemplo trabaja a un rendimiento y escalabilidad mucho mayores a la prefork, cada proceso que genera varios procesos hijos, estos son agrupados y permiten usar la misma conexión, esto en contra pero hace que si falla uno de los procesos hijo falla todo el proceso padre, la prefork evita esto, pero es mas lenta ya que cada proceso hijo genera una conexión.

3. DNS lookup
Cada vez que hacemos una conexión a un cliente el apache tiene que resolver el nombre del cliente, esto hace que tenga que hacer una petición al DNS, para accelerar este proceso, apache tiene la posibilidad de crear una lista interna de hosts-ips.
La opción en apache es la HostnameLookups, por defecto viene desactivada desde la versión 1.3 y por esto se recomienda el uso de un programa de post-procesamiento llamado logresolve.

4. AllowOverride
Si no vamos a usar ficheros .htaccess o simplemente si estamos administrando un servidor y no queremos que los usuarios puedan modificar las opciones por defecto de apache, simplemente cuando definamos una sección de directory, especificamos AllowOverride None.
AllowOverride All buscaría en los directorios típicos ficheros de configuración .htaccess, esto lo que hace es que cada vez que se carga una página web vaya a buscar dicho fichero. Así que es recomendable dejarlo siempre deshabilitado a menos que queremos que un directorio tenga un comportamiento especial, como podría ser con el mod_rewrite en los wordpress

5. FollowSymLinks y SymLinksOwnerMatch
Personalmente el SymLinksOwnerMatch ni lo conocía, pero simplemente lo que hace es lo mismo que FollowSymLinks pero que comprueba que el usuario que está ejecutando el proceso de apache puede acceder a aquel directorio.
Esto es una magnífica medida de seguridad pero también consume muchos mas recursos que el FollowSymLinks.
El FollowSymLinks lo que hace es que si en un directorio tienes un vínculo simbólico a otro directorio lo sigue, así que podrías hacer un link simbólico en /var/www llamado música apuntando a tu directorio de música del home y sería como tener la música en el directorio de apache, pero cuidado! hay que estar muy atento de no vincular un directorio que dentro tenga otros directorios con contenido delicado, ya que este también será accesible (importante tener en cuenta el valor Index, que permite hacer un índice del contenido del directorio).

6. Negociación
Otro de los valores interesantes es Multiviews, esto lo que hace es que cada vez que accedes a un directorio escanea el contenido de este, si básicamente vas a acceder a unos ficheros ya vinculados y no tienes por qué saber el contenido de este directorio simplemente esborra la opción Multiviews, ahorrarás al pobre apache de tener que hacer esta misma tarea innecesaria cada vez.

7. MaxClients
MaxClients define el numero de clientes que pueden conectarse, si el numero es demasiado bajo hará que haya muchos timeouts de las conexiones aunque la máquina no se disparará en consumo de RAM, en caso contrario, si el valor es alto apenas se darán timeouts, pero en momentos de mucho tráfico hará que nuestra máquina swapee y acabe funcionando lenta.
Para calcular este valor podemos usar esta fórmula:
MaxClients = Total RAM dedicated to the web server / Max child process size

8. MinSpareServers, MaxSpareServers, y StartServers
Este es similar al anterior pero hace referencia al numero de procesos hijos que puede tener activos un proceso. Dependiendo de la carga de los procesos puede hacer que tarde mas o menos en servir el contenido. Por ejemplo si tenemos una página que se tiene que procesar mucha información, nos va a interesar que use el máximo numero de procesos hijo para resolver el contenido, pero por contra, si definimos este numero muy bajo y el proceso es muy alto va a hacer que se tarde mucho en servir el contenido final.

9. MaxRequestsPerChild
Por defecto está a 0, es decir que no hay límite, pero no se recomienda en servidores con muchas visitas, ya que estas podrían hacer caer el servidor.

10. KeepAlive y KeepAliveTimeout
La directiva KeepAlive, permite hacer varias peticiones sobre la misma conexión TCP. Esto es particularmente útil cuando se están sirviendo páginas HTML con muchas imágenes. Si KeepAlive está en Off, entonces se tiene que hacer una conexión TCP para cada imagen, entonces para evitar esto se pondría el KeepAlive en On.
KeepAliveTimeout define el tiempo que tiene que esperar para la siguiente petición. Se recomienda definir este valor de 2 a 5 segundos, ya que si es demasiado grande, se estaría desaprovechando la posibilidad de ofrecer otro contenido a otro visitante durante la espera.

11. Compresión HTTP y caching
La compresión HTTP está especificada desde la versión 1.1 de HTTP, así que está soportada por todos los navegadores. Esta opción permite disminuir drásticamente el consumo de ancho de banda (según estudios del 75,2%!), pero en su contra consume muchos mas recursos, ya que usa gzip para comprimir el contenido antes de mandarlo.
En apache se puede habilitar la compresión habilitando el módulo mod_deflate.
Con caching lo que se hace es que el contenido ya pedido anteriormente ya esté preparado para servirlo. Para configurar estos valores usamos mod_expires y mod_headers. En versiones anteriores a la 2.2 es necesario habilitar mod_cache, en posteriores esta opción ya viene activada por defecto.

12. Separar el contenido dinámico y el estático
Anda que buena idea! los que administramos apache sabemos que no es lo mismo servir una página HTML puro y duro que una con PHP, por esto que mediante los proxys HTTP podemos decirle al apache que tenemos en el puerto 80 que mande las peticiones de cierto contenido a otro servidor apache que sólo se encargue de servir imágenes, documentos o páginas web estáticas.
Un servidor que ofrece contenido dinámico puede llegar a consumir 20M por proceso, en cambio uno de estático como mucho 1M.
Esto lo podremos hacer mediante los módulos mod_proxy y rewrite_module (comentado antes).
Y hasta aquí algunas de las opciones para tener nuestro apache super maqueadito, analiza primero de todo el tipo de tráfico que va a tener tu servidor y si tienes la posibilidad de tener varios, separa el tipo de servicio que tengan que ofrecer a un mas alto rendimiento.

Todo lo que necesitas saber sobre .htaccess

1.- Introducción

Hay muchísimos artículos en la red sobre el fichero .htaccess, así que es una buena forma de agrupar y reunir lo que realmente es interesante sobre este tema, mediante ejemplos claros que sirvan como ejemplo.

Primero, tenemos que decir que el fichero .htaccess es una verdadera 'navaja suiza' para el control del acceso a tu sitio web. Con ella se puede redireccionar a una persona, denegar el acceso, comprimir los ficheros, establecer una caché para los archivos, etc.

.htaccess significa acceso de hipertexto -hipertext access- y es un archivo de configuración de Apache. Apache es el software encargado de servir páginas web para plataformas Unix, Microsoft Windows, Mac, etc.
Un error en el .htaccess puede hacer que no se vea la web hasta que se arregle dicho error, antes de modificar cualquier cosa del .htaccess asgurate de haber hecho una copia de seguridad.

Es evidente, pero importante, saber que en todos los ejemplos habrá que sustituir los nombres genéricos y las IP por las correctas en tu servidor. En muchos casos los dominios son del tipo dominio.com, ejemplo1.com, ejemplo2.com y similares, y las IP suelen ser 100.100.100.100, 100.101.102.103, y parecidas.

2.- Bloqueando y Permitiendo Acceso

Denegar el acceso a un directorio -carpeta- del servidor


Crear un fichero .htaccess dentro de la carpeta con las instrucciones:
#denegar todo acceso
deny from all

Permitir el acceso sólo a una IP
#denegar todo acceso excepto una IP
deny from all
allow from 100.100.100.100
Permitir el acceso sólo a un rango específico de IPs (forzado mediante la máscara de red)
#denegar todo acceso excepto a un rango de IP
deny from all
allow from 100.100.100.100/24

Bloquear el acceso a un archivo específico
#bloquear un fichero concreto
<Files archivo_a_bloquear.html>
order allow,deny
deny from all

Redireccionar visitantes a una dirección alternativa, menos a una IP específica
#Redireccionar a todos a otrositio.com excepto una IP concreta
ErrorDocument 403 http://www.otrositio.com
order deny,allow
deny from all
allow from 100.101.102.103

Denegar un rango completo de IP

Esto quiere decir que elimina 256 direcciones en el primer caso, 65536 en el segundo caso, y más de 16 millones de direcciones IP en el tercer caso
# Primer caso: deniega el acceso a 256 IPs, desde la 100.100.100.0 hasta la 100.100.100.255
order allow,deny
deny from 100.100.100.
# Segundo caso: deniega 65536 IP
order allow,deny
deny from 100.100.
# Tercer caso: deniega todas las IP que empiezan por 100, que son más de 16 millones
order allow,deny
deny from 100.

Permitir un rango concreto de IP a la web
# permitir acceso a rango 100.100.100.0 hasta 100.100.100.255
order deny,allow
allow from 100.100.100.

Denegar acceso de un dominio concreto
# bloquear acceso a un dominio
order allow,deny
allow from all
deny from .*dominio\.com.*

Denegar acceso a visitantes que vengan de un dominio concreto
# bloquear acceso visitas desde ejemplo1.com y ejemplo2.com
RewriteCond %{HTTP_REFERER} ejemplo1\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ejemplo2\.com [NC,OR]
RewriteRule .* - [F]

Denegar acceso a una hora específica
# bloquear acceso una hora
RewriteCond %{TIME_HOUR} ^12$
RewriteRule ^.*$ - [F,L]

Denegar acceso a un directorio a varias horas concretas
# bloquear acceso en varias horas
RewriteCond %{TIME_HOUR} ^(12|13|14|15)$
RewriteRule ^.*$ - [F,L]

Denegar acceso a muchos proxies
# bloqueo de Proxies
RewriteCond %{HTTP:VIA} !^$ [OR]
RewriteCond %{HTTP:FORWARDED} !^$ [OR]
RewriteCond %{HTTP:USERAGENT_VIA} !^$ [OR]
RewriteCond %{HTTP:X_FORWARDED_FOR} !^$ [OR]
RewriteCond %{HTTP: PROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:XPROXY_CONNECTION} !^$ [OR]
RewriteCond %{HTTP:HTTP_PC_REMOTE_ADDR} !^$ [OR]
RewriteCond %{HTTP:HTTP_CLIENT_IP} !^$
RewriteRule ^(.*)$ - [F]

Prevenir accesos al archivo .htaccess
# prevenir acceso .htaccess
<files .htaccess>
order allow,deny
deny from all
</files>
Prevenir el acceso a un archivo específico
#prevenir acceso a un fichero concreto
<files nombre.jpg>
order allow,deny
deny from all
</files>

Prevenir el acceso a varios tipos de archivos
# prevenir acceso a tipos de ficheros concretos
<FilesMatch "\.(htaccess|htpasswd|ini|phps|log)$">
order allow,deny
deny from all
</FilesMatch>

Evitar que se muestren determinados tipos de ficheros
# evitar muestra de fichero MP4, WMV y AVI
IndexIgnore *.wmv *.mp4 *.avi

Evitar el listado de directorios
# evitar listado de directorios
IndexIgnore *

Evitar el hotlinking en el dominio

El hotlinking es cuando descargan ficheros de tu servidor desde otra web para mostrarlos en ésta, 'robando' ancho de banda y servicios del tuyo.
# Evita el hotlinking a ficheros GIF y JPG del servidor
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?midominio\.com/.*$ [NC]
RewriteRule .* \.(gif|jpg)$ http://www.midominio.com/hotlinking.jpg [R,NC,L]
Es más eficaz, si el archivo que mostramos a aquellos que realizan el hotlinking lo colgamos en un servidor gratuito de imágenes tipo ImageShack.us (o similares) y lo referenciamos allí.

Bloqueo de ficheros determinados el cualquier subdominio, para evitar hotlinking específico

Para evitar el hotlinking a ficheros MP3 y ficheros de vídeo AVI, WMV y MPG:
# Evita el hotlinking a ficheros MP3, AVI, WMV y MPG de cualquier subdominio y dominio del servidor
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://([-a-z0-9]+\.)?midominio\.com [NC]
RewriteRule .* \.(mp3|avi|wmv|mpg|mpeg)$ http://www.midominio.com/images/nohotlink.gif [R,NC,L]
Si se envían ficheros por RSS -sindicación del sitio- debe tenerse en cuenta, ya que las instrucciones anteriores bloquean todo el contenido de vídeo y los RSS pueden verse mal. Es más eficaz, si el archivo que mostramos a aquellos que realizan el hotlinking lo colgamos en un servidor gratuito de imágenes tipo ImageShack.us o similar, y lo referenciamos allí.

Bloqueo de robot -bot- específico, a través de SetEnvIfNoCase
# bloqueo del bot BotMalo
SetEnvIfNoCase User-Agent "BotMalo/" spambot
deny from env=spambot

Bloque de robot -bot- específico, a través de Rewrite
# bloqueo de 3 bots conocidos (hay muchísimos más)
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule .* - [F]

Bloqueo de robot -bot- que accede siempre al mismo fichero
# bloqueo del bot al acceder a un fichero PHP concreto
SetEnvIfNoCase Request_URI "/firefoxz.php$" spambot
deny from env=spambot

Bloqueo de robot -bot- que siempre es referenciado desde un mismo sitio, a través de SetEnvIfNoCase
# bloqueo cuando se viene referenciado de un sitio web concreto
SetEnvIfNoCase Referer "^http://www.dominiospammers.com/" spambot
deny from env=spambot
Las 3 anteriores sentencias pueden combinarse escribiendo las 3 líneas SetEnvIfNoCase, y luego solo un deny, de la siguiente forma:
SetEnvIfNoCase User-Agent "BotMalo/" spambot
SetEnvIfNoCase Request_URI "/firefoxz.php$" spambot
SetEnvIfNoCase Referer "^http://www.spammers.com/" spambot
deny from env=spambot

Bloqueo de robot -bot- que siempre es referenciado desde un mismo sitio, a través de Rewrite
# bloqueo cuando se viene referenciado de un sitio web concreto ejemplo1.com
RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC]
RewriteRule .* - [F]

Bloqueo de robot -bot- que siempre es referenciado desde dos sitios, a través de Rewrite
# bloqueo cuando se viene referenciado desde ejemplo1.com o ejemplo2.com
RewriteCond %{HTTP_REFERER} ^ejemplo1\.com$ [NC,OR]
RewriteCond %{HTTP_REFERER} ^ejemplo2\.com$ [NC]
RewriteRule .* - [F]

Evitar acceso mediante el navegador a una carpeta sin el archivo "index"
# evitar acceso a carpeta sin index
Options All -Indexes
Lo contrario, es decir, permitir el acceso a carpetas sin index es:
# evitar acceso a carpeta sin index
Options All +Indexes

3.- Re-escritura y redirección

Quitar siempre las www de la URL

Es importante no repetir URLs -mostrando el mismo contenido con y sin www-, ya que penaliza el posicionamiento.
# quitar las www
RewriteCond %{http_host} ^www\.netandsoftware\.com [NC]
RewriteRule ^(.*)$ http://netandsoftware.com/ [R=301,L]

Mostrar siempre las www de la URL
# mostrar siempre las www
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\.netandsoftware\.com$
RewriteRule (.*) http://www.netandsoftware.com/ [R=301,L]
Cambiar la página de carga por defecto
#orden de los ficheros de carga por defecto
DirectoryIndex inicio.html index.htm index.html index.php
El orden es muy importante porque da la preferencia de los ficheros de carga

Camuflar el tipo de ficheros

Esto se hace para que sea más dificil detectar el tipo de ficheros que se usa
# camuflar archivos PHP como NAS
AddType application/x-httpd-php .nas

Redirigir el contenido en función del navegador usado
RewriteCond %{HTTP_USER_AGENT} ^Opera/*
RewriteRule ^index\.html$ index.opera.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/*
RewriteRule ^index\.html$ index.mozilla.html [L]
RewriteRule ^index\.html$ index.html [L]
Los asteriscos indican el uso de cualquier versión de ese navegador, por ejemplo:dicarse a continuación de la barra, como "Mozilla/3.0", "Mozilla/4.0", "Mozilla/5.0", etc.

Redireccionar una antigua página a la nueva
# redireccionar permanentemente
RewriteRule ^(.*)$ http://www.minuevodominio.com/ [R=301,L]

Redireccionar una antigua página a la nueva, a través de ReDirect
# redireccionar permanentemente
redirect 301 / http://www.dominio.com/

Redireccionar una web a otro sitio provisionalmente (redirección 302)
# redireccionar provisionalmente
RewriteRule ^(.*)$ http://www.minuevodominio.com/ [R=302,L]

Redireccionar de un archivo a otro
# redireccionar un antiguo fichero a otra nueva dirección
Redirect /antiguo.html http://dominio.com/nuevo.html
Redireccionar una IP concreta a una página concreta

Puede servir para avisar a una persona con una IP concreta de que ha sido baneada.
# redireccionar una IP a una página concreta de nuestra web
RewriteCond %{REMOTE_ADDR} 100.101.102.103
RewriteRule .* pagina-concreta.html [R]

Redireccionar toda una web a un directorio del mismo dominio
# traslada todas las URL antiguas a la nueva carpeta en el mismo dominio
RewriteCond %{HTTP_HOST} ^midominio\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.midominio\.com$
RewriteCond %{REQUEST_URI} !^/webencarpeta/
RewriteRule (.*) /webencarpeta/ [L]

Quitar una palabra de una URL


En el siguiente ejemplo, de http://www.midominio.com/quitar/prueba.html a http://www.midominio.com/prueba.html
# quitar una cadena de una URL
RewriteRule ^quitar/(.+)$ http://www.midominio.com/ [R=301,L]

URL amigable (uso de fin de interrogación en RewriteRule)

Cambia una URL como http://www.midominio.com/articulos-blog?catid=27 a http://www.midominio.com/articulos-blog de forma permanente.
# Uso de ?
RewriteCond %{REQUEST_URI} ^/articulos-blog$ [NC]
RewriteCond %{QUERY_STRING} ^catid=(.*)$ [NC]
RewriteRule ^(.*)$ /articulos-blog? [R=301,L]

URL amigable (uso del tanto por ciento en RewriteRule)

Cambia una URL como http://www.dominio.com/noticias?id=127 a http://www.dominio.com/noticias/127 de forma provisional.
# Uso del %
RewriteCond %{REQUEST_URI} ^/noticias$ [NC]
RewriteCond %{QUERY_STRING} ^id=(.*)$ [NC]
RewriteRule ^(.*)$ /noticias/%1? [R=302,L]

Mejorando el posicionamiento SEO con RewriteRule

Cambia una URL con la cadena "ps" por una URL con la cadena "posicionamiento-seo" que determina mejor el contenido de las URLs.
# mejorando el posicionamiento SEO sustituyendo caracteres sin sentido por otros que determinan el contenido
RewriteRule ^(.*)/ps/(.*)$ /posicionamiento-seo/ [L,R=301]

Transformación de una URL con agrupamiento de caracteres mayúsculas y minúsculas

Cambia la URL de este tipo http://www.midominio.com/pais/Espana.php a http://www.midominio.com/codigo/pais.php?nombre=Espana
# detectar palabras en mayúsculas o minúsculas o combinacion de ambas
RewriteRule ^pais/([a-zA-Z_-]+).php$ codigo/pais.php?nombre= [L]
Paso de parámetros en la URL y doble parámetro

Cambia una URL como http://www.midominio.com/fecha/2013/12.html a http://www.midominio.com/fecha.php?mes=12&anio=2013 de forma permanente
# Doble parámetro
RewriteRule ^fecha/(.+)/(.+)\.html$ fecha.php?mes=&anio= [R=301,L]

4.- Compresión y caché

Comprimir ficheros de texto, HTML, JavaScript, CSS y XML
# comprimir focheros texto, html, javascript, css, xml
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
También en una sóla línea:
AddOutputFilterByType DEFLATE text/plain text/html text/xml text/css application/xml application/xhtml+xml application/rss+xml application/javascript application/x-javascript

Cachear ficheros de imágenes a una semana
#Cache del navegador, imagenes cacheadas a una semana: 604800 segundos
<FilesMatch "\.(ico|jpg|jpeg|png|gif)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

Cachear ficheros JPG a un mes
#Cache del navegador, imágenes cacheadas a un mes: 2592000 segundos
<FilesMatch "\.(jpg|jpeg)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>

Cachear con ExpiresByType y el intervalo legible
#caché que expira las imágenes JPG en 6 meses, los CSS en 2 meses, y los JavaScripts en 2 semanas
ExpiresActive on
ExpiresByType image/jpg "access plus 6 months"
ExpiresByType text/css "access plus 2 months"
ExpiresByType text/javascript "access plus 2 weeks"

Cachear ficheros a un año con ExpiresDefault y el intervalo en segundos
ExpiresActive On
ExpiresDefault A0
# caché expira en un año (A9030400) para los ficheros FLV, ICO, AVI, MOV, PPT, DOC, MP3, WMV y WAV
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A9030400
</FilesMatch>


5.- Otros funcionalidades en el .htaccess

Asignar permisos CHMOD automáticamente al fichero .htpasswd
# permiso automático del fichero que protege el directorio .htpasswd
chmod .htpasswd files 640

Asignar permisos CHMOD automáticamente al fichero .htaccess
# permiso automático del fichero .htaccess
chmod .htaccess files 644

Asignar permisos CHMOD automáticamente a ficheros PHP
# permisos automáticos de archivos PHP
chmod php files 600

Limitar la subida de ficheros más grandes que una cantidad

Protege de ciertos ataques DOS, limitando el tamaño de archivos que se suben al servidor.
# limitar la subida a 10 MB
LimitRequestBody 10000000

Permitir al usuario descargar archivos multimedia

Generalmente sólo se permiten abrir
# permitir descarga de ficheros multimedia AVI, MPG, WMV y MP3
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .wmv
AddType application/octet-stream .mp3

Personalizar errores 404
ErrorDocument 404 /errores/404.html
Para otros tipos de errores es similar, se coloca el número de error y la dirección donde queremos redireccionar al visitante.

Corregir pequeños errores de ortografía en las URL
CheckSpelling On

Especificar el e-mail por defecto del administrador del servidor
# e-mail del administrador del servidor
SetEnv SERVER_ADMIN webmaster@midominio.com

Especificar el lenguaje por defecto del servidor
# lenguaje por defecto del servidor
DefaultLanguage en-US

Forzar el uso del protocolo seguro SSL
# fuerza el uso de SSL en la web
SSLOptions + StrictRequire
SSLRequireSSL
Redireccionar usuarios con protocolo seguro HTTPS a una carpeta en particular

Esto se puede necesitar cuando una web tiene una tienda online en una carpeta específica
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} carpeta
RewriteRule ^(.*)$ https://www.midominio.com/carpeta/ [R,L]

Evitar la visualización de errores al visitante
# evitar que los errores se muestren al usuario
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off

Registrar errores de PHP en un fichero log
# registrar errores en log
php_flag log_errors on
php_value error_log /logs/php_error.log

Limitar el número de visitas al mismo tiempo a 400
# limitar el número de visitas a 400
MaxClients 400

Denegar la ejecución de scripts CGI
# bloquear CGIs
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .sh .cgi

Declarar tipos MIME
# agregar tipos mime
AddType application/x-shockwave-flash .swf
AddType video/x-flv .flv
AddType image/x-icon .ico

Definiendo el juego de caracteres

Pasando el juego de caracteres se evita el mostrar un error 500 por este motivo
AddDefaultCharset utf-8

Desactivar los Entities Tags
FileETag none

Activar compresión GZIP

Hay ocasiones en las que son interesantes activar la compresión de datos para mejorar la velocidad de carga de la web.
Para activar la compresión GZIP, lo primero que necesitamos saber es si el servidor apache donde está alojado nuestro sitio permite la compresión. Para ello, en el archivo .htaccess hacemos una comprobación para detectar si existe el módulo mod_gzip, y si es así, entonces que realice las tareas de compresión.
El código que deberíamos añadir a nuestro fichero sería el siguiente.
# Compresión GZIP con mod_gzip

mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*

Redirigir a usuarios móviles

En la actualidad la mayoría de los usuarios disponemos de dispositivos móviles capaces de navegar por la red. Ante esta situación, es muy importante asegurarnos de que nuestros portales se visualicen bien en el tamaño de pantallas de estos dispositivos. Para ello, una buena opción es desarrollar una versión para que cuando el visitante acceda desde un dispositivo móvil, se redirija hacia la carpeta que contenga la versión móvil.
Para lograr esto de forma automática, podemos hacer uso del siguiente código:
RewriteCond %{HTTP_USER_AGENT} ^.*iPad.*$
RewriteRule ^(.*)$ http://tudominio.com/movil [R=301]
En este caso le estamos indicando que si se visita desde un iPad, se redirija a la carpeta “movil”. De forma similar se puede actuar con el resto de dispositivos móviles que hay en el mercado.

6.- Recomendaciones sobre el fichero .htaccess

El tamaño es importante: cuanto más pequeño sea el fichero .htaccess menos tiempo tardará el servidor en procesarlo cada vez que se realiza una petición a tu servidor. Esto implica una pérdida de rendimiento en la carga de las páginas de tu sitio web si este fichero se hace demasiado grande.

La directiva [L] es realmente interesante y hace que el servidor no procese más el archivo una vez que se cumple esa regla. Por lo que incorpora siempre que puedas esta directiva en los RewriteRule.

La organización es fundamental: dado lo complicada que pueden ser ciertas líneas en el código de .htaccess, es imprescindible comentar adecuadamente tu fichero para que la modificación sea rápida y sencilla. No escatimes en comentarios, y organiza adecuadamente las instrucciones de tu .htaccess.

Protege adecuadamente este archivo de reescrituras ajenas, puede llegar a ser muy peligroso.

La denegación de permisos debe estar lo primero, antes de ejecutar RewriteCond y RewriteRule.

7.- Simbología del fichero .htaccess

De forma breve, los códigos y símbolos en el archivo .htaccess son:
# 
Puesto al inicio de una línea, ignora esa línea.
[F]
 Forbidden: prohíbe un acceso y fuerza un acceso denegado. 403 Forbidden.
[L]
 Last rule: indica que es la última regla que debe aplicarse.
[N]
 Next: indica continuación hasta que las directivas sean logradas.
[G]
 Gone: indica al servidor que ya no existe, es decir, entrega "Gone"
[P]
 Proxy: instruye al servidor para manejar los pedidos por mod_proxy.
[C]
 Chain: encadena la regla actual con la regla anterior.
[R]
 Redirect: indica redirección. Puede haber de varios tipos 301 (permanente), 302 (provisional).
[NC]
 No Case: no sensible a mayúsculas, es decir, indica que no debe distinguirse entre mayúsculas y minúsculas
[PT]
 Pass Through: pasa el URL a Apache para seguir procesando
[OR] 
Or: indica que la expresión debe interpretase como una alternativa junto a la siguiente: ó lógico. Si se omite, se sobreentiende que es una y lógica, por defecto
[NE]
 No Escape: analiza las salidas de caracteres sin escapar.
[NS]
 No Subrequest: para saltar directivas de sub-pedidos internos.
[QSA]
 Append Query String: agrega un query string al final de la expresión (URL).
[S=x]
 Skip: salta las siguientes "x" reglas del fichero .htaccess.
[E=variable:value]
 Environmental Variable: para añadir un valor a una variable.
[T=MIME-type]
 Mime Type: declara mime-type al recurso.
[]
 dentro de los paréntesis se encierran carácteres que definen los resultados
[]+
 se utiliza para hacer combinaciones.
[^]
 excluye los carácteres que pongamos dentro del paréntesis. Ejemplo [^abc] excluye las letras a, b y c.
[a-z]
 letras desde la a hasta la z (en minúsculas).
[A-Z]
 letras desde la A hasta la Z (en mayúsculas).
[a-zA-Z]
 sólo letras (mayúsculas y minúsculas).
[a-z]{1,10}
 palabras en minúsculas entre 1 y 10 caracteres.
[0-9]
 sólo un número.
[0-9]{4}
números de 4 cifras.
(.*)
 cualquier expresión, incluida la vacía.
a{n}
 especifica el número de caracteres.
a{n,}
 especifica el número "o más" de caracteres.
a{n,m}
 especifica un rango entre "n" y "m". Ejemplo s{3,6} será 3 "eses", 4 "eses", 5 "eses" o 6 "eses".
()
 es un agrupamiento de caracteres.
^ 
marca el inicio de un argumento.
$
 marca el fin de un argumento.
?
 establece como opcional el caracter que le precede. Si se pone este símbolo al final del segundo argumento del RewriteRule, indicará que no se ponga nada más en la URL.
!
 es la negación. Ejemplo: "!string" resulta "no string".
.
 indica cualquier caracter arbitrario
-
 instrucción “not to”.
+
 indica uno o más caracteres del caracter que le precede. Por ejemplo: (.+) indica cualquier cadena de uno o más caracteres.
| 
es el ó lógico, condición de alternancia. Ejemplo (a|b) es el caracter a o el b.
\ 
escapa caracteres, es decir, toma el caracter que le sigue literalmente. Por ejemplo: “\.” indica literalmente un punto, ya que sin la barra invertida indicaría cualquier caracter.
/*
 indica cero o más "/".
.*
 indica cualquier caracter, incluido que no exista caracter.
^$
 indica una cadena vacía.
^.*$
 indica "todo", toda la cadena.
[^/.]
 define un caracter que no sea "/" ni ".".
[^/.]+
 define, ningún número de caracter que tenga "/" o ".".
http://
http:// es literalmente “http://”.
^dominio.*
 define una cadena que comience con "dominio" y le siga cualquier número de caracteres.
^dominio\.com$
 define exactamente “dominio.com”.
-d
 prueba si la cadena es un directorio existente.
-f
 prueba si la cadena es un archivo existente.
-s
 prueba si el archivo en la cadena no tiene valor cero.

Apache y Nginx juntos

¿Por qué correr Apache y Nginx juntos?

Tanto Nginx como Apache son dos servidores web potentes y eficaces. Apache es el servidor que más usado actualmente, Nginx, desde su lanzamiento público en 2006, es ahora el segundo servidor web más usado. Las razones de la popularidad de cada respectivo servidor son claras: el poder de Apache y velocidad de nginx son bien conocidos. Sin embargo, ambos servidores tienen inconvenientes: Apache consume demasiada memoria del servidor, mientras que Nginx necesita la ayuda de php-FPM o módulos similares para servir contenido dinámico.
Sin embargo, podemos combinar los dos servidores para conseguir el máximo rendimiento, con Nginx como servidor estático en el front-end y Apache se encargará del procesamiento dinámico en backend.

Requerimiento inicial.

Para llevar a cabo los pasos de este tutorial, debes tener privilegios de sudo en tu VPS.

Instalando Nginx.

Para empezar, tenemos que instalar y configurar Nginx que servirá el front-end de nuestro sitio.
Vamos a descargarlo e instalarlo desde apt-get o yum:
(Sistemas basados en Debian)
sudo apt-get install nginx

(Sistemas basados en RedHat)
sudo yum -y install nginx
Una vez que se ha descargado e instalado ya podemos seguir con el siguiente paso.

Configuración de Nginx.

Abre la configuración de Nginx.
sudo nano /etc/nginx/sites-available/ejemplo
La siguiente configuración permitirá usar Nginx como servidor front-end. Es muy similar a la configuración por defecto, y los detalles se encuentran bajo la configuración.
server {
        listen   80; 

        root /var/www/; 
        index index.php index.html index.htm;

        server_name ejemplo.com; 

        location /{
        try_files $uri $uri//index.php;}

        location ~ \.php$ {
        
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8080;}

         location ~/\.ht {
                deny all;}}
Los siguientes cambios han sido implementados en la configuración:
  • Cambiamos la raíz ( root) por el directorio correcto de la Web.
  • Añadimos index.php a la línea de índice ( index ).
  • try_files intentará de servir cualquier página solicitada por los visitantes. Si nginx no puede servirla,  el archivo se pasa al proxy.
  • PROXY_PASS indica a Nginx la dirección del servidor proxy.
  • Por último, el bloque de localización  “location ~ /\.ht {”  deniega el acceso a los ficheros . htaccess, si la raíz ( document root ) de Apache concuerda con la de Nginx.
Esta configuración establece un sistema por el cual todas las peticiónes con un final .php se redireccionan al backend Apache que está corriendo en el puerto 8080.
Ahora debes activar el VirtualHost:
 
sudo ln -s /etc/nginx/sites-available/ejemplo /etc/nginx/sites-enabled/ejemplo
 
Además, debes eliminar sitio que Nginx trae por defecto:

sudo rm /etc/nginx/sites-enabled/default
 
El siguiente paso es instalar y configurar Apache.

Instalar Apache.

Una vez hemos acabado con la parte de Nginx,  es el momento de instalar nuestro backend, Apache.
(Sistemas basados en Debian)sudo apt-get install apache2
(Sistemas basados en RedHat)
sudo yum -y install httpd

Puesto que nginx todavía no está activado, Apache comenzará a funcionar en el puerto 80.

Configurar Apache.

Necesitamos configurar apache para que pueda hacerse cargo del backend, que como ya le indicamos a Nginx, nuestro proxy deberá estar corriendo en el puerto 8080. Debemos abrir el fichero ports.conf de Apache  para indicar el puerto correcto:

sudo nano /etc/apache2/ports.conf
 
Busca y cambia las siguientes líneas para tener Apache corriendo en el puerto 8080, y accesible sólo desde el localhost:

NameVirtualHost127.0.0.1:8080Listen127.0.0.1:8080
 
Guarda y sal.
Posteriormente, abre un nuevo archivo de Virtual Host, copiando el diseño del que trae apache por defecto:

sudo cp /etc/apache2/sites-available/default/etc/apache2/sites-available/ejemplo
sudo nano /etc/apache2/sites-available/ejemplo
 
El principal problema que debemos solucionar aquí es que el Virtual Host tiene que estar, una vez más, ejecutándose en el puerto 8080 (en lugar del predeterminado 80).
La línea debe tener este aspecto:
Asegúrate de que la raíz (Document Root) es la correcta. Guarda y sal del archivo y activa el Virtual Host:

sudo a2ensite ejemplo
 
Antes de empezar a probar nada, tenemos que equipar a Apache con PHP. Vamos a instalarlo:

sudo apt-get install php5
 
Reinicia ambos servidores para que los cambios surtan efecto:
sudo service apache2 restart
sudo service nginx restart

Finalizando.

Ya tenemos listo nuestro VPS  ( o servidor dedicado ) con Nginx ejecutandose como front-end de nuestro sitio y con el procesamiento de Apache + PHP como back-end. Si abrimos nuestro dominio nos llevará a la página por defecto de nuestro sitio.
Podemos comprobar que la información está siendo enviada a Apache de forma correcta mediante la ejecución de un script php común.
Vamos a crear el archivo php.info:
sudo service apache2 restart
sudo nano /var/www/info.php
Pega las siguientes líneas en el archivo:
sudo service apache2 restart
<? phpinfo();?>
Guarda y sal.
Visita a tu dominio/info.php y deberás ver la pantalla PHP info, podrás observar que fue servida con Apache.

Conclusiones.

Configurar Nginx y Apache juntos  puede ser un gran impulso para tu servidor y para tu sitio web. Esto  solo ha sido una breve introducción pero se puede afinar todo mucho más para aumentar el rendimiento con creces.
Basado en un artículo de OpenWibnars

Instarlar y configura Apache en CentOS

Despues  de usar Ubuntu por mucho tiempo olvide practicamente como instalar y configurar apache pero esta vez para el sistema operativo Centos 


Para hacer frente a este tipo de situaciones esta vez voy a dejarlo aca para futuros proyectos y no tener que tropezar nuevamente con la misma piedra
 


Los servidores web utilizan HTTP por defecto, que es un protocolo de texto claro. Como su nombre indica, un protocolo de texto no cifrado que no aplica ningún tipo de encriptación de los datos. Mientras el servidor web basado en HTTP es muy fácil de configurar, tiene una desventaja importante en términos de seguridad. Exponerse a cualquier ataque "man-in-the-middle" capaz de ver el contenido de los paquetes en tránsito con analizadores de paquetes cuidadosamente colocados. En caso de una vulnerabilidad, un usuario malintencionado puede incluso configurar un servidor "impostor" en la ruta de tránsito, que a continuación, se hace pasar por el servidor web de destino. En este caso, los usuarios finales pueden comunicarse realmente con el servidor impostor en lugar del servidor de destino real. De esta manera, el usuario malintencionado puede engañar a los usuarios finales para que entreguen información confidencial, como nombre de usuario y las contraseñas a través de falsos formularios cuidadosamente elaborados.
Para hacer frente a este tipo de vulnerabilidades, la mayoría de los proveedores a menudo prefieren HTTPS en sus servidores web. Para los sitios donde los usuarios sólo leen el contenido y en realidad no introducen cualquier información, HTTP sigue siendo una opción viable. Sin embargo, para los sitios que mantienen la información y/o sitios donde se conectan usuarios donde obtienen servicios sensibles, HTTPS es una necesidad. HTTPS permite que una página proporcionae los siguientes servicios.
  • Asegura que todos los paquetes de tránsito hacia y desde los servidores están cifrados.
  • Establece la confianza con un certificado digital oficial, de manera que los servidores impostores no pueden pretender ser el servidor real.

La primera cosa necesaria para la creación de HTTPS es un certificado digital.

Los certificados digitales se pueden obtener de cualquiera de los métodos siguientes.

Los certificados autofirmados se recomiendan para fines de pruebas y proyectos personales. Los certificados autofirmados son aplicables también para los proveedores de servicios donde los usuarios del cliente son específicas y el círculo de la confianza es limitada. Los certificados autofirmados no cuestan dinero.
Los certificados se pueden obtener de proveedores de certificados basados en la comunidad, tales como StartSSL y CACert . Estos certificados no cuestan dinero tampoco, se recomiendan para proyectos personales.
Para proyectos comerciales donde se accede a los sitios web a nivel mundial, se recomienda comprar un certificado de una autoridad certificadora de confianza conocido. Estos certificados cuestan dinero, pero aumentan la credibilidad del proveedor de servicios web.
Preparación
En esta demostración, vamos a utilizar un certificado auto-firmado. Se supone que el servidor web Apache ya está instalado en CentOS. Para generar un certificado auto-firmado, se utiliza openssl. Si openssl no está instalado, se puede instalar para tal uso.
# yum install mod_ssl openssl

Generar un certificado autofirmado
Los siguientes comandos se pueden utilizar para generar un certificado auto-firmado.
En primer lugar, generar una clave privada con cifrado de 2048 bits.

# openssl genrsa -out ca.key 2048
Luego genere solicitud de firma de certificado (CSR).
# openssl req -new -key ca.key -out ca.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:es
State or Province Name (full name) []:Caceres
Locality Name (eg, city) [Default City]:Caceres
Organization Name (eg, company) [Default Company Ltd]:LinuxParty
Organizational Unit Name (eg, section) []:Prensa
Common Name (eg, your name or your server's hostname) []:LinuxParty
Email Address []:linux_party@yahoo.es

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:passworddeprueba
An optional company name []:ExtreHost
Por último, generar un certificado auto-firmado de tipo X 509, que tiene una validez de 365 keys.
# openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
Una vez creado el certificado, copia los archivos en los directorios necesarios.
# cp ca.crt /etc/pki/tls/certs/

# cp ca.key /etc/pki/tls/private/

# cp ca.csr /etc/pki/tls/private/
Configuración del servidor Web Apache
Ahora que el certificado está listo, es hora de verlo en funcionamiento.
En primer lugar, edite el archivo de configuración siguiente.
 
# vim /etc/httpd/conf.d/ssl.conf 
### overwrite the following parameters ###
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key

### The following parameter does not need to be modified in case of a self-signed certificate. ###
### If you are using a real certificate, you may receive a certificate bundle. The bundle is added 
using the following parameters ###
SSLCertificateChainFile /etc/pki/tls/certs/example.com.ca-bundle
A continuación, reinicie el servicio httpd para que los cambios surtan efecto.
# service httpd restart
El servidor web ya está listo para usar HTTPS.
Ajuste de máquinas virtuales
El Servidor web Apache se puede configurar para alojar múltiples sitios web. Estos sitios se declaran como hosts virtuales en el archivo de configuración httpd. Por ejemplo, supongamos que nuestro servidor web Apache tendrá 1un sitio "virtual-web.example.com", y todos los archivos del sitio se almacenan en el directorio /var/www/html/virtual-web
Para el host virtual, la configuración típica para HTTP se vería así.
# vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin email@example.com
    DocumentRoot /var/www/html/virtual-web
    ServerName virtual-web.example.com
</VirtualHost>
Tenemos que crear una definición similar para HTTPS también.

# vim /etc/httpd/conf/httpd.conf

NameVirtualHost *:443

<VirtualHost *:443>
 SSLEngine on
 SSLCertificateFile /etc/pki/tls/certs/ca.crt
 SSLCertificateKeyFile /etc/pki/tls/private/ca.key
 <Directory /var/www/html/virtual-web>
  AllowOverride All
 </Directory>
 ServerAdmin email@example.com
DocumentRoot /var/www/html/virtual-web
ServerName virtual-web.example.com
</VirtualHost>
Para cada host virtual, etiquetas similares deberían ser definidas. Después de agregar los hosts virtuales, el servicio web se reinicie.
# service httpd restart
Ahora las máquinas virtuales están listos para usar HTTPS también. Opcional: Forzar Apache Web Server a utilizar siempre HTTPS
Si, por alguna razón, usted decide utilizar siempre HTTPS en el servidor web, usted tendrá que redirigir todas las solicitudes HTTP entrantes (puerto 80) hacia el puerto HTTPS (puerto 443).
El Servidor web Apache puede ser fácilmente ajustado para hacer esto.
1. Forzar el Sitio principal solamente
Para forzar el sitio principal para usar siempre HTTPS, modificamos el fichero de configuración httpd.
# vim /etc/httpd/conf/httpd.conf
 
ServerName www.example.com:80
Redirect permanent / https://www.example.com
# service httpd restart
 
2. Forzar Hosts virtuales
Si desea forzar HTTPS en algún host virtual, así, la definición de HTTP se puede reescribir como sigue.

# vim /etc/httpd/conf/httpd.conf

<VirtualHost *:80>
    ServerName virtual-web.example.com
    Redirect permanent / https://virtual-web.example.com/
</VirtualHost>

# Service httpd restart
En resumen, HTTPS siempre se recomienda para los sitios donde se conectan los usuarios. Esto mejora la seguridad tanto en el servidor y los usuarios que lo utilizan. Los certificados pueden ser obtenidos en diversos medios, como los auto-firmado, impulsado por la comunidad o incluso las autoridades comerciales. El administrador debe ser prudente al seleccionar el tipo de certificado que se utilizará.


y no olviden abril en el firewall el puerto 443 

sábado, 1 de noviembre de 2014

Ps instantánea de los procesos en el sistema

Ps se utiliza para obtener una instantánea de los procesos en el sistema. Muchas veces es necesario obtener información valiosa, como por ejemplo determinar bajo qué usuario corre un proceso, y utilizamos el viejo y conocido “ps aux” sin saber bien que opciones estamos utilizando.
Generalmente en cualquier distribución de GNU/Linux se incluye la versión de ps que acepta diferentes tipos de opciones: las opciones UNIX que son precedidas por un guión (dash), las opciones BSD que no utilizan guión, y las opciones GNU largas que se preceden por dos guiones. Estas opciones se pueden mezclar, pero a veces ocasionan conflictos o existen opciones sinónimas que producen los mismos resultados. Por ejemplo “ps -aux” muestra todos los procesos pertenecientes al usuario llamado “x”, ya que no suele existir un usuario llamado “x” ps lo interpreta como el comando “ps aux” e imprime una advertencia :D
Por defecto ps sólo muestra los procesos con el mismo user id efectivo (EUID) que el del usuario que lo ejecuta. Cuando utilizamos ps con las opciones “aux” el resultado es:
a: eliminar la restricción BSD “only yourself” para agregar procesos de otros usuarios
u: utilizar el formato orientado al usuario
x: eliminar la restricción BSD “must have a tty” para agregar procesos que no tengan una tty asociada
De esta forma seleccionamos todos los procesos en el sistema y los mostramos en el formato orientado al usuario.
La salida de “ps aux” es una tabla donde cada fila es un proceso y las columnas contienen la siguiente información:
USER: usuario con el que se ejecuta el proceso
PID: ID del proceso
%CPU: porcentaje de tiempo que el proceso estuvo en ejecución desde que se inició
%MEM: porcentaje de memoria física utilizada
VSZ: memoria virtual del proceso medida en KiB
RSS: “resident set size”, es la cantidad de memoria física no swappeada que la tarea a utilizado (en KiB)
TT: terminal que controla el proceso (tty)
STAT: código de estado del proceso (información detallada más adelante)
STARTED: fecha de inicio del proceso
TIME: tiempo de CPU acumulado
COMMAND: comando con todos sus argumentos
Los códigos de estado del proceso pueden ser:
D: suspendido no interrumpible (generalmente esperando E/S)
R: en ejecución o listo para ejecutarse (en cola)
S: suspendido interrumpible (esperando que se complete un evento)
T: detenido, por una señal de control de trabajo o porque está siendo traceado
W: paginado (no válido a partir del kernel 2.6.xx)
X: muerto (nunca debe ser visto)
Z: proceso difunto (“zombie”), terminado pero no reclamado por el proceso padre
Para los formatos BSD (por ejemplo como cuando se utiliza “ps axo” para mostrar la lista de procesos en un formato definido por el usuario) y cuando se utiliza la palabra clave “stat”, se muestran los caracteres adicionales:
N: baja prioridad
L: tiene páginas bloqueadas en memoria
s: es un líder de sesión (se trata de un proceso que ha iniciado una nueva sesión)
l: es multihilado
+: está en el grupo de procesos en primer plano
Por ejemplo:
$ ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
Algunos ejemplos útiles que se incluyen en el manual de ps son:
Ver todos los procesos en el sistema utilizando la sintaxis estándar:
ps -e
ps -ef
ps -eF
ps -ely
Imprimir un árbol de procesos:
ps -ejH
ps axjf
Obtener información de hilos:
ps -eLf
ps axms
Obtener información de seguridad:
ps -eo euser,ruser,suser,fuser,f,comm,label
ps axZ
ps -eM
Ver todos los procesos ejecutando como root (ID efectivo y real) en formato de usuario:
ps -U root -u root u
Entre muchas opciones que tiene ps, es posible ordenar la salida de acuerdo a una columna, para esto se debe utilizar la opción gnu larga “–sort”, por ejemplo para ordenar por tiempo de CPU (si deseamos determinar qué proceso ha utilizado más CPU) seleccionamos el código “cputime”, correspondiente a la columna TIME:
ps aux –sort cputime
Es posible alterar el comportamiento de ps utilizando variables de entorno, la más significativa es “PS_PERSONALITY” la cual afecta la “personalidad” de ps. Se puede setear “PS_PERSONALITY” utilizando export y observar los resultados, por ejemplo:
export PS_PERSONALITY=bsd
ps
PID TTY STAT TIME COMMAND
675 tty4 Ss+ 0:00 /sbin/getty -8 38400 tty4
680 tty5 Ss+ 0:00 /sbin/getty -8 38400 tty5
685 tty2 Ss+ 0:00 /sbin/getty -8 38400 tty2
687 tty3 Ss+ 0:00 /sbin/getty -8 38400 tty3
692 tty6 Ss+ 0:00 /sbin/getty -8 38400 tty6
893 tty1 Ss+ 0:00 /sbin/getty -8 38400 tty1
17774 pts/1 S 0:00 su 17775 pts/1 S 0:00 bash 18064 pts/1 R+ 0:00 ps
export PS_PERSONALITY=linux
ps
PID TTY TIME CMD
17774 pts/1 00:00:00 su 17775 pts/1 00:00:00 bash 18065 pts/1 00:00:00 ps