rootパスワードなしでcronジョブでmysqldumpを使用する


14

私のボックスにルートパスワードでログインすると、単にタイプできます

mysqldump --all-databasesと予想される「ダンプ」を取得します。

cron.dailyでジョブをセットアップし、これを実行してバックアップドライブにダンプします。私が持っている問題は、ユーザーがルートとして実行されているにもかかわらず、次のメッセージが表示されることです

mysqldump:エラー:1045:ユーザー 'root' @ 'localhost'のアクセスが拒否されました(パスワードを使用:NO)

接続しようとしたとき。私はしていないハードコードする(だろう)スクリプト内のMySQLデータベースのrootパスワードをしたいです。

bashシェルのコマンドラインで「mysqldump」と入力できることを考えると、-uパラメーターを使用して回避する必要があります。スクリプトの先頭に#!/ bin / bashが既にあります。

データベースへのルートパスワードを要求しないようにするためにここに何が欠けていますか?

回答:


12

mysqlサーバーに接続するには、資格情報を提供する必要があります。構成ファイルでそれらを指定するか、コマンドライン経由で渡すか、資格情報を必要としないアカウントを作成することができます。

もちろん、パスワードなしオプションは決して使用すべきではありません。psを実行できる人はだれでもコマンドラインを見ることができるため、pass-byコマンドラインは素晴らしいものではありません。

推奨されるオプションは、資格情報を使用してmysql構成ファイルを作成し、そのファイルをファイルシステムのアクセス許可で保護して、バックアップユーザーのみがアクセスできるようにすることです。

rootとして対話的にログインしている間にmysqlサーバーにログインできるということは、rootパスワードが設定されていないか、スクリプトで見つからない設定ファイルがあることを示唆しているようです。.my.cnfがある場合は、手動でポイントする必要があります。ルートアカウントにパスワードが設定されていない場合は、修正することを強くお勧めします。

更新(2016-06-29)mysql 5.6.6以降を実行している場合、暗号化されたファイルに資格情報保存できるmysql_config_editorツールを確認する必要があります。これについて私に言及してくれたGiovanniに感謝します。


1
この方法では、システム上に平文の暗号化されていないパスワードが必要です。それは私が回避しようとしているものです。
メカソフトウェア

>ルートパスワードが設定されていないか、スクリプトで見つからない設定ファイルがあります。著者は、ルートのmysqlパスワードがあり、mysqldumpコマンドにデータベースをアクセスせずにアクセスしようとしていることを明確に述べています: "(パスワードを使用:NO)"。したがって、アクセス拒否エラー。
単神話

1
@monomyth、著者はまた、rootとして対話的にログインしている間、パスワードなしでログインできると述べています。これは、何かが正しくないことを示しています。
ゾレダチェ

2
@Mech Software、ルートアカウントから自分自身を保護しようとする意味はあまりありません。誰かがrootアカウントを持っている場合、単にmysqlを再起動し、許可システムを完全にバイパスできます。
ゾレダチェ

1
ログインできた理由は、ルートアカウントが600のアクセス許可で指定された.my.cnfを持っていたため、シェルがアクセスを取得していたためです。ただし、cronはファイルを無視する必要があるため、この投稿のパラメーターを使用してファイルを指定しました。
Mechソフトウェア

3

セキュリティは、あいまいさによって行われるべきではありません。誰かがあなたのルートアカウントにアクセスすることを恐れている場合、mysqlダンプまたはデータベースファイルですべてのデータを利用できるため、rootのmysqlパスワードがスクリプトに保存されているかどうかは関係ありません。だから、本当の質問はあなたが何を保護しようとしているのですか?

データベース内のデータを変更できるパスワードを他人に取得させたくない場合は、適切な権限を持つユーザーを作成する必要があります。

mysqlのパスワードを、root set file permissions以外のローカルアカウントから見られたくない場合、そのスクリプトのを0700に設定し、所有者をrootに。


1
私がまだ理解していないのは、パスワード入力なしで(ルートプロンプトから)mysqldumpを入力できる場合、なぜcronジョブで同じように実行できないのかということです。-pパラメーターを必要とする欠品。パスワードを「あいまいに」しようとはしていません。パスワードを入力させたくないのです。ルートログイン自体に特定の何かがアクセスを許可しているので、なぜこれをcronで複製できないのですか?
メカソフトウェア

同じ「root」ユーザーを使用して、パスワードなしでパスワードを使用してログインできる場合は、mysqlデータベースに複数のrootユーザーが存在する可能性があります。一部にはパスワードが設定されていない場合があります。'root' @ 'localhost'からパスワードを削除できますが、cronがデータベースに接続できるだけでなく、ローカルアカウントを持つユーザーも接続できます。これは、平文スクリプトにパスワードを設定するのと違いはありません(またはそれよりも悪いです)。
単神話

MechSoftwareが作成したのは、rootになると基本的にデータベースファイルへの読み取りアクセスが許可され、暗号化されないという点だと思います。したがって、基本的にすでにアクセスできるデータをきれいに印刷するためだけにルートユーザーからルートMySQLパスワードを要求することは、「隠蔽によるセキュリティ」です。その上、アクセス許可を台無しにするのは非常に簡単です。たとえば、誰かがディレクトリに対してそれらを再帰的に設定している場合、ファイルへのシンボリックリンクがある場合など
Septagram

2

シェルを使用すると、それを実行するシェルがあるため、それを実行できます。つまり、ログオンすると、プロファイル内のすべてのシェルスクリプトが実行されます。

Cronにはそのような贅沢はありません。(rootとして)ログオンすると、デフォルトのシェルでログオンします。これにより、誰もがリモートでログオンできなくなりますが、実行される自動ログインスクリプトがないことも意味します。

cronを実行するシェルを設定し、crontabを編集して、SHELLおよびHOME変数を追加できます。

SHELL=/bin/bash
HOME=/root

これらが設定されていない場合、cronは/ etc / passwdで指定されたシェルとホームディレクトリで実行されます(おそらく/ bin / shである可能性があります)。

cronが実行されている環境を確認するには、envをファイルにエクスポートするcronジョブを追加します。例:

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

1

スクリプトをrootで実行する場合、アクセス権600と次の内容を持つ/root/.my.cnfファイルを作成できます。

[client]
user = DBUSERNAME
password = DBPASSWORD

(もちろん、MySQLのユーザー名とパスワードを入力します)。

このファイルは、rootとして実行されている場合、mysqlコマンドラインツールによって自動的に読み取られます。コマンドラインで提供する必要はもうありません。600の権限により、覗き見から保護されます。


1
これは、パスワードなしでmysqldumpを使用できた方法であることがわかりました。シェルがそれをどのように行っているかの謎を解いたので、なぜcronはそれを読んでいないのですか?
メカソフトウェア

1
cronからmysqldumpを実行すると、.my.cnfファイルが見つからない場合があります。解決策は、mysqldumpパラメータを追加して、.my.cnfファイルのオプションを明示的に読み取ることです。つまり、-defaults-extra-file = / root / .my.cnfこれはStack Overflowの他の2つの回答から学びました。参照stackoverflow.com/a/602054/854680stackoverflow.com/a/890554/854680
MikeOnline

1

Cronはデバッグするのが非常にイライラすることがあります。cronジョブが実行されるとき、シェルで当然のように設定される環境はありません。

cronのヒント:

  • 「ECHO = / bin / echo」など、すべてのパスをフルパスで使用します:(上部で変数を定義して簡単にします)
  • MAILTOを設定して、各ジョブから電子メールを取得します(または、ジョブにstderr / stdoutをファイルにリダイレクトさせます)

rootユーザーがシェルから実行できる場合、cronで実行できるはずです。コマンドラインで使用する構成ファイルを明示的に指定してください。


0

これらの応答のいくつかは役に立ちますが、unix rootユーザーとmysql rootユーザーは同じではなく、基本的に両者がログイン名「root」を使用する以外に関係がないため、いくつかは混乱を招きます。たぶんそれは明らかですが、いくつかの応答が2つを混同しているようです。

mysqldの便利なオプション(存在する可能性がある)は、unix rootとして実行されているmysqlやmysqldumpなどのクライアントプログラムが、root @ localhostの(mysql)パスワードを保存せずにパスワードなしでmysqldのroot @ localhostにアクセスできるようにすることですmy.cnfファイルまたは同様のもの。

私はそれがいくらか緊張することを知っていますが、理由はローカル(mysqldサーバーに対して)として実行されている誰でもUNIXルートはmysqldのセキュリティをとにかく簡単にバイパスできることです。そして、さえmysqldをrootパスワードの7x24または(ここで、そのパスワードがから来るのでしょうか?)その場で(例えば、mysqldumpをを行うには)MySQLのrootパスワードをmy.cnfファイルを削除/作成とのmy.cnfを持つことになり、私は緊張し。

mysql / mysqldump / etcを信頼してmysqldに送信し、ローカルUNIXルートアカウントで実行されていると本当に信じている必要があるため、何らかのインフラストラクチャと思考が必要になります。

しかし、たとえば、少なくともこのオプションの強く推奨されるオプションとして、mysqldのunixソケットのみに制限し、TCPは役に立ちません。これにより、クライアントがローカルで実行されていることを確認できますが、おそらく十分ではありません。しかし、それはアイデアの始まりかもしれません。おそらく、Unixソケットを介してファイル記述子を送信することは、別の部分になる可能性があります(それがおかしな話のように聞こえる場合は、グーグルで検索してください)。

PSいいえ、私はここでブレーンストーミングをしようとは考えていません。そのいずれかが非UNIXオペレーティングシステムでどのように機能するかを考えてみてください。


1
/root/.my.cnf適切なアクセス許可で資格情報を入力すると、問題が解決します。
マイケルハンプトン

私は同意しません。現在、他のシステムの欠陥を含め、そのファイルにアクセスできる人は誰でもmysql root pwを持っています。そして、24時間365日攻撃され、固定ファイルの場所にあります(もちろん/ rootにある必要はありません)。しかし、例えば、ファイルシステムダンプを実行する人、またはファイルシステムダンプにアクセスできる人は誰でもそれを引き出すことができますファイルシステムのダンプファイル。その場合、それは不満を抱く従業員の誘惑のように聞こえます。どこにでもシステム上にクリアテキストのパスワードが存在しないことが合理的な目標だと思います。
バリーシェイン

そうかもしれませんがローカルユーザーがrootになりすますふりをすることができるため、あなたが行った提案ははるかに悪いです。
マイケルハンプトン

いいえ、私の提案はすでにローカルサーバー上のUNIXルートでなければならないということでした。その場合、ローカルmysqldはmysqlまたはmysqldumpなど(クライアント)をunixルートとして実行し、mysqlルートとして認証されたかのように進むことができます。前述のように、それらがすでにサーバーのローカルUNIXルートである場合は、いくつかのよく文書化されたコマンド(「mysql rootパスワード回復」)を使用してmysql rootパスワードをバイパスできます。
バリーシェイン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.