เรียกใช้การถ่ายโอนข้อมูล mysql ในงาน cron โดยไม่ต้องเปิดเผยรหัสผ่าน


11

ฉันต้องการวิ่ง

mysqldump -u aUser -p P4SSw0rd --all-databases > backup.sql

ในงาน cron ฉันจะทำอย่างปลอดภัยได้อย่างไร

ฉันรู้ว่าฉันสามารถใส่คำสั่งได้ที่นั่น แต่ใครก็ตามที่เข้าถึงเครื่องจะเห็นได้ทันทีผ่าน crontab มีวิธีที่ดีกว่าที่จะทำหรือไม่


1
ตัวอย่างของคุณไม่ถูกต้องควรเป็น -pP4SSw0rd โดยไม่มีที่ว่าง
Simon Woodside

คำตอบ:


14

ตามที่ระบุในman mysqldump: ดู6.1.2.1 แนวทางสำหรับผู้ใช้เพื่อความปลอดภัยของรหัสผ่านในคู่มืออ้างอิง MySQL

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

ส่วนที่เกี่ยวข้องของคู่มืออ้างอิง MySQL:

เก็บรหัสผ่านของคุณในไฟล์ตัวเลือก ตัวอย่างเช่นบน Unix คุณสามารถแสดงรายการรหัสผ่านของคุณใน[client]ส่วนของ.my.cnfไฟล์ในโฮมไดเร็กตอรี่ของคุณ:

[client]
password=your_pass

เพื่อให้รหัสผ่านปลอดภัยใคร ๆ ก็ควรไม่สามารถเข้าถึงไฟล์ได้ยกเว้นตัวคุณเอง เพื่อให้แน่ใจว่านี้ตั้งค่าโหมดการเข้าถึงไฟล์ไปยังหรือ400 600ตัวอย่างเช่น:

shell> chmod 600 .my.cnf

หากต้องการตั้งชื่อจากบรรทัดคำสั่งไฟล์ตัวเลือกเฉพาะที่มีรหัสผ่านให้ใช้--defaults-file=file_nameตัวเลือกโดยที่file_nameชื่อพา ธ แบบเต็มไปยังไฟล์ ตัวอย่างเช่น:

shell> mysql --defaults-file=/home/francis/mysql-opts

ส่วน4.2.3.3,“ การใช้ไฟล์ตัวเลือก” , กล่าวถึงไฟล์ตัวเลือกโดยละเอียด

ยังเห็น/programming//q/10725209


ดูเหมือนว่าคำสั่ง ps ทำให้รหัสผ่านสับสนด้วยหนึ่ง x: ps: mysqldump -uroot -px xx mydb ฉันไม่ได้บอกว่ามันเป็นการป้องกันที่ดีแม้ว่า (ถ้าคุณพิมพ์งานรหัสผ่านจะถูกเปิดเผยเป็นข้อความธรรมดา)
ling

4

รัน cronjob ในฐานะผู้ใช้เฉพาะและใช้ตรรกะ Bash แบบง่าย ๆ เพื่อแยกรหัสผ่านจากไฟล์ข้อความธรรมดาที่เก็บไว้ที่ใดที่หนึ่งในระบบด้วยสิทธิ์ที่อนุญาตให้ผู้ใช้ (หรือกลุ่มอาจ) เข้าถึงเท่านั้น

PASS=`cat /path/to/pwdfile`

 mysqldump -u aUser -p $PASS--all-databases > backup.sql

ดังนั้นหาก cronjob ทำงานเป็น 'ตัวอย่าง' ของผู้ใช้ความเป็นเจ้าของของไฟล์ควรเป็น "example: example" และได้รับอนุญาต 0400

นอกจากนี้คุณยังสามารถใช้ฟังก์ชันที่คล้ายกันโดยใช้. my.cnfระดับผู้ใช้


1
read PASS < /path/to/pwdfileเป็นสิ่งที่สะอาดกว่าปกติในการทำสิ่งเดียวกัน (ฉันเดาว่าใช้ superuser.com/q/323060/49184 )
Daniel Andersson

* "เป็นวิธีที่ใช้ภาษาที่สะอาดกว่า" ... หลงทางในการแก้ไข
Daniel Andersson

คนที่มีความเข้าใจพื้นฐานที่สุดของ Bash ควรจะเห็นว่าเกิดอะไรขึ้นกับแมวตัวนั้น :)
Garrett

1
จริงฉันจะบอกว่ามันเป็นวิธีที่ใช้กันโดยทั่วไปมากที่สุด แต่ก็ยังเป็นเรื่องเล็กน้อย :-) ถ้ามีคนทำUUOCเป็นนิสัยมันจะกัดเมื่อไฟล์มีขนาดใหญ่กว่าARGMAXมันใช้กระบวนการพิเศษแทนการใช้เชลล์ในตัวมันอาจล่อลวงโครงสร้างเช่นfor i in `cat file`; do ...ปัญหาของตัวเองเป็นต้น แต่แน่นอนว่า กับสิ่งต่าง ๆ ส่วนใหญ่: ถ้าใครรู้ว่าเกิดอะไรขึ้นคนหนึ่งมีอิสระที่จะทำตามที่เลือก ฉันไม่ได้อยู่ในสงครามครูเสดที่นี่ไม่ว่ามันจะปรากฏได้อย่างไร :-D
Daniel Andersson

0

ทุกคนที่มีสิทธิ์เข้าถึงเครื่องมีระดับการเข้าถึง/var/spool/cron/crontabs/เหมือนกับที่/var/lib/mysqlคุณอนุญาตให้มี ดังนั้นตั้งค่าสิทธิ์ที่เหมาะสมในไดเรกทอรีและทำ ทุกคนที่มีสิทธิ์เข้าถึงรูทสามารถเข้าถึงไฟล์ฐานข้อมูลได้โดยตรง ใครก็ตามที่คุณไม่ไว้ใจให้เข้าถึงเครื่องควรไม่สามารถเข้าถึงเครื่องได้เลย

โดยปกติคนจะเห็นเพียง cronjobs crontab -lของตัวเองผ่านทาง


0

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

CREATE USER bUser IDENTIFIED BY 'p4ss';

GRANT SELECT ON *.* TO bUser@localhost;
GRANT LOCK TABLES ON *.* TO bUser@localhost;

mysqldumpต้องการเพียงSELECTและLOCK TABLESสิทธิพิเศษในการทำงาน

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