Puppetでは、パスワード変数(この場合はMySQLパスワード)をどのように保護しますか?


13

私はPuppetを使用して、パラメーター化されたクラスでMySQLをプロビジョニングしています。

class mysql::server( $password ) {

        package { 'mysql-server': ensure => installed }
        package { 'mysql': ensure => installed }

        service { 'mysqld':
                enable => true,
                ensure => running,
                require => Package['mysql-server'],
        }

        exec { 'set-mysql-password':
                unless => "mysqladmin -uroot -p$password status",
                path => ['/bin', '/usr/bin'],
                command => "mysqladmin -uroot password $password",
                require => Service['mysqld'],
        }
}

どうすれば保護でき$passwordますか?現在、ノード定義ファイルからデフォルトの読み取り可能なパーミッションを削除し、puppetACLを介して明示的に読み取りパーミッションを付与しました。

他の人も同じような状況に出くわしたと思うので、おそらくもっと良い方法があるでしょう。

回答:


3

PuppetとMySQLを使用する場合、ルートパスワードを/root/.my.cnfに入れ、このファイルをロックダウンしてから、データベースサーバーへのSSHアクセスを制限する傾向があります。

はい、ルートパスワードをdbサーバーにクリアテキストで保存することは、最も安全なソリューションではありません。ただし、このファイルにmysqlルートパスワードを書き込む場合、localhostからのログインのみを許可するようにmysqlルートアカウントをセキュリティで保護すると、パスワードはパペットからもプロセスリストpsテーブルからも保持されます。

さらに、誰かが/root/.my.cnfにあるファイルを読み取るためのルートアクセス権を持っている場合、おそらくローカルMySQLデーモンを停止し、ユーザーテーブルなしでデーモンを再起動してデータベースへのルートアクセス権をすぐに取得できます。


2
mysql 5.6以降の場合は、mysql_config_editorを使用します。そうすれば、少なくともパスワードはプレーンテキストになりません。
ケジャウトゥレー16年

1

他の誰かが私を修正するプラグインなどを指摘する可能性がありますが、これに関する一般的な方法は、プレーンテキストのパスワードではなく、暗号化されたパスワードを保存することです。

ただし、MySQLでは、暗号化されたパスワードの使用は許可されていません。それ以外の場合、パスワードはパスワードであり、ハッシュを使用すると、とにかくログインできます。

HieraやGPGなどのサードパーティのユーティリティを使用できるようにする「ハック」がたくさんあります。明らかに、あなたはあなた自身を転がすことができます-しかし、Puppet自身のメーリングリストでさえこの方法を提案します


1

このパスワードの保護者を指定しませんでした。パペットマスターやクライアントボックスにアクセスできるが、ルートパスワードを知る必要がないのは、他のシステム管理者またはおそらく開発者であると想定します。

最初にパスワードを設定するには、次の構文を使用できます。

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6DF1FC54F0CCD999F55D59D3D88526878230C77C' WITH GRANT OPTION;

これにより、プレーンテキストのパスワードではなく、暗号化されたパスワードをパペット設定に保存できます。

コマンドラインでクライアントを使用mysqladminするmysql場合.my.cnf、適切なユーザーのホームディレクトリに展開されるファイルをパペット設定に追加することを考えるのが最善です。パペットマスターとクライアントの両方にあるファイルには、適切な制限されたファイルアクセス許可が必要です。

ミックスにパペットを追加する場合(クライアントからファイルをプルするexec()を作成するなど)、これらのファイルのアクセス許可を回避する方法はたくさんありますが、パスワードを世界中の読み取り可能なファイルに保存するよりも改善されるようです。パペット設定にバージョン管理システムを使用する場合、これはより困難になります。


1
しかし、誰かが暗号化されたパスワードを取得した場合、暗号化された文字列を使用してログインすることはできませんか?
アンドリューM.

@Redmumbaすべての私のテストはそう示すようです。おそらく、ラダダダダが詳しく説明できるものが欠けているのかもしれません。
ベルミンフェルナンデス

3
いいえ。MySQLのIDENTIFIED BY PASSWORD '*HASH-HERE'代わりに使用するとIDENTIFIED BY 'PASSWORD-HERE'、ハッシュがuserテーブルに直接挿入されます。次に、そのハッシュを生成したパスワードを使用してログインする必要がありますSHOW GRANTS;。パスワードハッシュを指定したgrantコマンドがどのように表示されるかを確認するには、通常にログインしてを入力します。他のユーザーを確認することもできますSHOW GRANTS FOR user@host;
ラダダダダ

ああ、そのため、ハッシュ自体を使用してログインすることはできません。ただし、データベースに接続する必要があるクライアント(フロントエンドなど)がある場合、暗号化されたパスワードを保存する方法も必要になります。
アンドリューM.

0

このリンクは、環境変数を使用する方法とサブシェルを使用する方法の2つを提案しています。

コマンドの簡単なラッパーを作成してmysqladmin、暗号化されたパスワードを渡すこともできると思います。次に、このラッパーはパスワードを復号化し、それをに渡しますmysqladmin。復号化部分が含まれているため、ラッパーを保護する必要があります。

環境とシステムにアクセスできるユーザーに基づいて、より安全であると感じる方法を選択できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.