ป้อนรหัสผ่านโปรแกรมอย่างปลอดภัย


9

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

ฉันมีสคริปต์ทุบตีที่ติดตั้งเซิร์ฟเวอร์ LAMP ทั้งหมดโดยอัตโนมัติจากแหล่งที่มา: Apache, FastCGI, PHP และ MySQL การติดตั้งเหล่านี้ต้องการรหัสผ่านโดยเฉพาะ MySQL

ฉันจะทำให้สคริปต์เป็นแบบอัตโนมัติได้อย่างสมบูรณ์โดยไม่เปิดเผยรหัสผ่านได้อย่างไร

แก้ไข (9 มิถุนายน, 3:55 UTC):
ฉันเรียกใช้ mysql ด้วยรหัสผ่านบนบรรทัดคำสั่งผ่านรูท:

root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6

(PASS = "p4ssw0rd" ในกรณีของเรา)
และฉันดำเนินการps aux | grep mysqlผ่านผู้ใช้ปกติของฉัน (dor) ซึ่งไม่แสดงรหัสผ่านให้ฉัน ! เอาต์พุต
(บางส่วน) psคือ:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3562  0.0  0.0  34156  2864 pts/0    S+   05:53   0:00 mysql -u root -px xxxxxx

เป็นไปได้อย่างไร


ดูunix.stackexchange.com/q/385339/135943ด้วย แต่โปรดทราบว่าสิ่งนี้ไม่ปลอดภัย!
Wildcard

คำตอบ:


11

เกี่ยวกับการอัปเดตของคุณ:

เมื่อเริ่มต้นโปรเซสนั้นจะมีพื้นที่หน่วยความจำเฉพาะซึ่งมีการจัดเก็บอาร์กิวเมนต์และ int ที่บอกจำนวนอาร์กิวเมนต์ที่ส่งผ่าน

MEMORY
argc    2
argv[0] program_name
argv[1] foo
argv[2] bar

MySQL ตรวจสอบว่ารหัสผ่านถูกส่งผ่านบรรทัดคำสั่งโดย-pและถ้ามันถูกคัดลอกไปยังตัวแปรใหม่ที่มองไม่เห็นแล้วเขียนทับภูมิภาคของหน่วยความจำด้วยx'es

ในแง่ง่าย ๆ เช่น:

argc 2
argv[1] -p
argv[2] p4ssw0rd

new_var = copy(argv[2]);
argv[2] = "xxxxx";

คุณสามารถค้นหาได้เช่นในclient/mysqladmin.ccซอร์สโค้ด:

  case 'p':
      ...
      opt_password=my_strdup(argument,MYF(MY_FAE));
      while (*argument) 
          *argument++= 'x';     /* Destroy argument */

เมื่อpsเรียกใช้มันอ่านภูมิภาคหน่วยความจำของการขัดแย้ง ( argv[N]) xxxxและทำให้มันเป็น

สั้นมากในขณะที่มองเห็นรหัสผ่านได้ แต่มีเพียงไม่กี่รอบของ CPU


คุณสามารถอัปเดตรหัสผ่าน MySQL ได้โดยใช้--init-fileตัวเลือกและขั้นตอนพิเศษ C.5.4.1.2 การรีเซ็ตรหัสผ่านรูท: ระบบ Unix

mysqld_safe --init-file=/home/me/mysql-init &

แก้ไข:

ในฐานะที่เป็น@Gillesบอกว่าคุณสามารถecho,printfหรือการใช้hereเอกสารจากสคริปต์

คุณยังสามารถเพิ่มสิ่งนี้ไปยัง.my.cnfไดเรกทอรีบ้านของคุณหรือในไฟล์( ชั่วคราว ) และใช้--defaults-extra-fileตัวเลือก (เชื่อว่าคุณต้องเพิ่มตัวเลือกนั้นก่อนในบรรทัดคำสั่ง)หรืออาจรวมถึงผู้ใช้ด้วย นอกจากนี้ให้สังเกตการเพิ่มในชื่อตัวเลือกนอกจากว่าคุณต้องการใช้เฉพาะไฟล์ดังกล่าวเป็นการกำหนดค่า:

[client]
user=foo
password='password!'
shell> chmod 400 my_tmp.cnf
shell> mysql --defaults-extra-file=my_tmp.conf -...

การ[client]จัดกลุ่มเป็นทางเลือกทำให้mysqldข้ามการกำหนดค่า

หนึ่งสามารถใช้MYSQL_PWDตัวแปรสภาพแวดล้อม แต่ไม่ควรใช้ตามที่คุณสามารถแสดงรายการสภาพแวดล้อมในpsการใช้งานหลายโดยps -eใน/proc/<PID>/environไฟล์บน Linux ฯลฯ

tr '\0' '\n' < /proc/<PID>/environ

เพิ่มเติมเกี่ยวกับหัวข้อที่นี่

คุณอาจต้องการดูMySQL Configuration Utilityที่ให้คุณเก็บรหัสผ่านในไฟล์ที่เข้ารหัสในโฮมไดเร็กตอรี่ของคุณ - .mylogin.cnf.


มีวิธีการเปลี่ยนโทเค็นในmysql-initไฟล์ด้วยรหัสผ่านที่เก็บไว้ในตัวแปร bash หรือไม่? (ไม่ได้รับการเปิดเผย)
Dor

4
@Dor สิ่งที่ชอบecho 'password=p4ssw0rd' >>mysql.cnfมีความปลอดภัยเพราะechoมีในตัวดังนั้นรหัสผ่านจะไม่ปรากฏในบรรทัดคำสั่งของกระบวนการใด ๆ เอกสารที่นี่ยังปลอดภัย
Gilles 'หยุดความชั่วร้าย'

4

วิธีแก้ปัญหาทั่วไปคือการอ่านรหัสผ่านจากไฟล์หรือจากอินพุตมาตรฐาน (หรือจากตัวอธิบายไฟล์อื่นซึ่งจะต้องถูกส่งผ่านเป็นพารามิเตอร์)


3

บางโปรแกรม ( ftpตัวอย่างเช่นบรรทัดคำสั่ง) อ่านรหัสผ่านจาก/dev/ttyไฟล์พิเศษต่อกระบวนการที่แสดงถึงการควบคุม TTY ของกระบวนการ สิ่งนี้จะช่วยให้โปรแกรมไม่ได้สะท้อนรหัสผ่านกลับไปที่หน้าจอและเพื่อเพิ่มความมั่นใจว่ารหัสผ่านมาจากไหน

#!/bin/bash

stty -F /dev/tty -echo 
read PASSWORD < /dev/tty

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