Cách thay thế an toàn để sử dụng mật khẩu MySQL trên dòng lệnh là gì?


35

Chúng tôi có một kịch bản dòng lệnh PHP để phiên bản cơ sở dữ liệu. Chúng tôi chạy tập lệnh này bất cứ khi nào nhà phát triển đã thêm một bản vá cơ sở dữ liệu mới.

Kịch bản chạy bản vá với dòng lệnh MySQL:

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

Tuy nhiên, MySQL 5.6 hiện đưa ra cảnh báo sau:

Cảnh báo: Sử dụng mật khẩu trên giao diện dòng lệnh có thể không an toàn

Điều này rõ ràng là đúng, nhưng có thể hoặc không thể là một vấn đề cho người dùng.

  • Là gì an toàn thay thế sau đó?
  • Ngoài ra, có thể vô hiệu hóa cảnh báo này?

Xin lưu ý rằng tôi không muốn phải dựa vào tệp mật khẩu bên ngoài.


2
Có thông tin đăng nhập của bạn trong một tệp không phải là vấn đề lớn. Nếu một người có quyền root trên máy chủ của bạn, họ hoàn toàn có thể bỏ qua hệ thống xác thực, chỉ bằng cách khởi động lại máy chủ mysql bằng một tùy chọn cụ thể.
Zoredache

Đây không phải là vấn đề tương tự như trong bản sao được kẹp . MySQL không nhắc mật khẩu, tôi đang cung cấp và nó hoạt động tốt. Tôi đang tìm giải pháp thay thế để cung cấp mật khẩu, ngoại trừ tệp mật khẩu.
Benjamin

Câu trả lời:


17

Trong phiên bản GA gần đây của MySQL, tức là phiên bản 5.6 , bạn có thể thực hiện việc này thông qua lệnh mysql_config_editor, như được mô tả trong http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html

Về cơ bản những gì nó làm là: mã hóa thông tin người dùng / thông tin của bạn bằng bí danh máy chủ, sau đó bạn sử dụng bí danh máy chủ, đưa thông tin này vào một tệp cấu hình trong thư mục chính của bạn, và sau đó, khi bạn cần, thay vì làm một cái gì đó như :

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

thay vào đó bạn viết:

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

do đó tránh đặt mật khẩu của bạn vào một số tập lệnh trong văn bản rõ ràng.

Để làm việc này, trước tiên bạn phải (chỉ một lần) xác định myhostaliaslà:

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

Bạn có thể sử dụng các đường dẫn đăng nhập khác nhau cho các tài khoản và / hoặc máy chủ khác nhau tùy thích. Ý tưởng khá tốt nếu bạn hỏi tôi

Lưu ý, tôi tin rằng, chức năng này KHÔNG tồn tại trong bất kỳ phiên bản nào dưới 5.6.


lưu ý: Tôi thực sự nhận ra rằng mysql_config_editor thực sự tạo ra một tệp mật khẩu bên ngoài, tuy nhiên, điều này không phải do bạn thực hiện, đó là cách hệ thống hoạt động, do đó không có en / de / mã hóa thủ công nào được thực hiện bởi bạn.
Tuncay Göncüoğlu

Cảm ơn, tôi đang sử dụng MySQL 5.6 nên đây không phải là vấn đề. Điều đó nói rằng, cách tiếp cận của bạn vẫn có vấn đề (ít nhất là với cách chúng tôi hiện đang làm việc), vì tôi muốn lấy mật khẩu từ tệp cấu hình PHP trong thời gian thực và tự động chuyển nó vào dòng lệnh. Với những gì bạn đề xuất, tôi vẫn sẽ phải sử dụng mật khẩu trên dòng lệnh khi gọi mysql_config_editor, vì vậy nó không mang lại nhiều giá trị hơn. Tôi cũng đang cố gắng tránh việc nhà phát triển thực hiện thủ công, do đó phải duy trì cả tệp cấu hình PHP cấu hình mysql.
Benjamin

Giải pháp tốt nhất của tôi có lẽ là bỏ qua các cảnh báo cho bây giờ. Tôi thực sự tự hỏi liệu có bất kỳ vấn đề bảo mật nào không: bởi vì nó được gọi từ PHP, tôi đoán dòng lệnh không được lưu trong lịch sử bash hoặc bất kỳ nơi nào khác trên máy?
Benjamin

không theo hiểu biết của tôi, không, lịch sử bash không lưu trữ nó. tuy nhiên, mật khẩu nằm trong bản rõ trong tệp cấu hình php mang cùng rủi ro chính xác, chỉ ở dạng khác. có lẽ bạn sẽ thích lưu trữ mật khẩu bằng mysql_config_editor và lưu đường dẫn đăng nhập trong tệp cấu hình php của bạn? Bằng cách đó bạn sẽ không để lộ mật khẩu của mình ở bất cứ đâu. (nhưng vẫn sẽ phải duy trì mật khẩu bên ngoài).
Tuncay Göncüoğlu

9

Sử dụng --defaults-filehoặc --defaults-extra-filetùy chọn. Bạn có thể chỉ định id người dùng và mật khẩu trong đó. Nó có định dạng tương tự như /etc/my.cnf.

Đọc thêm, bạn nói rằng bạn không muốn phải dựa vào tệp mật khẩu bên ngoài, nhưng đó là cách duy nhất thực sự an toàn. Bất cứ điều gì khác sẽ để lại dấu vết trong bảng quy trình hoặc một cái gì đó. Bạn thậm chí có thể đặt tập tin mật khẩu trong kiểm soát phiên bản nếu bạn thực sự muốn. Làm cho nó 600 (hoặc 400) và chỉ có thể đọc được bởi mysql hoặc người dùng mà nó đang chạy.


1
Tôi không chống lại tệp mật khẩu vì lý do bảo mật, chỉ là thông tin đăng nhập MySQL là một phần của cấu hình toàn cầu trong ứng dụng PHP (cũng được sử dụng cho kết nối PDO) và làm như vậy có nghĩa là chỉ tạo một tệp mật khẩu (tạm thời) vì mục đích chạy dòng lệnh mysql trong suốt vòng đời của tập lệnh (vài giây).
Benjamin

Làm thế nào để làm điều này trên Windows Server 2012? Tệp cấu hình chứa tùy chọn --defaults-file ở đâu?
Jake

Bạn chỉ cần chỉ định tệp dưới dạng tùy chọn cho --defaults-file như trong:mysql --defaults-file c:\some\dirs\my.cnf
lsd

@Benjamin, vì vậy nếu không phải là về bảo mật, thì chỉ cần nhập mật khẩu vào dòng lệnh. Có gì sai khi làm điều đó (ngoài bảo mật)?
Pacerier

@Benjamin nếu bạn đã sử dụng MySQL từ PHP, tại sao bạn lại từ chối mysqlmáy khách console?
Josip Rodin

5

Bạn có 4 lựa chọn cho mỗi http://dev.mysql.com/doc/refman/5.1/en/password-security-user.html

  • Sử dụng một -pyour_pass hoặc --password=your_passtùy chọn trên dòng lệnh
  • Sử dụng -p--password tùy chọn hoặc trên dòng lệnh không có giá trị mật khẩu được chỉ định. Trong trường hợp này, chương trình máy khách lấy mật khẩu một cách tương tác:
  • Lưu mật khẩu của bạn trong một tập tin tùy chọn.
  • Lưu mật khẩu của bạn trong MYSQL_PWDbiến môi trường

Đối với nhu cầu của bạn, MYSQL_PWDcó thể là một lựa chọn, nhưng nó không còn an toàn nữa. Thực sự bạn nên sinh ra một quy trình tương tác với --passwordvà gửi mật khẩu tương tác, nhưng đó là một giải pháp khá phức tạp cho vấn đề này.


1
Làm thế nào MYSQL_PWD sẽ kém an toàn hơn dòng lệnh? PW không bao giờ xuất hiện trong danh sách quy trình, dường như là mối quan tâm chính
TheLQ

1
Chắc chắn là có. man ps-E Display the environment as well. Từ url tôi liên kết đến: Phương pháp chỉ định mật khẩu MySQL của bạn phải được coi là cực kỳ không an toàn và không nên được sử dụng. Một số phiên bản của ps bao gồm một tùy chọn để hiển thị môi trường của các tiến trình đang chạy. Trên một số hệ thống, nếu bạn đặt MYSQL_PWD, mật khẩu của bạn sẽ được hiển thị cho bất kỳ người dùng nào khác chạy ps. Ngay cả trên các hệ thống không có phiên bản ps như vậy, sẽ không khôn ngoan khi cho rằng không có phương pháp nào khác mà người dùng có thể kiểm tra môi trường xử lý.
RS

Chọn từ tùy chọn MYSQL_PWD này: Tôi đoán rằng nếu bạn đặt biến môi trường ở đầu một số tập lệnh, sau đó gọi dòng lệnh MySQL, sau đó xóa rằng sau khi kết thúc tập lệnh, bạn có thể giảm tối thiểu thời gian phơi sáng . Điều đó nghe có hợp lý không?
superjos

@kormoc, Xin hãy giải thích về đoạn cuối. Giải pháp khá phức tạp mà bạn đang nói đến là gì?
Pacerier

1
Có vẻ như rằng việc sử dụng các biến môi trường an toàn hơn so với các dòng lệnh. Trên một hệ thống debian mặc định, bạn có thể làm psvà xem đối số dòng lệnh cho mọi quy trình của mọi người dùng. Nhưng ps echỉ hiển thị môi trường cho các quy trình của riêng bạn (trừ khi bạn là root tất nhiên). Nó chỉ an toàn hơn một chút, nhưng nó vẫn an toàn hơn.
jlh

4

Nếu tập lệnh PHP của bạn đã có kết nối cơ sở dữ liệu mở, tại sao bạn không sử dụng mysqli_multi_query()để nhập tệp .sql? Nếu cú ​​pháp của tệp .sql là hợp lệ, tất nhiên ...


Tôi không chắc nó sẽ hoạt động tốt như thế nào với các tệp .sql khá lớn?
Benjamin

1
@Benjamin Tôi tưởng tượng không tệ hơn máy khách MySQL - nếu bạn thực sự quan tâm đến vấn đề bảo mật mặc dù đây sẽ là cách ít rắc rối nhất để giải quyết vấn đề và kích thước là vấn đề bạn có thể giải quyết theo một số cách.
voretaq7

Bạn có biết nếu có thể với PDO không?
Benjamin

PDO dường như không có chức năng tương đương để ném một loạt các truy vấn vào cơ sở dữ liệu cùng một lúc. Lấy làm tiếc. Đó là một ý tưởng ...
Michael Hampton
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.