15.2.08

SSH: seguridad básica

OpenSSH es el estándar en lo que a conexión remota se refiere, de ahí que muchos de los ataques se dirijan específicamente a este servicio. En entradas anteriores hemos visto como proteger una máquina contra un ataque basado en diccionario, utilizando el paquete Denyhosts:

http://joservilas.blogspot.com/2006/07/denyhosts-no-ms-flood-mi-sshd.html

Ahora veremos como efectuar una configuración muy simple pero a la vez segura para optimizar el acceso al servicio, toqueteando el fichero de configuración /etc/ssh/sshd_config:

Lo primero será deshabilitar el acceso del superusuario (root) de forma remota

PermitRootLogin no

o, si lo queremos, dejar que acceda pero nunca mediante password, obligándolo a utilizar un juego de claves ssh que se deberán almacenar en /root/.ssh/authorised_keys o en el propio fichero de configuración

PermitRootLogin without-password


Siguiendo con la misma política, será interesante indicar (si el número no es grande) los usuarios que pueden acceder al sistema, en lugar de permitirlos todos añadiendo la(s) línea(s)

AllowUsers nombre_de_usuario
AllowUsers jose
AllowUsers pepe
...


y aunque el valor "PermitRootLogin" esté marcado como "yes", si no marcamos una línea "AllowUsers root", el sistema no validará al superusuario.

Como complemento a este parámetro, podemos especificar la(s) máquina(s) desde la(s) que podremos acceder, denegando los restantes intentos

AllowUsers jose@172.16.0.5
AllowUsers jose@mustafar
AllowUsers jose@mi_isp.mi_host.com
...


apartado en el que se pueden utilizar comodines

AllowUsers jose@192.168.*
...


Por último, es muy probable que no se necesite autentificación PAM, salvo que utilicemos un servidor LDAP o similar, con lo que no está de más deshabilitar esta entrada (ya que OpenSSH sabe de sobra donde validar usuarios)

UsePam no

Como complemento, podremos utilizar DenyHosts, TcpWrappers o forzar la validación mediante pares de certificados, pero tal cual, ya se trata de una configuración realmente segura (salvo la predecible posibilidad que se deriva de la "mala praxis" de acceder desde redes no fiables con el riesgo de un ataque spoofing).

1.2.08

Python: Crear una clase de properties

Si se ha trabajado con otros lenguajes de programación orientados a objetos como Java o .NET, probablemente se estará acostumbrado al uso de clases con properties para, por ejemplo, construir modelos de datos.
Python se comporta exactamente igual, con la salvedad que no existen palabras reservadas para este efecto como el caso de .NET (recomiendo la lectura del artículo de Guido: Unifying types and classes in Python)

Veamos un ejemplo simple sobre como crear un modelo de datos para una persona utilizando Python, que derive de un objeto (por definir):

class persona(objeto):
   def __init__(self):
      self.nombre = ""
      self.apellido1 = ""
      self.apellido2 = ""
   def _setNombre(self,valor):
      self.nombre = valor
   def _setPrimerApellido(self,valor):
      self.apellido1 = valor
   def _setSegundoApellido(self,valor):
      self.apellido2 = valor
   def _getNombre(self):
      return self.nombre
   def _getApellidos(self):
      return self.apellido1 + " " + self.apellido2
   def _getPropiedadSoloLectura(self):
      return "Valor de solo lectura"