質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • MySQL

    6022questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

mysqlでcreate functionを実行すると自動で作成されるユーザーのホストについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,319

mysqlについて質問です。

(前提条件)
1.実行ユーザーのホストは、「%」のみが存在している
2.「実行ユーザー@%」の権限
SELECT
INSERT
UPDATE
DELETE
LOCK TABLES
CREATE ROUTINE
ALTER ROUTINE
SUPER(追記)
3.MYSQLサーバのバージョン
5.6.21

(起きている現象)
クライアントから、mysqlコマンドを使用して、functionのcreate文を実行すると
「実行ユーザー@クライアントIPアドレス」が自動で作成されます。
以降、権限が何もない状態となり何もできなくなる。

(コマンド)
mysql -h $MYSQL_HOST -u $MYSQL_USER hogedb < create_function.sql

(クエリ)
DELIMITER ;;
DROP FUNCTION IF EXISTS fn_hoge;;
CREATE DEFINER=root@localhost FUNCTION fn_hoge(
) RETURNS int(11)
    DETERMINISTIC
BEGIN
//処理
END;

(質問)
1.何故、ユーザーのホストが追加されてしまうのか?
2.ユーザーのホストが追加されずに済む方法があるか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

手元にMySQLもなく再現も検証もしてなくて申し訳ないが
automatic_sp_privilegesというやつじゃないだろうか?
user@%でもこれはただホスト部がワイルドカードなだけで実際にはアクセス元ホストのユーザーとして認識されてるからこの効果により作成されちゃうんじゃないか?とりあえず0に設定してみたらうまくいくかもしれない。
ただの推測だから間違ってたらごめんよ。

 以下追記

検証してみた結果、
automatic_sp_privilegesがONかつホスト部がワイルドカードのユーザーに対してEXECUTEもしくはALTER ROUTINEのどちらかが足りない場合は、実際の接続元ホストのユーザーが作成され、それに対してEXECUTEALTER ROUTINEが付与されるね。
よってもしこれが原因であった場合の解決策はautomatic_sp_privilegesをOFFにする:

set global automatic_sp_privileges=0;


かもしくはホスト部が'%'のユーザーに対してあらかじめEXECUTEALTER ROUTINEを与えておく:

grant execute, alter routine on yourdb.* to 'user'@'%';

再現したんだけどねー。新しくユーザー作るわけだからこのレポートにもあるようにcreate functionするユーザーにmysql.userテーブルに対するinsert権限が必要なわけよ。質問文のやつにはそんなの書いてないじゃん?あと検証するにあたってdefiner=root@localhostとするならsuper権限必要だったし。なんか書いてあるのとは別に豪華な権限与えてる?
だから原因がこれかは正直わかんね。とりあえずcreate functionするユーザーへの権限付与が適切じゃないんじゃね?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/28 12:08 編集

    ありがとうございます。
    こちらでもやってみました!

    automatic_sp_privilegesを無効にした結果、以下の権限を与える事で
    ユーザーが作成されることは回避できました。

    ・LOCK TABLES
    ・CREATE ROUTINE
    ・ALTER ROUTINE
    ・SUPER

    ※SUPERに関しては、SET GLOBAL log_bin_trust_function_creators = 'ON';を
    サーバ側の設定を変更して、試してみましたが、それでも要求されてしまって、とりあえず与えております。
    (サーバの再起動が必要なのかも・・・今、簡単に再起動できないので確認取れておりません)

    おっしゃる通り、SUPER権限の問題が残ったのですが
    自動でユーザーが作成される状態は回避できています。

    キャンセル

  • 2016/03/28 12:19

    えーとね。ちゃんと回答読んで、automatic_sp_privilegesについて調べて、create function文の公式のマニュアルを読みふけって適切な設定してくれたらうれしいな。
    superは直接は関係ないから。あとautomatic_sp_privilegesをOFF「もしくは」execute+alter routineだから。
    さらにmysql.userにinsert権限なければwarningがでてユーザーつくられねーから。insert on *.*やってんじゃないだろうな。
    まあ原因が最初の推測通りだったようだからそれがわかって俺は大体満足だ。

    キャンセル

  • 2016/03/30 16:28

    回答者様のご指摘で再度確認したところ、SUPER権限も付与した際に発生していました。
    混乱させてしまい申し訳ありませんでした。
    回答ありがとうございました。助かりました!

    キャンセル

関連した質問

  • 解決済

    MySQLのAUTO_INCREMENTについて

    PHPとMySQLを使って開発をしています。ユーザIDをAUTO_INCREMENTしているのですが、 本番環境では、ある程度大きい数字から開始したいと思っています。途中から変更す

  • 解決済

    Mysqlのパスワードを変更したい

    Mysql初心者です。 Mysqlをインストールし、rootのパスワードを変更したいのですが 変更するにはどうすれば良いでしょうか? どなたか知っている方いましたら教えてください。

  • 解決済

    MySQLについて

    MySQLについて質問です。 MySQLにてテーブルを作成したところなのですが、テーブルを作成した際のCREATE文を拡張子sqlのファイルで提出してほしいといわれたのですが、メモ

  • 解決済

    mysqlでDECLAREが使えない

    以下のsqlだとsyntax errorになっていまいます。どう修正すればよいでしょうか? CREATE PROCEDURE sample()

  • 解決済

    mysql -u ユーザー名 -pでDBにアクセスできません。

    現在、DBにアクセス制限がかかっているので、 新しくアクセスできるユーザーを作成したと考えております。 しかし、下記エラーが出ます。 ERROR 1045 (2800

  • 受付中

    MySQLで存在しないファンクションを作成する構文ってありますか?

    前提・実現したいこと MySQLでCREATE FUNCTIONするさいに、そのFUNCTIONが存在しない場合のみCREATEを実行したいです。 要するに、CREATE FU

  • 解決済

    データベースが作成できない

    初心者で恐縮ですが、ご教授くださいm(__)m コマンドプロンプトで、作成したユーザーでログインし、 create database cake_test; と打ったんです

  • 解決済

    rootで付与した権限が反映されない

    前提 XAMPPをインストールしたときに同梱されていたMySQLをコマンドラインで利用していました。コマンドはすべてrootで実行しています。 MySQLのバージョン情報

同じタグがついた質問を見る

  • MySQL

    6022questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。