2012-12-19 18 views
9

Tôi đang chạy một công việc cron thực hiện mysqldump thông qua một tập lệnh PHP, bãi chứa yêu cầu đặc quyền RELOAD. Sử dụng tài khoản quản trị MySQL không cảm thấy đúng, nhưng không tạo ra một người dùng có quyền quản trị.Đặc quyền tải lại MySQL cho mysqldump trong công việc cron PHP: Sử dụng tài khoản quản trị MySQL hoặc tạo người dùng duy nhất? Bảo vệ?

Mối quan tâm chính của tôi là khía cạnh bảo mật, tôi đang tải thuộc tính db (tên người dùng, mật khẩu, v.v.) trong mảng "thuộc tính" được bảo vệ của lớp tôi đang sử dụng.

Tôi tự hỏi cách tiếp cận nào có ý nghĩa hơn hoặc nếu có cách khác để đạt được kết quả tương tự.


Tổng quan:
ĐÈN Server: CentOS 5.8, Apache 2.2.3, MySQL 5.0.95, PHP 5.3.3

Cron công việc phác thảo:

  1. Dump stats liệu dữ liệu từ hai bảng InnoDB trong db trang web, chúng có mối quan hệ khóa ngoại.
  2. Nạp dữ liệu vào bảng trong số liệu thống kê db
  3. Lấy giá trị cuối cùng của khóa chính tự động incrementing đó là chuyển
  4. Sử dụng giá trị khóa chính trong một truy vấn xóa dữ liệu sao chép từ trang web db
  5. Process dữ liệu chuyển trong db số liệu thống kê để cư trú các báo cáo bảng
  6. Khi chế biến xong, xóa các số liệu thống kê dữ liệu thô từ các số liệu thống kê db

Cơ sở dữ liệu trang web được cấu hình làm chủ với ghi nhật ký nhị phân và máy chủ được sao chép sẽ được thiết lập khi dữ liệu thống kê không còn được lưu trữ và xử lý trong cơ sở dữ liệu của trang web nữa (sao chép cơ sở dữ liệu trang web) cơ sở dữ liệu của riêng họ).

Tất cả các tệp được truy cập trong công việc định kỳ đều nằm bên ngoài thư mục DocumentRoot.


Thực chất của vấn gritty:
Các mysqldump thực hiện trong bước đầu tiên đòi hỏi đặc quyền RELOAD, đây là lệnh:

<?php 
$SQL1 = "--no-create-info --routines --triggers --master-data "; 
$SQL1 .= "--single-transaction --quick --add-locks --default-character-set=utf8 "; 
$SQL1 .= "--compress --tables stats_event stats_event_attributes"; 

$OUTPUT_FILENAME = "/var/stats/daily/daily-stats-18.tar.gz"; 

$cmd1 = "/usr/bin/mysqldump -u website_user -pXXXXXX website_db $SQL1 | gzip -9 > $OUTPUT_FILENAME"; 

exec($cmd1); 
?> 

Các thông báo lỗi:

mysqldump: Couldn't execute 'FLUSH TABLES': Access denied; you need the RELOAD privilege for this operation (1227) 

Hoạt động tốt nếu tôi sử dụng các thông tin quản trị mysql.

Trả lời

5

Tôi tự hỏi cách tiếp cận nào có ý nghĩa hơn hoặc nếu có cách khác để đạt được kết quả tương tự.

Điểm mấu chốt là bạn cần người dùng có đặc quyền nhất định để chạy lệnh mysqldump đó.Mặc dù có vẻ ngớ ngẩn khi tạo người dùng mới chỉ cho công việc cron này, đó là cách tiếp cận đơn giản và đơn giản nhất mà bạn có thể thực hiện ít nhất là mang lại sự xuất hiện bên ngoài của lolsecurity.

Cho rằng đây là biện pháp tạm dừng cho đến khi bạn có thể nhân rộng và chạy, không có tác hại thực sự nào được thực hiện ở đây. Làm điều này bằng cách nhân rộng hoàn toàn là cách để đi, và các biện pháp dừng chân có vẻ lành mạnh.

Ngoài ra, khi đến lúc cần sao chép, xtrabackup là bạn của bạn. Nó bao gồm đặt tên đăng nhập nhị phân và thông tin vị trí với ảnh chụp nhanh cần thiết, giúp thiết lập các nô lệ mới là khoe.

+0

Tôi không rõ ràng về bản sao, nó cho cơ sở dữ liệu trang web, chúng tôi muốn giảm số liệu thống kê trước vì chúng chiếm nhiều không gian hơn mọi thứ khác kết hợp và xử lý đôi khi. Chỉ cần lưu các số liệu thống kê của các số liệu thống kê gây ra một chút thời gian xuống của các báo cáo là không quan trọng. Vì vậy, không phải tạm thời. Đoán mối quan tâm của tôi là về an ninh hơn bất cứ điều gì khác, tôi sẽ nhấn mạnh rằng trong câu hỏi. Bất kỳ suy nghĩ về an ninh nói riêng? – codewaggle

+0

Tôi đang giả định rằng điều này không phải là trên lưu trữ được chia sẻ từ ngữ cảnh. Đảm bảo rằng người dùng chỉ có thể kết nối từ (các) máy chủ mong muốn và chọn một mật khẩu an toàn? Có lẽ không có mối đe dọa thực sự ở đây. – Charles

+0

Chỉ là những gì tôi muốn nghe. Chúng tôi sở hữu máy chủ và tôi đã định đặt người dùng thành @localhost, suy nghĩ về việc chuyển số liệu thống kê sang máy chủ khác nhưng localhost sẽ hoạt động ngay bây giờ. – codewaggle

3

Tôi chỉ chạy qua cùng một lỗi này (có thể trên cùng một trang web bạn đang làm việc trên :)), ngay cả khi chạy với tư cách là người dùng root MySQL. Tôi đã xoay xở để thu thập thông tin bằng cách không chỉ định - ổ khóa bổ sung, ví dụ: làm việc này:

/usr/bin/mysqldump -u USERNAME -pPW DATABASE_NAME --skip-lock-tables --single-transaction --flush-logs --hex-blob 
Các vấn đề liên quan