Avatar billede dbmanager Nybegynder
15. marts 2004 - 00:51 Der er 24 kommentarer

Skjul databaser en bruger ikke har rettighed til , ver 4.x

Hi


Vi har på den skole hvor jeg er ansat, to MySQL-servere kørende. Den ene kører ver. 3.x og den anden er opgraderet til 4.x

PhpMyadmin anvendes i begge tilfælde som værktøj til eleverne.

På den ene (3.x) kan en bruger efter login kun se sine egne databaser, men på 4.x'eren kan brugeren se alle db'er.
Brugeren kan kun se tabeller og indhold af egne databaser, men vi ville alligevel gerne kunne skjule de andre databaser for brugeren.

Hvordan gør vi det?
Avatar billede muddi Praktikant
15. marts 2004 - 12:07 #1
Det er nok dine access priviledges du skal kigge på. Jeg kunne ikke helt forstå hvor mange brugerprofiler du bruger.
Har du en brugerprofil til version 3.x og en til 4.x?

Ihvertfald kan du når du opretter en bruger angive hvilke databaser, hun skal have adgang til. Ved så at bruge to eller flere brugere, har du fuld kontrol over hvilke databaser de har adgang til.
Avatar billede dbmanager Nybegynder
15. marts 2004 - 12:24 #2
Det er forskellige brugere på de to MySQL-installationer.

En Nyoprettet bruger Test, på ver. 4.x har nej i flg. priv. i Users:
Select
Insert
Update
Delete
Create
Drop
Reload
Shutdown
Process
File
Grant
References
Index
Alter

Alligevel kan han se alle databaser, men ikke tabeller og indhold.
Avatar billede muddi Praktikant
15. marts 2004 - 15:47 #3
user tabellen er global, det vil sige at indstillinger foretaget her virker på alle databaser.
Du er derfor nødt til at give en bruger adgang til databaserne i tabellen db.
Prøv at kigge i tabellen db i databasen mysql. Her kan du tilføje database-adgangsprivilegier til hver eneste bruger.
Avatar billede dbmanager Nybegynder
15. marts 2004 - 15:58 #4
Jo, men min testbruger har slet ikke adgang til nogen af db'erne i tabellen db.

Han står der slet ikke.

Eller jeg skal måske oprette ham, og så "nægte" adgang?
Avatar billede muddi Praktikant
15. marts 2004 - 16:00 #5
Du skal selv oprette dem!
Avatar billede muddi Praktikant
15. marts 2004 - 16:02 #6
Du skal indtaste "brugernavnet" og "databasen" hun har adgang til, samt alle adgangs-privilegierne.
Giv ALDRIG mere end nødvendigt!
Avatar billede dbmanager Nybegynder
15. marts 2004 - 16:12 #7
Øh nu er jeg ikke helt med.

Jeg har oprettet brugeren i tabellen users
Skal jeg også oprette brugeren i talebben db, for hver eneste database, og vælge N til alle privillegier?
Avatar billede muddi Praktikant
15. marts 2004 - 16:16 #8
Nej, du skal kun oprette poster med databaser du vil give brugeren adgang til. Hvis brugeren kun er i tabellen db én gang, vil han kun have adgang til den ene database der står nævnt!
Du skal ikke oprette brugeren i db for de tabeller han slet ikke har adgang til.
Tabellen db indeholder adgangsoplysninger til de tabeller han godt må se, og så kan han ikke se andre.
Avatar billede dbmanager Nybegynder
15. marts 2004 - 16:21 #9
OK - det regnede jeg også med.

Nu har jeg så oprette en bruger test i tabellen users men flg:
Select: N
Insert: N
Update: N
Delete: N
Create: N
Drop: N
Reload: N
Shutdown: N
Process: N
File: N
Grant: N
References: N
Index: N
Alter: N

Og i tabellen db findes han slet ikke.

Alligevel kan han fra f.eks. PhPMyAdmin se alle databaserne. Altså kun navnene, ikke indhold, tabeller og struktur.

Så vidt jeg kan se, er det kun på den MySQL-server der kører ver. 4.x det er sådan. På 3.x'eren vises kun den/de databaser der er adgang til
Avatar billede muddi Praktikant
15. marts 2004 - 16:54 #10
hvad sker der så, hvis du også opretter ham i tabellen db?
Avatar billede muddi Praktikant
15. marts 2004 - 16:56 #11
Jeg er desværre nødt til at smutte nu. Jeg kigger ind på eksperten igen i morgen, i mellemtiden skal du prøve at læse hvad der står i manualen:
http://www.mysql.com/doc/en/Privilege_system.html

Der gives en grundig beskrivelse af adgangssystemet. Hvilke tabeller der overruler andre osv.

Tak for i dag :o)
Avatar billede muddi Praktikant
16. marts 2004 - 11:46 #12
Jeg har fundet en bedre løsning!
Har netop siddet og leget med version 3.23.58 og version 4.0.
På version 4.0 kan en bruger åbenbart ikke få vist andre databaser end dem han har adgang til. Mens man i version 3.23.58 får vist det hele.

Der findes heldigvis en løsning på problemet.

Lav en fil der hedder my.cnf og læg den i "C:\" eller "C:\Windows-directory" på windows eller "/etc/" på Unix.

I den fil skal du så sætte safe_show_database til On i stedet for Off.
Off er nemlig standard, som du kan se, hvis du skriver SHOW VARIABLES.

Se her hvordan du bruger option-files: http://www.mysql.com/doc/en/Option_files.html

Om safe_show_database-indstillingen står der i manualen:
"Don't show databases for which the user doesn't have any database or table privileges. This can improve security if you are concerned about people being able to see what databases other users have. See also skip_show_database", http://www.mysql.com/doc/en/SHOW_VARIABLES.html

Det er jo helt klart den mulighed vi skal bruge her :o)

/Morten
Avatar billede muddi Praktikant
16. marts 2004 - 11:49 #13
Jeg læste lige dit spm. igen. Og fandt ud af, at du faktisk står med det modsatte problem, nemlig at brugeren på 4.x kan se alle databaser, mens brugeren på 3.x kun kan se sine egne.
Men ovenstående løsning burde virke for dem begge.
Avatar billede muddi Praktikant
16. marts 2004 - 12:00 #14
Der ligger i rod-biblioteket til mysql en samling filer der hedder my-medium.cnf, my-small.cnf osv.
På min maskine var de "maskeret" som speed-dialers, men ved at gå ind og slette fil-typen cnf i mappeindstillingerne blev det muligt for mig at læse dem.
I de filer kan du se eksempler på hvordan du laver din egen my.cnf-fil.
Avatar billede muddi Praktikant
16. marts 2004 - 12:32 #15
Ok, her fremgår det så, at safe_show_database er fjernet i version 4.0.5
http://lists.mysql.com/announce/143
Avatar billede dbmanager Nybegynder
16. marts 2004 - 15:37 #16
Ok - Men hvad så? Er der en anden løsning?
Avatar billede muddi Praktikant
17. marts 2004 - 08:31 #17
Du kan starte mysql med --skip_show_database
Så er der ingen der kan bruge funktionen SHOW DATABASE, og det er måske ikke helt hensigtsmæssigt?!
Jeg har ikke selv prøvet den i praksis ...

I øvrigt forstår jeg ikke hvorfor man har valgt at fjerne safe_show_database, da den jo kunne være enormt smart på et webhotel, hvor det jo ikke kommer brugerne ved, hvilke andre brugere der har databaser på samme webhotel.
Hverken Azero, DHT eller Cliche har safe_show_database aktiveret. Det er altså muligt at få vist alle databaser på serveren.
Men hos MySQL AB mener man ikke at den er nødvendig mere. Muligvis fordi det nu er indbygget i MySQL 4+.
Avatar billede muddi Praktikant
17. marts 2004 - 08:35 #18
Her står det faktisk i dokumentationen til MySQL 4.0.17
http://rucus.ru.ac.za/docs/mysql/Show-database-info.html

"SHOW DATABASES lists the databases on the MySQL server host. You can also get this list using the mysqlshow command line tool. In version 4.0.2 you will only see those databases for which you have some kind of privilege, if you don't have the global SHOW DATABASES privilege."

Måske er dit problem så, at alle brugere har global SHOW DATABASES privilegier ved oprettelsen.
Har du kopieret mysql-databasen fra version 3.x over til version 4.x eller har du oprettet alle brugerne igen på den nye server?
Avatar billede muddi Praktikant
17. marts 2004 - 09:10 #19
Kig i tabellen users og kontroller at alle brugere ud over root og superbrugere har følgende rettigheder:

Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv:  N
Reload_priv: N
Shutdown_priv: N
Process_priv: N
File_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N

Kort og godt ingen rettigheder. Ingen andre end root og superbrugere skal have Y i nogen af disse. Disse privilegier skal nemlig sættes i tabellen db! db-tabellen sætter disse indstillinger på per-database-niveau og ikke på overordnet niveau.

Din test-bruger du oprettede før så god nok ud, men kig lige om alle de andre også er ok.
Avatar billede muddi Praktikant
17. marts 2004 - 09:19 #20
Jeg har lige afprøvet min teori. Jeg lavede en bruger, som havde N i alt ovenstående, undtagen Select_priv. Så brugte jeg FLUSH PRIVILEGES og vupti, blev alle databaser vist for brugeren.
Det kunne være løsningen på dit problem.
Avatar billede dbmanager Nybegynder
17. marts 2004 - 12:21 #21
Hvor får du:
Show_db_priv: N
Super_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Execute_priv: N
Repl_slave_priv: N
Repl_client_priv: N

fra, de er ikke i min users-tabel?

Som jeg tidligere har skrevet, har alle brugere N i alt.

Hvor skal jeg skrive --skip_show_database Mysql startes som en service der benytter mysqld-nt.exe?

Den teori du har afprøvet med N til alt, og så flush privileges, er det ikke lige det modsatte?
Avatar billede muddi Praktikant
17. marts 2004 - 13:21 #22
"Den teori du har afprøvet med N til alt, og så flush privileges, er det ikke lige det modsatte?"
Hvad mener du med lige det modsatte? Flush privileges tvinger serveren til at genindlæse alle privilegier, hvilket den ellers ville gøre ved opstart.

Jeg tror de felter du nævner tilhører version 4, men jeg er ikke sikker.
Hvis du blot har overført mysql databasen fra din gamle data-mappe til din nye datamappe, så findes disse felter selvfølgelig ikke i din version 4.

Men det har du vel heller ikke gjort vel???!

Jeg har prøvet at finde ud af det med --skip_show_database, og selvom de i manualen skriver at man kan bruge den som en ekstra sikkerhed, så nævner de (eller andre) noget om hvor og hvordan det gøres!
Avatar billede dbmanager Nybegynder
17. marts 2004 - 13:39 #23
Jeg har kørt installationene af den nye version oven i den gamle, så regnede jeg med, at den selv opdaterede hvor det var nødvendigt.
Avatar billede muddi Praktikant
17. marts 2004 - 13:58 #24
Jamen så har den sikkert også gjort det. Det er da bare underligt, når vi har den samme version og på den samme server.

Men der er noget galt, hvis der er brugere, der står anført i tabellen user, med N til alle privilegier, og i tabellen db slet ikke står anført.
Sådanne brugere burde slet ikke have mulighed for at se noget som helst.

Det sidste jeg kan komme på er, at reinstallere mysql og dernæst tilføje hver eneste bruger enkeltvis (hvis der ikke er for mange selvfølgelig).

Men for alt i verden ville jeg undgå at bruge den gamle mysql-database (den med user, db, osv.).

Kig eventuelt på disse links, der står svaret sikkert:
http://www.mysql.com/doc/en/Privileges.html

Nu er mit lager af viden desværre ved at være udtømt tror jeg.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester