読者です 読者をやめる 読者になる 読者になる

MySQLでパスワードを表示する際に陥ったこと。

背景

以前ユーザを作成する際に確認方法として以下の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
すこし頑固なので表記を変えず使ってみました。
イメージした用例は、正宗の名を翳(かざ)した名刀などです。
許されがたいかも