MySQLのアクセス権の詳細

3548 ワード

多くのネットユーザーがMySQLがサーバーにログインできないことについて質問しているのを見て、PHPでMySQLを呼び出したときに発生したMySQLデータベースサーバーにログインできない問題を含めて、PHPに問題があったと思っています.実はMySQL権限の問題です.
MySQLの権限システムはMySQLのマニュアルの中でとても長い1章で、私はそれを印刷して20ページ以上印刷しました!ここで私の理解を簡単に書いて、MySQLに接触したばかりの同志に少し役に立つことを望んでいます.言うことが間違っているところがあれば,同志たちにも指摘してもらいたい.
MySQLの権限メカニズムを知った後、思わずその厳密さと巧みさに感心しました.すべてのデータベースシステムがそうかもしれませんが、他の大規模なデータベースがスーパー管理者がデータテーブルに直接介入する必要がないように権限を持っているだけです.
MySQLの権限はmysqlという名前のデータベースに保存され、user、db、host、tables_があります.priv、columns_privなど5つのテーブル.
まず、ユーザーのログインを制限するのはuserテーブルのみで、最もよく使われるのはuser、host、passwordの3つのフィールドです.その他のselect_priv、update_priv、......これらのフィールドは、それぞれ、そのユーザにselect、update、......などの権限があるかどうかを示し、これらのフィールドは「Y」に設定され、そのユーザが対応する権限を持っていることを示し、「N」は、ユーザが対応する権限を持っていないことを示す.ここで指定した権限はグローバルです.userテーブルでユーザーselectまたはupdate権限を与えると、このサーバ上のデータベース、テーブルに上記の権限があります.もちろんmysqlデータベースも含まれています!!これは、userテーブルのデータを変更することで、より大きな権限を不正に取得できることを意味します!!!これは非常に恐ろしいので、root用のアウトドア以外にuserテーブルに権限を割り当てないことをお勧めします.特に、rootとほぼ同じ権限を持つユーザーを作ることができます(パスワードは他の人に言わないでください!)rootパスワードを忘れた時に使えました.ユーザーを追加するときに、権限フィールドの値を指定しないと、デフォルト値は「N」です.つまり、このユーザーには何の権限もありません.ユーザーテーブルにユーザーを追加するのは安心できます.ログインできても何もできないからです.
もう一つ注意すべき問題はuserテーブルのpasswordフィールドです.rootユーザーがmysqlデータベースを閲覧できる以上、userテーブルのpasswordフィールドが見えますが、他のユーザーのパスワードが見えているのではないでしょうか.いいえ!userテーブルのpasswordフィールドにはpassword()関数で暗号化されたユーザパスワードが保存されており、ユーザがログインするとサーバは受信したユーザから入力されたパスワードをpassword()関数で暗号化し、暗号化された文字列がuserテーブルpasswordフィールドと一致すれば暗号コードが正しいと判断する.password()には逆演算がないので、暗号化された文字列からパスワードの明文を得ることはできません.また、userテーブルを手動で変更する場合は、passwordフィールドを更新するときにpassword()関数で暗号化することを忘れないでください.たとえば、billという名前のユーザーがサーバーにログインすることを許可し、12345のパスワードを設定するには、次のようにします.

insert into user (user,host,password) values ('bill','%',password('12345'));


もしあなたが直接

insert into user (user,host,password) values ('bill','%','12345');


もし、彼はあなたのサーバーに登れないかもしれません.オソのネット上に投稿して質問します.
権限に関連するデータ・テーブルを手動で操作するたびに、flush privilegesコマンドを実行して有効にします.
次の問題は、ユーザーに権限を割り当てる方法です.ユーザーにデータベースを開き、そのデータベースに関するすべての権限または一部の権限を彼に開放する場合は、dbテーブルを使用します.dbテーブルの意味は、あるユーザがクエリーを要求すると、そのユーザがクエリーに対するデータベースに対してそのクエリー操作を行う権限を持っているかどうかを検出し、ある場合、クエリーを許可することである.いいえ、tablesにさらに問い合わせます.privテーブル.dbテーブルの最も一般的なフィールドはuser、db、および権限に関するフィールドの山です.userは、言うまでもなく、そのユーザーのユーザー名であり、userテーブルの対応である.dbは、彼に割り当てるデータベース名です.そして、彼に与える権限に対応する権限フィールドを「Y」に設定します.同様に、これらのフィールドの値は、指定されていない場合にデフォルトでは'N'です.GRANT/REVOKEコマンドでユーザーに権限を割り当てることもできます.

grant select,update,insert,delete,creater,alter,drop,index on bill.* to bill;


これによりbillというデータベースに対するほとんどの権限がユーザbillに与えられる.ここで与えられていないのはgrant権限だけで、この権限については、簡単に人に与えないことをお勧めします.ユーザーはgrant権限を持っているので、他のユーザーに権限を割り当てることができます.幸いなことに、grant権限を持つユーザーは、自分がすでに持っている権限を他の人に割り当てるしかありません.
GRANT/REVOKEコマンドを使用して権限を変更すると、flush privilegesコマンドを実行することなく変更を有効にできます.
上で説明したのは、1人のユーザーにデータベースを完全に開く問題です.1人のユーザーに特定のテーブルの権限を与えたい場合はtables_です.privテーブルが機能する時が来た.ここでのキーフィールドはuser、db、table_です.name .ユーザーに特定のデータベース内の特定のテーブルの権限を指定するには、どのユーザー(user)、どのデータベース(db)、どのテーブル(table_name)の3つの重要な要素があります.そのメカニズムはdbテーブルと似ています.これ以上繰り返す必要はありません.唯一違うのはここでSETタイプのフィールドtableを使ったことです.privはユーザーのこの表に対する権限を指定し、SETのメンバーにはSELECT、UPDATE、INSERT、DELETE、ALTER、CREATE、DROP、GRANT、INDEX、REFERENCEなどがあり、いずれかまたはいくつかを選択してユーザーに割り当てることができます.
上記のいくつかのパーミッション・テーブルおよび未説明のhostテーブルには、異なるホストから同じユーザーを区別したり、同じユーザーに異なるホストから接続したりする際に異なるパーミッションを付与するためのhostフィールドがあります.この使い方はあまり一般的ではありませんが、安全のためrootユーザーは、リモートから接続する必要がない場合は、hostをlocalhostに設定し、他の場合は%、すなわち任意のホストに設定することをお勧めします.