私は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
?現在、ノード定義ファイルからデフォルトの読み取り可能な権限を削除し、ACL経由でpuppet
の読み取り権限を明示的に付与しています。
他の人が同じような状況に遭遇したと思いますので、もっと良い方法があるでしょう。
PuppetとMySQLを使用する場合、/ root/.my.cnfにrootパスワードを入力し、このファイルをロックして、データベースサーバーへのSSHアクセスを制限する傾向があります。
はい、dbサーバーにrootパスワードをクリアテキストで保存することは、最も安全なソリューションではありません。ただし、このファイルにmysql rootパスワードを書き込む場合、mysqlrootアカウントを保護してlocalhostからのログインのみを許可すると、パスワードがpuppetから除外され、プロセスリストps
テーブルからも除外されます。
さらに、誰かが/root/.my.cnfにあるファイルを読み取るためのrootアクセス権を持っている場合、ローカルMySQLデーモンを停止し、usersテーブルなしでデーモンを再起動してデータベースへの即時のrootアクセス権を取得するアクセス権も持っている可能性があります。
他の誰かが私を修正するプラグインなどを指摘する可能性がありますが、これを行う一般的な方法は、encryptedパスワードを保存することです。プレーンテキストのパスワード。
しかし、私は今あなたに言うことができます、MySQLはあなたが暗号化されたパスワードを使用することを許可しません-そうでなければ、それはパスワードであり、ハッシュはあなたがとにかくログインすることを許可します。
HieraおよびGPG などのサードパーティのユーティリティを使用できるようにする「ハック」がたくさんあります。もちろん、自分でロールすることもできますが、 Puppet自身のメーリングリストでもこの方法を提案しています 。
このパスワードを保護する相手を指定していません。パペットマスターまたはクライアントボックス、あるいはその両方にアクセスできるが、rootパスワードを知る必要がないのは、他のシステム管理者または開発者であると想定します。
最初にパスワードを設定するには、次の構文を使用できます。
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6DF1FC54F0CCD999F55D59D3D88526878230C77C' WITH GRANT OPTION;
これにより、プレーンテキストパスワードではなく、暗号化されたパスワードをパペット構成に保存できます。
コマンドラインでmysqladmin
とmysql
クライアントを使用する場合、.my.cnf
ファイルを適切なユーザーのホームディレクトリにデプロイされるパペット設定に追加します。 Puppetマスターとクライアントの両方のファイルには、適切で制限的なファイル権限が必要です。
Puppetをミックスに追加するとき(クライアントからファイルをプルするexec()を作成するなど)、これらのファイル権限を回避する方法はたくさんありますが、誰でも読み取り可能なファイルにパスワードを保存するよりも改善されるようです。パペット設定にバージョン管理システムを使用している場合、これはさらに困難になります。
このリンク は、環境変数を使用する方法とサブシェルを使用する方法の2つの方法を提案しています。
コマンドmysqladmin
の周りに単純なラッパーを作成して、暗号化されたパスワードを渡すこともできると思います。このラッパーは、パスワードを復号化してmysqladmin
に渡します。ラッパーには復号化部分が含まれているため、ラッパーを保護する必要があります。
ご使用の環境とシステムへのアクセス権を持つユーザーに基づいて、より安全な方法を選択できます。