การใช้ mysqldump ในงาน cron โดยไม่มีรหัสผ่านรูต


14

หากฉันเข้าสู่ระบบด้วยรหัสผ่านรูทในกล่องฉันสามารถพิมพ์ได้

mysqldump - ทั้งหมด - ฐานข้อมูลและฉันจะได้รับ "การถ่ายโอนข้อมูล" ที่คาดไว้

ฉันตั้งค่างานใน cron.daily ให้เรียกใช้และถ่ายโอนข้อมูลนี้ไปยังไดรฟ์สำรอง ปัญหาที่ฉันมีคือแม้ว่าผู้ใช้ที่ทำงานเป็น root ฉันได้รับข้อความต่อไปนี้

mysqldump: มีข้อผิดพลาด: 1045: การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'root' @ 'localhost' (ใช้รหัสผ่าน: NO)

เมื่อพยายามเชื่อมต่อ ฉันไม่ต้องการรหัสยากรหัสผ่าน root ของฐานข้อมูล mysql ในสคริปต์ (ใครจะ)

เมื่อพิจารณาว่าฉันสามารถพิมพ์ "mysqldump" ที่บรรทัดคำสั่งในเชลล์ bash ของฉันจะต้องมีอีกวิธีที่จะได้รับการใช้พารามิเตอร์ -u ฉันมี #! / bin / bash ที่ด้านบนของสคริปต์

ฉันหายไปที่นี่เพื่อขอสิ่งนี้เพื่อไม่ขอรหัสผ่านรูทไปยังฐานข้อมูลได้อย่างไร

คำตอบ:


12

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

แน่นอนว่าไม่ควรใช้ตัวเลือกไม่มีรหัสผ่านบรรทัดคำสั่ง pass-by นั้นไม่ดีนักเพราะทุกคนที่สามารถเรียกใช้ ps อาจเห็นบรรทัดคำสั่ง

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

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

อัปเดต (2016-06-29) หากคุณใช้ mysql 5.6.6 ขึ้นไปคุณควรดูเครื่องมือmysql_config_editorที่ให้คุณจัดเก็บข้อมูลประจำตัวในไฟล์ที่เข้ารหัส ขอบคุณGiovanni ที่พูดถึงสิ่งนี้กับฉัน


1
วิธีการนั้นยังต้องใช้รหัสผ่านที่ไม่ได้เข้ารหัสในข้อความธรรมดาที่จะอยู่ในระบบ นั่นคือสิ่งที่ฉันพยายามหลีกเลี่ยง
Mech Software

> คุณไม่มีชุดรหัสผ่านรูทหรือคุณมีไฟล์กำหนดค่าที่สคริปต์ของคุณไม่พบ ผู้เขียนระบุอย่างชัดเจนว่ามีรหัสผ่าน mysql สำหรับรูทและเขาพยายามเข้าถึงฐานข้อมูลโดยไม่ต้องส่งไปยังคำสั่ง mysqldump: "(ใช้รหัสผ่าน: NO)" ดังนั้นการเข้าถึงถูกปฏิเสธข้อผิดพลาด
monomyth

1
@monomyth ผู้เขียนยังระบุว่าเขาสามารถเข้าสู่ระบบได้โดยไม่ต้องใช้รหัสผ่านในขณะที่เข้าสู่ระบบเป็นโต้ตอบ สิ่งนี้บอกฉันบางสิ่งที่ไม่ถูกต้อง
Zoredache

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

1
เหตุผลที่ฉันสามารถเข้าสู่ระบบได้เพราะบัญชีรูทมี. my.cnf ระบุไว้ด้วย 600 สิทธิ์ดังนั้นนั่นคือวิธีที่เชลล์เข้าถึง cron แต่จะต้องละเว้นไฟล์ดังนั้นฉันใช้พารามิเตอร์ในโพสต์นี้เพื่อชี้ไปที่มัน
Mech Software

3

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

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

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


1
ฉันเดาว่าสิ่งที่ฉันยังไม่เข้าใจคือถ้าฉันสามารถพิมพ์ (จากรูทพรอมต์) mysqldump ที่ไม่มีการป้อนรหัสผ่านทำไมฉันไม่สามารถเรียกใช้งาน cron ด้วยวิธีเดียวกันได้ ส่วนใดหายไปที่ต้องใช้พารามิเตอร์ -p ฉันไม่ได้พยายามที่จะ "คลุมเครือ" รหัสผ่านฉันแค่อยากจะไม่ใส่มัน มีบางสิ่งบางอย่างในการล็อกอินรูทที่อนุญาตให้เข้าถึงดังนั้นทำไมจึงไม่สามารถทำซ้ำกับ cron ได้
Mech Software

หากคุณเห็นว่าคุณสามารถเข้าสู่ระบบได้โดยไม่ต้องใช้รหัสผ่านและด้วยรหัสผ่านโดยใช้ผู้ใช้ "root" คนเดียวกันอาจเป็นไปได้ว่ามีผู้ใช้รูทหลายคนในฐานข้อมูล mysql ของคุณ บางคนอาจไม่ได้ตั้งรหัสผ่าน คุณสามารถลบรหัสผ่านจาก 'root' @ 'localhost' แต่ไม่เพียง cron จะสามารถเชื่อมต่อกับฐานข้อมูลของคุณ แต่ทุกคนที่มีบัญชีท้องถิ่น สิ่งนี้ไม่แตกต่างกัน (หรือแย่กว่า) กว่ามีรหัสผ่านในสคริปต์ข้อความที่ชัดเจน
monomyth

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

2

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

Cron ไม่มีสินค้าฟุ่มเฟือยเช่นนี้ เมื่อมันเข้าสู่ระบบ (เป็น root) มันจะเข้าสู่ระบบด้วยเปลือกเริ่มต้น สิ่งนี้ป้องกันไม่ให้ใครก็ตามเข้าสู่ระบบจากระยะไกล แต่ก็หมายความว่าไม่มีสคริปต์การเข้าสู่ระบบอัตโนมัติที่ทำงานอยู่

คุณสามารถตั้งค่าเชลล์สำหรับ cron ให้ทำงานภายใต้แก้ไข crontab และเพิ่มตัวแปร SHELL และ HOME เช่น

SHELL=/bin/bash
HOME=/root

หากไม่ได้ตั้งค่าสิ่งเหล่านี้ cron จะรันด้วยเชลล์และโฮมไดเร็กทอรีที่ระบุใน / etc / passwd (ซึ่งอาจไม่มีอะไรที่เป็นไปได้ / bin / sh)

หากคุณต้องการเห็นสภาพแวดล้อม cron กำลังทำงานอยู่ให้เพิ่มงาน cron ที่ส่งออก env ไปยังไฟล์เช่น:

$crontab -e
* * * * * env > /tmp/crontabenv.log
:wq

1

หากสคริปต์รันโดยรูทคุณสามารถสร้างไฟล์/root/.my.cnfด้วยการอนุญาต 600 และเนื้อหาต่อไปนี้:

[client]
user = DBUSERNAME
password = DBPASSWORD

(ที่คุณป้อนชื่อผู้ใช้และรหัสผ่าน MySQL ของคุณแน่นอน)

ไฟล์นี้จะถูกอ่านโดยอัตโนมัติโดยเครื่องมือบรรทัดคำสั่ง mysql ใด ๆ หากมีการเรียกใช้เป็นรูท ไม่จำเป็นต้องระบุไว้ใน command-line อีกต่อไป การอนุญาต 600 ครั้งช่วยป้องกันไม่ให้บุคคลอื่นแอบดู


1
ฉันพบว่านี่เป็นกรณีของวิธีที่ฉันสามารถให้เรา mysqldump โดยไม่ต้องใช้รหัสผ่าน ดังนั้นสิ่งนี้จึงแก้ไขความลึกลับของการที่ SHELL ทำมันได้อย่างไรทำไม cron ถึงไม่อ่านมัน?
Mech Software

1
mysqldump เมื่อเรียกใช้จาก cron อาจไม่สามารถค้นหาไฟล์. my.cnf วิธีแก้ไขคือการเพิ่มพารามิเตอร์ mysqldump เพื่ออ่านตัวเลือกในไฟล์ the.my.cnf อย่างชัดเจนนั่นคือ --defaults-extra-file = / root / .my.cnf ฉันได้เรียนรู้สิ่งนี้จากคำตอบสองคำใน Stack Overflow ดูstackoverflow.com/a/602054/854680และstackoverflow.com/a/890554/854680
MikeOnline

1

Cron สามารถทำลายการดีบักได้อย่างมาก เมื่องาน cron ดำเนินการพวกเขาจะไม่มีชุดสภาพแวดล้อมเหมือนที่คุณให้สิทธิ์กับเชลล์

เคล็ดลับสำหรับ cron:

  • ใช้เส้นทางแบบเต็มเพื่อทุกอย่าง - "ECHO = / bin / echo" ฯลฯ : (กำหนดตัวแปรที่ด้านบนเพื่อทำให้ง่ายขึ้น)
  • ตั้งค่า MAILTO เพื่อให้คุณได้รับอีเมลจากแต่ละงาน (หรือให้งานเปลี่ยนเส้นทาง stderr / stdout เป็นไฟล์)

หากผู้ใช้รูทของคุณสามารถทำได้จากเชลล์คุณสามารถใช้ cron ได้ ตรวจสอบให้แน่ใจว่าคุณระบุไฟล์กำหนดค่าที่จะใช้อย่างชัดเจนในบรรทัดคำสั่ง


0

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

สิ่งที่อาจเป็นตัวเลือกที่มีประโยชน์ (อาจมีอยู่แล้ว) กับ mysqld จะอนุญาตให้โปรแกรมไคลเอนต์เช่น mysql หรือ mysqldump ฯลฯ ทำงานเป็นยูนิกซ์รูทเพื่อเข้าถึงรูทของ localq @ localhost โดยไม่ต้องใช้รหัสผ่านโดยไม่ต้องเก็บรหัสผ่านของ root @ localhost ในไฟล์ my.cnf หรือคล้ายกัน

ฉันรู้ว่ามันทำให้กังวล แต่เหตุผลก็คือทุกคนที่ทำงานในท้องถิ่น (ไปยังเซิร์ฟเวอร์ mysqld) unix root สามารถบายพาสความปลอดภัยของ mysqld ได้โดยง่าย และการมี my.cnf ด้วยรหัสผ่าน root mysqld 7x24 หรือแม้แต่การสร้าง / ลบ my.cnf ด้วยรหัสผ่าน root ของ mysql (รหัสผ่านนั้นมาจากไหน?) ได้อย่างรวดเร็ว (เช่นการทำ mysqldump) ทำให้ฉันกังวล

มันจะต้องมีโครงสร้างพื้นฐานและการคิดเพราะต้องเชื่อถือ mysql / mysqldump / etc เพื่อส่งไปยัง mysqld จริง ๆ แล้วเชื่อว่ามันถูกเรียกใช้โดยบัญชีรูทยูนิกซ์

แต่ตัวอย่างเช่นการ จำกัด ให้กับซ็อกเก็ตยูนิกซ์ของ mysqld เท่านั้นไม่มี TCP สามารถช่วยได้อย่างน้อยก็เป็นตัวเลือกที่แนะนำอย่างยิ่งของตัวเลือกนี้ ที่สามารถพิสูจน์ได้ว่าลูกค้ากำลังทำงานอยู่ภายในเครื่องที่อาจไม่เพียงพอ แต่มันอาจเป็นการเริ่มต้นของความคิด บางทีการส่งคำอธิบายไฟล์ไปยังซ็อกเก็ตยูนิกซ์อาจเป็นอีกส่วนหนึ่ง (google ถ้าหากฟังดูเหมือนคำพูดบ้า)

PS ไม่ฉันจะไม่พยายามระดมสมองที่นี่ว่าสิ่งใดบ้างที่อาจทำงานบนระบบปฏิบัติการที่ไม่ใช่ยูนิกซ์แม้ว่าแนวคิดนี้จะแปลไปเป็นระบบปฏิบัติการอื่น


1
ใส่ข้อมูลประจำตัว/root/.my.cnfด้วยสิทธิ์ที่เหมาะสมในการแก้ไขปัญหาอย่างเรียบร้อย
Michael Hampton

ฉันไม่เห็นด้วยตอนนี้ทุกคนที่สามารถเข้าถึงไฟล์นั้นรวมถึงข้อบกพร่องของระบบอื่น ๆ มี mysql root pw และมีการโจมตีตลอด 24x7 และในตำแหน่งไฟล์คงที่ (ยอมรับได้ว่ามันไม่จำเป็นต้องอยู่ใน / รูท) แต่ตัวอย่างเช่นใครก็ตามที่เรียกใช้ระบบไฟล์ทิ้งหรือสามารถเข้าถึงได้สามารถดึงมันออกมาจาก ไฟล์ดัมพ์ของระบบไฟล์ ในกรณีนี้ดูเหมือนว่าเป็นการล่อลวงให้กับพนักงานที่ไม่พอใจ ฉันคิดว่ามันเป็นเป้าหมายที่สมเหตุสมผลที่ไม่มีรหัสผ่าน cleartext อยู่ในระบบทุกที่
Barry Shein

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

ไม่ข้อเสนอของฉันคือพวกเขาต้องเป็นยูนิกซ์รูทบนเซิร์ฟเวอร์ภายในซึ่งในกรณีที่ mysqld ในพื้นที่เชื่อถือ mysql หรือ mysqldump ฯลฯ (ไคลเอ็นต์) ที่กำลังเรียกใช้เป็นรูทยูนิกซ์และอนุญาตให้พวกเขาดำเนินการราวกับว่าพวกเขาพิสูจน์ . อย่างที่ฉันได้กล่าวไปแล้วว่าถ้าพวกเขายูนิกซ์รูทโลคอลไปยังเซิร์ฟเวอร์พวกเขาสามารถส่งรหัสผ่านรูทของ mysql ไปด้วยคำสั่งที่มีเอกสารที่ดี ("mysql root password recovery")
Barry Shein
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.