ทางเลือกที่ปลอดภัยในการใช้รหัสผ่าน MySQL ในบรรทัดคำสั่งคืออะไร


35

เรามีสคริปต์บรรทัดคำสั่ง PHP เพื่อสร้างฐานข้อมูล เราเรียกใช้สคริปต์นี้เมื่อใดก็ตามที่ผู้พัฒนาเพิ่มแพตช์ฐานข้อมูลใหม่

สคริปต์จะเรียกใช้โปรแกรมปะแก้ด้วย MySQL command-line:

system('mysql --user=xxx --password=xxx < patch.sql');

อย่างไรก็ตาม MySQL 5.6 ตอนนี้ออกคำเตือนต่อไปนี้:

คำเตือน: การใช้รหัสผ่านบนอินเตอร์เฟสบรรทัดคำสั่งอาจไม่ปลอดภัย

ซึ่งเป็นเรื่องจริงที่เห็นได้ชัด แต่อาจจะใช่หรือไม่ใช่ปัญหาสำหรับผู้ใช้

  • อะไรคือการรักษาความปลอดภัยทางเลือกแล้ว?
  • หรือเป็นไปได้ที่จะปิดคำเตือนนี้หรือไม่

โปรดทราบว่าฉันไม่ต้องการใช้ไฟล์รหัสผ่านภายนอก


2
การมีสิทธิของคุณในไฟล์ไม่ใช่ปัญหาใหญ่ หากบุคคลมีสิทธิ์ใช้งานรูทบนเซิร์ฟเวอร์ของคุณบุคคลเหล่านั้นสามารถข้ามระบบการตรวจสอบสิทธิ์ได้อย่างสมบูรณ์เพียงแค่รีสตาร์ทเซิร์ฟเวอร์ mysql ด้วยตัวเลือกเฉพาะ
Zoredache

นี่ไม่ใช่ปัญหาเดียวกับในสำเนาที่แนะนำ MySQL ไม่ได้แจ้งให้ใส่รหัสผ่านฉันจะให้และมันก็ใช้ได้ดี ฉันกำลังมองหาทางเลือกในการให้รหัสผ่านไม่รวมไฟล์รหัสผ่าน
Benjamin

คำตอบ:


17

ใน MySQL รุ่นล่าสุดของ MySQL คือเวอร์ชัน 5.6คุณสามารถทำได้ผ่านคำสั่ง mysql_config_editor ดังที่อธิบายไว้ในhttp://dev.mysql.com/doc/refman/5.6/th/mysql-config-editor.html

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

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

คุณเขียนแทน:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

ดังนั้นหลีกเลี่ยงการใส่รหัสผ่านของคุณในสคริปต์บางส่วนใน cleartext

เพื่อให้สิ่งนี้ใช้งานได้คุณต้องกำหนด (ครั้งเดียวเท่านั้น) myhostaliasว่า:

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

คุณสามารถใช้เส้นทางเข้าสู่ระบบที่แตกต่างกันสำหรับบัญชีและ / หรือโฮสต์ที่แตกต่างกันตามที่คุณต้องการ ความคิดที่ดีงามถ้าคุณถามฉัน

เป็นบันทึกผมเชื่อว่าการทำงานนี้ไม่ไม่อยู่ในรุ่นใด ๆ ดังต่อไปนี้ 5.6


หมายเหตุ: ฉันทราบดีว่า mysql_config_editor สร้างไฟล์รหัสผ่านภายนอกจริง ๆ แต่สิ่งนี้ไม่ได้ดำเนินการโดยคุณวิธีการทำงานของระบบดังนั้นจึงไม่มีคู่มือ en / de / crypting ที่จะต้องทำโดยคุณ
Tuncay Göncüoğlu

ขอบคุณฉันใช้ MySQL 5.6 ดังนั้นนี่ไม่ใช่ปัญหา ที่กล่าวว่าวิธีการของคุณยังคงมีปัญหา (อย่างน้อยกับวิธีการทำงานของเราในปัจจุบัน) เพราะฉันต้องการใช้รหัสผ่านจากไฟล์กำหนดค่า PHP แบบเรียลไทม์และส่งผ่านไปยังบรรทัดคำสั่งแบบไดนามิก ด้วยสิ่งที่คุณแนะนำฉันจะยังคงต้องใช้รหัสผ่านในบรรทัดคำสั่งเมื่อโทรmysql_config_editorดังนั้นจึงไม่ทำให้เกิดค่ามากขึ้น ฉันยังพยายามหลีกเลี่ยงการให้นักพัฒนาทำด้วยตนเองดังนั้นจึงต้องดูแลไฟล์ PHP config และ mysql ไว้ด้วย
Benjamin

ทางออกที่ดีที่สุดของฉันน่าจะเพิกเฉยต่อคำเตือนในตอนนี้ ฉันสงสัยจริงๆว่ามีปัญหาด้านความปลอดภัยหรือไม่: เพราะมันถูกเรียกจาก PHP ฉันเดาว่าบรรทัดคำสั่งไม่ได้ถูกเก็บไว้ในประวัติทุบตีหรือที่อื่นใดในเครื่อง?
Benjamin

ไม่ให้ความรู้ของฉันไม่ประวัติศาสตร์ทุบตีไม่ได้เก็บไว้ อย่างไรก็ตามรหัสผ่านที่อยู่ในรูปแบบธรรมดาในไฟล์ php config มีความเสี่ยงที่เหมือนกันเพียงในรูปแบบอื่น บางทีคุณอาจต้องการเก็บรหัสผ่านโดยใช้ mysql_config_editor และเก็บเส้นทางการเข้าสู่ระบบในไฟล์กำหนดค่า php ของคุณ? ด้วยวิธีนี้คุณจะไม่เปิดเผยรหัสผ่านของคุณทุกที่ (แต่ยังจะต้องรักษารหัสผ่านภายนอก)
Tuncay Göncüoğlu

9

ใช้ตัวเลือก--defaults-fileหรือ --defaults-extra-fileคุณสามารถระบุรหัสผู้ใช้และรหัสผ่านได้ /etc/my.cnfมันมีรูปแบบเดียวกับ

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


1
ฉันไม่ได้ต่อต้านไฟล์รหัสผ่านเพื่อเหตุผลด้านความปลอดภัยเป็นเพียงแค่ข้อมูลรับรอง MySQL เป็นส่วนหนึ่งของการกำหนดค่าทั่วโลกในแอปพลิเคชัน PHP (ใช้สำหรับการเชื่อมต่อ PDO เช่นกัน) และการทำเช่นนั้นจะหมายถึงการสร้างไฟล์รหัสผ่านชั่วคราว เพื่อประโยชน์ในการใช้งานบรรทัดคำสั่ง mysql ตลอดอายุการใช้งานของสคริปต์ (ไม่กี่วินาที)
เบนจามิน

วิธีการทำเช่นนี้ใน Windows Server 2012 ไฟล์กำหนดค่าที่มีตัวเลือก --defaults-file อยู่ที่ไหน
Jake

คุณเพียงระบุไฟล์เป็นตัวเลือกสำหรับ --defaults-file ดังใน:mysql --defaults-file c:\some\dirs\my.cnf
lsd

@Benjamin ดังนั้นหากไม่ใช่เรื่องความปลอดภัยให้พิมพ์รหัสผ่านในบรรทัดคำสั่ง เกิดอะไรขึ้นกับการทำเช่นนั้น (นอกเหนือจากความปลอดภัย)
Pacerier

@Benjamin ถ้าคุณใช้ MySQL จาก PHP อยู่แล้วทำไมคุณถึงฟอร์กเกอร์mysqlไคลเอ็นต์คอนโซล?
Josip Rodin

5

คุณมี 4 ตัวเลือกต่อhttp://dev.mysql.com/doc/refman/5.1/en/password-security-user.html

  • ใช้-pyour_passหรือ--password=your_passตัวเลือกในบรรทัดคำสั่ง
  • ใช้ตัวเลือก-pหรือ--passwordบนบรรทัดคำสั่งโดยไม่ได้ระบุค่ารหัสผ่าน ในกรณีนี้โปรแกรมไคลเอนต์ร้องขอรหัสผ่านแบบโต้ตอบ:
  • เก็บรหัสผ่านของคุณในไฟล์ตัวเลือก
  • เก็บรหัสผ่านของคุณในMYSQL_PWDตัวแปรสภาพแวดล้อม

สำหรับความต้องการของคุณMYSQL_PWDอาจเป็นตัวเลือก แต่ไม่มีความปลอดภัยมากขึ้น จริงๆแล้วคุณควรวางไข่กระบวนการโต้ตอบด้วย--passwordและส่งรหัสผ่านแบบโต้ตอบ แต่นั่นค่อนข้างซับซ้อนของการแก้ปัญหาสำหรับปัญหานี้


1
MYSQL_PWD จะปลอดภัยน้อยกว่าแล้วบรรทัดคำสั่ง? PW ไม่เคยปรากฏในรายการกระบวนการซึ่งดูเหมือนจะเป็นข้อกังวลหลัก
TheLQ

1
แน่นอนมันทำ man psมี-E Display the environment as well. จาก url ฉันเชื่อมโยงกับ: วิธีการระบุรหัสผ่าน MySQL ของคุณจะต้องถือว่าไม่ปลอดภัยอย่างยิ่งและไม่ควรใช้ ps บางเวอร์ชันมีตัวเลือกเพื่อแสดงสภาพแวดล้อมของกระบวนการทำงาน ในบางระบบหากคุณตั้งค่า MYSQL_PWD รหัสผ่านของคุณจะถูกเปิดเผยต่อผู้ใช้อื่น ๆ ที่รัน ps แม้แต่ในระบบที่ไม่มี ps เวอร์ชันดังกล่าวก็ยังไม่ฉลาดที่จะสมมติว่าไม่มีวิธีอื่นที่ผู้ใช้สามารถตรวจสอบสภาพแวดล้อมของกระบวนการได้
RS

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

@kormoc โปรดอธิบายอย่างละเอียดในย่อหน้าสุดท้าย คำตอบที่ซับซ้อนที่คุณพูดถึงคืออะไร?
Pacerier

1
ดูเหมือนว่าการใช้ตัวแปรสภาพแวดล้อมมีความปลอดภัยมากกว่าบรรทัดคำสั่ง บนระบบเดเบียนเริ่มต้นคุณสามารถทำpsและดูอาร์กิวเมนต์บรรทัดคำสั่งสำหรับทุกกระบวนการของผู้ใช้ทุกคน แต่ps eจะแสดงสภาพแวดล้อมสำหรับกระบวนการของคุณเท่านั้น (ยกเว้นกรณีที่คุณรูทแน่นอน) มันปลอดภัยเพียงเล็กน้อยเท่านั้น แต่ก็ยังปลอดภัยมากกว่า
jlh

4

หากสคริปต์ PHP ของคุณมีการเชื่อมต่อฐานข้อมูลแบบเปิดอยู่ทำไมคุณไม่ใช้เพียงmysqli_multi_query()นำเข้าไฟล์. sql หากไวยากรณ์ของไฟล์. sql ถูกต้องแน่นอน ...


ฉันไม่แน่ใจว่าวิธีการที่ดีที่จะทำงานกับไฟล์. sql ที่ค่อนข้างใหญ่
Benjamin

1
@Benjamin ฉันคิดว่าไม่แย่ไปกว่าไคลเอนต์ MySQL - ถ้าคุณกังวลเกี่ยวกับความปลอดภัยจริง ๆ แต่นี่เป็นวิธีที่แฮ็กน้อยที่สุดที่จะไปเกี่ยวกับมันและขนาดเป็นปัญหาที่คุณสามารถแก้ไขได้หลายวิธี
voretaq7

คุณรู้หรือไม่ว่ามันเป็นไปได้กับ PDO?
เบนจามิน

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