Autor Tema: Bloqueo de base de datos  (Leído 13895 veces)

0 Usuarios y 1 Visitante están viendo este tema.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Bloqueo de base de datos
« Respuesta #15 en: Octubre 23, 2013, 12:44:29 am »
Esa idea es buena siempre y cuando se controlen usuarios por BD y muchas veces pasa que se crean y controlan usuarios por aplicativo. No se como es en MySQL pero sino es muy complicado implementar eso entonces seria buena alternativa.

Toda aplicacion se conecta mediante un usuario,  de ahí que controle sus propios usuarios es otra cosa. Se puede aplicar perfectamente.

Es correcto, pero he visto programa que muchas veces ese usuario con el que se conecta viene siendo el unico usuario para todas las transacciones de todos los terminales, igual es una forma menos negrera :-)
Me encuentras en YAcosta.com

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Bloqueo de base de datos
« Respuesta #16 en: Octubre 23, 2013, 12:53:16 am »
En realidad yo lo tengo pensado así, es decir, un usuario para la aplicación que corre en el servidor y otro para la aplicación de las terminales (en todas las terminales el mismo usuario). Siempre lo probé con dos o tres equipos y no tuve problemas. ¿Está mal hacerlo así?

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Bloqueo de base de datos
« Respuesta #17 en: Octubre 23, 2013, 12:50:00 pm »
En realidad yo lo tengo pensado así, es decir, un usuario para la aplicación que corre en el servidor y otro para la aplicación de las terminales (en todas las terminales el mismo usuario). Siempre lo probé con dos o tres equipos y no tuve problemas. ¿Está mal hacerlo así?

No, al contrario me parece que es una de las mejores formas.
Me encuentras en YAcosta.com

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Bloqueo de base de datos
« Respuesta #18 en: Octubre 23, 2013, 01:20:54 pm »
¡Excelente!
¡Muchas gracias!

Jerónimo

wolf_kof

  • Visitante
Re:Bloqueo de base de datos
« Respuesta #19 en: Octubre 23, 2013, 04:32:39 pm »
Esta bien crearte los dos usuarios. Uno para el servidor y otro para las terminales.

De hecho, debe de ser así siempre!!!!!!!

en vez de cambiarle la contraseña (que ignoro que algoritmo vas a utilizar) por que simplemente no le quitas los permisos al usuario de las terminales y ya. Es una linea de código.

PD. Las terminales de un soft deben de utilizar un usuario que tenga permisos de lectura y escritura. Pero no deben de usuar el usuario de administrador. Es mala costumbre utilizar el mismo usuario.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Bloqueo de base de datos
« Respuesta #20 en: Octubre 23, 2013, 05:08:51 pm »
Le cambio la contraseña porque es lo que más fácil encontré para hacer. Se me hace que quitar los permisos es más engorroso.
Lo hago de la siguiente manera:
Código: (SQL) [Seleccionar]
BD.Execute "UPDATE mysql.user SET Password=PASSWORD('claveparainhabilitar') WHERE User='nombreusuario'"
El usuario de las terminales tiene solo permisos para SELECT, INSERT, DELETE, UPDATE y EXECUTE.
El problema de cambiar la clave es que solo impide conexiones nuevas, pero si un usuario ya está conectado no puedo impedir que siga trabajando. A lo mejor cambiando los permisos, como decís, deje de admitir tanto conexiones nuevas como consultas de conexiones existentes. ¿Es así? En ese caso, ¿me podrás pasar la línea para cambiar los permisos al usuario, por favor?
¡Muchas gracias!

Jerónimo

wolf_kof

  • Visitante
Re:Bloqueo de base de datos
« Respuesta #21 en: Octubre 24, 2013, 03:44:43 pm »
No viste ningún enlace que te di vdd  :'(

Ok aquí esta una síntesis de los que te interesa


Citar
REVOKE ALL ON *.* FROM pepito@localhost;

Citar

ADMINISTRACIÓN DE USUARIOS

 

 * Nombre de usuario:

   Cuando creamos un nuevo usuario en MySQL, éste queda identificado por su
   nombre de usuario más el nombre o IP del ordenador desde el cual hemos dicho
   que accederá (podemos utilizar el carácter comodín '%' para representar
   varios ordenadores). La sintaxis es:

     usuario@ordenador

   Ejemplos de usuarios:

     pepito
     pepito@'%'
     pepito@localhost
     pepito@'192.168.0.%'
     pepito@'%.midominio.org'

   Por ejemplo, el usuario 'pepito@localhost' se considera diferente del usuario
   'pepito@192.168.0.%', aunque tengan el mismo nombre 'pepito', y por lo tanto
   pueden tener permisos diferentes.

 * Ver los usuarios:   
     SELECT User,Host,Password FROM mysql.user;

 * Crear un usuario:
     CREATE USER usuario [IDENTIFIED BY 'contraseña'] [, usuario [IDENTIFIED BY 'contraseña']] ...

   Ejemplos:
     CREATE USER Pepito IDENTIFIED BY 'Griyo';
     CREATE USER Anonimo@localhost;
     CREATE USER Alumno@'192.168.0.%' IDENTIFIED BY 'Alumno';

 * Borrar un usuario:
     DROP USER usuario [, usuario] ...

   Ejemplos:
     DROP USER Anonimo;

 * Cambiar el nombre de un usuario:
     RENAME USER viejo_usuario TO nuevo_usuario [, viejo_usuario TO nuevo_usuario] ...

   Ejemplos:
     RENAME USER Pepito TO Pepito@127.0.0.1;

 * Cambiar la contraseña de un usuario:
     SET PASSWORD FOR usuario = PASSWORD('contraseña')

   Ejemplos:
     SET PASSWORD FOR Pepito = PASSWORD('Grillo')

 * Ver los privilegios de un usuario:
     SHOW GRANTS FOR usuario

   Ejemplos:
     SHOW GRANTS FOR root;
     SHOW GRANTS FOR Pepito;

 * Otorga privilegios a un usuario:
     GRANT privilegios ON base_datos.tabla(columnas) TO usuario;

   Sintaxis ampliada:
     GRANT privilegios [(columnas)] [, privilegios [(columnas)]] ...
       ON [objecto] {tabla | * | *.* | basedatos.*}
       TO usuario [IDENTIFIED BY [PASSWORD] 'contraseña'] [, usuario [IDENTIFIED BY [PASSWORD] 'contraseña']] ...
       [REQUIRE NONE | [{SSL| X509}] [CIPHER 'cipher' [AND]] [ISSUER 'issuer' [AND]] [SUBJECT 'subject']]
       [WITH opcion [opcion] ...]

     privilegios = ALL, ALTER, CREATE, CREATE USER, CREATE VIEW, DELETE, DROP, EXECUTE, INDEX, INSERT,
                   LOCK TABLES, RELOAD, SELECT, SUPER, UPDATE, GRANT OPTION, ...

     objecto = TABLE | FUNCTION | PROCEDURE

     opcion = GRANT OPTION
       | MAX_QUERIES_PER_HOUR count
       | MAX_UPDATES_PER_HOUR count
       | MAX_CONNECTIONS_PER_HOUR count
       | MAX_USER_CONNECTIONS count

   Ejemplos:
     GRANT UPDATE, INSERT, SELECT ON world.City TO pepito@localhost;
     GRANT UPDATE, INSERT, SELECT ON world.City TO fulanito@localhost IDENTIFIED BY 'nuevapasswd', tu@equipo.remoto.com;
     GRANT UPDATE, INSERT, SELECT ON world.Country TO pepito@'%.empresa.com', fulanito@'%', menganito;
     GRANT UPDATE, INSERT, SELECT ON world.Country TO pepito@192.168.10.111, fulanito@'192.168.10.%', menganito;
     GRANT UPDATE(Population), SELECT(Name, Population) ON world.Country TO pepito@localhost;
     GRANT SELECT ON world.* TO pepito@'%' REQUIRE ssl;
     GRANT SELECT ON world.* TO pepito@'%' WITH MAX_CONECTIONS_PER_HOUR 3 MAX_QUERIES_PER_HOUR 300 MAX_UPDATES_PER_HOUR 30;
     GRANT ALL ON *.* TO operador@localhost
     GRANT ALL ON *.* TO operador@localhost WITH GRANT OPTION;

 * Elimina privilegios de un usuario:
     REVOKE privilegios ON base_datos.tabla(columnas) FROM usuario;

   Sintaxis ampliada:
     REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
       ON [object_type] {tbl_name | * | *.* | db_name.*} FROM user [, user] ...

     REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

   Ejemplos:
     REVOKE ALL ON *.* FROM pepito@localhost;

 * Todos los privilegios se guardan en las tablas 'user', 'db', 'tables-priv',
   'columns_priv' y 'host' de la base de datos 'mysql'. Se pueden realizar las
   modificaciones directamente sobre estas tablas, para obtener los mismos
   resultados que con GRANT, REVOKE, DROP o SET PASSWORD:

     USE mysql;
     SHOW TABLES;
     DESCRIBE user;
     DESCRIBE db;
     DESCRIBE tables_priv;
     SELECT User, Host, Select_priv FROM user WHERE User = 'pepito';
     UPDATE user SET Password = PASSWORD('nuevapasswd') WHERE User = 'pepito' AND Host = 'localhost';
     FLUSH PRIVILEGES;
     DELETE FROM user WHERE User = 'pepito' AND Host = 'localhost';
     FLUSH PRIVILEGES;
     DELETE FROM user WHERE Password = '';
     FLUSH PRIVILEGES;

 * Podemos iniciar el servidor pidiéndole que no tenga en cuenta los privilegios
   otorgados a los usuarios. Por ejemplo, si hemos olvidado la contraseña del
   administrador de la base de datos y necesitamos poner una nueva:

     mysqld --skip-grant-tables --skip-networking
     mysql -e "UPDATE mysql.user SET Password = PASSWORD('nuevo') WHERE User = 'root'"

 * De nada sirve controlar los privilegios de los usuarios dentro del servidor
   de bases de datos si fuera del servidor, en el entorno del sistema operativo,
   estos usuarios tienen libre acceso al sistema de ficheros. Para evitarlo
   debemos vigilar los permisos de acceso de los siguientes archivos:
   - Las bases de datos y sus tablas, para que usuarios no autorizados no puedan
     acceder a ellas directamente.
   - Ficheros de logs y de estado, para que usuarios no autorizados no puedan
     acceder a ellas directamente.
   - Ficheros de configuracion, para que usuarios no autorizados no puedan
     reemplazarlos o modificarlos.
   - Programas y scripts que manejan y acceden a bases de datos, para que
     los usuarios no puedan reemplazarlos o modificarlos.

 * Una capa adicional de seguridad nos la da encriptar los datos que escribimos
   y leemos de la base de datos, mediante las funciones ENCODE(), DECODE(),
   DES_ENCRYPT(), DES_DECRYPT(), AES_ENCRYPT(), AES_DECRYPT(), y PASSWORD();

 * Lecturas para profundizar:
   - http://dev.mysql.com/doc/refman/5.0/es/user-account-management.html
   - http://dev.mysql.com/doc/refman/5.0/es/account-management-sql.html
   - http://dev.mysql.com/doc/refman/5.0/es/privilege-system.html
   - http://dev.mysql.com/doc/refman/5.0/es/encryption-functions.html

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Bloqueo de base de datos
« Respuesta #22 en: Octubre 28, 2013, 11:01:33 am »
Sí, los había leído, pero se ve que no muy bien porque pensé que tenía que especificar todas las tablas de la bd en el comando REVOKE. Luego advertí que podía usar el asterisco y funciona perfectamente.
Pero de aquí me surge otra duda: ¿se puede hacer algo para que el cambio de privilegios afecte a un usuario que ya esté conectado, es decir, que no le permita seguir haciendo consultas? Cuando revoco privilegios para un usuario los cambios tienen efecto para conexiones nuevas de ese usuario, pero si el usuario ya está conectado sigue pudiendo hacer consultas. ¿Hay manera de bloquear a ese usuario que está conectado?
Cambio los privilegios así:
Código: (SQL) [Seleccionar]
REVOKE ALL ON mibd.* FROM usuario@'%'Esto funciona bien para la siguiente vez que el usuario se conecta. Pero si el usuario ya está conectado puede seguir operando sin ninguna restricción. Y según el sitio de MySQL:
Citar
Los cambios en los privilegios de tabla y columna toman efecto en la siguiente petición del cliente.
Citar
Si usted modifica las tablas grant utilizando GRANT, REVOKE, o SET PASSWORD,el servidor se da cuenta de estos cambios y recarga las tablas grant en la memoria inmediatamente.
¿Me está faltando algo?
Muchas gracias.

Jerónimo
« última modificación: Octubre 28, 2013, 11:10:37 am por Jeronimo »

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Bloqueo de base de datos
« Respuesta #23 en: Octubre 28, 2013, 11:52:53 am »
si, FLUSH PRIVILEGES, para que tome efecto al momento de los que no se toman al momento x'D

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Bloqueo de base de datos
« Respuesta #24 en: Octubre 28, 2013, 11:58:21 am »
Omití decirlo en el post anterior, pero lo probé y no hubo diferencia.
Aclaro como me conecto, por si el error está ahí.
1.- La aplicación VB6 se conecta por DSN a la base de datos, utilizando el usuario A.
2.- Se trabaja normalmente y se cierra la conexión con la base de datos cuando se cierra la aplicación.
Entonces, luego del paso 1 desde el servidor cambio los privilegios al usuario A y hago "FLUSH PRIVILEGES", pero el usuario sigue consultando la base de datos como si nada hubiera pasado.
Ahora, si cierro la aplicación y la vuelvo a iniciar, el usuario ya conecta sin los privilegios. Eso está bien, pero me gustaría que entre el paso 1 y el 2 pueda hacer que el usuario no pueda seguir haciendo consultas en la BD.
Muchas gracias, raul338.

Jerónimo

EDITO: También omití decir que luego de cambiar los privilegios voy al MySQL Administrator y en los privilegios de ese usuario contra esa bd se ve la información actualizada, pero la aplicación sigue trabajando sin problemas.
« última modificación: Octubre 28, 2013, 12:01:43 pm por Jeronimo »

wolf_kof

  • Visitante
Re:Bloqueo de base de datos
« Respuesta #25 en: Octubre 28, 2013, 11:43:34 pm »
Es que eso depende exactamente de qué tipo de usuario tengan las terminales, si tu usuario es Administrador o SuperAdministrador, claro  que va a seguir consultando los registros.

Los de un usuario normal deberían de ser estos:

SELECT- Selecciona los registros de la tabla/s
INSERT- Insertar registro en la tabla/s
UPDATE- Actualizar datos ya existentes en la tabla/s
ALTER- Modificar la estructura de la tabla/s
CREATE- Crear nuevas tablas, bases datos.
DROP- Eliminar tablas o BD

Los de un administrador ademas de esos deberian de ser estos:

FILE- Permite al admin leer y gravar achivos en el server mySQL
PROCESS- Permite al administrador controlar los procesos.
RELOAD- Permite al administrador reformar los acesos,privilegios...
SHUTDOWN- Permite al admin apagar el servidor

Y los privilegios especiales deben de ser muy bien tratados:

ALL- Todos los privilegios comentadas anteriormente
USAGE- Permite el acceso.

Si así no se te cumple lo que quieres, despues de revocar los privilegios al usuario de las temrinales hasle un reset al servidor, antes de que hagas tu proceso.

Intenta con RELOAD

Para mayor referencia

http://dev.mysql.com/doc/refman/5.0/es/privilege-changes.html



wolf_kof

  • Visitante
Re:Bloqueo de base de datos
« Respuesta #26 en: Octubre 28, 2013, 11:46:39 pm »
Aqui esta mejor explicado

http://dev.mysql.com/doc/refman/5.0/es/privileges-provided.html

Suerte y saludos.