Asunto: Contraseñas password en Oracle - Encriptación
¿Cómo encripta Oracle las contraseñas de los usuarios? ¿dónde las guarda? ¿es posible "hackearlas"? soy desarrollador de software y llevo poco tiempo utilizando Oracle como base de datos de mis aplicaciones. Me gustaría saber cómo administrarlo para que sea seguro al 100%. He leído por ahí que no es difícil hackear las contraseñas de los usuarios en Oracle Database ¿es cierto?
Publicado:
Mie Feb 04, 2009 6:04 am
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Contraseñas password en Oracle - Encriptación
Anuncios
varios escribió:
¿Cómo encripta Oracle las contraseñas de los usuarios? ¿dónde las guarda? ¿es posible "hackearlas"? soy desarrollador de software y llevo poco tiempo utilizando Oracle como base de datos de mis aplicaciones. Me gustaría saber cómo administrarlo para que sea seguro al 100%. He leído por ahí que no es difícil hackear las contraseñas de los usuarios en Oracle Database ¿es cierto?
Vayamos por partes:
* Oracle guarda las contraseñas en la tabla interna sys.user$. Verás por muchos foros el típico error diciendo que Oracle guarda las contraseñas en la tabla DBA_USERS. En realidad DBA_USERS es una vista que apunta a la tabla sys.users$.
* Oracle encripta las contraseñas de los usuarios del siguiente modo:
HASH en MD5 modificado del nombre del usuario (en mayúsculas) más la contraseña (en mayúsculas también).
Es decir, para el nombre de usuario "Fernando" y la contraseña "AlonsO", Oracle hará lo siguiente:
1. Upper("Fernando") || Upper("AlonsO")) = FERNANDOALONSO
2. Aplica una función que obtiene el hash md5 pero con una modificación propia de Oracle, por lo que aunque apliquemos el HASH a esa cadena no nos dará lo que obtiene Oracle.
Hay que tener en cuenta que el mecanismo de encriptación de la contraseña por parte de Oracle es unidireccional, esto quiere decir que Oracle almacena el HASH modificado pero nunca podrá obtener del HASH modificado la contraseña que el usuario introdujo. Es decir, no podrá desencriptarse la cadena encriptada.
Evidentemente existen mecanismos que, mediante fuerza bruta, pueden obtener determinadas contraseñas, a base de muchas horas de procesos y mucha capacidad de procesador.
Como abrás observado, en Oracle, da igual si la contraseña del usuario es en minúscula o en mayúscula, para Oracle tanto el nombre de usuario como la contraseña internamente las almacena en mayúsculas, por lo que se limita un poco la seguridad. En el ejemplo anterior da igual que accedas con "fernando" y contraseña "ALONSO" que con "FERNANDO" y contraseña "AlOnSo".
Con lo anterior ya te puedes ir haciendo una idea, Oracle es casi 100% seguro si está correctamente configurado, como cualquier motor de base de datos profesional.
A continuación te indicamos algunos consejos, no son los únicos ni los mejores, tendrás que documentarte más al respecto:
1. Teniendo en cuenta que en la tabla sys.users$ se alojan las contraseñas, si impides el acceso a esta tabla o a su vista DBA_USERS a todos los usuarios conseguirás que nadie pueda ejecutar esta consulta:
Código:
select password
from dba_users
where username='ALONSO'
Si un usuario tiene acceso a esto, podrá saber qué hash modificado tiene un usuario concreto, por lo que mediante software como "orabf" y un poco de paciencia podrían obtener la contraseña.
2. Cambiar la contraseña y desactivar todos aquellos usuarios de Oracle que no vayas a utilizar: SCOTT, HR, etc. Puedes utilizar la siguiente consulta SQL para hacerlo:
Código:
ALTER USER "FERNANDO"
ACCOUNT LOCK
Donde "FERNANDO" será el nombre del usuario a bloquear.
3. Utilizar SIEMPRE contraseñas "fuertes", es decir, contraseñas largas con números y letras, que no tengan "sentido semántico", es decir que no sean del tipo "perro" ó "mimoto", una contraseña "fuerte" sería: "h3msu81z49e". Teniendo en cuenta que la encriptación es unidireccional, el ataque por fuerza bruta podría tardar semanas en obtener una contraseña como la que acabamos de mostrar, en cambio, para una contraseña como "00000000" podría tardar horas.
4. Cambiar las contraseñas de los usuarios cada cierto tiempo, con esto conseguiremos que si "alguien" ha conseguido ver las contraseñas encriptadas de DBA_USERS (sys.users$), al cambiarlas no le servirá de nada. La consulta SQL para cambiar la contraseña a un usuario:
Código:
alter user fernando identified by 'nueva_contraseña'
O bien, para pasarle la contraseña encriptada con el md5 modificado de Oracle:
Código:
alter user fernando identified by values 'HASH_MODIFICADO'
5. Auditar el acceso a las tablas o vistas "peligrosas" como DBA_USERS o SYS.USERS$. Por ejemplo, mediante un procedimiento almacenado (trigger) que avise de alguna forma si se ha realizado un SELECT sobre esta tabla o vista y ha sido un usuario distinto al que sí lo puede realizar. De esta forma, si esto se produce, tendréis qué usuario lo ha realizado y podréis aplicar un cambio de contraseñas inmediato.
6. Prestar mucha atención a los usuarios con el rol "DBA" que tendrán acceso a todo y podrán modificar todo. Esto sólo se debe usar con los usuarios DBA propios de Oracle: SYS, SYSTEM y que éstos tengan unas contraseñas "fuertes". El usuario con el rol DBA es el equivalente (salvando las distancias) al superusuario "root" en Linux, por lo que hay que proceder con especial cuidado con estos usuarios.
Por supuesto, hay muchos más mecanismos de prevención de hackeo de contraseñas y, por supuesto, un sistema Oracle bien configurado es casi invulnerable.
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A