SSH login sin contraseña

Objetivo

Desea utilizar Linux y OpenSSH para automatizar sus tareas. Por lo tanto, necesita un inicio de sesión automático desde el usuario-a@host-A  a  usuario-b@Host-B . No desea introducir ninguna contraseña, ya que desea llamar a ssh desde una secuencia de comandos de shell.

Cómo hacerlo

Primero inicie sesión en A como usuario a y genere un par de claves de autenticación. No introduzca una frase de contraseña:


a@A:~> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/a/.ssh/id_rsa):
Created directory '/home/a/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/a/.ssh/id_rsa.
Your public key has been saved in /home/a/.ssh/id_rsa.pub.
The key fingerprint is:
3e:4f:05:79:3a:9f:96:7c:3b:ad:e9:58:37:bc:37:e4 a@A

Ahora use ssh para crear un directorio ~ / .ssh como usuario b en B. (Es posible que el directorio ya exista, lo cual está bien):


a@A:~> ssh b@B mkdir -p .ssh b@B's password:

Finalmente agregue una nueva clave pública a b@B:.ssh/authorized_keys e ingrese la contraseña de b una última vez:


a@A:~> cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys' b@B's password:

A partir de ahora, puede iniciar sesión en B como b desde A sin contraseña:


a@A:~> ssh b@B

Nota: Dependiendo de su versión de SSH, también podría tener que hacer los siguientes cambios:

  • Poner la cláve pública en  .ssh/authorized_keys2
  • Cambiar los permisos de .ssh a 700
  • Cambiar los permisos de .ssh/authorized_keys2 a 640

¿Por qué copiar software ilegalmente si puede obtenerlo de forma gratuita?

Así que, estás perfectamente limpio, tienes tos compró una licencia para todo el software que has usado * tos *, y nadie te puede molestar sobre esto? Bueno, si ese es el caso, felicidades 🙂

Sin embargo, para la mayoría de la gente, seamos honestos, software copiado ilegalmente es muy común. Copiar Adobe Photoshop en lugar de comprarlo probablemente no le permite tener pesadillas. Pero, ¿estás realmente seguro de que nunca tendrás problemas para eso? Los fabricantes de software están progresando y encontrando más y más formas de rastrear a los propietarios ilegales, y como cada vez más personas que tienen conexiones de banda ancha (permanente), podrían agregar una funcionalidad en línea en el software que va a Controlar y verificar su copia cada vez que lo inicie.

Si ejecuta Linux e instala software libre, no tendrá que preocuparse de esto nunca más! La mayor parte del software libre (como en la libertad de expresión) es gratuito (como en la cerveza, bueno!). Usted puede encontrar un reemplazo libre para la mayor parte del software comercial allí  afuera. Tal vez carezcan de algunas de las funciones avanzadas, pero serán más que suficientes para la mayoría de la gente. Aquí hay una lista de algunos programas comerciales, y sus equivalentes de código abierto:

Tabla de software equivalentes

Comercial Open source ¿Existe en Windows?
Adobe Illustrator Inkscape Si
Adobe InDesign Scribus Si
Adobe Photoshop The GIMP Si
Adobe Premiere Pitivi, Kino, Cinelerra No
Adobe Reader Evince, Kpdf, GV Si
Apple iTunes AmaroK, Rhythmbox, Banshee Si
Autodesk Autocad FreeCad Si
Autodesk 3ds Max Blender Si
Autodesk Maya Blender Si
Bittorrent Transmission Si
Cubase Ardour No
Kazaa aMule, eMule Si
Microsoft Excel LibreOffice Spreadsheet Si
Microsoft Internet Explorer Firefox, Chrome, Si
Microsoft Office LibreOffice Si
Microsoft Windows Mail Thunderbird, Evolution, KMail, Geary Si
Microsoft Powerpoint LibreOffice Presentation Si
Microsoft Windows Media Player Mplayer, VLC, Totem, Kaffeine, Xine Si
Microsoft Word LibreOffice Word Processor Si
Microsoft Windows Messenger Pidgin, Kopete, aMSN Si
Nero Brasero, K3b No
Pro Tools Ardour No
Quark XPress Scribus Si
QuickTime Player Mplayer, VLC, Totem, Kaffeine, Xine Si
Winamp AmaroK, Rhythmbox, Banshee No

 

 

Buenos hábitos para el uso de la línea de comando en Linux

Introducción

Cuando se usa un sistema con frecuencia, tiende a caer en patrones de uso establecidos. A veces, no comienzas el hábito de hacer las cosas de la mejor manera posible. A veces, incluso se recogen las malas prácticas que conducen a desorden y torpeza. Una de las mejores maneras de corregir estas insuficiencias es recoger conscientemente buenos hábitos que los contrarrestan. Este artículo sugiere 10 hábitos para los comandos de línea de comando de Linux dignos de recoger. Estos son buenos hábitos que ayudan a romper muchas de las deficiencias de uso comunes y hacerte más productivo en la línea de comandos .

Hacer árboles de directorios de una sola vez

El Listado 1 ilustra uno de los hábitos de UNIX más comunes en torno a: definir árboles de directorio de uno en uno.

Listado 1. : Ejemplo de definición de árboles de directorios de forma individual

~ $ mkdir tmp
~ $ cd tmp
~/tmp $ mkdir a
~/tmp $ cd a
~/tmp/a $ mkdir b
~/tmp/a $ cd b
~/tmp/a/b/ $ mkdir c
~/tmp/a/b/ $ cd c
~/tmp/a/b/c $

Es mucho más rápido usar la opción -p en mkdir y hacer que todos los directorios padre junto con sus hijos en un solo comando. Pero incluso los administradores que conocen esta opción siguen atrapados a través de los subdirectorios a medida que los hacen en la línea de comandos. Vale la pena su tiempo para recoger conscientemente el buen hábito:

Listado 2: Definición de árboles de directorios con un comando

~ $ mkdir -p tmp/a/b/c

Puede utilizar esta opción para crear complejos árboles de directorios complejos, que son ideales para usar dentro de las secuencias de comandos; No sólo jerarquías simples. Por ejemplo:

Listado 3: Definiendo un árbol de directorio complejo

~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

En el pasado, la única excusa para definir directorios individualmente era que la implementación de mkdir no admitía esta opción, pero esto ya no es cierto en la mayoría de los sistemas. IBM AIX® mkdir, GNU mkdir y otros que cumplen con la especificación Single UNIX ahora tienen esta opción.
Para los pocos sistemas que todavía carecen de la capacidad, utilice el script mkdirhier, que es un contenedor para mkdir que hace la misma función:

~ $ mkdirhier project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

Cambiar la ruta; No mueva el archivo

Otro patrón de uso incorrecto es mover un archivo de archivo .tar a un directorio determinado porque sucede que es el directorio en el que desea extraerlo. Nunca necesita hacer esto. Puede desempaquetar cualquier archivo .tar en cualquier directorio que desee, es para lo que está la opción -C. Utilice la opción -C para desempaquetar un archivo comprimido para especificar el directorio para descomprimirlo en:

Listado #4:  Usar la opción -C para desempaquetar un archivo .tar

~ $ tar xvf -C tmp/a/b/c newarc.tar.gz

Hacer un hábito de usar -C es preferible a mover el archivo a donde desea descomprimirlo, cambiar a ese directorio, y sólo entonces extraer su contenido, especialmente si el archivo de archivo pertenece a otro lugar.

Combine sus comandos con los operadores de control

Probablemente ya sepa que en la mayoría de los shells, puede combinar comandos en una sola línea de comandos colocando un punto y coma (;) entre ellos. El punto y coma es un operador de control de shell y, aunque es útil para encadenar varios comandos discretos en una sola línea de comandos, no funciona para todo. Por ejemplo, suponga que utilice un punto y coma para combinar dos comandos en los que la ejecución correcta del segundo comando dependa totalmente de la finalización satisfactoria del primero. Si el primer comando no sale como se esperaba, el segundo comando sigue ejecutándose y falla.

En su lugar, utilice operadores de control más apropiados (algunos se describen en este artículo). Mientras su shell los apoye, valen el conseguir del hábito de usarlos.

Ejecutar un comando sólo si otro comando devuelve un estado de salida cero
Utilice el operador de control && para combinar dos comandos para que el segundo se ejecute sólo si el primer comando devuelve un estado de salida cero. En otras palabras, si el primer comando se ejecuta correctamente, se ejecuta el segundo comando. Si falla el primer comando, el segundo comando no se ejecuta en absoluto. Por ejemplo:

Listado #5: Combinar comandos con operadores de control

~ $ cd tmp/a/b/c && tar xvf ~/archive.tar

En este ejemplo, el contenido del archivo se extrae en el directorio ~ /tmp/a/b/c a menos que ese directorio no exista. Si el directorio no existe, el comando tar no se ejecuta, por lo que no se extrae nada.

Ejecutar un comando sólo si otro comando devuelve un estado de salida distinto de cero

Del mismo modo, el || El operador de control separa dos comandos y ejecuta el segundo comando sólo si el primer comando devuelve un estado de salida distinto de cero. En otras palabras, si el primer comando tiene éxito, el segundo comando no se ejecuta. Si falla el primer comando, ejecuta el segundo comando. Este operador se utiliza a menudo cuando se prueba para saber si un directorio dado existe y, si no, crea uno:

Listado #6 : Combinar comandos con operadores de control

~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c

También puede combinar los controladores descritos en esta sección. Cada uno funciona en el último comando ejecutado:

Listado #7: Combinando operadores de control

~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar

Citar variables con precaución

Tenga siempre cuidado con la expansión del shell y los nombres de variables. Generalmente es una buena idea incluir llamadas variables entre comillas dobles, a menos que tenga una buena razón para no hacerlo. Del mismo modo, si está siguiendo directamente un nombre de variable con texto alfanumérico, asegúrese de incluir también el nombre de la variable entre llaves ({}) para distinguirlo del texto que lo rodea. De lo contrario, el shell interpreta el texto final como parte de su nombre de variable, y muy probablemente, devuelve un valor nulo. El Listado 8 proporciona ejemplos de varias citas y no cotizaciones de variables y sus efectos.

Listado#8: Citando (y no citando) una variable

~ $ ls tmp/
a b
~ $ VAR="tmp/*"
~ $ echo $VAR
tmp/a tmp/b
~ $ echo "$VAR"
tmp/*
~ $ echo $VARa
~ $ echo "$VARa"
~ $ echo "${VAR}a"
tmp/*a
~ $ echo ${VAR}a
tmp/a
~ $

Utilizar secuencias de escape para administrar entradas largas

Probablemente haya visto ejemplos de código en los que una barra invertida () continúa con una línea larga hasta la línea siguiente y usted sabe que la mayoría de los shell tratan lo que escribe sobre líneas sucesivas unidas por una barra invertida como una línea larga. Sin embargo, es posible que no aproveche esta función en la línea de comandos tan a menudo como sea posible.

La barra invertida es especialmente útil si su terminal no maneja multilínea que envuelve correctamente o cuando su línea de comando es más pequeña . La barra invertida también es útil para dar sentido a las líneas de entrada largas mientras las escribe, como en el ejemplo siguiente:

Listado #9: Usar backslash para entradas largas de comandos

~ $ cd tmp/a/b/c || \
> mkdir -p tmp/a/b/c && \
> tar xvf -C tmp/a/b/c ~/archive.tar

Alternativamente, la siguiente configuración también funciona:

Listado #10: Alternativa al uso d backslash para entradas largas de comandos

~ $ cd tmp/a/b/c \
> || \
> mkdir -p tmp/a/b/c \
> && \
> tar xvf -C tmp/a/b/c ~/archive.tar

Sin embargo, si se divide una línea de entrada en varias líneas, el shell siempre la trata como una línea continua, ya que siempre borra todas las barras invertidas y espacios adicionales.

Nota: En la mayoría de los shells, al presionar la tecla de flecha hacia arriba, la entrada de línea múltiple completa se vuelve a dibujar en una sola línea de entrada larga.

El universo no tiene “arriba”

Una nueva investigación de la Universidad College de Londres sugiere que el universo es de hecho “isotrópico”, la mismo en todas las direcciones. Los cosmólogos Daniela Saadeh y Andrew Pontzen analizaron la radiación de fondo de microondas (CMB) dejada por el Big Bang para buscando un patrón que indicarían “una dirección especial en el espacio”. Nota de la revista Science:

No hay ningún eje de giro o cualquier otra dirección especial en el espacio. De hecho, se estima que sólo hay una posibilidad de uno en 121.000 de una dirección preferida. Esto es la merjor evidencia de un universo isótropo ….

En 1543, Nicolás Copérnico golpeó la Tierra y la humanidad del supuesto que la tierra fuese centro del universo, observando que la Tierra gira alrededor del Sol, y no al revés. Esa observación dio a luz al principio de Copérnico, que sostiene que no tenemos un lugar especial en el universo infinito, no hay centros. A principios del siglo 20, con el advenimiento de la teoría general de la relatividad de Einstein y la observación de que el universo se expande en todas las direcciones, esa idea se convirtió en el principio cosmológico, que supone que el universo es el mismo en todas partes y en todas las direcciones. En términos más elegantes, el universo es homogéneo e isotrópico …

Artículo: “It’s official: You’re lost in a directionless universe” by Adrian Cho (Science)

Imagen de la NASA: “. En ella se detallada, toda la imagen del cielo desde la infancia del universo. La imagen es creada a partir de nueve años de datos del WMAP (Wilkinson Microwave Anisotropy Probe) La imagen revela las fluctuaciones de temperatura 13,77 millones de años de (que se muestran como diferencias de color) que se corresponden con las semillas de las que luego se convertiesen en las galaxias. Esta imagen muestra un rango de temperatura de ± 200 microkelvin “.

iPhone 7, Apple Watch. Revisión tardía

Iphone 7

iPhone 7

 

Finalmente se presentó el iPhone 7, que cumple con todas las expectativas. Aquí un breve resumen de sus características:

  • Versión normal y versión Plus, de 4.7 pulgadas y 5.5 respectivamente
  • Resistente al agua y al polvo, con certificación IP67
  • Cámara con tecnología impresionante multilente. Además, el iPhone 7 Plus viene con doble cámara para hacer fotos de altísima calidad. Lee más sobre la cámara en nuestro artículo sobre la cámara del iPhone 7
  • Pantalla mejorada, con un 50% más de brillo para conseguir mejor visión a la luz del día. Mejora en los colores y modo nocturno. Puedes ver nuestro análisis en el artículo sobre la pantalla del iPhone 7
  • Botón Home especial, programable por desarrolladores y sensible al tacto. Ahora el botón Home tiene 3D Touch y puede interpretar la presión que se ejerza sobre él
  • Procesador A10 de altísimas prestaciones. Consta de 4 núcleos, dos de alta potencia y dos de bajo consumo, para maximizar la vida de la batería. Además con co-procesador M10 especialmente diseñado para Siri, inteligencia artificial y ayuda a los sensores. Puedes leer más información en procesador A10 de Apple características
  • Nuevos almacenamientos. La versión más baja es de 32 Gb, luego 128 Gb y el tope de gama es de 256 Gb

Por último el precio. El precio de salida del iPhone 7 va a ser de 649$ en EEUU para la versión más sencilla.

Apple Watch 2

Apple Watch 2

 

El nuevo reloj inteligente de Apple viene a sustituir y mejorar la versión anterior. Esta nuevo producto ha sido rediseñado, tanto a nivel visual como a nivel interno. Los ingenieros de Apple han hecho un tremendo esfuerzo para conseguir algo impresionante: el Apple Watch 2 es sumergible hasta 50 metros. Esta es probablemente la característica más importante de las presentadas en la Keynote.

También, con esta nueva versión, han conseguido aumentar el brillo de la pantalla, hasta un 100% más. Ideal para un dispositivo de estas características que tiene poco tamaño y que se usa mucho en exterior y haciendo deporte. El procesador es un 50% más rápido que el anterior y este nuevo modelo, viene equipado con GPS integrado.

El nuevo sistema operativo WatchOS permite la ejecución de varias aplicaciones y el lanzamiento rápido de las mismas. Además, se presentaron nuevas aplicaciones e incluso juegos para el Watch, incluyendo el famosísimo Pokemon Go, que ahora se podrá utilizar desde este dispositivo, con todas las características del original.

AirPods

Apple Airpods

ILos AirPods son los nuevos auriculares inalámbricos de Apple. Están especialmente diseñados para que sean compatibles con iPhone, Watch y Mac. Permiten realizar llamadas y comunicarse con Siri para solicitarle acciones, sin necesidad de utilizar nuestro iPhone.

Tienen una batería que les da una autonomía de 5 horas, y vienen con una carcasa protectora que hace también de base de carga. Me ha parecido un producto realmente interesante e innovador.

Cómo Mypy podría simplificar la compilación de Python

mypy - python

El proyecto de comprobación de tipo estático de Mypy para Python está explorando formas en que podría ayudar con la compilación sin esfuerzo de Python en C o lenguaje de máquina.

Es el sueño de todos los programadores profesionales de Python: tomar una aplicación Python existente, ejecutarla a través de un compilador y generar código de alta velocidad y plataforma nativa respetando la naturaleza dinámica de Python.

En teoría, eso es posible hacerlo ahora, o algo así. El problema es que cada trayectoria disponible está plagada de limitaciones. Tienes que modificar la fuente de manera no estándar (Cython), usar en tiempo de ejecución los reemplazos que es muchas veces mayor que el normal y tiene sus propias limitaciones (PyPy), o trabajar con herramientas que son todavía enormemente inestables y experimentales (Nuitka).

Ahora el equipo de desarrollo de Mypy, la sintaxis optativa de escribir de forma estática para Python  que se ha convertido en un problema para el estándar para el lenguaje, está analizando la posibilidad de usar Mypy para generar código que se puede compilar a un binario.

La discusión que surgió alrededor de la idea: Las herramientas para compilar Python necesitan hacer el código de Python más rápido sin complicar también las cosas para los desarrolladores.

Exactamente mi tipo

La idea de usar Mypy como un paso hacia una versión compilada estáticamente de Python ha estado dando vueltas desde que surgió la sintaxis -más aún desde que Mypy fue aceptado como un estándar de Python.

El creador de Python, Guido van Rossum, ha declarado anteriormente que la introducción de Mypy en Python no fue concebida como un preludio para hacer que Python esté escrito de forma estática. Uno de los mayores beneficios de Python siempre ha sido su dinamismo; cualquier cosa que haga a Python menos dinámico por defecto no es  un triunfo.

“La filosofía básica del lenguaje no va a cambiar”, dijo van Rossum. Mypy permite que los linters de código y los controladores garanticen mejor la calidad del código Python, al mismo tiempo que se preserva el dinamismo.

Dicho esto, van Rossum no se opone a la idea de las implementaciones de Python  para que se compile estáticamente. Para ello, la sintaxis de Mypy podría utilizarse como base para una representación intermedia o versión transpiled de Python que alimente a un compilador. Python como idioma seguiría siendo dinámico; esto da una nueva ruta para volverse estática. (Van Rossum también ha dado los pulgares para explorar estrategias para Mypy para ayudar con la compilación estática).

Lo que sale por el otro extremo

La discusión dentro del equipo de Mypy todavía está en las primeras etapas, pero algunos puntos claves han surgido en el debate. Si esto se hizo, los desarrolladores de Mypy argumentan, ¿qué tipo de código se produciría?

Un método implica lo que se ha descrito como PyIR: una representación intermedia para el código Python, o IR, que se inspira en el proyecto WebAssembly. Otra posibilidad, que potencialmente implica mucho menos reinventar desde cero, sería aprovechar el proyecto Cython.

Cython permite que el código existente de Python se compile a C, a menudo con dramáticas aceleraciones, anotando código Python con marcado para indicar el tipo de variable estática. Pero el marcado de Cython no se parece en nada a Mypy o C. Es un subdialecto idiosincrásico de Python. Sin embargo, no es mucha la diferencia para imaginar cómo el código Python anotado por Mypy podría convertirse en Cython (y por tanto en C).

Tan elegante como esa solución suena, también está lleno de inconvenientes. Por ejemplo, algunas anotaciones de tipo de alto nivel en Mypy no se correlacionan precisamente con algunos tipos de Cython cercanos a la máquina. Los desarrolladores tendrían que añadir más anotaciones de tipo o el compilador tendría que hacer conjeturas contextuales sobre la escritura.

La discusión de GitHub también expuso el problema de ser forzado a elegir entre los tipos que ayudan a la productividad del programador (el fuerte de Python) o el tipado que es útil al compilador (la especialidad de C). Cython se utiliza principalmente para optimizar módulos individuales y funciones donde la velocidad es crítica – “hot spots” – en lugar de programas enteros, por lo que los desarrolladores sólo necesitan proporcionar anotación de tipo a las partes de la aplicación que lo necesitan. Por el contrario, la discusión de Mypy toma la idea más holística de alimentar al compilador todo el árbol fuente de Python y recuperar un único producto unificado.

Entregando lo bueno

Si ese es el objetivo más grande con un compilador estático para Python, el problema real puede no ser con la compilación estática, sino con cómo la compilación estática puede ser parte de una cadena de herramientas de extremo a extremo para el lenguaje. Toolchains en lenguajes como C/C++ — así como derivados como Rust, Go y Nim — producen un binario sin la necesidad de un runtime externo. Python ha sido durante mucho tiempo un lenguaje interpretado, por lo que no tiene tradición nativa, aparte de las herramientas de empaquetado (no compilación) de terceros como PyInstaller.

Si Python obtuvo tales herramientas, es probable que no procedan del proceso de desarrollo básico del lenguaj, ya que el lenguaje es en primer lugar dinámico e interpretado. Pero hay claramente interés en tener más toolchains para Python que produzcan de forma fiable ejecutables nativos en las distintas plataformas o al menos un código de nivel inferior que se puede compilar en el mismo.

Como dijo el comentarista wtpayne en la discusión de GitHub, “Estoy interesado en construir una cinta transportadora suave y continua que tome ideas (algoritmos) desde el inicio hasta la producción”.

Iptables: ejemplo para proteger un servidor web. Como Firewall

Uno de los Ataques al que será objeto un servidor web son aquellos como los de direcciones IP Enmascaradas o inválidas que intentan engañar al servidor para que entienda que los paquetes que recibe llegan desde la red interna o de una red confiable. Otro de los eventos al que es expuesto es al escaneo de puertos de comunicación que tiene como objetivo ver que puertos de comunicación tiene abierto el equipo y así determinar los servicios que está corriendo y utilizar esa información como base a un posible ataque.

El script de abajo, lo he estado provando mis servidores web y las reglas han mostrado ser efectivas. El script consiste en reglas de iptables para detener los paquetes inválidos y que llegan desde direcciones enmascaradas, intenta además detener el escaneo de puertos bloqueando por un tiempo determinado la dirección ip desde donde se origina. Otra de las mejores prácticas que se siguen aquí es la de descartar las conexiones a todos los puertos de comunicación y solo crear reglas con los puertos que realmente vamos a necesitar.

En este script permito las conexiones a los puertos HTTP (80), SSH (22), HTTPS (443), SMTP (25) y descarto cualquier otro. Se puede modificar según las necesidades. Por Ejemplo, el script permite solo los puertos 80 ya que es un servidor web sin certificado Digital y el 22 para las tareas de administración.

El Script para Firewall

# firewall.sh
#Limpiar Reglas Existentes
iptables -F

# INPUT
# Aceptar loopback input
iptables -A INPUT -i lo -p all -j ACCEPT

#Permitir Handshake de tres vias<
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#Detener Ataques Enmascarados<
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -m limit --limit 1/second -j ACCEPT

#Descartar Paquetes Inválidos
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

#Descartar paquetes RST Excesivos para Evitar Ataques Enmascarados
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#Cualquier IP que intente un Escaneo de Puertos sera Bloqueada por 24 Horas.
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

#Pasadas las 24 Horas, remover la IP Bloqueada por Escaneo de Puertos
iptables -A INPUT -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

#Esta Regla agrega el Escaner de Puertos a la Lista de PortScan y Registra el Evento.
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

#Permitir estos puertos desde Fuera
# smtp
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
# http
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# https
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# ssh & sftp
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

#Descartar cualquier otra Entrada
iptables -A INPUT -j REJECT

#Permitir el Ping
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

#OUTPUT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#Permitir estos puertos desde Fuera
# smtp
iptables -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
# http
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
# https
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
# ssh & sftp
iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT

#Permitir Pings
iptables -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

#Descartar cualquier otra Salida
iptables -A OUTPUT -j REJECT

#No Permitir Forward
iptables -A FORWARD -j REJECT

Como obtener información sobre el sistema de hardware en linux

Muchos de nosotros conocemos comandos como lsusb, lspci, lscpu o simplemente lshw, comandos que nos sirven para obtener vasta información de nuestro sistema. Hoy les traigo otro comando que a mi parecer nos brinda mucha más información: dmidecode.

Los comandos

Los siguientes comandos tienen que ser ejecutados como root o con sudo!:

Por ejemplo, vamos a obtener información básica de nuestro sistema:
sudo dmidecode -t System

Esta es la información básica del Sistema, también se puede mostrar la información del Bios:
sudo dmidecode -t BIOS
Así como algo que encontrarán más interesante:
sudo dmidecode -t Processor
Las opciones son varias, pueden usar el nombre de lo que desean conocer (System, BIOS, etc) o el número que lo identifique.

Si desean tener aún más opciones para dmidecode lean el manual de la aplicación, lo pueden ver escribiendo en una terminal: man dmidecode

Medidas de seguridad para un servidor web con iptables

Iptables es un firewall que viene incluido en la mayoría de distribuciones basadas en GNU/Linux recientes, como cualquier otro firewall, su principal objetivo es filtrar paquetes entrantes y salientes de la maquina, este objetivo es cumplido con las reglas de configuración definidas en el firewall que delimitan puertos, protocolos, estados de conexiones, direcciones IP, entre otras cosas.

Para ver un manejo más sencillo de bloqueo con iptables leer : Como Bloquear con Iptables
Como podrá imaginar el lector, la “piedra angular” de esta potente herramienta es precisamente la correcta definición de las reglas establecidas, dado que una mala configuración de iptables, puede convertir un sistema operativo GNU/Linux es un objetivo fácil y casi tan inseguro como cualquier plataforma Windows (bueno, vale, he exagerado un poco…) no obstante, la correcta definición de las reglas definidas en el firewall permiten tener un sistema robusto contra intentos de penetración desde un sistema remoto, así que se trata de una practica vital en la seguridad en las comunicaciones entrantes y salientes que no debe de ser tomada nunca a la ligera y por el contrario, debería de ser una de las tareas mas importantes que desempeña un administrador y/o equipo en seguridad en redes y telecomunicaciones.

El uso de un conjunto de reglas bien definido, evita que cualquier escaner de puertos pueda enumerar todos los servicios que se ejecutan en el servidor, aunque es cierto que un escaner como Nmap puede generar “predicciones” sobre el sistema objetivo para brindar mas informacion a un atacante, utilizar reglas iptables correctamente establecidas, reduce considerablemente la precisión de un escaneo y de un posible ataque restringiendo el acceso a servicios sensibles tales como SSH, de este modo puede indicarse que solamente las direcciones IP definidas puedan acceder a dicho servicio, no obstante, esto no es a prueba de tontos, ya que un atacante puede realizar un ataque de “spoofing” utilizando como objetivo las direcciones IP que tienen acceso a dichos servicios, pero sin lugar a dudas, plantea dificultades a la hora de llevar a cabo un ataque

A continuacion se lista un ejemplo del uso de Iptables para permitir la conectividad de un servidor de paquetes entrantes solamente a los puertos 80/TCP y 443/TCP (Servidor Web) y por otro lado restringiendo el acceso de todos los paquetes entrantes al puerto 22/TCP (Donde se encuentra el servicio SSH) excepto para una dirección IP determinada (que puede ser una maquina de administración remota)

  1. En primera instancia, Limpiar todas las reglas actualmente establecidas en el servidor:
    iptables -F
    iptables -X
  2. Establecer la política de filtros, para Denegar por defecto todo
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP
  3. Aceptar todas las peticiones entrantes por HTTP al servidor web por el puerto 80 desde cualquier sitio
    iptables -A INPUT -p tcp -s 0/0 –sport 1024:65535 -d 192.168.1.33 –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
  4. Aceptar todas las respuestas salientes por HTTP desde el servidor web por el puerto 80 a cualquier sitio
    iptables -A OUTPUT -p tcp -s 192.168.1.33 –sport 80 -d 0/0 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT
  5. Aceptar todas las peticiones entrantes por HTTPS al servidor web por el puerto 443 desde cualquier sitio
    iptables -A INPUT -p TCP -s 0/0 –sport 1024:65535 -d 192.168.1.33 –dport 443 -m state –state NEW,ESTABLISHED -j ACCEPT
  6. Aceptar todas las respuestas salientes por HTTPS desde el servidor web por el puerto 443 a cualquier sitio
    iptables -A OUTPUT -p tcp -s 192.168.1.33 –sport 443 -d 0/0 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT
  7. Aceptar conexiones entrantes SSH SOLAMENTE desde la dirección IP de administración (192.168.1.34) al servidor web en el puerto 22 TCP
    iptables -A INPUT -p tcp -s 192.168.1.34 –sport 1024:65535 -d 192.168.1.33 –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
  8. Aceptar todo el trafico SSH saliente SOLAMENTE desde el servidor web en el puerto 22/TCP la dirección IP de administración
    iptables -A OUTPUT -p tcp -s 192.168.1.33 –sport 22 -d 192.168.1.34 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT
  9. Finalmente, de forma explicita definir que todo el trafico entrante y/o saliente que no coincida con los criterios anteriormente declarados, deben ser borrados
    iptables -A INPUT -j DROP
    iptables -A OUTPUT -j DROP

Esta configuración se enfoca, principalmente en la capa de enlace y de transporte sobre el protocolo TCP/IP, permitiendo solamente aquellos paquetes interesantes y descartando cualquier otro tipo de paquete, de esta forma las peticiones y respuestas viajan de forma “segura” desde y hacia el servidor web. Este seriá un buen punto de partida que lleve hacia una configuración optima (es decir, un poco menos insegura o incitativa, sin embargo… en el mundo en el que vivimos todo es cada vez, menos seguro.)

Conocer el estado de los disco duros en linux

Todos los servidores que corren Linux facilitan enormemente la tarea de detectar fallos en discos duros, proceder a su parada y sustituirlos por otros nuevos, integrándolos transparentemente en el RAID que solemos implementar en nuestros servidores.

¿Cómo se detecta que un disco es defectuoso? La primera pista nos la va a dar un cambio drástico en el servidor: bajada de rendimiento, problemas de acceso a ficheros, servicios caídos, etc. Es en ese momento cuando debemos pasar a comprobar la salud de los discos duros del sistema y descubrir cuál (o cuales) es el que tiene problemas.
La forma más directa y sencilla de comprobar si un disco duro está teniendo problemas es consultar el registro de los mensajes del núcleo con el comando dmesg. Ahí buscaremos referencias a errores de acceso a disco, problemas en las operaciones de lectura/escritura, menciones a relocalización de sectores, etc.

dmesg | less
...
 ata2.00: failed command: READ FPDMA QUEUED
 ata2.00: cmd 60/08:00:d8:5b:89/00:00:89:00:00/40 tag 0 ncq 4096 in
 res 41/40:08:d8:5b:89/00:00:89:00:00/00 Emask 0x409 (media error)
 ata2.00: status: { DRDY ERR }
 ata2.00: error: { UNC }
 sd 1:0:0:0: [sdb] Unhandled sense code
 sd 1:0:0:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
 sd 1:0:0:0: [sdb] Sense Key : Medium Error [current] [descriptor]
 sd 1:0:0:0: [sdb] Add. Sense: Unrecovered read error - auto reallocate failed
 sd 1:0:0:0: [sdb] CDB: Read(10): 28 00 89 89 5b d8 00 00 08 00
 end_request: I/O error, dev sdb, sector 2307480536
 ...

En el ejemplo vemos que el disco problemático es sdb. Igualmente sencillo es comprobar si se ha caído algún disco del RAID del servidor:

cat /proc/mdstat
Personalities : [raid1]
 md3 : active raid1 sda4[2] sdb4
 1839220031 blocks super 1.2 [2/1] [U_]

De nuevo comprobamos que sdb es el culpable. Sin embargo, al tratarse de servidores, la forma más adecuada de detectar fallos en los discos es mediante la prevención a través de un sistema de monitorización al que incorporemos los controles necesarios, normalmente basados en la tecnología S.M.A.R.T. que se encuentra presente en los discos duros desde hace ya muchos años.

El soporte S.M.A.R.T. en Linux se consigue a través del paquete smartmontools, que permite controlar y monitorizar sistemas de almacenamiento utilizando dicha tecnología. De hecho, se incluye un demonio que nos avisa inmediatamente si se producen errores en alguno de los discos monitorizados.

Una vez identificado el disco defectuoso procedemos a comprobar su salud mediante smartctl, una herramienta de línea de comandos incluida en smartmontools. Con esta utilidad podremos no sólo obtener detallada información sobre el disco, sino además llevar a cabo completos tests que nos mostrarán si es defectuoso y cuál es el defecto concreto. Veamos unos ejemplos.

Para obtener información sobre un disco tenemos a nuestra disposición varios parámetros. Si queremos información sobre el hardware:

smartctl -i /dev/sdb

=== START OF INFORMATION SECTION ===
Device Model: ST…
Serial Number: W…
Firmware Version: C…
User Capacity: 3,000,592,982,016 bytes
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: 8
ATA Standard is: ATA-8-ACS revision 4
Local Time is: Fri Nov 22 12:33:54 2013 CET
SMART support is: Available – device has SMART capability.
SMART support is: Enabled

Podemos ampliar estos datos con la información SMART del disco duro con el parámetro -a. Si en cambio usamos -x, la salida del comando incluirá la información que no proviene de SMART.

smartctl -a /dev/sdb

=== START OF INFORMATION SECTION ===
 ...
=== START OF READ SMART DATA SECTION ===
 SMART overall-health self-assessment test result: PASSED

General SMART Values:
 Offline data collection status: (0x00) Offline data collection activity
 was never started.
 Auto Offline Data Collection: Disabled.
 Self-test execution status: ( 121) The previous self-test completed having
 the read element of the test failed.
 ...
 SMART Attributes Data Structure revision number: 10
 Vendor Specific SMART Attributes with Thresholds:
 ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
 1 Raw_Read_Error_Rate 0x000f 107 098 006 Pre-fail Always - 186855524
 3 Spin_Up_Time 0x0003 093 093 000 Pre-fail Always - 0
 4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 8
 5 Reallocated_Sector_Ct 0x0033 092 092 036 Pre-fail Always - 10640
 7 Seek_Error_Rate 0x000f 083 060 030 Pre-fail Always - 219208774
 ...

Si alguno de los anteriores comandos falla, podemos añadir el parámetro -T permissive (e incluso -T verypermissive) para intentar que smartctl ignore los errores que pueda y obtenga toda la información posible del disco.

Pasemos a lo realmente interesante: la realización de tests en los discos duros. La primera y más sencilla opción que tenemos a nuestra disposición es el parámetro -H, que nos informa de la salud SMART del disco.

smartctl -H /dev/sdb
=== START OF READ SMART DATA SECTION ===
 SMART overall-health self-assessment test result: PASSED

Esta opción sólo indica que la salud es mala cuando el disco ya ha fallado o va a fallar en las próximas 24 horas. Podemos ver en el ejemplo que, a pesar de que sdb es defectuoso, se nos informa de que la salud SMART del disco es buena.

Para detectar el problema del disco en detalle contamos con el parámetro -t, que a su vez admite un argumento que indica el tipo de test a realizar: offline, short, long yconveyance. Todas estas pruebas se pueden realizar con el sistema en producción, a menos que usemos el parámetro -C, que las ejecuta en modo cautivo (no tiene efecto en tests de tipo offline). Este modo sirve para realizar las pruebas más rápidamente y tiene especial utilidad cuando la máxima prioridad es comprobar la salud del disco. La explicación en detalle de cada uno de estos tests se encuentra en el manual electrónico de smartctl.

Excepto en el mencionado modo cautivo, los tests se realizan en segundo plano, por lo que no obtenemos ninguna información por pantalla a menos que la pidamos explícitamente con el parámetro -l selftest. Dado que esto sólo nos muestra un instante del progreso del test, es interesante combinarlo con el comando watch, que por defecto realiza la tarea que le asignemos cada dos segundos. Veamos un ejemplo:

smartctl -t short /dev/sdb
=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
 Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
 Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
 Testing has begun.
 Please wait 1 minutes for test to complete.
 Test will complete after ...

Use smartctl -X to abort test.

watch smartctl -l selftest /dev/sdb
Every 2,0s: smartctl -l selftest /dev/sdb

=== START OF READ SMART DATA SECTION ===
 SMART Self-test log structure revision number 1
 Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error

1 Short offline Completed: read failure 90% 15073 2307480536

¡Eureka, hemos encontrado el defecto del disco sospechoso! Se trata de un error de lectura en al menos un sector del disco, siendo el primero detectado el especificado en la salida de smartctl. Ahora sólo queda cambiarlo por uno nuevo y llevar el defectuoso al fabricante a que nos lo cambie (si está en garantía, claro). Por cierto, en el ejemplo vemos cómo se nos informa de que podemos abortar cualquier test con smartctl -X.

Como curiosidad, si necesitamos conocer el modelo y número de serie del disco para el trámite con el fabricante, podemos obtenerlos con este sencillo comando (además de con smartctl -i):

hdparm -i /dev/sdb | grep SerialNo
Model=ST..., FwRev=C..., SerialNo=W...