web-dev-qa-db-ja.com

80人のMySQLユーザーを簡単にProxySQLに取り込む方法は?

88個のユーザーアカウントを持つPercona MySQLサーバーの前にProxySQLを設定しています。私も彼らのパスワードのほとんどを知りません。パスワードはハッシュとしてMySQLに保存されますが、プレーンテキストでProxySQLに保存されます。 88個すべてのアカウントを一度にProxySQLに簡単に取り込むにはどうすればよいですか?または、オンにできるパススルー認証スイッチはありますか?

5
IcarusNM

PerconaでProxySQLを使用しているので、Perconaの優秀な人々が作成した気の利いたツールがあり、まさに求めていることを実行します(mysqlのユーザーをproxysqlに同期します)。

Percona RPMを使用してProxySQLをインストールすると、「proxysql-admin」と呼ばれるProxySQLインスタンスの管理に役立つ便利なスクリプトが付属しています。このスクリプトには、「-syncusers」のオプションがあります。スクリプトのヘルプ情報の抜粋を次に示します。

[root@localhost ~]# /usr/bin/proxysql-admin
Usage: [ options ]
Options:
  --config-file=<config-file>        Read login credentials from a configuration file (overrides any login credentials specified on the command line)
  --quick-demo                       Setup a quick demo with no authentication
  --proxysql-datadir=<datadir>       Specify proxysql data directory location
  --proxysql-username=user_name      Username for connecting to the ProxySQL service
  --proxysql-password[=password]     Password for connecting to the ProxySQL service
  --proxysql-port=port_num           Port Nr. for connecting to the ProxySQL service
  --proxysql-hostname=Host_name      Hostname for connecting to the ProxySQL service
  --cluster-username=user_name       Username for connecting to the Percona XtraDB Cluster node
  --cluster-password[=password]      Password for connecting to the Percona XtraDB Cluster node
  --cluster-port=port_num            Port Nr. for connecting to the Percona XtraDB Cluster node
  --cluster-hostname=Host_name       Hostname for connecting to the Percona XtraDB Cluster node
  --cluster-app-username=user_name   Application username for connecting to the Percona XtraDB Cluster node
  --cluster-app-password[=password]  Application password for connecting to the Percona XtraDB Cluster node
  --without-cluster-app-user         Configure Percona XtraDB Cluster without application user
  --monitor-username=user_name       Username for monitoring Percona XtraDB Cluster nodes through ProxySQL
  --monitor-password[=password]      Password for monitoring Percona XtraDB Cluster nodes through ProxySQL
  --without-check-monitor-user       Configure ProxySQL without checking/attempting to create monitor user
  --enable, -e                       Auto-configure Percona XtraDB Cluster nodes into ProxySQL
  --disable, -d                      Remove any Percona XtraDB Cluster configurations from ProxySQL
  --node-check-interval=3000         Interval for monitoring node checker script (in milliseconds)
  --mode=[loadbal|singlewrite]       ProxySQL read/write configuration mode, currently supporting: 'loadbal' and 'singlewrite' (the default) modes
  --write-node=Host_name:port        Writer node to accept write statments. This option is supported only when using --mode=singlewrite
                                     Can accept comma delimited list with the first listed being the highest priority.
  --include-slaves=Host_name:port    Add specified slave node(s) to ProxySQL, these nodes will go into the reader hostgroup and will only be put into
                                     the writer hostgroup if all cluster nodes are down.  Slaves must be read only.  Can accept comma delimited list.
                                     If this is used make sure 'read_only=1' is in the slave's my.cnf
  --adduser                          Adds the Percona XtraDB Cluster application user to the ProxySQL database
  --syncusers                        Sync user accounts currently configured in MySQL to ProxySQL (deletes ProxySQL users not in MySQL)
  --version, -v                      Print version info
[root@localhost ~]#

下部にある「--syncusers」オプションに注意してください。そうですね、そうですか? ...そしてそれはPerconaによって作成され、配布されています。 :)

お役に立てれば!

5
Jordan

ProxySQL内でのパスワードの保存(およびハッシュ)を説明する簡単なドキュメントは次のとおりです。 https://github.com/sysown/proxysql/wiki/Passwords-management

次に、すべての usernames および SHA1ハッシュパスワード mysql から proxysql バックエンド。 sqlite3 ファイルです。ここに私がそれをした方法があります。

A. /tmp/user.sqlのようなファイルを作成します。

select "INSERT INTO mysql_users (username,password) VALUES (", CONCAT("'",User,"'"), ",", CONCAT("'",Password,"'"), ");" from user WHERE Password LIKE "*%" order by User;

B. mysqldサーバーに対して、 root として、または少なくともmysql.userテーブルを表示する権限を持つ任意の権限で実行します。 mysql コマンドに-hまたは-pまたは必要なものを追加します。

linux# mysql -N mysql < /tmp/user.sql > /tmp/input.sql

C. /tmp/input.sqlを編集して、ユーザーを慎重に確認し、重複する行を省略します。同じユーザーが異なるパスワードハッシュで表示される場合があります。ここでは同じパスワードが常に同じハッシュにマップされるため、mysqlで古いユーザーを定義している場合、おそらく異なるクライアントIPの異なるパスワードを使用していると、整理に時間がかかることがあります。そのファイルの残りの書式設定とタブについて心配する必要はありません。不要な行を削除するだけです。

D. proxysql サーバー( mysqld と同じ)で、/var/lib/proxysql /をコピーしますproxysql.db to /tmpinput.sqlファイルを配置してインポートを試みます。

linux# sqlite3 /tmp/proxysql.db < /tmp/input.sql

既存のユーザーアカウントについて警告する場合があります。これは無害ですが、次のような行の入力ファイルを確認する価値があります。

Error: near line 34: columns username, frontend are not unique
Error: near line 35: columns username, frontend are not unique

E. sqlite3で新しい実績を直接表示します。

linux# sqlite3 /tmp/proxysql.db
sqlite> select * from mysql_users;
...
glpi|*F210F7D92AE10C493DDA19A33D4BC50C6E82517|1|0|0||0|0|0|1|1|10000
icinga|*79BAD610D871E3323F655960E4BD2399FAAF7C1|1|0|0||0|0|0|1|1|10000
icinga_check|*B87C5B0712F247F7632A450A36D1285C8666496|1|0|0||0|0|0|1|1|10000
ipplan|*EE50B7BF86175E257803509C4B04B51DF557D19|1|0|0||0|0|0|1|1|10000
...

F.正しく表示されていることを確認したら、本番環境のproxysql.dbファイルで同じ編集を行い、 admin としてログインします。 proxysqlに、そして新しいユーザーを生き生きとさせます:

proxysql> LOAD MYSQL USERS FROM DISK;

G.今、あなたは一人でいます。それらをRUNTIMEに入れ、テストし、その他の設定(デフォルトのスキーマやホストグループなど)を設定します。

私は、あなたがここでどのような損害を与えるかについて、保証も主張もしません。これは、既存のユーザーの長いリストをProxySQLに導入した方法です。データベースサーバーのポート3306で proxysql を挿入し、静かに mysql を2206に移動しようとしました。サイコロはありません。それは私の環境では決して起こらないでしょう。たぶんあなたは幸運で、管理が簡単なものを持っているかもしれません。少なくともこれであなたは始められ、ProxySQLの内部について何かを学ぶでしょう。幸運を!

4
IcarusNM

IcarusNMからの回答に基づいて、少し改善しました。

このスクリプトは、現在のディレクトリに資格情報を持つ2つのファイルを想定しています。

  • proxyadmin.cnf
  • backend.cnf

それは単に各バックエンドからユーザーアカウントのリストをロードし、それをプロキシで置き換えます。

#!/bin/bash

TMPFILE=$(mktemp)

USER_BLACKLIST="'root', 'phpmyadmin'"
GET_QUERY="select \"REPLACE INTO mysql_users (username,password,default_hostgroup) VALUES (\", CONCAT(\"\'\",user.User,\"\'\"), \",\", CONCAT(\"\'\",Password,\"\'\"), \",\", %s, \");\" FROM user LEFT JOIN db on (user.User=db.User) WHERE db.db IS NOT NULL AND Password LIKE \"*%%\" AND user.User NOT IN (%b) order by user.User;"

# First backend
BACKEND=192.168.1.100
HOSTGROUP=1

printf "$GET_QUERY" "$HOSTGROUP" "$USER_BLACKLIST" \
        | mysql --defaults-file=backend.cnf --Host="$BACKEND" --skip-column-names mysql \
        | tee $TMPFILE

# Second backend, duplicate to get more.
BACKEND=192.168.66.101
HOSTGROUP=2

printf "$GET_QUERY" "$HOSTGROUP" "$USER_BLACKLIST" \
        | mysql --defaults-file=backend.cnf --Host="$BACKEND" --skip-column-names mysql \
        | tee -a $TMPFILE


# Load users into ProxySQL.
cat $TMPFILE | mysql --defaults-file=proxyadmin.cnf

# Enable new config.
echo "LOAD MYSQL USERS TO RUNTIME" | mysql --defaults-file=proxyadmin.cnf

# Cleanup
rm -v $TMPFILE
3
Herman van Rink

MySql 5.7とProxySQL 2.0で動作するようにIcarusNMのクエリを改善しました

SELECT DISTINCT 
CONCAT("INSERT INTO mysql_users (username,password, default_hostgroup) VALUES ("
  ,CONCAT("'",User,"'")
  ,","
  ,CONCAT("'",authentication_string,"'",",10")
  ,");"
) 
from mysql.user 
WHERE authentication_string LIKE "*%" 
order by User;
0
Uccio