ผู้ใช้ MySQL debian คืออะไร (และอื่น ๆ )?


71

ฉันถูกกัดหลายครั้งโดยผู้ใช้ 'debian-sys-maint' ที่ติดตั้งโดยค่าเริ่มต้นบนแพ็คเกจ mysql- เซิร์ฟเวอร์ที่ติดตั้งจากที่เก็บ Ubuntu

โดยทั่วไปสิ่งที่เกิดขึ้นคือฉันดึงสำเนาฐานข้อมูลการผลิตของเรา (ซึ่งไม่ได้ทำงานบน Debian / Ubuntu) สำหรับการแก้ไขปัญหาหรือการพัฒนาใหม่และลืมที่จะยกเว้นตาราง mysql.user ดังนั้นการสูญเสียผู้ใช้ debian-sys-maint

หากเราเพิ่มผู้ใช้ mysql ใหม่ด้วยเหตุผลใดก็ตามฉันต้อง 'รวม' สิ่งเหล่านี้เข้ากับสภาพแวดล้อมการพัฒนาของฉันซึ่งต่างจากการซ้อนทับตาราง

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

sudo /etc/init.d/mysql restart
Stopping MySQL database server: mysqld...failed.
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
  • debian-sys-maint ใช้ทำอะไร
    • มีวิธีที่ดีกว่าสำหรับผู้ดูแลแพ็คเกจที่จะทำสิ่งที่พวกเขากำลังพยายามทำหรือไม่?
  • วิธีที่ง่ายที่สุดในการกู้คืนหลังจากที่ทำหายไปคืออะไร?
  • สิทธิ์ที่ถูกต้อง / น้อยที่สุดสำหรับผู้ใช้นี้คืออะไร?
    • ดูเหมือนว่าไอเดียที่ไม่ดีในการ 'ให้สิทธิ์ทั้งหมดใน *. * ... '

แก้ไข

คำถามเพิ่มเติม - รหัสผ่านใน /etc/mysql/debian.cnf แฮชแล้วหรือนี่เป็นรหัสผ่านธรรมดาหรือไม่ มันสำคัญเมื่อคุณไปสร้างผู้ใช้ใหม่และฉันไม่เคยเห็นถูกต้องในการลองครั้งแรก

ขอบคุณ


8
รหัสผ่านเป็นข้อความธรรมดาใน /etc/mysql/debian.cnf
Brent

คำตอบ:


57

debian-sys-maint ใช้ทำอะไร

สิ่งสำคัญอย่างหนึ่งที่ใช้สำหรับบอกเซิร์ฟเวอร์ให้ย้อนล็อก อย่างน้อยต้องมีสิทธิ์การโหลดและปิดระบบ

ดูไฟล์/etc/logrotate.d/mysql-server

มันถูกใช้โดย/etc/init.d/mysqlสคริปต์เพื่อรับสถานะของเซิร์ฟเวอร์ มันถูกใช้เพื่อปิด / โหลดเซิร์ฟเวอร์ใหม่อย่างสง่างาม

นี่คือคำพูดจาก README.Debian

* MYSQL WON'T START OR STOP?:
=============================
You may never ever delete the special mysql user "debian-sys-maint". This user
together with the credentials in /etc/mysql/debian.cnf are used by the init
scripts to stop the server as they would require knowledge of the mysql root
users password else.

วิธีที่ง่ายที่สุดในการกู้คืนหลังจากที่ทำหายไปคืออะไร?

แผนการที่ดีที่สุดคือการไม่สูญเสียมันไป หากคุณทำรหัสผ่านหายให้รีเซ็ตโดยใช้บัญชีอื่น ถ้าคุณได้สูญเสียสิทธิ์ผู้ดูแลระบบทั้งหมดบนเซิร์ฟเวอร์ MySQL debian-sys-maintตามคำแนะนำเพื่อรีเซ็ตรหัสผ่านรากแล้วซ่อมแซม

คุณสามารถใช้คำสั่งเช่นนี้เพื่อสร้างไฟล์ SQL ที่คุณสามารถใช้ในภายหลังเพื่อสร้างบัญชีใหม่

mysqldump --complete-insert --extended-insert=0 -u root -p mysql | grep 'debian-sys-maint' > debian_user.sql

เป็นรหัสผ่านใน /etc/mysql/debian.cnf แฮชแล้ว

รหัสผ่านไม่ถูกแฮช / เข้ารหัสเมื่อติดตั้ง แต่ตอนนี้ mysql เวอร์ชันใหม่มีวิธีเข้ารหัสข้อมูลประจำตัว (ดู: https://serverfault.com/a/750363 )


1
"แผนการที่ดีที่สุดคือการไม่ทำมันเสีย" อย่างจริงจัง? นั่นเป็นศูนย์ช่วยเหลือสำหรับผู้ที่สูญเสียมันไปแล้วอย่างที่ฉันเห็นในระหว่างการอัพเกรด สำหรับผู้ที่ต้องการสร้างผู้ใช้อีกครั้งให้ใช้หนึ่งในตัวเลือก "GRANT ALL" ในคำตอบอื่น ๆ เนื่องจากผู้ใช้นี้ไม่ได้ใช้สำหรับการดำเนินการ logrotate เท่านั้น - เป็นส่วนสำคัญของกระบวนการอัปเกรด
FKEinternet

หากคุณสูญเสียข้อมูลประจำตัวคุณจะมีตัวเลือกเสมอโดยเริ่มจาก mysql / mariadb daemon ด้วยตัวเลือกที่ข้ามระบบสิทธิ์หรือเข้าสู่ระบบในฐานะผู้ใช้รายอื่นที่มีสิทธิ์ root mysql และรีเซ็ตรหัสผ่าน การรีเซ็ตรหัสผ่านและการข้ามระบบสิทธิ์จะได้รับการบันทึกไว้อย่างดีในสถานที่อื่นใน Google และคำถามอื่น ๆ ในไซต์นี้
Zoredache

22

ผู้ใช้debian-sys-maintเป็นค่าเริ่มต้นที่เทียบเท่ารูท มันถูกใช้โดยสคริปต์การบำรุงรักษาบางอย่างในระบบ Debian และเป็นผลข้างเคียงช่วยให้ผู้ใช้ที่มีการเข้าถึงรูทบนกล่องเพื่อดูรหัสผ่านข้อความธรรมดาใน /etc/mysql/debian.cnf (ดีหรือไม่ดี)

คุณสามารถสร้างผู้ใช้ใหม่โดย:

GRANT ALL PRIVILEGES on *.* TO `debian-sys-maint`@`localhost` IDENTIFIED BY 'your password' WITH GRANT OPTION;

เพียงตรวจสอบให้แน่ใจว่ารหัสผ่านตรงกับใน /etc/mysql/debian.cnf


9
Re (ดีหรือไม่ดี) - ถ้ามีคนจัดการที่จะกลายเป็นรูทพวกเขาสามารถข้ามระบบสิทธิ์ทั้งหมดโดยเพียงแค่รีสตาร์ทเซิร์ฟเวอร์ด้วยตัวเลือกที่ถูกต้อง หากผู้โจมตีของคุณได้รับรูทคุณอาจมีปัญหามากขึ้นจากนั้นไฟล์การกำหนดค่านั้น
Zoredache

2
เช่นกัน: ดีหรือไม่ดี - ฉันต้องพึ่งพาการเข้าถึง debian-sys-Maint เพื่อตั้งค่ารหัสผ่านบัญชี root MySQL อีกครั้งเมื่อมันถูกลืม มันดีที่มีตัวเลือกสำรองนี้
Brent

1
@Brent : ดูdev.mysql.com/doc/refman/5.0/en/resetting-permissions.htmlสำหรับวิธีรีเซ็ตรหัสผ่าน root ของ mysql ฉันได้ปิดการใช้งานผู้ใช้นี้ใน mysql จำนวนมากที่ติดตั้งบน Debian เนื่องจากอาจทำให้เกิดความเสียหายเมื่อเริ่มต้นด้วยการตรวจสอบตารางหากเป็นตารางขนาดใหญ่
นาธาน

1
นาธานขอบคุณสำหรับลิงค์นั้น นั่นคือข้อมูลใหม่สำหรับฉัน หากคุณมีขั้นตอนการปิดการใช้งานบัญชี debian-sys-maint โดยสิ้นเชิงทำไมคุณไม่รวมมันไว้ที่นี่เป็นคำตอบแยกต่างหาก มันจะดีมาก!
Brent

3
การมอบสิทธิ์ที่ดีกว่านั้นก็เพื่อมอบสิทธิ์การปิด / การเริ่มต้นเท่านั้น
jmtd

19

คุณสามารถ:

sudo dpkg-reconfigure mysql-server-5.0

ซึ่งจะให้ตัวเลือกแก่คุณในการสร้างผู้ใช้ debian-sys-maint ผู้ใช้และฐานข้อมูลที่มีอยู่นั้นปลอดภัย


สิ่งนี้ทำงานบน mysql-server-5.5 เช่นกัน
serverSentinel

วิธีนี้จะใช้งานได้หากการติดตั้ง mysql-server ของคุณไม่เสียหาย - อาจเกิดขึ้นได้หากผู้ใช้ debian-sys-maint หายไป
FKEinternet

19

ฉันต้องการเพียงแค่แสดงความคิดเห็น แต่ฉันคิดว่าไวยากรณ์ที่ถูกต้องสมควรได้รับมันเป็นของตัวเอง สิ่งนี้จะสร้างผู้ใช้debian-sys-maint :

mysql> GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'plaintextpassword' WITH GRANT OPTION; FLUSH PRIVILEGES;

หากคุณยังคงมีไฟล์ /etc/mysql/debian.cnf เพียงใช้รหัสผ่านในนั้น

รู้สึกอิสระที่จะเกิดขึ้นด้วยโซลูชั่นที่ปลอดภัยหวาดระแวงมากขึ้น


1
มันเป็นความหวาดระแวงเท่าที่จำเป็นต้องเป็น จากนั้นมีเพียงไฟล์เดียวเท่านั้นที่ควรอ่าน/etc/mysql/debian.cnfไฟล์ได้คือrootผู้ใช้Linux และเมื่อใครบางคนสามารถอ่านไฟล์นั้นพวกเขาrootสามารถเข้าถึงเครื่องและสามารถหยุดเซิร์ฟเวอร์ MySQL และเพิ่มผู้ดูแลระบบของตนเอง และสคริปต์ที่เริ่มต้นด้วย MySQL และแพ็คเกจอื่น ๆ ไม่สามารถทำการบำรุงรักษาความปลอดภัยและการบำรุงรักษาอื่น ๆ ได้ ใช่มันปลอดภัยเหมือนที่เคยเป็น และมีประโยชน์หากคุณปล่อยรหัสผ่านผู้ดูแลระบบ MySQL เพื่อกู้คืนโดยไม่จำเป็นต้องรีสตาร์ทในโหมดที่ไม่ปลอดภัย ;-)
Anders

นั่นคือสิ่งที่แก้ไขสำหรับ
RobinJ

6

หากคุณต้องการเพิ่มdebian-sys-maintผู้ใช้เพียงเพื่อlogrotate.dวัตถุประสงค์คุณไม่ควรให้สิทธิ์ALL PRIVILEGESหรือGRANT OPTIONนี่คือช่องโหว่ด้านความปลอดภัยที่ไม่จำเป็น แต่คุณสามารถเพิ่มผู้ใช้ที่มีRELOADสิทธิ์แบบนี้แทนได้ (สมมติว่าคุณกำลังเข้าถึงฐานข้อมูลของคุณเป็นrootและคุณแทนที่ xxxxxx ด้วยรหัสผ่านของคุณ)

# add the user with the reload right
GRANT RELOAD on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'xxxxxx'; 

# reload the rights
FLUSH PRIVILEGES;

# double check
select * from mysql.user;

อัพเดต 2019

คำตอบนี้อาจล้าสมัย - โปรดดูความเห็นที่มีความเห็นอย่างยิ่งด้านล่าง


debian-sys-maintนี่คือคำตอบที่เชื่อถือเดียวที่มันถือเป็นสิทธิ์ที่จำเป็นเท่านั้นที่จะ นอกจากนี้ฉันสามารถยืนยันได้ว่ามันใช้งานได้อย่างมีเสน่ห์ ไชโย!
Jealie

2
มันเป็นช่องโหว่ความปลอดภัยหรือไม่? หากใครบางคนสามารถอ่าน /etc/mysql/debian.cnf ได้แล้วพวกเขาน่าจะมีสิทธิ์เข้าถึงรูตและสามารถรีสตาร์ท mysql ด้วย --skip-grant-tables
mc0e

ขอบคุณ แต่ไม่จำเป็นต้องล้างข้อมูลสองครั้ง MySQL รู้แล้วว่าคำสั่ง GRANT ทำอะไร ดูdev.mysql.com/doc/refman/5.6/th/privilege-changes.html
ygoe

1
และสิ่งนี้จะไม่ทำงานเนื่องจากdebian-sys-maintผู้ใช้ยังใช้เพื่อปิดเซิร์ฟเวอร์ และเพื่อตรวจสอบผู้ใช้รูทเมื่อเริ่มต้นเซิร์ฟเวอร์ mysql อย่างน้อยคุณก็จำเป็นต้องให้สิทธิ์พิเศษในการเลือก mysql. * และการปิดระบบ
Anders

1
ไม่ไม่ไม่ทำตามคำแนะนำของคำตอบนี้ - คุณต้องให้สิทธิ์ทั้งหมดแก่ debian-sys-maint ด้วยเหตุผลตามที่ระบุไว้ในคำตอบอื่น ๆ ในหัวข้อ "สิทธิ์ debian-sys-maint ที่จำเป็น" ในระยะสั้นคุณอาจปรับวันต่อวัน แต่พบปัญหาร้ายแรงเมื่อคุณใช้การปรับปรุงความปลอดภัยแก้ไขหรืออัพเกรดระบบของคุณ
Kurt Fitzner

3

แทน

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY PASSWORD('your password') WITH GRANT OPTION; FLUSH PRIVILEGES;

ฉันคิด

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'your password' WITH GRANT OPTION; FLUSH PRIVILEGES;

เพราะรหัสผ่านไม่ถูกแฮช ... ?


3

สิทธิ์ที่จำเป็น debian-sys-maint

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

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

  • การปิดระบบและการโหลดซ้ำนั้นไม่น่าแปลกใจเพียงพอสำหรับการปิดหรือการทำฐานข้อมูลโดย /etc/init.d/mysql
  • เลือกบน mysql.userซึ่งจำเป็นสำหรับการตรวจสอบสติที่ทำเมื่อฐานข้อมูลเริ่มต้นเพื่อให้แน่ใจว่ามีผู้ใช้รูท เสร็จสิ้นการเริ่มต้นแต่ละครั้งโดย / etc / mysql / debian-start (เรียกโดย /etc/init.d/mysql) ด้วยรหัสจริงในฟังก์ชัน check_root_accounts ในไฟล์ /usr/share/mysql/debian-start.inc.sh
  • เลือกใน information_schema.tables , ทั่วโลกเลือกที่จำเป็นสำหรับการตรวจสอบสำหรับตารางชน เสร็จสิ้นการเริ่มต้นแต่ละครั้งโดย / etc / mysql / debian-start (เรียกโดย /etc/init.d/mysql) ด้วยรหัสจริงในฟังก์ชัน check_for_crashed_tables ในไฟล์ /usr/share/mysql/debian-start.inc.sh
  • สิทธิพิเศษระดับโลกทั้งหมดที่จำเป็นสำหรับการอัพเกรดตารางหาก / เมื่อมีการติดตั้ง MySQL เวอร์ชันใหม่ผ่านการอัปเดตหรืออัปเดตเดเบียน เสร็จสิ้นการเริ่มต้นแต่ละครั้งโดย / etc / mysql / debian-start (เรียกโดย /etc/init.d/mysql) ด้วยรหัสจริงในฟังก์ชั่น upgrade_system_tables_if_n จำเป็นในไฟล์ /usr/share/mysql/debian-start.inc.sh - จริง ๆ แล้วเรียก MySQL ไบนารี mysql_upgrade - อย่าหลงกลโดยชื่อฟังก์ชั่น (upgrade_system_tables_if_n จำเป็น) สิ่งนี้อาจสัมผัสโต๊ะทั้งหมด - ดูด้านล่าง

อันสุดท้ายคือความต้องการหลักสำหรับสิทธิพิเศษ หน้า man สำหรับ mysql_upgrade ระบุว่า:

mysql_upgrade ตรวจสอบตารางทั้งหมดในฐานข้อมูลทั้งหมดเพื่อให้เข้ากันไม่ได้กับ MySQL Server รุ่นปัจจุบัน mysql_upgrade อัพเกรดตารางระบบเพื่อให้คุณสามารถใช้สิทธิพิเศษหรือความสามารถใหม่ ๆ ที่อาจเพิ่มเข้ามา

หาก mysql_upgrade พบว่าตารางมีความไม่ลงรอยกันที่เป็นไปได้มันจะทำการตรวจสอบตารางและหากพบปัญหาให้ลองทำการซ่อมแซมตาราง

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


ขอบคุณสำหรับคำตอบที่ซับซ้อน ยากที่จะเชื่อว่าคำถามนี้มีอายุเกือบ 10 ปี!
Joe Holloway

นี่ควรเป็นหนึ่งในสิ่งแรกที่ผู้คนอ่าน
FKEinternet

2

ในฐานะที่เป็นหมายเหตุด้านนี้ให้ดูที่mysqlperformanceblog โพสต์นี้ด้วยเหตุผลที่ว่าทำไมคุณอาจต้องการปิดการใช้งานสิ่งที่เฉพาะ debian


1
"โปรดทราบว่านี่ไม่น่าจะมีปัญหากับ MySQL จาก Debian lenny เพราะมันมาพร้อมกับสคริปต์เริ่มต้นซึ่งจะไม่เรียกใช้ตารางตรวจสอบบนตารางที่ไม่ใช่ MYISAM" - จากหน้าเชื่อมโยง
d -_- b

2

เมื่อใช้ MySQL 5.6+ ฉันขอแนะนำให้ใช้mysql_config_editorคำสั่งเพื่อสร้างรายการสำหรับผู้'debian-sys-maint'@'localhost'ใช้โดยใช้รหัสผ่านที่เกี่ยวข้องซึ่งหมายความว่ารหัสผ่านไม่จำเป็นต้องเก็บไว้ในรูปแบบข้อความธรรมดาบนเซิร์ฟเวอร์

mysql_config_editor set --login-path=debian-sys-maint --host=localhost --user=debian-sys-maint --password

หลังจากนี้ไฟล์การกำหนดค่าเฉพาะของเดเบียน/etc/mysql/debian.cnfสามารถเปลี่ยนแปลงได้ดังนั้นชื่อผู้ใช้และรายละเอียดรหัสผ่านจะไม่ถูกเก็บไว้ในไฟล์

สุดท้ายให้แก้ไขไฟล์ logrotate สำหรับ MySQL เพื่อใช้รายละเอียดการเข้าสู่ระบบที่เก็บไว้ใน~/.mylogin.cnfไฟล์แทนไฟล์เฉพาะ debian โดยการแทนที่

/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf

กับ

/usr/bin/mysqladmin --login-path=debian-sys-maint

หวังว่าจะช่วย :)

เดฟ


แต่จุดประสงค์ของdebian-sys-maint ผู้ใช้จะสำเร็จได้ด้วยสิ่งนี้หรือไม่? แพ็คเกจที่ควรจะสามารถใช้ผู้ใช้ / รหัสผ่านนี้เพื่อทำการบำรุงรักษาระบบบางอย่างในฐานะrootผู้ใช้ในโดเมน Linux (ไม่ใช่rootผู้ใช้ใน MySQL โดยไม่มีผู้ดูแลระบบจำเป็นต้องใส่rootรหัสผ่านสำหรับ MySQL?
Anders

มันใช้งานได้สำหรับฉันในการทดสอบของฉันหากคุณทำการเปลี่ยนแปลงทั้งหมดเช่นการเปลี่ยน/etc/mysql/debian.cnfเพื่อลบรหัสผ่านและเปลี่ยนไฟล์ logrotate เพื่ออ้างอิงการใช้รายละเอียดที่ปลอดภัย ฉันไม่แน่ใจว่าผู้ใช้ debian-sys-maint ใช้เพื่อสิ่งอื่นหรือไม่ แต่ถ้าเป็นเช่นนี้จะช่วยให้คุณทราบว่าเดเบียนใช้บัญชีผู้ใช้นี้ในนามของคุณหรือไม่
Dave Rix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.