Komut satırında MySQL şifresi kullanmanın güvenli bir alternatifi nedir?


35

Veritabanını sürümlemek için bir PHP komut satırı komut dosyası var. Bir geliştirici yeni bir veritabanı yaması eklediğinde bu betiği çalıştırırız.

Komut dosyası, yamayı MySQL komut satırıyla çalıştırır:

system('mysql --user=xxx --password=xxx < patch.sql');

Ancak, MySQL 5.6 şimdi aşağıdaki uyarıyı veriyor:

Uyarı: Komut satırı arayüzünde bir şifre kullanmak güvensiz olabilir

Açıkçası doğru olan, ancak kullanıcı için bir sorun olabilir veya olmayabilir.

  • Öyleyse güvenli alternatif nedir ?
  • Alternatif olarak, bu uyarıyı devre dışı bırakmak mümkün müdür?

Lütfen harici bir şifre dosyasına güvenmek istemediğimi unutmayın.


2
Kimlik bilgilerinizi bir dosyada bulundurmak sorun değil. Bir kişinin sunucunuzda kök ayrıcalıkları varsa, yalnızca mysql sunucusunu belirli bir seçenekle yeniden başlatarak kimlik doğrulama sistemini tamamen atlayabilir.
Zoredache

Bu, önerilen kopyadakiyle aynı sorun değil . MySQL şifre istemiyor, ben veriyorum ve iyi çalışıyor. Bir şifre dosyası hariç, şifreyi sağlamak için alternatifler arıyorum.
Benjamin

Yanıtlar:


17

MySQL'in son GA sürümünde, yani sürüm 5.6'da , bunu http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html adresinde açıklandığı gibi mysql_config_editor komutuyla yapabilirsiniz.

Temel olarak yaptığı şey: kullanıcı / parola kimlik bilgilerini bir ana bilgisayar diğer adıyla şifrelemek ve ardından ana bilgisayar diğer adını kullanmak, bu bilgileri ana dizininizdeki bir yapılandırma dosyasına koymak ve daha sonra ihtiyacınız olduğunda, bunun gibi bir şey yapmak yerine :

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

bunun yerine yaz:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

Böylece parolanızı cleartext içindeki bir komut dosyasına koymaktan kaçının.

Bunun çalışması için önce (yalnızca bir kez) şu şekilde tanımlamanız gerekir myhostalias:

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

İstediğiniz gibi farklı hesaplar ve / veya ana bilgisayarlar için farklı giriş yolları kullanabilirsiniz. Bana sorarsan oldukça iyi bir fikir.

Bir not olarak, bu işlevselliğin 5.6'nın altındaki sürümlerinde bulunmadığını düşünüyorum .


not: mysql_config_editor uygulamasının aslında harici bir şifre dosyası yarattığını fark ettim ancak bu işlem sizin tarafınızdan yapılmadığı gibi, sistemin nasıl çalıştığını, bu nedenle sizin tarafınızdan yapılması gereken herhangi bir manuel en / de / şifre çözme işlemi olmadığını da biliyoruz.
Tuncay Göncüoğlu,

Teşekkürler, MySQL 5.6 kullanıyorum, bu yüzden sorun değil. Bununla birlikte, yaklaşımınız hala sorunlu (en azından şu anda nasıl çalıştığımızla), çünkü bir PHP config dosyasından şifreyi gerçek zamanlı olarak alıp dinamik olarak komut satırına geçirmek istiyorum. Önerdiğin gibi, hala arama yaparken şifreyi komut satırında kullanmak zorunda kalacağım mysql_config_editor, bu yüzden maalesef daha fazla değer getirmiyor. Ayrıca geliştiricinin manuel olarak yapmasını engellemeye çalışıyorum, bu nedenle hem PHP config dosyasını hem de mysql config'i korumam gerekiyor.
Benjamin

En iyi çözümüm şu an için uyarıları görmezden gelmektir. Aslında herhangi bir güvenlik sorunu olup olmadığını merak ediyorum: PHP'den çağrıldığından komut satırının bash tarihinde veya makinenin başka bir yerinde saklanmadığını tahmin ediyorum.
Benjamin

bildiğim kadarıyla hayır, bash tarihinin saklaması yok. ancak, php config dosyasında düz metin olarak bulunan parola, aynı riski taşır, sadece başka bir biçimde. belki mysql_config_editor kullanarak şifreyi saklamayı ve giriş yolunu php config dosyanızda saklamayı tercih edersiniz? Bu şekilde şifrenizi hiçbir yerde ifşa etmeyeceksiniz. (ama yine de harici şifreyi korumak zorunda kalacak).
Tuncay Göncüoğlu

9

--defaults-fileVeya --defaults-extra-fileseçeneğini kullanın . İçinde kullanıcı kimliği ve şifre belirtebilirsiniz. İle aynı formatta /etc/my.cnf.

Daha fazla okumak, harici bir şifre dosyasına güvenmek istemediğinizi söylüyorsunuz, ancak bu gerçekten güvenli bir yol. Başka bir şey işlem tablosunda veya başka şeylerde izler bırakacaktır. İsterseniz bile şifre dosyasını sürüm kontrolüne koyabilirsiniz. 600 (veya 400) yapın ve yalnızca mysql veya altında çalışan kullanıcı tarafından okunabilir hale getirin.


1
Güvenlik nedeniyle şifre dosyasına karşı değilim, sadece MySQL kimlik bilgilerinin PHP uygulamasındaki (PDO bağlantısı için de kullanılır) global bir konfigürasyonun bir parçası olduğu ve bunu yapmak sadece (geçici) bir şifre dosyası oluşturmak anlamına geleceği anlamına geliyor betiğin ömrü boyunca mysql komut satırını çalıştırmak uğruna (birkaç saniye).
Benjamin

Windows Server 2012'de bu nasıl yapılır? --Defaults-file seçeneğini içeren config dosyası nerede?
Jake,

Dosyayı aşağıdaki gibi --defaults-file olarak bir seçenek olarak belirleyebilirsiniz:mysql --defaults-file c:\some\dirs\my.cnf
lsd

@Benjamin, Eğer güvenlikle ilgili değilse , şifreyi komut satırına yazmanız yeterlidir. Bunu yapmanın nesi yanlış (güvenlik dışında)?
Pacerier

@Benjamin zaten PHP'den MySQL kullanıyorsanız, neden mysqlkonsol istemcisini terk ediyorsunuz ?
Josip Rodin

5

Http://dev.mysql.com/doc/refman/5.1/en/password-security-user.html için 4 seçeneğiniz vardır

  • Komut satırında bir -pyour_passveya --password=your_passseçenek kullanın
  • Komut satırında -pveya --passwordparola değeri belirtilmeden seçeneği kullanın . Bu durumda, istemci programı etkileşimli olarak şifreyi ister:
  • Şifrenizi bir seçenek dosyasına kaydedin.
  • Parolanızı MYSQL_PWDortam değişkeninde saklayın.

İhtiyaçlarınız MYSQL_PWDiçin bir seçenek olabilir, ancak artık güvenli değil. Gerçekten --passwordde parola ile etkileşimli bir süreç oluşturmalı ve parolayı etkileşimli olarak sunmalısınız, ancak bu, bu sorun için bir çözümün oldukça karmaşık bir örneğidir.


1
MYSQL_PWD komut satırından sonra nasıl daha az güvende olur? PW asla asıl mesele gibi görünen süreç listesinde görünmüyor
TheLQ

1
Tabii ki öyle. man pssahiptir -E Display the environment as well. MySQL şifresi son derece güvensiz kabul edilmeli ve kullanılmamalıdır belirterek bu yöntemin: Ben bağlantılı url itibaren. Bazı ps sürümleri, çalışan işlemlerin ortamını görüntülemek için bir seçenek içerir. Bazı sistemlerde, MYSQL_PWD'yi ayarlarsanız, şifreniz ps çalışan herhangi bir kullanıcıya açıktır. Böyle bir ps sürümü olmayan sistemlerde bile, kullanıcıların işlem ortamlarını inceleyebileceği başka bir yöntem olmadığını varsaymak doğru değildir.
RS

Bu MYSQL_PWD seçeneğinden almak: Ortam değişkenini bir betiğin başında ayarlarsanız, o zaman MySQL komut satırını çağırırsanız, ardından betiğin sonunda en az pozlama süresini azaltabileceğinizi temizleyin . Bu mantıklı geliyor mu?
superjos

@kormoc, Lütfen son paragrafı hazırlayın. Bahsettiğiniz o oldukça karmaşık çözüm nedir?
Pacerier

1
Ortam değişkenini kullanarak görünüyor olduğunu komut satırından daha güvenli. Varsayılan bir debian sisteminde ps, her kullanıcının her işlemi için komut satırı argümanını görebilir ve görebilirsiniz. Ancak, ps eyalnızca kendi işlemleriniz için ortamı görüntüler (elbette siz köklü değilseniz). Sadece marjinal olarak daha güvenli, ama yine de daha güvenli.
JLH

4

PHP betiğinizin zaten açık bir veritabanı bağlantısı varsa, neden sadece mysqli_multi_query().sql dosyasını almak için kullanmıyorsunuz ? .Sql dosyasının sözdizimi geçerliyse, elbette ...


Oldukça büyük .sql dosyalarıyla ne kadar iyi çalışacağından emin değilim?
Benjamin

1
@Benjamin MySQL istemcisinden daha kötü bir şey hayal edemiyorum - güvenlik konusunda gerçekten endişeleniyorsanız, bunun için en az dolambaçlı yol olsa da ve boyut, çeşitli şekillerde çözebileceğiniz bir sorundur.
voretaq7

PDO ile mümkün olup olmadığını biliyor musunuz?
Benjamin

PDO, bir kerede veritabanına bir sürü sorgu atmak için eşdeğer bir işleve sahip görünmüyor. Üzgünüm. Bu ... bir düşünceydi
Michael Hampton
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.