วิธีการส่งรหัสผ่านไปยังบรรทัดคำสั่ง mysql


20

ฉันมีรหัสผ่าน MySQL บันทึกไว้ในไฟล์foo.phpเช่นP455w0rdเมื่อฉันพยายามใช้:

$ cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2 | mysql -U root -p mydb -h friendserver
Enter password: (holds)

$ echo P455w0rd | mysql -u root -p mydb -h friendserver
Enter password: (holds)

ตัวเลือกทั้งสองยังคงถามรหัสผ่านวิธีการที่ถูกต้องในการส่งรหัสผ่านstdinคืออะไร?


3
ต้องไม่เว้นว่างระหว่าง-pและรหัสผ่านของคุณ
FıratKÜÇÜK

mysql ไม่อ่านรหัสผ่านจาก stdin ฉันไม่สามารถคิดได้ว่ามันอ่านอะไรจาก
Omn

คำตอบที่เหมาะสมคือไม่ใส่รหัสผ่านของคุณในบรรทัดคำสั่งที่ทุกคนสามารถเข้าถึง/procนิด ๆ สามารถอ่านได้ตราบเท่าที่โปรแกรมทำงาน นั่นคือสิ่งที่มี~/.my.cnfไว้สำหรับ chmod'ed อย่างถูกต้องถึง 0600
Shadur

คำตอบ:


25

psคุณจะต้องระมัดระวังเป็นอย่างมากวิธีการที่คุณผ่านรหัสผ่านไปยังบรรทัดคำสั่งเป็นถ้าคุณไม่ระวังคุณจะจบลงปล่อยให้มันเปิดให้ดมกลิ่นโดยใช้เครื่องมือเช่น


วิธีที่ปลอดภัยที่สุดในการทำเช่นนี้คือการสร้างไฟล์กำหนดค่าใหม่และส่งต่อไปยังการmysqlใช้ตัวเลือกบรรทัดคำสั่ง--defaults-file=หรือ--defaults-extra-file=

ความแตกต่างระหว่างทั้งสองคือการอ่านหลังนอกเหนือไปจากไฟล์กำหนดค่าเริ่มต้นในขณะที่ก่อนหน้านี้มีเพียงหนึ่งไฟล์ที่ส่งผ่านเป็นอาร์กิวเมนต์ที่ใช้

ไฟล์กำหนดค่าเพิ่มเติมของคุณควรมีสิ่งที่คล้ายกับ:

[client]
user=foo
password=P@55w0rd

ตรวจสอบให้แน่ใจว่าคุณได้รักษาความปลอดภัยไฟล์นี้

จากนั้นเรียกใช้:

mysql --defaults-extra-file=<path to the new config file> [all my other options]

2
MySQL จะแก้ไขargvเพื่อเขียนทับพารามิเตอร์ที่กำหนดให้กับ-pแฟล็ก อย่างน้อยนั่นคือสิ่งที่สรุปไว้ที่นี่พร้อมกับข้อมูลที่เกี่ยวข้องอื่น ๆ : unix.stackexchange.com/questions/78757/ …
Kusalananda

นี่เป็นทางออกที่ดีที่สุดเนื่องจากมีมาตรการรักษาความปลอดภัย คุณต้อง chmod go-rwx และตรวจสอบให้แน่ใจว่าอาร์กิวเมนต์นี้นำหน้าข้อโต้แย้งอื่น ๆ ทั้งหมด
ChuckCottrill

1
@ Kusalananda ใช่ แต่ตามความคิดเห็นในunix.stackexchange.com/q/385339/135943นั่นไม่ได้หมายความว่ามันปลอดภัย!
Wildcard

อาจมีค่าเพิ่มการบันทึกเกี่ยวกับ--login-pathตอนนี้มันได้รับการสนับสนุน มันไม่ได้ดีไปกว่านี้ แต่มันเป็นข้อความธรรมดาน้อยกว่าเล็กน้อย (แม้ว่าอุปสรรคในการแปลงเนื้อหาให้เป็นข้อความธรรมดาอยู่ในระดับต่ำ)
Geoffrey Wiseman

6
ชุด MYSQL_PWD ในสภาพแวดล้อม ( export MYSQL_PWD=muhpassword) -pและดำเนินการคำสั่งของคุณได้โดยไม่ต้อง ดูตัวแปร MySQL โครงการสิ่งแวดล้อม ทั้งๆที่ของคู่มือของคำเตือนน่ากลัวนี้เป็นที่ค่อนข้างปลอดภัย ยกเว้นว่าคุณเริ่มต้น warez แปลก ๆ ในเปลือกเดียวกันในภายหลัง ดังนั้นเราจึงเรียกใช้:MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost
David Tonhofer

12

mysqlยูทิลิตี้ลูกค้าสามารถใช้รหัสผ่านในบรรทัดคำสั่งอย่างใดอย่างหนึ่ง-pหรือ--password=ตัวเลือก

หากคุณใช้-pจะต้องไม่มีพื้นที่ว่างหลังตัวอักษรตัวเลือก:

$ mysql -pmypassword

ฉันชอบตัวเลือกแบบยาวในสคริปต์เนื่องจากมีการจัดทำเอกสารด้วยตนเอง:

mysql --password=mypassword --user=me --host=etc

3
สิ่งนี้ไม่ปลอดภัยเนื่องจากผู้ใช้สามารถดูรหัสผ่านได้โดยตรง/proc/$pid/cmdlineหรือผ่านpsคำสั่ง เป็นความจริงที่ mysql จะเขียนทับรหัสผ่านใน argv ระหว่างการเริ่มต้น แต่มีหน้าต่างเวลาเสมอที่ผู้ใช้รายอื่นสามารถสังเกตรหัสผ่านได้ นอกจากนี้ในบางระบบการเขียนทับ argv อาจไม่ทำงาน
maxschlepzig

3

หากคุณต้องการเริ่มmysqlด้วยรหัสผ่านหากคุณต้องดึงรหัสผ่านในตัวแปรก่อน:

MYSQLPASS=`cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2`

จากนั้นคุณสามารถเริ่มต้นmysqlคำสั่งของคุณด้วย:

mysql -U root -p ${MYSQLPASS} mydb -h friendserver

1
นอกจากนี้ยังjeopardizes การรักษาความปลอดภัยรหัสผ่านของคุณ โปรดทราบว่ามีMYSQL_PWDตัวแปรสภาพแวดล้อมที่ถูกอ่านโดยถ้าคุณไม่ได้ระบุmysql -pและภายใต้ Linux นี่เป็นวิธีการที่ปลอดภัยเพราะสภาพแวดล้อมของผู้ใช้ไม่สามารถอ่านได้โดยผู้ใช้ที่ไม่มีสิทธิพิเศษอื่น ๆ - ตรงกันข้ามกับเวกเตอร์อาร์กิวเมนต์
maxschlepzig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.