ใน Puppet ฉันจะรักษาความปลอดภัยตัวแปรรหัสผ่าน (ในกรณีนี้คือรหัสผ่าน MySQL) ได้อย่างไร


13

ฉันใช้ Puppet เพื่อจัดเตรียม MySQL ด้วยคลาสที่มีพารามิเตอร์:

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'],
        }
}

ฉันจะป้องกันได้$passwordอย่างไร ขณะนี้ฉันลบสิทธิ์การอ่านที่เป็นค่าดีฟอลต์ของโลกออกจากไฟล์นิยามโหนดและให้puppetสิทธิ์การอ่านผ่าน ACL อย่างชัดเจน

ฉันสมมติว่าคนอื่นเจอสถานการณ์ที่คล้ายกันดังนั้นอาจมีวิธีปฏิบัติที่ดีกว่า

คำตอบ:


3

เมื่อทำงานกับ Puppet และ MySQL ฉันมักจะใส่รหัสผ่านรูทใน /root/.my.cnf ล็อคไฟล์นี้ลงแล้ว จำกัด การเข้าถึง SSH บนเซิร์ฟเวอร์ฐานข้อมูล

ใช่การจัดเก็บรหัสผ่านรูทบนเซิร์ฟเวอร์ db เป็นข้อความธรรมดาไม่ใช่วิธีที่ปลอดภัยที่สุด อย่างไรก็ตามหากคุณเขียนรหัสผ่านรูทของ mysql ในไฟล์นี้การรักษาความปลอดภัยบัญชีรูทของ mysql เพื่อให้การเข้าสู่ระบบจาก localhost จะเก็บรหัสผ่านของหุ่นเชิดและนอกpsตารางรายการกระบวนการ

นอกจากนี้หากใครบางคนมีสิทธิ์เข้าถึงรูทเพื่ออ่านไฟล์ที่ /root/.my.cnf พวกเขาอาจจะมีสิทธิ์เข้าถึงเพื่อหยุด MySQL daemon ในเครื่องและรีสตาร์ท daemon โดยไม่มีตารางผู้ใช้เพื่อเข้าถึงรูทฐานข้อมูลทันที


2
ใช้ mysql_config_editor หากใช้ mysql 5.6 ขึ้นไป จากนั้นอย่างน้อยรหัสผ่านจะไม่เป็นข้อความธรรมดา
Kejau Touray

1

มีคนอื่นอาจชี้ให้เห็นปลั๊กอินบางอย่างหรือคล้ายกันที่แก้ไขฉันได้ แต่วิธีทั่วไปในการทำเช่นนี้คือการจัดเก็บรหัสผ่านที่เข้ารหัสไม่ใช่รหัสผ่านข้อความธรรมดา

อย่างไรก็ตามฉันสามารถบอกคุณได้ตอนนี้ว่า MySQL ไม่อนุญาตให้คุณใช้รหัสผ่านที่เข้ารหัส - มิฉะนั้นจะเป็นรหัสผ่านและแฮชจะอนุญาตให้คุณเข้าสู่ระบบได้

มีจำนวนมากของ "แฮ็ก" รอบ ๆ ที่ช่วยให้คุณใช้สาธารณูปโภคของบุคคลที่สามเช่นHiera และจีพีจี เห็นได้ชัดว่าคุณสามารถม้วนของคุณเอง - แต่แม้แต่รายชื่อผู้รับจดหมายของ Puppet ก็แนะนำวิธีนี้


1

คุณไม่ได้ระบุว่าคุณกำลังปกป้องรหัสผ่านนี้จากใคร ฉันจะถือว่ามันคือ sysadmins อื่น ๆ หรือนักพัฒนาที่อาจเข้าถึงต้นแบบหุ่นเชิดและ / หรือกล่องไคลเอนต์ แต่ไม่จำเป็นต้องรู้รหัสผ่านรูท

สำหรับการตั้งรหัสผ่านครั้งแรกคุณสามารถใช้ไวยากรณ์นี้ได้:

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

ซึ่งจะช่วยให้คุณสามารถเก็บรหัสผ่านที่เข้ารหัสไว้ในการกำหนดค่าหุ่นเชิดของคุณแทนที่จะเป็นรหัสธรรมดา

สำหรับการใช้งานmysqladminและmysqlไคลเอนต์บนบรรทัดคำสั่งสิ่งที่ดีที่สุดที่ฉันคิดคือการเพิ่ม.my.cnfไฟล์ลงในการกำหนดค่าหุ่นเชิดของคุณที่ได้รับการปรับใช้ในโฮมไดเรกทอรีของผู้ใช้ที่เหมาะสม ไฟล์ทั้งใน puppet master และบนไคลเอนต์ควรมีสิทธิ์ในการใช้ไฟล์ที่เหมาะสมและ จำกัด

มีหลายวิธีในการอนุญาตไฟล์เหล่านั้นเมื่อคุณเพิ่ม puppet ลงในมิกซ์ (เช่นการเขียน exec () ที่ดึงไฟล์จากไคลเอนต์) แต่ดูเหมือนจะเป็นการปรับปรุงมากกว่าการจัดเก็บรหัสผ่านในไฟล์ที่อ่านได้ทั่วโลก สิ่งนี้จะยากขึ้นหากคุณใช้ระบบการกำหนดรุ่นสำหรับการกำหนดค่าหุ่นกระบอกของคุณ


1
แต่ถ้ามีคนดึงรหัสผ่านที่เข้ารหัสพวกเขาไม่สามารถใช้สตริงที่เข้ารหัสเพื่อเข้าสู่ระบบได้ใช่ไหม
Andrew M.

@ Redmumba การทดสอบของฉันทั้งหมดดูเหมือนว่าจะเป็นเช่นนั้น บางทีฉันอาจพลาดบางสิ่งที่ Ladadadada
Belmin Fernandez

3
ไม่เมื่อคุณใช้IDENTIFIED BY PASSWORD '*HASH-HERE'แทนIDENTIFIED BY 'PASSWORD-HERE'MySQL จะแทรกแฮชลงในuserตารางโดยตรง แล้วคุณจะต้องใช้รหัสผ่านที่สร้างขึ้นที่กัญชาเพื่อเข้าสู่ระบบ. SHOW GRANTS;คุณสามารถมองเห็นสิ่งที่สั่งการให้สิทธิ์ของคุณด้วยรหัสผ่านกัญชาจะมีลักษณะโดยการเข้าสู่ระบบตามปกติและการพิมพ์ คุณสามารถตรวจสอบผู้ใช้รายอื่นด้วยSHOW GRANTS FOR user@host;
Ladadadada

อาดังนั้นคุณไม่สามารถใช้แฮชตัวเองเพื่อเข้าสู่ระบบฉันเห็น อย่างไรก็ตามหากเขามีลูกค้าที่ต้องการเชื่อมต่อกับฐานข้อมูล - พูดว่าส่วนหน้าของเขา - เขาจะต้องมีวิธีการจัดเก็บรหัสผ่านที่เข้ารหัสซึ่งเป็นอาหารสำหรับความคิด
Andrew M.

0

ลิงค์นี้แนะนำสองวิธี: การใช้ตัวแปรสภาพแวดล้อมและการใช้เชลล์ย่อย

ฉันคิดว่าคุณยังสามารถสร้าง wrapper ง่ายๆรอบคำสั่งของคุณmysqladminและส่งรหัสผ่านที่เข้ารหัสของคุณไปยังมัน mysqladminเสื้อคลุมนี้จะถอดรหัสรหัสผ่านและผ่านมันไป คุณต้องปกป้องเสื้อคลุมของคุณเพราะมันมีส่วนถอดรหัส

คุณสามารถเลือกวิธีที่คุณรู้สึกว่าปลอดภัยมากขึ้นตามสภาพแวดล้อมของคุณและผู้ที่สามารถเข้าถึงระบบของคุณได้

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