Mostrando entradas con la etiqueta seguridad. Mostrar todas las entradas
Mostrando entradas con la etiqueta seguridad. Mostrar todas las entradas

jueves, 10 de enero de 2019

No guardar comandos ejecutados en historial de bash

Hoy vamos a ver un sencillo truco para evitar que los comandos ejecutados en nuestra sesión de bash pasen al fichero .bash_history. Será de utilidad cuando se quieren eliminar parte de las huellas de un acceso a un equipo o para evitar que otros sepan qué comandos ejecutó alguien en una conexión anterior.

lunes, 29 de septiembre de 2014

Integrar Latch en Python

Espero que conozcáis Latch, y si no estáis tardando. Es un excelente método para proteger nuestras cuentas de accesos no autorizados. Se puede implementar en una web, en una aplicación de escritorio, en el propio proceso de logado de usuarios de algunos sistemas operativos, y en general es aplicable a cualquier sistema que ideemos y que sea susceptible de proteger ante eventuales ataques.
Una buena fuente para aprender sobre Latch y seguridad en general es el blog Un informático en el lado del mal.
Como para otros muchos lenguajes y plataformas, Latch tiene una librería para poderse usar desde Python. Con tan solo descargar el fichero latch.py e importarlo en nuestra aplicación Python, podemos usarlo.
Lo primero de todo es darse de alta en la web de Latch como desarrollador. Se hace de forma gratuita. Obtendremos una Latch APP ID y un Latch Secret.

Parear una cuenta de usuario con nuestra aplicación

El proceso de parear un usuario con una aplicación se inicia generando un código aleatorio por parte del usuario, mediante la aplicación para móvil de Latch. En nuestro ejemplo será 92Us26.
El siguiente script Python corresponde al proceso de emparejar un usuario con nuestra aplicación:
# -*- coding: latin-1 -*-

import sys, latch

LATCH_APP_ID = '55HAbMdwQRRS6421AAxZ'
LATCH_SECRET = 'EDadxfiyuyjgfdferRG43658HGEWTRtZ3254VMhE'

usuario = sys.argv[1]
codigo  = sys.argv[2]

latcheo = latch.Latch(LATCH_APP_ID, LATCH_SECRET)
response = latcheo.pair(codigo)
cuenta_latch = str(response.get_data()['accountId'])

print cuenta_latch
La ejecución del script anterior sería de este modo:
$ python parear.py user01 92Us26
ebbcf87d97174f0e397e3a42b2a86ca0e34627e5345f817446eefba348550a82
Como se aprecia, tras el pareo nuestra aplicación se queda con el ID del pestillo que se acaba de crear. En este caso, a modo de ejemplo, se imprime por pantalla. Lo ideal es que nuestra aplicación almacene en una base de datos que el usuario user01 tiene como ID del pestillo de inicio de sesión ebbcf87d97174f0e397e3a42b2a86ca0e34627e5345f817446eefba348550a82.

Comprobar el estado del pestillo de un usuario

Una vez que se ha creado el pestillo, el siguiente paso es conocer la forma de consultar su estado (abierto o cerrado). De esta forma, cuando el usuario (o un atacante) introduzca ese login y su contraseña correcta, la aplicación consultará el estado del pestillo. Si está abierto, la aplicación logará al usuario con normalidad. Si está cerrado, la aplicación devolverá el mensaje de usuario o contraseña incorrectos.
A continuación se muestra un pequeño script para consultar el estado del pestillo (en la práctica lo suyo es obtenerlos de la base de datos):
# -*- coding: latin-1 -*-

import sys, latch

LATCH_APP_ID = '55HAbMdwQRRS6421AAxZ'
LATCH_SECRET = 'EDadxfiyuyjgfdferRG43658HGEWTRtZ3254VMhE'

latchuserid  = sys.argv[1]

latcheo = latch.Latch(LATCH_APP_ID, LATCH_SECRET)
response = latcheo.status(latchuserid)
if response.get_data()['operations'][LATCH_APP_ID]['status'] == 'on':
    print 'Acceso permitido'
else:
    print 'Acceso denegado'
La ejecución del script sería:
$ python comprobar.py
ebbcf87d97174f0e397e3a42b2a86ca0e34627e5345f817446eefba348550a82
Acceso denegado
¿Cómo has usado Latch en tu aplicación? ¿Qué usos le has dado? ¡Deja tu comentario!

viernes, 21 de enero de 2011

Crear listado de ficheros con su código md5


A continuación os muestro cómo calcular el código md5 de cada uno de los ficheros contenidos en un directorio (en este caso el directorio actual, .) y generar un fichero, llamado md5, con los nombres de los ficheros junto con su ćodigo md5:

Listado md5 con todos los ficheros excepto los ocultos

$ find . * ! -path "./*" ! -path "md5" ! -type d -exec md5sum '{}'>>md5 \;

Listado md5 con todos los ficheros incluídos los ocultos

$ find . * ! -path "./[^.]*"  ! -path "md5" ! -type d -exec md5sum '{}'>>md5 \;

Estos listados son muy útiles para distintos casos:

  • Junto con algunos ficheros colgados en Internet se nos ofrece su código md5. Al bajarlo podemos generar el código md5 de nuestra copia para saber si es idéntica o sufrió algún error en la descarga.
  • Podemos generar ficheros md5 de ciertos ficheros importantes de nuestras máquinas (fichero /etc/passwd, /etc/rc.local, etc) y comprobar de vez en cuando si dichos ficheros han sufrido algún cambio. Es una buena manera de detectar modificaciones no autorizadas en nuestros sistemas.
  • Se puede implementar un proceso de actualización para nuestras aplicaciones, tal que ante una nueva versión los clientes solo descarguen del servidor aquellos ficheros que cambiaron. Si un cliente genera el código md5 de sus ficheros y los comprueba contra los ficheros del servidor, sabrá qué ficheros descargarse. Esto disminuye el tiempo de actualización y el uso del ancho de banda de nuestras lineas de comunicaciones.

lunes, 27 de diciembre de 2010

Crear contraseñas aleatorias

Cuando se crean usuarios de forma masiva es interesante disponer de un mecanismo para generar contraseñas de manera aleatoria. Aunque existen aplicaciones que las generan vamos a usar herramientas existentes en cualquier distribución Linux para evitar instalar paquetes adicionales.

Para generarlas con 8 dígitos alfanuméricos ejecutad:

$ tr -dc A-Za-z0-9_ < /dev/urandom | head -c 8


Cambiando el número pasado al comando head se podrá variar la longitud de la contraseña.

jueves, 29 de octubre de 2009

Ocultación de contraseñas en fstab al montar comparticiones samba

Si accedemos frecuentemente a comparticiones samba desde nuestra máquina Linux, es interesante que estas comparticiones se monten automáticamente al inicio del sistema. Para ello, en el fichero /etc/fstab tendremos algo parecido a esto:

//192.168.1.1/compartido  /mnt/compartido   smbfs  defaults,username=perico,password=delospalotes,uid=juan,gid=juan,iocharset=utf8    0 0

Pero claro, cualquier usuario de nuestra máquina puede hacer un cat /etc/fstab y enterarse del usuario y contraseña que usamos para hacer esta conexión.

Existe una forma de ocultar el usuario y contraseña usados:

//192.168.1.1/compartido  /mnt/compartido   smbfs  defaults,credentials=/root/.smbcredentials/servidor,uid=juan,gid=juan,iocharset=utf8    0 0

Ahora, la entrada del fstab indica que la identificación sobre el servidor se hará usando los datos del fichero /root/.smbcredentials/servidor, fichero que por supuesto solo lo puede leer root.

El contenido del fichero /root/.smbcredentials/servidor tendrá el siguiente contenido:

username=perico
password=delospalotes

miércoles, 28 de octubre de 2009

Deshabilitar ssh para root

Una manera de securizar un poco más un equipo de cara a posibles atacantes es no permitir que un usuario se pueda logar como root mediante ssh en la máquina en cuestión. Esta medida de seguridad nos permitirá el que, si un atacante se consigue logar en nuestra máquina por un ataque de fuerza bruta (o cualquier otro método), al menos le sea imposible hacerlo (en una primera fase) como usuario root. Siempre podrá intentar logarse con su, pero este será un segundo reto que le llevará tiempo.

Para deshabilitar el acceso de logado como root en ssh, establecer el parámetro a No en el fichero /etc/ssh/sshd_config:

PermitRootLogin no

Y a continuación, reiniciar el demonio sshd:

# /etc/init.d/ssh restart

lunes, 26 de octubre de 2009

Fork bomb en Ubuntu

La mayoría de distribuciones Linux y Unix vienen con un límite de procesos por usuario bastante relajado o incluso inexistente. Haciendo uso de esta configuración por defecto, se puede realizar una denegación de servicio a un equipo/servidor.

El fork bomb consiste en ejecutar el siguiente comando (con cualquier usuario):

$ :(){ :|:& };:

Esto hará que nuestro bash comience a generar procesos hasta ocupar toda la CPU y bloquear, literalmente, nuestra máquina. Así pues, no hagáis pruebas sobre equipos en producción!! Es curioso ver cómo un usuario sin privilegios de root puede tumbar un equipo.

Si ejecutamos el comando

$ ulimit -u

Observaremos el número de procesos máximos que el usuario actual puede generar. Si queremos limitar este número basta con ejecutar el comando:

$ ulimit -u 1000

Para limitar a 1000 el número de procesos. Este valor se puede definir en el fichero /etc/security/limits.conf. Añadir la siguiente entrada para limitar el número máximo de procesos para cualquier usuario a 1000:

* hard nproc 1000

viernes, 9 de octubre de 2009

Cifrar contraseñas con Python

Python es un estupendo lenguaje con el que construir desde pequeños scripts a grandes aplicaciones en un abrir y cerrar de ojos. Yo hago mis pinitos con él.

Si alguna vez habéis realizado un programa en el que los usuarios han de logarse, es fundamental que el servidor guarde las contraseñas con un cifrado seguro. Y es interesante que si dos usuarios escogen la misma contraseña, el administrador de sistemas que gestione dicha información encriptada no sepa de este hecho, es decir, que no vea la misma cadena cifrada para dos usuarios.

La estrategia que seguiremos será la siguiente: la cadena de texto a cifrar no será sólo el password del usuario, sino la concatenación de su login y su password. Así, dos usuarios con la misma password no tendrán la misma cadena cifrada (pues el login se supone que es único). Usaremos el cifrado SHA-1 por ser un método (hasta ahora) seguro.

Este script en Python nos dará la clave cifrada que tendremos que guardar:

# -*- coding: latin-1 -*-

import hashlib, sys

if len(sys.argv) < 3:
    print "Uso: python encriptador.py USUARIO PASSWORD"
else:
    print "Password generado: " + hashlib.sha1( sys.argv[1] + sys.argv[2] ).hexdigest()

Para los no iniciados en Python, para ejecutarlo basta con:

$ python encriptador.py pepico delospalotes

Si deseáis usar el cifrado SHA-256, bastará con sustituir en el script anterior "sha1" por "sha256". La cadena resultado veréis que es más larga.