martes, 15 de noviembre de 2016

Cómo chequear si un puerto está siendo usado en Linux

Son muchas las ocasiones en las que como administradores de servidores y/o de bases de datos o simplemente como un usuario del común cuando necesitamos validar si un puerto está siendo usado o si el servicio se encuentra activo por el puerto "estándar".

Dentro de las buenas prácticas a nivel de seguridad una de las recomendaciones más simples es la de "no uses puertos por defecto, cámbialos!!".

En este link pueden encontrar una lista con los puertos por default de varios servicios; uno de los que se suelen validar con frecuencia es el del servicio ssh cuyo puerto por default es el 22.  Cómo validar si el puerto se encuentra activo.

Existen varias formas, esta es una de las más sencillas.  Desde tu máquina cliente lanzas un telnet a la ip de la máquina destina por el puerto 22 así:




Y si el servicio se encuentra activo obtendrás una respuesta similar a esta:






Suponiendo que el servicio no se encuentre activo y/o configurado lo que obtendrás es una respuesta como esta:



Suponiendo que estamos logeados en la máquina linux y lo que queremos validar es (por ejemplo) si se encuentra activo o disponible el servicio SMTP que escucha por el puerto 25, podemos proceder de la siguiente manera:

Con un telnet al localhost por el puerto 25:



La anterior imagen muestra que el servicio se encuentra activo.  De qué otra manera nos podemos dar cuenta que el servicio se encuentra disponible y en uso:

Usando el comando ps y el grep, sólo que con esta instrucción no identificamos el puerto sino el servicio:





Pero para localizar el servicio podemos usar el comando netsat con el parámetro -tnl:



Y existe otra herramienta que te facilitará el descubrimiento/escaneo de puertos y servicios activos de una forma sencilla y que es una gran herramienta para todos los que incursionan en el mundo de la seguridad informática; les hablo del Nmap:

Puedes ejecutar la siguiente instrucción nmap -v -A localhost y después de que termine el escaneo tendrás un resumen similar a este:




Todos los comando usados para explorar y/o consultar si un servicio/puerto se encuentra activo poseen muchas opciones de ejecución; cada una te traerá información diferente con respecto a la ip/puerto/servicio consultado. Te recomiendo saques un tiempito para que explores un poco más sobre cada comando.




lunes, 10 de octubre de 2016

KDevelop para Windows

KDevelop es un IDE de desarrollo integrado para C++ y otros lenguajes.  Funcionaba solo para ambientes Linux y escribo funcionaba ya que ha sido liberada la versión 5.0.1 una (por ahora) beta disponible para la plataforma windows.

KDevelop 5 under Linux with the Breeze style
Sin duda una gran noticia para todos los que somos adictos al entorno Linux y mucho más para los desarrolladores amantes de este IDE.

Este instalador como se muestra en su web oficial contiene/embebe lenguajes como Python, plugins de PHP, librerias de QML/JS y C++

miércoles, 18 de mayo de 2016

Código fuente inventario y facturación

Amigos, gracias por visitar mi web e interesarse por mis proyectos de Python.

En este link podrán encontrar los archivos de facturación e inventario solicitados:

http://sh.st/PIWZy

Espero los disfruten y les sirva.

jueves, 6 de agosto de 2015

Backup con Netcat desde una máquina fantasma

En la actualidad existe diferentes herramientas de informática para llevar a cabo el proceso de copias de seguridad, sin embargo existen algunas con opciones poco conocidas por los usuarios y que son gran utilidad, este es el caso del Netcat con el que podemos por ejemplo hacer
copia de archivos de una máquina Linux a otra (o simplemente hacer respaldo/copia de seguridad de un escritorio a un servidor).

Suponiendo quiere una copia de seguridad de un servidor o de escritorio a otro equipo o incluso crear una imagen de un archivo, procederíamos así:

En el equipo destino:

** Arracamos nuestra distribución de linux en modo de rescate con acceso a redes

Hacemos que el netcat escuche por el puerto 30 - # nc -l -p | dd of = /dev/sda (asumiendo que el disco duro está identificado como sda y no como hda):

# nc -l -p 30 | dd of = /dev/sda

En el pc de origen:

Volcamos el contenido del disco para el PC de destino - # dd if = /dev/sda | nc

# dd if = /dev/sda | nc 192.168.0.20 30

Comprobamos que el tráfico es fluido, en el origen par ir a otra terminal (ALT/F2) y volcar los datos TCP en la NIC (asumiendo es eth0):

# tcpdump -TNLI eth0 puerto 30

Si lo que desea es una imagen como copia de seguridad podría variar la línea así:

# nc -l -p 30 | dd of = mybackup.img

Recuerde que para hacer imagenes de disco se debe contar con al menos el mismo espacio en el disco destino.

Espero que esta información haya sido de utilidad y les sirva para mantener actualizado sus datos.


lunes, 22 de junio de 2015

Enviar archivos por sftp con Python

Esta es una breve modificación a uno de los scripts creados con anterioridad y que consiste en enviar un archivo por  sftp.   La necesidad en concreto consistía en comparar ambos servidores local y remoto y validar qué archivo faltaba en el remoto que estuviera en el local para proceder a enviarlo y mantener el remoto actualizado.

Este script se guarda con el nombre que quieras, le das permiso de ejecución y lo agregas en un crontab.

  
    
import pysftp
import os

# Cambiar por la ruta donde se generan los archivos (Amsterdam)
servidor_local = os.listdir(r'C:\proyecto\archivos') 

#print servidor_local

# Cambiar por una ruta en Amsterdam, puede ser /tmp/res
os.remove(r"c:\proyecto\res\archivos.txt") 

for archivos in servidor_local:
    # Cambiar por '/tmp/res/archivos.txt','a'
    local = open(r"c:\proyecto\res\archivos.txt",'a') 
    print 'Archivo local: '+archivos
    local.write(str(archivos)+'\n')
    local.close()

# Cambiar por /tmp/res/remoto.txt
os.remove(r"c:\proyecto\res\remoto.txt") 
with pysftp.Connection('servidor_remoto.com', username='usuario', password='clave') as sftp:
    # Cambiar por la ruta donde quedan los archivos en el servidor remoto
    with sftp.cd('/tmp'): 
        f = sftp.listdir()
        for files in f:
            # '/tmp/res/remoto','a'
            remoto = open(r"c:\proyecto\res\remoto.txt",'a') 
            print 'Archivos remotos: '+str(f)
            remoto.write(str(files)+'\n')
            remoto.close()

# Comparo archivo local con remoto
# /tmp/res/pendiente.txt=0:
os.remove(r"c:\proyecto\res\pendiente.txt") 
        print i,' Existe \n'
    else:
        pendiente = open(r"c:\proyecto\res\pendiente.txt",'a')
        print 'Archivo pendient: '+i
        pendiente.write(str(i)+'\n')
        directorio = os.chdir(r"C:\proyecto\archivos")
        print 'Directorio actual: '+os.getcwd()
        subir=i.split("\n",1)
        # Envio el archivo faltante
        ith pysftp.Connection('servidor_remoto.com', username='usuario', password='clave') as sftp:
            sftp.cd('/tmp')
            sftp.put(str(subir[0]))
        pendiente.close()
   
 

jueves, 4 de junio de 2015

Comparar y enviar por ftp con Python

Aunque por razones laborales me encuentro casi de lleno en la administración de bases de datos, en algunas ocasiones mis compañeros de infraestructura se encuentran con algunas situaciones las cuales pueden ser resueltas de forma "fácil y divertida" usando Python y aquí es donde entro a sugerir y ayudar con algunas cosas de mi antigua área de infraestructura.

Para este caso la situación es esta:
Cada día se generan en un directorio archivos con consolidados de transacciones que deben ser enviados a un servidor externo por ftp. En el directorio permanencen almacenados los archivos generados durante un mes y cada mes se va borrando el más antiguo.

Se necesitaba automatizar ese proceso pero con la condición de que sólo se debía enviar el archivo generado el último día; para ello creamos entonces el siguiente script en Python que se conecta al servidor remoto para listar los archivos que tiene ya cargados; genera el listado del servidor local con los archivos generados desde hace un mes hasta la fecha.

El script revisa/compara el listado y si en el servidor local existe un archivo que no se encuentra en el remoto entonces procede a enviarlo.

Existen diferentes formas de hacer esto, pero para efectos de repasar lectura y escritura de archivos lo hicimos así:

#!/usr/bin/python
# Importa librerias necesarias para trabajarimport pysftp    # Permite conectar remotamenteimport os        # Permite ejecutar comandos de sistema operativo
# Lista archivos localesarchivo_remoto = os.listdir('/consolidados/salida/')

# Almacenamos la lista en un arreglofor archivo in archivo_remoto:
    # Guardamos el resultado en un archivo de texto    local=open('archivo_remoto.txt','w')
    local.write(str(archivo))

with pysftp.Connection('dominioalqueconecta.com', username='usuario', password='clave') as sftp:
    with sftp.cd('/out'):
        archivo_sftp = sftp.listdir()
        remoto=open('archivo_local.txt','w')
        remoto.write(str(archivo_sftp))

# Comparo los archivosf_local=open('archivo_remoto.txt','r')

comparar = f_local.readlines()
for i in comparar:
    f_remoto = open('archivo_local.txt','r')
    full = f_remoto.read()
    if full.find(str(i))>=0:
        print i,' Existe \n'    else:
        print i
        # Envio el archivo faltante        with pysftp.Connection(''dominioalqueconecta.com', username='usuario', password='clave') as sftp:
                with sftp.cd('/out'):
                        sftp.put('/archivos/salida/'+str(i))
    f_remoto.close()
f_local.close()

sftp.close() 
 
Como para mejorarle faltaría el envio de correo indicando el resultado del escript; si envio archivo, que archivo envio, si fallo, cual fue la falla, etc.
 
Espero este código les pueda servir de guía .