Bir programı şifre ile güvenli bir şekilde besleme


9

Komut satırında bir parola kullanma sorununu anladıktan sonra , bir programı bir parola ile sorun olmadan (parola bir yere kaydedilmeden) beslemenin bir yolunu bulmam gerekiyor.

Apache, FastCGI, PHP ve MySQL: Kaynaktan tüm LAMP sunucusunu otomatik olarak yükleyen bir bash betiği var. Bu kurulumlar bir şifre gerektirir, özellikle MySQL.

Şifreyi açmadan komut dosyasının tam otomatik olmasını nasıl sağlayabilirim?

Edit (9 Haziran, 3:55 UTC):
Komut satırında root ile mysql'yi çağırıyorum:

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" Bizim durumumuzda)
Ve ben ps aux | grep mysqldüzenli kullanıcı (dor) üzerinden yürütmek , bu bana şifre göstermez !
(Bazıları) psçıktı:

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

Bu nasıl mümkün olabilir?


Ayrıca unix.stackexchange.com/q/385339/135943 adresine bakın , ancak bunun güvenli olmadığını
Joker

Yanıtlar:


11

Güncellemenizle ilgili olarak:

Bir işlem başlatıldığında, bağımsız değişkenlerin depolandığı özel bir bellek alanına ve kaç bağımsız değişkenin geçtiğini bildiren bir int'e sahiptir.

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

MySQL, parolanın komut satırında geçirilip geçirilmediğini kontrol eder -pve görünmeyen yeni bir değişkene kopyalanmışsa, o bellek bölgesinin üzerine x'es ile yazın.

Basit bir ifadeyle, örneğin:

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

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

Örneğin client/mysqladmin.cckaynak kodunda bulabilirsiniz:

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

Zaman psçalıştırmak bu argümanlar bellek bölgesini, (okur argv[N]) ve bu yüzden o xxxx.

Parola görünürken çok kısa bir süre için, ancak yalnızca birkaç CPU döngüsü için.


Özel --init-fileseçeneği ve prosedürü kullanarak MySQL şifresini güncelleyebilirsiniz . C.5.4.1.2. Kök Parolasını Sıfırlama: Unix Systems

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

Düzenle:

As @Gilles demek yapabilirsiniz echo,printf veya kullanım herebir komut dosyasından belge.

Bunu .my.cnfana dizininize veya ( geçici ) bir dosyaya da ekleyebilir ve --defaults-extra-fileseçeneği kullanabilirsiniz . (Bu seçeneği komut satırına erken eklemeniz gerektiğine inanabilirsiniz.) İsteğe bağlı olarak kullanıcı da içerir. Ayrıca, yalnızca bu dosyayı yapılandırma olarak kullanmak istemiyorsanız, seçenek adındaki fazladan notu da unutmayın :

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

İsteğe bağlı olarak [client]gruplama mysqldyapılandırmayı atlar.

MYSQL_PWDOrtam değişkeni de kullanılabilir , ancak bu, ortamı, birçok uygulamada , Linux'taki dosyada vb. Listeleyebileceğiniz için asla kullanılmamalıdır .psps -e/proc/<PID>/environ

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

Konu hakkında daha fazla bilgi burada .

Ayrıca , ana dizininizdeki şifreli bir dosyada parola depolamanızı sağlayan MySQL Yapılandırma Yardımcı Programı'na da göz atmak isteyebilirsiniz - .mylogin.cnf.


mysql-initBir bash değişkeninde saklanan parola ile dosyadaki bir simgeyi değiştirmenin bir yolu var mı ? (açıklanmadan)
Dor

4
@Dor gibi bir echo 'password=p4ssw0rd' >>mysql.cnfşey güvenlidir, çünkü echoyerleşiktir, bu nedenle parola herhangi bir işlemin komut satırında görünmez. Burada bir belge de güvenlidir.
Gilles 'SO- kötü olmayı bırak

4

Tipik çözüm, şifreyi bir dosyadan veya standart girişten (veya parametre olarak geçirilmesi gereken başka bir dosya tanımlayıcısından) okumaktır.


3

Bazı programlar ( ftpörneğin komut satırı ) /dev/tty, 'TTY'yi denetleyen işlemin temsil edildiği işlem başına özel dosyadaki parolaları okur . Bu, programın parolayı tekrar ekrana yansıtmamasını ve parolanın nereden geldiğiyle ilgili biraz daha güvence almasını sağlar.

#!/bin/bash

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

echo $PASSWORD
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.