Chạy kết xuất mysql trong một công việc định kỳ mà không để lộ mật khẩu


11

tôi muốn chạy

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

trong một công việc định kỳ. Làm thế nào tôi có thể làm như vậy một cách an toàn?

Tôi biết tôi có thể đặt lệnh ngay tại đó, nhưng bất kỳ ai có quyền truy cập vào máy sẽ thấy ngay lập tức thông qua crontab. Có cách nào tốt hơn để làm điều đó?


1
Ví dụ của bạn không chính xác, nó phải là -pP4SSw0rd không có khoảng trắng.
Simon Woodside

Câu trả lời:


14

Như đã nêu trong man mysqldump: xem 6.1.2.1. Nguyên tắc người dùng cuối về bảo mật mật khẩu trong hướng dẫn tham khảo MySQL.

Một tập tin tùy chọn là đặt cược an toàn nhất, không nhất thiết theo tham chiếu ở trên. Cung cấp nó trong bản rõ trong crontab là không tốt, nhất là vì dòng lệnh quy trình theo mặc định được hiển thị thông qua pscho người dùng khác. Điều tương tự thực sự áp dụng cho các biến môi trường như được giải thích trong tài liệu tham khảo.

Phần có liên quan của tài liệu tham khảo MySQL:

Lưu mật khẩu của bạn trong một tập tin tùy chọn. Ví dụ: trên Unix, bạn có thể liệt kê mật khẩu của mình trong [client]phần của .my.cnftệp trong thư mục chính của bạn:

[client]
password=your_pass

Để giữ mật khẩu an toàn, không nên truy cập tệp cho bất kỳ ai trừ chính bạn. Để đảm bảo điều này, hãy đặt chế độ truy cập tệp thành 400hoặc 600. Ví dụ:

shell> chmod 600 .my.cnf

Để đặt tên từ dòng lệnh một tệp tùy chọn cụ thể có chứa mật khẩu, hãy sử dụng --defaults-file=file_nametùy chọn, trong đó file_nametên đường dẫn đầy đủ đến tệp. Ví dụ:

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

Mục 4.2.3.3, sử dụng tập tin tùy chọn, tập trung thảo luận về các tập tin tùy chọn chi tiết hơn.

Xem thêm /programming//q/10725209 .


Có vẻ như lệnh ps làm xáo trộn mật khẩu với một x: ps: mysqldump -uroot -px xx mydb. Tôi không nói rằng đó là một sự bảo vệ tốt (nếu bạn nhập công việc, thì mật khẩu sẽ được tiết lộ bằng văn bản thuần túy).
ling

4

Chạy cronjob như một người dùng cụ thể và sử dụng một số logic Bash đơn giản để trích xuất mật khẩu từ tệp văn bản gốc được lưu trữ ở đâu đó trên hệ thống với các quyền chỉ cho phép người dùng (hoặc có thể nhóm) truy cập vào nó.

PASS=`cat /path/to/pwdfile`

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

Vì vậy, nếu cronjob chạy dưới dạng 'ví dụ' của người dùng, quyền sở hữu tệp phải là "ví dụ: ví dụ" và được phép 0400.

Bạn cũng có thể đạt được một chức năng tương tự bằng cách sử dụng .my.cnf cấp người dùng .


1
read PASS < /path/to/pwdfilelà một trình dọn dẹp thành ngữ để làm điều tương tự (có thể đoán là tôi đoán; superuser.com/q/323060/49184 áp dụng).
Daniel Andersson

* "là AN CÁCH sạch hơn thành ngữ" ... Mất chỉnh sửa.
Daniel Andersson

Một người thậm chí có hiểu biết cơ bản nhất về Bash sẽ có thể thấy những gì đang xảy ra với con mèo đó. :)
Garrett

1
Đúng, tôi thậm chí sẽ nói đó là cách phổ biến nhất để làm điều đó, nhưng nó vẫn còn một chút chướng mắt :-). Nếu người ta tạo cho UUOC một thói quen, nó sẽ cắn khi tệp lớn hơn ARGMAX, nó cần một quá trình bổ sung thay vì sử dụng trình bao có sẵn, nó có thể cám dỗ các cấu trúc như for i in `cat file`; do ...với các vấn đề riêng của nó, v.v. Nhưng tất nhiên, như với hầu hết mọi thứ: nếu một người biết những gì đang xảy ra, người ta có thể tự do làm như người ta chọn. Tôi không tham gia một cuộc thập tự chinh ở đây, bất kể nó có thể xuất hiện như thế nào :-D.
Daniel Andersson

0

Bất cứ ai có quyền truy cập vào máy đều có cùng mức truy cập /var/spool/cron/crontabs/như /var/lib/mysqlbạn cho phép họ có. Vì vậy, thiết lập các quyền thích hợp trên các thư mục và thực hiện. Bất cứ ai có quyền truy cập root đều có quyền truy cập trực tiếp vào các tệp cơ sở dữ liệu. Bất cứ ai bạn không tin tưởng có quyền truy cập vào máy đều không nên có quyền truy cập vào máy.

Thông thường mọi người chỉ nhìn thấy cronjobs của riêng họ thông qua crontab -l.


0

Đối với mục đích sao lưu, hãy xem xét việc có một người dùng chỉ đọc trong mysql, như vậy

CREATE USER bUser IDENTIFIED BY 'p4ss';

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

mysqldump chỉ yêu cầu SELECTLOCK TABLESđặc quyền để thực hiện công việc của mình.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.