背景
以前ユーザを作成する際に確認方法として以下のselect構文を使用してmysql.user(mysqlデータベース内のuserテーブル)の中からhostとuserとpasswordを表示させることで確認できるとしたが、今回改めて下記の構文を使用したところうまく表示されなかった。
状況
SELECT USER,HOST,PASSWORD from mysql.user
下記がエラーメッセージ
ERROR 1054 (42S22): Unknown column ‘password’ in ‘field list’
そんなカラム無いよとのことらしい。
おかしいな紹介されていたから無いはず無いのだけどなと思ったが、とりあえずuserテーブルにどんな属性が設定されているか確認することにした。
あまり詳しくない僕はとりあえず、select文ですべて表示することにした。
select * from mysql.user from user ="student";
対応方針
select文で表示するとにした。
上記で表示したところカラムが多すぎて画面に収まらず横に長いディスプレイが欲しくなった。
とりあえず、上記で表示された(*1)カラム名の中にpasswordと言うかラムが存在するか目視で確認したところ数件発見
参照先
| password_expired | password_last_changed | password_lifetime |
みたところ全部違いそうだったけれど一応意味のメモ
password_expired:期限切れのパスワード
password_last_changed:最終更新日
password_lifetime:パスワードが有効な期間のサイクル
https://dev.mysql.com/doc/refman/5.7/en/grant-tables.html
URL先を参照してもpasswordというかラムは存在していない。
ユーザ情報の中のセキリティに分類されている列の抜粋
リンク先のセキュリティ情報という分類の中にも存在していなかった。
Security columns | ssl_type |
---|---|
ssl_cipher | |
x509_issuer | |
x509_subject | |
plugin | |
authentication_string | |
password_expired | |
password_last_changed | |
password_lifetime | |
account_locked |
上記の中で該当しそうなカラムは、authentication_stringかなと思い確認してみることに。
こちらは、セキュリティの認証情報が格納されているカラムとのこと。
passwordそのものでなく、passwordをhash化したデータが格納されている。
そのため、authentication_stringという名を(*2)翳しているのかなとおもいました。
非可逆なカラムで他者からは見えない、セキリティ上当然の使用であることを恥ずかしながら今更知ったというところでした。
passwordが文字列に含まれる列名のテーブルの参照結果
一旦下記にstudentの情報を吐き出す。
select user,password_last_changed ,password_expired,password_lifetime from mysql.user where user = 'student';
user | password_last_changed | password_expired | password_lifetime |
---|---|---|---|
student | 2017-05-14 02:26:18 | N | NULL |
passwordのハッシュ化された列名の確認
authentication_string は以下
select user,password_last_changed ,password_expired,password_lifetime ,authentication_string from mysql.user where user = 'student';
user | password_last_changed | password_expired | password_lifetime | authentication_string |
---|---|---|---|---|
student | 2017-05-14 02:26:18 | N | NULL | *5C9A4E4AB5E34FC99610372BA8D061F994CFFB94 |
テーブルが持つ属性の確認方法
今回はselect文でどんな属性情報がテーブルに登録されているか確認したが、この記録をするために調べたところ、別途構文が存在していること知る。以下がそれです。
use 'database_name'; desc 'table_name';
上記で簡単に属性情報を閲覧することができる。
以下はuserテーブルに登録されているカラム名の一覧と型および制約情報などのviewtableです。
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
Host | char(60) | NO | PRI | ||
User | char(32) | NO | PRI | ||
Select_priv | enum(‘N’,‘Y’) | NO | N | ||
Insert_priv | enum(‘N’,‘Y’) | NO | N | ||
Update_priv | enum(‘N’,‘Y’) | NO | N | ||
Delete_priv | enum(‘N’,‘Y’) | NO | N | ||
Create_priv | enum(‘N’,‘Y’) | NO | N | ||
Drop_priv | enum(‘N’,‘Y’) | NO | N | ||
Reload_priv | enum(‘N’,‘Y’) | NO | N | ||
Shutdown_priv | enum(‘N’,‘Y’) | NO | N | ||
Process_priv | enum(‘N’,‘Y’) | NO | N | ||
File_priv | enum(‘N’,‘Y’) | NO | N | ||
Grant_priv | enum(‘N’,‘Y’) | NO | N | ||
References_priv | enum(‘N’,‘Y’) | NO | N | ||
Index_priv | enum(‘N’,‘Y’) | NO | N | ||
Alter_priv | enum(‘N’,‘Y’) | NO | N | ||
Show_db_priv | enum(‘N’,‘Y’) | NO | N | ||
Super_priv | enum(‘N’,‘Y’) | NO | N | ||
Create_tmp_table_priv | enum(‘N’,‘Y’) | NO | N | ||
Lock_tables_priv | enum(‘N’,‘Y’) | NO | N | ||
Execute_priv | enum(‘N’,‘Y’) | NO | N | ||
Repl_slave_priv | enum(‘N’,‘Y’) | NO | N | ||
Repl_client_priv | enum(‘N’,‘Y’) | NO | N | ||
Create_view_priv | enum(‘N’,‘Y’) | NO | N | ||
Show_view_priv | enum(‘N’,‘Y’) | NO | N | ||
Create_routine_priv | enum(‘N’,‘Y’) | NO | N | ||
Alter_routine_priv | enum(‘N’,‘Y’) | NO | N | ||
Create_user_priv | enum(‘N’,‘Y’) | NO | N | ||
Event_priv | enum(‘N’,‘Y’) | NO | N | ||
Trigger_priv | enum(‘N’,‘Y’) | NO | N | ||
Create_tablespace_priv | enum(‘N’,‘Y’) | NO | N | ||
ssl_type | enum(‘’,‘ANY’,‘X509’,‘SPECIFIED’) | NO | |||
ssl_cipher | blob | NO | NULL | ||
x509_issuer | blob | NO | NULL | ||
x509_subject | blob | NO | NULL | ||
max_questions | int(11) unsigned | NO | 0 | ||
max_updates | int(11) unsigned | NO | 0 | ||
max_connections | int(11) unsigned | NO | 0 | ||
max_user_connections | int(11) unsigned | NO | 0 | ||
plugin | char(64) | NO | mysql_native_password | ||
authentication_string | text | YES | NULL | ||
password_expired | enum(‘N’,‘Y’) | NO | N | ||
password_last_changed | timestamp | YES | NULL | ||
password_lifetime | smallint(5) unsigned | YES | NULL | ||
account_locked | enum(‘N’,‘Y’) | NO | N |
気づき
上記のテーブルを見て今までboolean型bit(1)を使用していたけれどenum(‘N’,‘Y’)を使用していることに気づきました。
mysqlに標準で付いているテーブルに登録されている属性が列挙型のY/Nになっているのでそちらの方のメリットデメリットを再考する必要があるなと感じました。
まだまだわからないことがたくさんあるので学んでいきたい。
今後の課題
- boolean型採用時の最適な型についての調べる。
- plugin の mysql_native_passwordについても調べる。
- password_last_changedの単位を調べる。
注釈
(1)カラム名 :属性、カラム名、属性名、列名、などの表記の乱れが文章中に存在しています。ネット上の情報を見るとfield name やフィールド名などともいうそうでどれを使えば通じるのかイマイチよくわからないのが現状です。
(2)翳して:その名を付けた器などという風に、通り名(?)がついた状態の時に使う言葉だと思っていましたが、辞書で調べてみたらその意味は記述されていませんでした。
①手に持って頭上に高くかかげる。 「団旗を-・して進む」 ②物の上方におおいかけるように手をさしだす。 「火鉢に手を-・す」 ③光などをさえぎるために、手などを額のあたりに持っていっておおう。 「小手を-・す」出典|三省堂大辞林 第三版について | 情報
https://kotobank.jp/word/%E7%BF%B3%E3%81%99-461674
すこし頑固なので表記を変えず使ってみました。
イメージした用例は、正宗の名を翳(かざ)した名刀などです。
許されがたいかも