Kök şifresi olmadan cron işinde mysqldump kullanma


14

Kutumda root şifresi ile giriş yaparsam yazabilirim

mysqldump - all-veritabanları ve ben th beklenen "Dökümü" alacak.

Bunu çalıştırmak ve bir yedekleme sürücüsüne dökmek için cron.daily'de bir iş ayarladım. Sahip olduğum sorun, kullanıcı root olarak çalışmasına rağmen aşağıdaki mesajı alıyorum

mysqldump: Hata var: 1045: 'root' @ 'localhost' kullanıcısı için erişim reddedildi (şifre kullanarak: HAYIR)

bağlanmaya çalışırken. Ben yok sert koduna (olur) komut MySQL veritabanı root şifresini istiyorum.

Sadece benim bash kabuğumdaki komut satırına "mysqldump" yazabileceğim düşünüldüğünde, -u parametresini kullanarak dolaşmak için bir yol olmalı.

Bunu veritabanına root şifresi istememek için burada ne eksik?

Yanıtlar:


12

MySQL sunucusuna bağlanmak için kimlik bilgilerini sağlamanız gerekir. Bunları bir yapılandırma dosyasında belirleyebilir, komut satırından geçirebilir veya kimlik bilgileri gerektirmeyen bir hesap oluşturabilirsiniz.

Elbette parola yok seçeneği asla kullanılmamalıdır, doğrudan komut satırı harika değildir, çünkü ps çalıştırabilen herkes komut satırını görebilir.

Önerilen seçenek, içinde kimlik bilgileri olan bir mysql yapılandırma dosyası oluşturmak ve daha sonra yalnızca yedekleme kullanıcınızın erişebilmesi için bu dosyayı dosya sistemi izinleriyle korumaktır.

Kök olarak etkileşimli olarak oturum açmışken mysql sunucusunda oturum açabilmeniz, bir kök parola ayarınızın olmadığını veya komut dosyanız tarafından bulunmayan bir yapılandırma dosyanızın olduğunu gösteriyor gibi görünüyor. Bir .my.cnf dosyanız varsa el ile işaret etmeniz gerekebilir. Kök hesabınızda ayarlanmış bir şifre yoksa, bunu düzeltmenizi şiddetle tavsiye ederim.

Güncelleme (2016-06-29) mysql 5.6.6 veya üstünü çalıştırıyorsanız, kimlik bilgilerini şifrelenmiş bir dosyada saklamanızı sağlayan mysql_config_editor aracına bakmalısınız . Giovanni'ye bundan bahsettiği için teşekkürler .


1
Bu yöntem hala sistemde düz metin olarak şifrelenmemiş bir şifre gerektirir. Bundan kaçınmaya çalışıyorum.
Mech Software

> ayarlanmış bir root şifreniz yok veya betiğiniz tarafından bulunmayan bir yapılandırma dosyanız var. Yazar, root için bir mysql şifresi olduğunu ve veritabanına mysqldump komutunu vermeden erişmeye çalıştığını açıkça belirtmektedir: "(şifre: NO kullanarak)". Bu nedenle, erişim reddedildi hatası.
monomyth

1
@monomyth, yazar aynı zamanda root olarak etkileşimli olarak giriş yaparken şifre olmadan giriş yapabileceğini belirtir. Bu bana bir şeyin doğru olmadığını söylüyor.
Zoredache

2
@Mech Software, Kendinizi kök hesaptan korumaya çalışmanın pek bir anlamı yok. Birisi root hesabına sahipse, mysql'yi yeniden başlatabilir ve izin sistemini tamamen atlayabilir.
Zoredache

1
Giriş yapabilmemin nedeni, root hesabının 600 izniyle bir .my.cnf belirtilmiş olmasıydı, bu yüzden kabuğun erişimi bu şekilde oldu. Ancak cron, dosyayı yok saymak gerekir, bu yüzden bu yazıya işaret etmek için bu parametreyi kullandım.
Mech Software

3

Güvenlik anlaşılmazlıkla yapılmamalıdır. Birinin kök hesabınıza erişiminin olduğundan korkuyorsanız, tüm verilerinizin mysql dökümlerinde veya veritabanı dosyalarında mevcut olduğundan, kökün mysql şifresinin komut dosyasında depolanması önemli değildir. Yani asıl soru neyi korumaya çalışıyorsunuz?

Başkalarının veritabanınızdaki verileri değiştirmelerine izin verecek bir şifre almasını istemiyorsanız, uygun izinlere sahip bir kullanıcı oluşturmanız gerekir .

Bu mysql parolasının , bu komut dosyasındaki kök kümesi dosya izinleri dışındaki herhangi bir yerel hesap tarafından 0700 ve kök sahibi olarak görünmesini istemiyorsanız .


1
Hala anlamadım sanırım (root isteminden) parola girişi olmadan mysqldump yazabiliyorsam, neden aynı şekilde cron işi ile çalıştıramıyorum. -P parametresini gerektiren hangi parça eksik. Şifreyi "gizlemeye" çalışmıyorum, hiç girmemeyi tercih ederim. Kök girişinin kendisine özgü bir şey erişime izin veriyor, bu yüzden neden cron ile çoğaltılamıyor?
Mech Software

Aynı "root" kullanıcısını kullanarak şifresiz ve şifreyle giriş yapabileceğinizi görürseniz, mysql veritabanınızda birden fazla root kullanıcısı olabilir. Bazılarında şifre ayarlanmamış olabilir. 'Root' @ 'localhost' şifresini kaldırabilirsiniz, ancak daha sonra sadece cron veritabanınıza bağlanamaz, aynı zamanda yerel hesabı olan herkes de bağlanabilir. Bu, açık metin komut dosyasında bir parolaya sahip olmaktan farklı (veya daha kötü) değildir.
monomyth

MechSoftware yaptığı nokta olduğunu düşünüyorum kök olmanın temelde veritabanı dosyalarına okuma erişimi verir ve onlar şifreli değildir düşünüyorum. Bu nedenle, kök kullanıcıdan kök MySQL parolasını yalnızca temelde zaten erişebildikleri verileri oldukça yazdırmak için istemek, "belirsiz güvenlik" dir. Ayrıca, izinlerin
dağıtılması

2

Kabuk kullanımınız bunu çalıştırmak için bir kabuğunuz olduğu için yapabilir, yani oturum açtığınızda profilinizdeki tüm kabuk komut dosyalarınız çalıştırılır.

Cron'un böyle lüksleri yok. Oturum açtığında (kök olarak) varsayılan bir kabukla oturum açar. Bu, herkesin uzaktan oturum açmasını önler, ancak aynı zamanda çalıştırılan otomatik oturum açma komut dosyaları olmadığı anlamına gelir.

Cron'un altında çalışacak bir kabuk ayarlayabilir, crontab'ı düzenleyebilir ve SHELL ve HOME değişkenlerini ekleyebilirsiniz, örn.

SHELL=/bin/bash
HOME=/root

bunlar ayarlanmazsa, cron / etc / passwd içinde belirtilen kabuk ve giriş dizini ile çalışır (bu muhtemelen hiçbir şey değildir, muhtemelen / bin / sh).

Ortam cronunun çalıştığını görmek istiyorsanız, env dosyasını bir dosyaya aktaran bir cron işi ekleyin, örneğin:

$crontab -e
* * * * * env > /tmp/crontabenv.log
:wq

1

Komut dosyası kök tarafından çalıştırılıyorsa, 600 izinlerine ve aşağıdaki içeriğe sahip bir /root/.my.cnf dosyası oluşturabilirsiniz :

[client]
user = DBUSERNAME
password = DBPASSWORD

(burada MySQL kullanıcı adınızı ve şifrenizi girdiğiniz yer).

Bu dosya, root olarak çalıştırılırsa herhangi bir mysql komut satırı aracı tarafından otomatik olarak okunur. Artık komut satırında sağlamanıza gerek yok. 600 izin, meraklı gözlere karşı korur.


1
Bu nasıl şifre olmadan mysqldump bize başardı nasıl olduğunu buldum. Peki bu, SHELL'in bunu nasıl yaptığının gizemini çözdü, öyleyse cron neden okumuyor?
Mech Software

1
mysqldump, cron'dan çalıştırıldığında .my.cnf dosyasını bulamayabilir. Çözüm, m.q.cump dosyasındaki seçenekleri açıkça okumak için mysqldump parametresi eklemektir, yani --defaults-extra-file = / root / .my.cnf Bunu Stack Overflow'daki diğer iki cevaptan öğrendim. Bkz. Stackoverflow.com/a/602054/854680 ve stackoverflow.com/a/890554/854680
MikeOnline

1

Cron hata ayıklamak için çok sinir bozucu olabilir. Cron işleri yürütüldüğünde, kabuk gibi kabul ettiğiniz gibi bir ortam oluşturmazlar.

Cron için ipuçları:

  • her şeyin tam yollarını kullanın - "ECHO = / bin / echo", etc: (kolaylaştırmak için üstteki değişkenleri tanımlayın)
  • MAILTO olarak ayarlayın, böylece her işten bir e-posta alırsınız (veya işlerin stderr / stdout'u bir dosyaya yönlendirmesini sağlar)

Kök kullanıcınız kabuktan yapabilirse, cron bunu yapabilmelidir. Komut satırında kullanılacak yapılandırma dosyasını açıkça belirttiğinizden emin olun.


0

Bu yanıtların birçoğu yardımcı olsa da, unix root kullanıcısı ve mysql root kullanıcısı aynı olmadığından ve temel olarak her ikisinin de 'root' oturum açma adını kullanması dışında hiçbir ilişkisi olmadığı için kafa karıştırıcıdır. Belki bu açıktır, ancak bazı tepkiler bu ikisini karıştırmaktadır.

Mysqld için yararlı bir seçenek (belki de var mı?) Mysql veya mysqldump gibi istemci programlarının root @ localhost (mysql) şifresini saklamak zorunda kalmadan bir şifre olmadan mysqld'ın root @ localhost'una erişmesine izin vermek olabilir. my.cnf veya benzeri bir dosyada.

Biraz sinir yapar biliyorum ama muhakeme yerel (mysqld sunucusuna) unix kök olarak çalışan herkes mysqld'ın güvenliğini nasılsa kolayca geçebilir. Ve 7x24 mysqld kök parolasına sahip bir my.cnf'ye sahip olmak, hatta mysql kök parolasıyla (bu parola nereden geliyor?) My.cnf oluşturmak / silmek (örneğin, bir mysqldump yapmak) beni sinirlendiriyor.

Bazı altyapı ve düşünme gerektirir çünkü bir mysql / mysqldump / etc gerçekten yerel bir unix kök hesabı tarafından çalıştırıldığını inanıyor mysqld iletmek için güvenmek zorunda kalacaktır.

Ancak, örneğin mysqld'in yalnızca unix soketi ile sınırlamak, TCP yok, en azından bu seçeneğin şiddetle tavsiye edilen bir seçeneği olarak yardımcı olabilir. Bu, istemcinin yerel olarak çalıştığını belirleyebilir, bu muhtemelen yeterince yeterli değildir. Ancak bu bir fikrin başlangıcı olabilir. Belki de bir unix soketi üzerinden bir dosya tanımlayıcı göndermek başka bir parça olabilir (çılgın konuşma gibi geliyorsa google.)

PS Hayır Fikir muhtemelen diğer işletim sistemlerine dönüştüğünde unix olmayan bir işletim sisteminde nasıl çalışabileceğini burada beyin fırtınası yapmaya çalışmayacağım.


1
Kimlik bilgilerini /root/.my.cnfuygun izinlerle koymak sorunu düzgün bir şekilde çözer.
Michael Hampton

Kabul etmiyorum, şimdi bu dosyaya erişebilen herkes, diğer sistem kusurları da dahil olmak üzere, mysql root pw'ye sahip. Ve saldırıya uğramak için 24x7 var ve sabit bir dosya konumunda (kuşkusuz / root olması gerekmeyecekti.) Ama örneğin, dosya sistemi dökümlerini çalıştıran veya bunlara erişebilen, bir dosya sistemi döküm dosyası. Bu durumda hoşnutsuz bir çalışan için cazip geliyor. Bir sistemde hiçbir yerde açık metin parolaların bulunmamasının makul bir hedef olduğunu düşünüyorum.
Barry Shein

Belki öyleyse, ancak yaptığınız teklif çok daha kötüdür, çünkü herhangi bir yerel kullanıcının önemsizce kök gibi davranmasına izin verir .
Michael Hampton

Hayır, benim önerim zaten yerel sunucuda unix kökü olması gerektiğiydi, bu durumda yerel mysqld mysql veya mysqldump vb (istemci) unix kökü olarak çalıştırılıyor ve mysql kökü olarak doğrulanmış gibi ilerlemelerine izin veriyor . Söylediğim gibi, zaten sunucuya yerel olarak unix kökleri ise, mysql kök parolasını birkaç iyi belgelenmiş komutla ("mysql kök parola kurtarma") her nasılsa by-pass edebilirler.
Barry Shein
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.