Trong Puppet, tôi sẽ bảo mật biến mật khẩu như thế nào (trong trường hợp này là mật khẩu MySQL)?


13

Tôi đang sử dụng Puppet để cung cấp cho MySQL một lớp được tham số hóa:

class mysql::server( $password ) {

        package { 'mysql-server': ensure => installed }
        package { 'mysql': ensure => installed }

        service { 'mysqld':
                enable => true,
                ensure => running,
                require => Package['mysql-server'],
        }

        exec { 'set-mysql-password':
                unless => "mysqladmin -uroot -p$password status",
                path => ['/bin', '/usr/bin'],
                command => "mysqladmin -uroot password $password",
                require => Service['mysqld'],
        }
}

Làm thế nào tôi có thể bảo vệ $password? Hiện tại, tôi đã xóa quyền mặc định có thể đọc được khỏi tệp định nghĩa nút và rõ ràng đã cấp puppetquyền đọc qua ACL.

Tôi cho rằng những người khác đã gặp phải một tình huống tương tự vì vậy có lẽ có một thực tiễn tốt hơn.

Câu trả lời:


3

Khi làm việc với Puppet và MySQL, tôi có xu hướng đặt mật khẩu gốc vào /root/.my.cnf, khóa tệp này và sau đó hạn chế quyền truy cập SSH vào máy chủ cơ sở dữ liệu.

Có, lưu trữ mật khẩu gốc trên máy chủ db trong văn bản rõ ràng không phải là giải pháp an toàn nhất. Tuy nhiên, nếu bạn viết mật khẩu gốc mysql trong tệp này, việc bảo mật tài khoản gốc mysql để cho phép đăng nhập từ localhost sẽ giúp mật khẩu không bị rối và cũng nằm ngoài psbảng danh sách quy trình .

Ngoài ra, nếu ai đó có quyền truy cập root để đọc tệp tại /root/.my.cnf, thì có lẽ họ cũng có quyền truy cập để dừng daemon MySQL cục bộ và khởi động lại daemon mà không cần bảng người dùng để có quyền truy cập ngay vào cơ sở dữ liệu.


2
Sử dụng mysql_config_editor nếu trên mysql 5.6 trở lên. Sau đó, ít nhất mật khẩu sẽ không ở dạng văn bản đơn giản.
Kejau Touray

1

Một số người khác có thể chỉ ra một số trình cắm hoặc tương tự sửa lỗi cho tôi, nhưng cách chung để thực hiện điều này là lưu trữ mật khẩu được mã hóa , không phải mật khẩu văn bản đơn giản.

Tuy nhiên, tôi có thể nói với bạn ngay bây giờ, MySQL không cho phép bạn sử dụng mật khẩu được mã hóa - nếu không, đó sẽ là mật khẩu và hàm băm sẽ cho phép bạn đăng nhập bằng mọi cách.

Có rất nhiều "hack" xung quanh cho phép bạn sử dụng các tiện ích của bên thứ ba như Hiera và GPG . Rõ ràng, bạn có thể tự cuộn - nhưng ngay cả danh sách gửi thư của Puppet cũng gợi ý phương pháp này .


1

Bạn đã không chỉ định người mà bạn đang bảo vệ mật khẩu này. Tôi sẽ giả sử đó là các hệ thống quản trị hệ thống khác hoặc có thể là các nhà phát triển có quyền truy cập vào chủ rối và / hoặc các hộp khách nhưng không cần biết mật khẩu gốc.

Để đặt mật khẩu ban đầu, bạn có thể sử dụng cú pháp này:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6DF1FC54F0CCD999F55D59D3D88526878230C77C' WITH GRANT OPTION;

Điều này sẽ cho phép bạn lưu trữ một mật khẩu được mã hóa trong cấu hình con rối của bạn thay vì mật khẩu.

Để sử dụng mysqladminmysqlứng dụng khách trên dòng lệnh, cách tốt nhất tôi có thể nghĩ đến là thêm một .my.cnftệp vào cấu hình con rối của bạn được triển khai vào thư mục chính của người dùng thích hợp. Các tập tin cả trong chủ rối và trên máy khách phải có quyền truy cập tệp hạn chế, phù hợp.

Có rất nhiều cách xung quanh các quyền của tệp khi bạn thêm con rối vào hỗn hợp (chẳng hạn như viết tệp exec () kéo tệp từ máy khách) nhưng dường như đó là một cải tiến trong việc lưu trữ mật khẩu trong tệp có thể đọc được trên thế giới. Điều này sẽ khó khăn hơn nếu bạn sử dụng một hệ thống phiên bản cho cấu hình con rối của bạn.


1
Nhưng nếu ai đó lấy lại mật khẩu được mã hóa, họ không thể sử dụng chuỗi được mã hóa để đăng nhập?
Andrew M.

@Redmumba Tất cả các thử nghiệm của tôi dường như chỉ ra như vậy. Có lẽ tôi đang thiếu một cái gì đó mà Ladadadada có thể giải thích.
Belmin Fernandez

3
Không. Khi bạn sử dụng IDENTIFIED BY PASSWORD '*HASH-HERE'thay vì IDENTIFIED BY 'PASSWORD-HERE'MySQL chèn băm trực tiếp vào userbảng. Sau đó, bạn phải sử dụng mật khẩu đã tạo ra hàm băm đó để đăng nhập. Bạn có thể thấy lệnh cấp của bạn với hàm băm mật khẩu sẽ như thế nào bằng cách đăng nhập bình thường và gõ SHOW GRANTS;. Bạn cũng có thể kiểm tra những người dùng khác vớiSHOW GRANTS FOR user@host;
Ladadadada

Ah, vì vậy bạn không thể sử dụng chính hàm băm để đăng nhập, tôi thấy. Tuy nhiên, nếu anh ta có một khách hàng cần kết nối với cơ sở dữ liệu - giả sử, mặt trước của anh ta - anh ta cũng sẽ cần một cách lưu trữ mật khẩu được mã hóa, đó là thức ăn để suy nghĩ.
Andrew M.

0

Liên kết này gợi ý hai phương pháp: sử dụng các biến môi trường và sử dụng lớp con.

Tôi nghĩ bạn cũng có thể tạo một trình bao bọc đơn giản xung quanh lệnh của bạn mysqladminvà chuyển mật khẩu được mã hóa của bạn cho nó. Trình bao bọc này sau đó sẽ giải mã mật khẩu và chuyển nó đến mysqladmin. Bạn cần bảo vệ trình bao bọc của mình vì nó chứa phần giải mã.

Bạn có thể chọn cách bạn cảm thấy an toàn hơn dựa trên môi trường của bạn và người có quyền truy cập vào hệ thống của bạn.

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.