In che modo mysql determina il nome host dei suoi client?


14

Sto cercando di creare un utente MySQL a cui sarà consentito connettersi al database MySQL solo da un nome host specifico.

concedi tutto su db_name. * a 'user_name'@'appserver-lan.mydomain.com' identificato da 'some_passwd'

Controllando la tabella degli utenti sul database mysql, posso vedere che l'utente è stato creato correttamente:

usa mysql; seleziona * dall'utente dove User = 'nome_utente' e Host = 'appserver-lan.mydomain.com'

o

mostra sovvenzioni per 'nomeutente'@'appserver-lan.mydomain.com'

Il nome host che ho specificato è un alias di un nome amazon-ec2, che una volta risolto dai server DNS AWS genera un indirizzo LAN:

[root @ db_server ~] # host appserver-lan.mydomain.com

appserver-lan.mydomain.com è un alias per ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com ha l'indirizzo 10.xxx .xxx.xxx

Il problema è che quando provo a connettermi al database LAN IP da questo appserver-lan, ottengo un errore di accesso negato, sebbene la password sia corretta. La cosa strana qui è che il nome host mostrato nell'errore non è il nome host che avevo specificato al momento della creazione dell'utente:

ERRORE 1045 (28000): Accesso negato per l'utente 'nome_utente' @ ' appserver.mydomain.com ' (utilizzando la password: SÌ)

Quindi, la mia domanda è: come fa mysql a determinare il nome host del client? Credo che non lo faccia con una ricerca DNS inversa, poiché ho controllato e non punta a "appserver.mydomain.com" né a "appserver-lan.mydomain.com". Inoltre, il server db non ha voci relative al appserver su / etc / hosts.

Riassumendo, sono abbastanza sicuro che sia un problema di risoluzione del nome host, dal momento che la concessione dei privilegi per l'host "%" o per l'IP LAN funziona bene.

Qualche idea su cosa mi sto perdendo?


Perché pensi che non sia DNS inverso? Cosa succede quando lo fai host -t PTR 10.1.2.3?
Zoredache,

host -t PTR 10.xxx.xxx.xxx xxx.xxx.xxx.10.in-addr.arpa puntatore nome dominio ip-10-xxx-xxx-xxx.ec2.internal. Come puoi vedere, questo non è il nome host mostrato nel messaggio di errore (appserver.mydomain.com) e questo mi ha fatto pensare che MySQL non stesse effettuando una ricerca inversa.
Luis Fernando Alen,

Risposte:


13

Utilizza una ricerca DNS inversa. Prende l'indirizzo IP del client e utilizza qualunque record PTR venga restituito per quel nome.

A mio avviso, fare l'autenticazione basata sul nome non è affatto molto utile, suggerisco di prendere in considerazione l'utilizzo di indirizzi IP.

Vedi questo documento su come Mysql utilizza il DNS .


Grazie per il link, @Zoredache. Vorrei evitare di utilizzare gli indirizzi IP perché l'interfaccia interna di AWS utilizza DHCP e il suo IP cambia di volta in volta (ogni volta che il server si avvia, immagino), così come il suo record PTR. La cosa strana qui è che dal momento che utilizza ricerche inverse, dovrebbe dire "Accesso negato per l'utente @ ip-10-xxx-xxx-xxx.ec2.internal". invece di appserver.mydomain.com ...
Luis Fernando Alen,

1
Puoi saltare completamente l'autenticazione IP / nome, invece utilizzare un firewall basato su host o configurare l'autenticazione basata su SSL e Cert.
Zoredache,

3

MySQL eseguirà una ricerca DNS inversa sull'indirizzo IP per ottenere il nome host. Se stai eseguendo AWS EC2, puoi assegnare un IP elastico al tuo server (questo non costa alcun extra) e quindi chiedere ad Amazon di impostare il DNS inverso affinché l'IP elastico vada al tuo nome host.

Anche il tuo server DB è anche in EC2? Perché in tal caso utilizzerà l'indirizzo IP privato dell'istanza, altrimenti utilizzerà l'indirizzo IP pubblico. Sembra che tu pubblichi come tu appserver-lan sia l'ip privato 10.XXX.XXX.XXX assegnato al tuo server, non quello putlic.

Non sono sicuro di quale indirizzo IP verrebbe utilizzato se comunichi con una regione diversa, dato che ho avuto solo server all'interno della stessa regione.


Sì, è anche su EC2 e nella stessa regione. Grazie per la punta, Andy. Non sapevo che le istanze EC2 usassero l'ip interno per comunicare tra loro anche se si specifica l'ip valido per la comunicazione. Ciò ha risolto il mio problema =]
Luis Fernando Alen,

3

Ho appena avuto un problema simile, in cui il server mysql sembrava che eseguisse ricerche DNS inverse in modo errato.

Il problema che ho avuto è stato che il server disponeva delle autorizzazioni per "user'@'1.2.3.4" e per "user'@'reverse.dns". L'utente con solo l'indirizzo IP disponeva di autorizzazioni minime, ma il server mysql utilizzava le autorizzazioni di quell'utente anziché quella con il nome host e restituiva il messaggio "Accesso negato per l'utente 'utente'@'1.2.3.4'". L'eliminazione dell'utente con l'indirizzo IP ha risolto il problema e ha costretto il server a utilizzare l'altro utente come nome host.


0

Ho anche riscontrato problemi in cui i nomi host e gli indirizzi IP IPV4 e IPV6 non corrispondono e in cui un nome host viene utilizzato solo per l'autorizzazione dell'utente. Ad esempio, dove esiste un DNS inverso IPV6 ma nessun DNS IPV6 diretto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.