ฉันมีผู้ใช้ซึ่งฉันต้องการให้สิทธิ์การอ่านทั้งหมดในสคีมา db
วิธีหนึ่งคือ:
GRANT SELECT, SHOW_VIEW ON test.* TO 'readuser'@'%';
มีวิธีจัดกลุ่มการดำเนินการอ่านทั้งหมดโดยให้สิทธิ์หรือไม่?
ฉันมีผู้ใช้ซึ่งฉันต้องการให้สิทธิ์การอ่านทั้งหมดในสคีมา db
วิธีหนึ่งคือ:
GRANT SELECT, SHOW_VIEW ON test.* TO 'readuser'@'%';
มีวิธีจัดกลุ่มการดำเนินการอ่านทั้งหมดโดยให้สิทธิ์หรือไม่?
คำตอบ:
หากมีสิทธิ์เดียวที่หมายถึงการดำเนินการอ่านทั้งหมดบนฐานข้อมูล
ขึ้นอยู่กับว่าคุณกำหนด "อ่านทั้งหมด" อย่างไร
"การอ่าน" จากตารางและมุมมองเป็น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
สิทธิ์ในขั้นตอนสามารถรับสิทธิ์ที่เพิ่มขึ้นชั่วคราวเพื่ออนุญาตให้พวกเขาทำสิ่งต่างๆ ขั้นตอนสำเร็จ
SHOW DATABASES
?
SHOW DATABASES
ได้รับอนุญาตสำหรับผู้ใช้ทุกคนเสมอ อย่างไรก็ตามฐานข้อมูลเดียวที่ส่งคืนคือinformation_schema
เว้นแต่ว่าผู้ใช้จะมีสิทธิ์ใด ๆ ในฐานข้อมูลอื่น (หรืออื่น ๆ ทั้งหมด) ซึ่งในกรณีนี้จะรวมอยู่ในรายการด้วย
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';
สิ่งนี้จะสร้างผู้ใช้ที่มีSELECT
สิทธิ์สำหรับฐานข้อมูลทั้งหมดรวมถึงมุมมอง
สิทธิ์ต่างๆที่คุณสามารถให้กับผู้ใช้ได้คือ
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’;
ฉันพบนี้บทความที่เป็นประโยชน์มาก
ขั้นตอนตามคู่มือขั้นตอนที่ผมพบว่าที่นี่
เพื่อสร้างบัญชีผู้ใช้ฐานข้อมูลแบบอ่านอย่างเดียวสำหรับ 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
แม้แต่ผู้ใช้ก็ยังได้รับคำตอบและ @Michael - sqlbot ได้กล่าวถึงประเด็นต่างๆเป็นอย่างดีในโพสต์ของเขา แต่ขาดหายไปจุดหนึ่งดังนั้นเพียงพยายามปกปิด
หากคุณต้องการให้สิทธิ์ในการอ่านแก่ผู้ใช้ทั่วไป (ไม่ใช่ประเภทผู้ดูแลระบบ) -
GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';
หมายเหตุ: จำเป็นต้องดำเนินการที่นี่เพื่อให้ผู้ใช้สามารถอ่านข้อมูลได้หากมีขั้นตอนการจัดเก็บที่สร้างรายงาน (มีคำสั่งเลือกน้อย)
แทนที่ localhost ด้วย IP เฉพาะที่ผู้ใช้จะเชื่อมต่อกับ DB
สิทธิ์ในการอ่านเพิ่มเติมคือ -
หมายเหตุสำหรับ MySQL 8 นั้นแตกต่างกัน
คุณต้องทำในสองขั้นตอน:
CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
หากคุณต้องการให้มุมมองอ่านหลังจากให้สิทธิ์ในการอ่านเท่านั้นคุณสามารถใช้ ALGORITHM = TEMPTABLE ในการดูคำจำกัดความ DDL
SHOW VIEW
ไม่ใช่SHOW_VIEW
แต่คุณไม่จำเป็นต้องให้สิทธิ์นี้แก่ผู้ใช้เว้นแต่คุณต้องการให้พวกเขาสามารถSHOW CREATE VIEW
ดูได้ ... พวกเขาสามารถเลือกจากมุมมองที่มีSELECT
สิทธิ์เพียงอย่างเดียว "จัดกลุ่มการดำเนินการอ่านทั้งหมดในการให้สิทธิ์" หมายความว่าอย่างไร