Aman memberi makan program dengan kata sandi

9

Setelah memahami masalah dengan menggunakan kata sandi di baris perintah , saya perlu menemukan cara memberi makan program dengan kata sandi tanpa menjadi masalah (tanpa kata sandi direkam di suatu tempat).

Saya memiliki skrip bash yang secara otomatis menginstal seluruh server LAMP dari sumber: Apache, FastCGI, PHP & MySQL. Instalasi ini memerlukan kata sandi, terutama MySQL.

Bagaimana saya bisa membuat skrip sepenuhnya otomatis tanpa mengungkapkan kata sandi?

Sunting (9 Juni, 3:55 UTC):
Saya memohon mysql dengan kata sandi di baris perintah, melalui root:

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" dalam kasus kami)
Dan saya mengeksekusi ps aux | grep mysqlmelalui pengguna reguler saya (dor), yang tidak menunjukkan kata sandi kepada saya !
(Beberapa) psoutput adalah:

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

Bagaimana itu mungkin?

Dor
sumber
Lihat juga unix.stackexchange.com/q/385339/135943 , tetapi perhatikan ini tidak membuatnya aman!
Wildcard

Jawaban:

11

Sehubungan dengan pembaruan Anda:

Ketika suatu proses dimulai itu memiliki area memori khusus di mana argumen disimpan dan sebuah int yang memberitahu berapa banyak argumen yang dilewati.

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

MySQL memeriksa apakah kata sandi diteruskan oleh baris perintah -p, dan jika itu disalin ke variabel baru yang tidak terlihat, maka timpa wilayah memori itu denganx .

Secara sederhana misalnya:

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

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

Anda dapat menemukannya misalnya di client/mysqladmin.ccdalam kode sumber:

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

Ketika psmenjalankannya membaca wilayah memori argumen, ( argv[N]), dan memang begitu xxxx.

Untuk waktu yang singkat kata sandi terlihat, tetapi hanya untuk beberapa siklus CPU.


Anda dapat memperbarui kata sandi MySQL menggunakan --init-fileopsi dan prosedur khusus. C.5.4.1.2. Menyetel Ulang Kata Sandi Root: Unix Systems

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

Edit:

Seperti yang dikatakan @Gilles , Anda bisa echo,printf atau menggunakanhere dokumen dari skrip.

Anda juga dapat menambahkan ini ke .my.cnfdirektori home Anda atau dalam file ( sementara ) dan gunakan --defaults-extra-fileopsi. (Percaya Anda harus menambahkan opsi itu lebih awal pada baris perintah.) Opsional juga termasuk pengguna. Juga perhatikan ekstra dalam nama pilihan kecuali jika Anda ingin menggunakan hanya file yang konfigurasi:

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

Secara opsional [client]pengelompokan membuat mysqldmelewati konfigurasi.

Satu juga dapat menggunakan MYSQL_PWDvariabel lingkungan, tetapi itu tidak boleh digunakan karena Anda dapat membuat daftar lingkungan, dalam banyak psimplementasi oleh ps -e, dalam /proc/<PID>/environfile di Linux dll.

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

Lebih banyak tentang topik di sini .

Anda mungkin juga ingin melihat Utilitas Konfigurasi MySQL yang memungkinkan Anda menyimpan kata sandi dalam file terenkripsi di direktori home Anda - .mylogin.cnf.

Runium
sumber
Apakah ada cara untuk mengubah token dalam mysql-initfile dengan kata sandi yang disimpan dalam variabel bash? (tanpa diungkapkan)
Dor
4
@Atau Sesuatu seperti echo 'password=p4ssw0rd' >>mysql.cnfaman, karena echoini adalah built-in, sehingga kata sandi tidak muncul pada baris perintah dari proses apa pun. Dokumen di sini juga aman.
Gilles 'SO- stop being evil'
4

Solusi khasnya adalah membaca kata sandi dari file atau dari input standar (atau dari deskriptor file lain yang harus dilewatkan sebagai parameter).

Hauke ​​Laging
sumber
3

Beberapa program (baris perintah ftpmisalnya) membaca kata sandi dari /dev/tty, file khusus per proses yang mewakili proses 'mengendalikan TTY. Hal ini memungkinkan program tidak menggemakan kata sandi kembali ke layar, dan memiliki sedikit lebih banyak jaminan tentang dari mana kata sandi itu berasal.

#!/bin/bash

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

echo $PASSWORD
Bruce Ediger
sumber