MySql: ให้สิทธิ์อ่านอย่างเดียวหรือไม่


103

ฉันมีผู้ใช้ซึ่งฉันต้องการให้สิทธิ์การอ่านทั้งหมดในสคีมา db

วิธีหนึ่งคือ:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

มีวิธีจัดกลุ่มการดำเนินการอ่านทั้งหมดโดยให้สิทธิ์หรือไม่?


สิทธิ์SHOW VIEWไม่ใช่SHOW_VIEWแต่คุณไม่จำเป็นต้องให้สิทธิ์นี้แก่ผู้ใช้เว้นแต่คุณต้องการให้พวกเขาสามารถSHOW CREATE VIEWดูได้ ... พวกเขาสามารถเลือกจากมุมมองที่มีSELECTสิทธิ์เพียงอย่างเดียว "จัดกลุ่มการดำเนินการอ่านทั้งหมดในการให้สิทธิ์" หมายความว่าอย่างไร
Michael - sqlbot

หากมีสิทธิ์เดียวที่หมายถึงการดำเนินการอ่านทั้งหมดบนฐานข้อมูล ฉันเข้าใจว่าพวกเขาให้การเข้าถึงแบบละเอียด แต่นามธรรมระดับสูงที่สะดวกสบายจะช่วยเราได้
Ajeet Ganga

คำตอบ:


169

หากมีสิทธิ์เดียวที่หมายถึงการดำเนินการอ่านทั้งหมดบนฐานข้อมูล

ขึ้นอยู่กับว่าคุณกำหนด "อ่านทั้งหมด" อย่างไร

"การอ่าน" จากตารางและมุมมองเป็นSELECTสิทธิพิเศษ หากนั่นคือสิ่งที่คุณหมายถึง "อ่านทั้งหมด" ใช่:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

อย่างไรก็ตามดูเหมือนว่าคุณหมายถึงความสามารถในการ "มองเห็น" ทุกอย่างเป็น "มอง แต่ไม่แตะต้อง" ดังนั้นนี่คือการอ่านประเภทอื่น ๆ ที่อยู่ในใจ:

"การอ่าน" นิยามของมุมมองคือSHOW VIEWสิทธิพิเศษ

"การอ่าน" รายการข้อความค้นหาที่กำลังดำเนินการโดยผู้ใช้รายอื่นถือเป็นPROCESSสิทธิ์

"การอ่าน" สถานะการจำลองแบบปัจจุบันคือREPLICATION CLIENTสิทธิพิเศษ

โปรดทราบว่าสิ่งเหล่านี้อาจเปิดเผยข้อมูลมากกว่าที่คุณตั้งใจจะเปิดเผยทั้งนี้ขึ้นอยู่กับลักษณะของผู้ใช้ที่เป็นปัญหา

หากเป็นการอ่านที่คุณต้องการทำคุณสามารถรวมสิ่งเหล่านั้น (หรือสิทธิพิเศษอื่น ๆที่มี ) ไว้ในGRANTคำสั่งเดียว

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

อย่างไรก็ตามไม่มีสิทธิ์เดียวที่ให้สิทธิพิเศษอื่น ๆ บางส่วนซึ่งเป็นสิ่งที่คุณกำลังถาม

หากคุณกำลังทำสิ่งต่าง ๆ ด้วยตนเองและกำลังมองหาวิธีที่ง่ายกว่าในการดำเนินการนี้โดยไม่จำเป็นต้องจำการให้สิทธิ์ที่แน่นอนที่คุณทำสำหรับผู้ใช้บางระดับคุณสามารถค้นหาคำสั่งเพื่อสร้างการให้สิทธิ์ของผู้ใช้ที่เทียบเคียงกันใหม่และเปลี่ยนแปลงได้ เพื่อสร้างผู้ใช้ใหม่ที่มีสิทธิ์คล้ายกัน:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

การเปลี่ยน 'not_leet' และ 'localhost' ให้ตรงกับผู้ใช้ใหม่ที่คุณต้องการเพิ่มพร้อมกับรหัสผ่านจะส่งผลให้มีGRANTคำสั่งที่ใช้ซ้ำได้เพื่อสร้างผู้ใช้ใหม่

ในกรณีที่คุณต้องการให้การดำเนินการเดียวในการตั้งค่าและให้สิทธิ์ชุดที่ จำกัด แก่ผู้ใช้และอาจลบสิทธิ์ที่ไม่ได้รับการรับรองใด ๆ ออกไปซึ่งสามารถทำได้โดยการสร้างกระบวนงานที่เก็บไว้ที่ห่อหุ้มทุกสิ่งที่คุณต้องการทำ ภายในเนื้อหาของโพรซีเดอร์คุณจะต้องสร้างGRANTคำสั่งด้วยไดนามิก SQL และ / หรือจัดการตารางการให้สิทธิ์โดยตรง

ในคำถามล่าสุดเกี่ยวกับผู้ดูแลระบบฐานข้อมูลผู้โพสต์ต้องการความสามารถสำหรับผู้ใช้ที่ไม่มีสิทธิพิเศษในการแก้ไขผู้ใช้รายอื่นซึ่งแน่นอนว่าไม่ใช่สิ่งที่ทำได้ตามปกติผู้ใช้ที่สามารถแก้ไขผู้ใช้รายอื่นได้นั้นค่อนข้างมากตามคำจำกัดความไม่ใช่ ผู้ใช้ที่ไม่มีสิทธิ์ - อย่างไรก็ตาม - กระบวนงานที่จัดเก็บไว้เป็นทางออกที่ดีในกรณีนั้นเนื่องจากพวกเขาทำงานด้วยบริบทความปลอดภัยของDEFINERผู้ใช้ทำให้ทุกคนที่มีEXECUTEสิทธิ์ในขั้นตอนสามารถรับสิทธิ์ที่เพิ่มขึ้นชั่วคราวเพื่ออนุญาตให้พวกเขาทำสิ่งต่างๆ ขั้นตอนสำเร็จ


2
ขอบคุณ. นอกเหนือจากคำตอบที่ดีฉันยังชอบรหัสผ่านของคุณด้วย :)
Ajeet Ganga

2
สิ่งที่น่าสังเกต: PROCESS และ REPLICATION CLIENT เป็นประเภทสิทธิ์ "ส่วนกลาง" ดังนั้นไวยากรณ์จะล้มเหลวเมื่อกำหนดด้วยการยกเว้น "ต่อฐานข้อมูล" กระบวนการให้เงินบน mydb. * จะไม่ถูกต้อง แต่ GRANT PROCESS ON *. * จะไม่เป็นไร
Bee Kay

GRANT SELECT ON db_name. * TO 'demo' @ '%' with GRANT OPTION;
มูซา

เกี่ยวกับอะไรSHOW DATABASES?
Marinos

@Marinos การเรียกใช้งานSHOW DATABASESได้รับอนุญาตสำหรับผู้ใช้ทุกคนเสมอ อย่างไรก็ตามฐานข้อมูลเดียวที่ส่งคืนคือinformation_schemaเว้นแต่ว่าผู้ใช้จะมีสิทธิ์ใด ๆ ในฐานข้อมูลอื่น (หรืออื่น ๆ ทั้งหมด) ซึ่งในกรณีนี้จะรวมอยู่ในรายการด้วย
Michael - sqlbot

17
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

สิ่งนี้จะสร้างผู้ใช้ที่มีSELECTสิทธิ์สำหรับฐานข้อมูลทั้งหมดรวมถึงมุมมอง


12

สิทธิ์ต่างๆที่คุณสามารถให้กับผู้ใช้ได้คือ

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

ในการให้สิทธิ์แก่ผู้ใช้เฉพาะคุณสามารถใช้กรอบงานนี้:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

ฉันพบนี้บทความที่เป็นประโยชน์มาก


3

ขั้นตอนตามคู่มือขั้นตอนที่ผมพบว่าที่นี่

เพื่อสร้างบัญชีผู้ใช้ฐานข้อมูลแบบอ่านอย่างเดียวสำหรับ MySQL

ที่พรอมต์ UNIX ให้เรียกใช้โปรแกรมบรรทัดคำสั่ง MySQL และเข้าสู่ระบบในฐานะผู้ดูแลระบบโดยพิมพ์คำสั่งต่อไปนี้:

mysql -u root -p

พิมพ์รหัสผ่านสำหรับบัญชีรูท ที่พรอมต์ mysql ทำหนึ่งในขั้นตอนต่อไปนี้:

เมื่อต้องการให้ผู้ใช้เข้าถึงฐานข้อมูลจากโฮสต์ใด ๆ ให้พิมพ์คำสั่งต่อไปนี้:

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

หากตัวรวบรวมจะถูกติดตั้งบนโฮสต์เดียวกันกับฐานข้อมูลให้พิมพ์คำสั่งต่อไปนี้:

grant select on database_name.* to 'read-only_user_name' identified by 'password';

คำสั่งนี้ให้ผู้ใช้เข้าถึงฐานข้อมูลแบบอ่านอย่างเดียวจากโลคัลโฮสต์เท่านั้น หากคุณทราบชื่อโฮสต์หรือที่อยู่ IP ของโฮสต์ที่จะติดตั้งตัวรวบรวมให้พิมพ์คำสั่งต่อไปนี้:

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

ชื่อโฮสต์ต้องสามารถแก้ไขได้โดย DNS หรือไฟล์โฮสต์ภายในเครื่อง ที่พรอมต์ mysql พิมพ์คำสั่งต่อไปนี้:

flush privileges;

ประเภทquit.

ต่อไปนี้เป็นรายการตัวอย่างคำสั่งและข้อความยืนยัน:

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit

3

แม้แต่ผู้ใช้ก็ยังได้รับคำตอบและ @Michael - sqlbot ได้กล่าวถึงประเด็นต่างๆเป็นอย่างดีในโพสต์ของเขา แต่ขาดหายไปจุดหนึ่งดังนั้นเพียงพยายามปกปิด

หากคุณต้องการให้สิทธิ์ในการอ่านแก่ผู้ใช้ทั่วไป (ไม่ใช่ประเภทผู้ดูแลระบบ) -

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

หมายเหตุ: จำเป็นต้องดำเนินการที่นี่เพื่อให้ผู้ใช้สามารถอ่านข้อมูลได้หากมีขั้นตอนการจัดเก็บที่สร้างรายงาน (มีคำสั่งเลือกน้อย)

แทนที่ localhost ด้วย IP เฉพาะที่ผู้ใช้จะเชื่อมต่อกับ DB

สิทธิ์ในการอ่านเพิ่มเติมคือ -

  • SHOW VIEW: หากคุณต้องการแสดงสคีมามุมมอง
  • REPLICATION CLIENT: หากผู้ใช้ต้องการตรวจสอบสถานะการจำลอง / ทาส แต่ต้องให้สิทธิ์กับ DB ทั้งหมด
  • กระบวนการ: หากผู้ใช้ต้องการตรวจสอบกระบวนการทำงาน จะทำงานกับ DB ทั้งหมดเท่านั้น

3

หมายเหตุสำหรับ MySQL 8 นั้นแตกต่างกัน

คุณต้องทำในสองขั้นตอน:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;

1
นี่เป็นทางออกเดียวที่ใช้ได้ผลสำหรับฉัน ดูเหมือนว่าโซลูชันอื่น ๆ จะล้าสมัยตามที่คุณกล่าว ขอขอบคุณที่ให้บริการโซลูชันที่อัปเดตนี้
Kyle Bridenstine

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.