セキュリティエンジニアへの道2 ~ MySQLの構築と操作~

はじめに

例えば CentOS8 で「yum install mysql」を実行すると MySQL ではなく MariaDB がインストールされるので、以下のリファレンスマニュアルに従って MySQL をインストールします。

MySQL Yum リポジトリを使用して MySQL を Linux にインストールする

※「yum install mysql-community-server」が失敗する場合は「dnf -y module disable mysql」を事前に実行してください。

パスワードの変更

MySQL はインストール時に仮のrootパスワードが設定されています。まずはパスワードを確認するところから始めなくてはいけません。

初期パスワードは「/var/log/mysqld.log」のログ中に記載されています。

[root@DV-SV ~]# /var/log/mysqld.log
2020-12-13T08:38:47.689312Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Jo,)Y109!LOe

仮パスワードで MySQL にログインすることができます。

[root@DV-SV ~]# mysql -p

ただし、仮パスワードでは SHOW コマンドが実行できません。

mysql> SHOW DATABASES;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

試していませんが、SHOW が出来ないならほとんどの操作が出来ないと思います。

パスワードを変更する必要があります。以下のコマンドを実行してください。

色々聞かれますが、パスワードの入力以外は基本的にエンターを押し続けても問題ありません。

[root@DV-SV ~]# mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:

The existing password for the user account root has expired. Please set a new password.

New password:

Re-enter new password:
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) :

 ... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) :

 ... skipping.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) :

 ... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) :

 ... skipping.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) :

 ... skipping.
All done!

データベースの作成

パスワードが変更出来たら、データベースを作成します。

mysql> CREATE DATABASE yamazon;
Query OK, 1 row affected (0.01 sec)

作成したデータベースが存在することを確認します。

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| yamazon            |
+--------------------+
5 rows in set (0.00 sec)

データベースが確認出来たらUSEでデータベースに移動します。

mysql> USE yamazon
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

エラーっぽいメッセージが出ますが、読んでみると分かるようにエラーではないので気にしないで下さい。

テーブルの作成

次にテーブルを作成します。テーブルを作成するには最低でも1列必要です。データ型の指定も必須です。

mysql> CREATE TABLE users (id INT);
Query OK, 0 rows affected (0.03 sec)

テーブルが作成されていることを確認します。

mysql> SHOW TABLES;
+-------------------+
| Tables_in_yamazon |
+-------------------+
| users             |
+-------------------+
1 row in set (0.00 sec)

テーブルの詳細を確認します。

mysql> DESCRIBE users;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id    | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

上記から分かるように、主キーは必須ではありません。

カラムの修正

ID を自動的に連番で割り当てるように変更したいと思います。

mysql> ALTER TABLE users MODIFY id INT AUTO_INCREMENT;
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

上記エラーのように、AUTO_INCREMENT 属性としたい場合、列は主キーもしくは一意キーである必要があります。

なので、まずは先に列を主キーにします。

mysql> ALTER TABLE users ADD PRIMARY KEY (id);

主キーを設定した時点でそのカラムは NOT NULL になります。

mysql> DESCRIBE users;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id    | int  | NO   | PRI | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

これで AUTO_INCREMENT が設定できますが、ついでに id 列は 0 でパディングするように設定します。

mysql> ALTER TABLE users MODIFY id INT ZEROFILL AUTO_INCREMENT;
Query OK, 0 rows affected, 1 warning (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 1

MODIFY は設定の追加ではなく変更であることに注意してください。明示的に宣言していないものは現在設定されていても上書き(削除)されます。

mysql> DESCRIBE users;
+----------+---------------------------+------+-----+---------+----------------+
| Field    | Type                      | Null | Key | Default | Extra          |
+----------+---------------------------+------+-----+---------+----------------+
| id       | int(10) unsigned zerofill | NO   | PRI | NULL    | auto_increment |
+----------+---------------------------+------+-----+---------+----------------+
1 rows in set (0.00 sec)

ZEROFILL を設定すると int の桁数が自動で 10 になります。桁数を指定しないと何桁 0 でパディングするか分からないからですね。

「UNSIGNED」は「負数が扱えなくなり、その分正数の範囲が広がる」という属性です。ZEROFILL にすると自動的についてきます。

カラムの追加

カラムを追加します。

mysql> ALTER TABLE users
    -> ADD username VARCHAR(10) NOT NULL,
    -> ADD password VARCHAR(32) NOT NULL;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

varchar(10)なら10文字以内はOK、10文字より大きければNGです。これはアルファベットでも漢字でも同じです。

mysql> DESCRIBE users;
+----------+---------------------------+------+-----+---------+----------------+
| Field    | Type                      | Null | Key | Default | Extra          |
+----------+---------------------------+------+-----+---------+----------------+
| id       | int(10) unsigned zerofill | NO   | PRI | NULL    | auto_increment |
| username | varchar(10)               | NO   |     | NULL    |                |
| password | varchar(32)               | NO   |     | NULL    |                |
+----------+---------------------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

ユーザの作成

ユーザを作成します。

mysql> INSERT INTO users (username,password) VALUES ('yamada','P@ssw0rd');

シングルクオーテーションもしくはダブルクオーテーションで囲わないとsyntaxエラーになるので注意してください!

最後にテーブルにユーザが追加されていることを確認します。

mysql> SELECT * FROM users;
+------------+----------+----------+
| id         | username | password |
+------------+----------+----------+
| 0000000001 | yamada   | P@ssw0rd |
+------------+----------+----------+
1 row in set (0.00 sec)

使用コマンド

mysql_secure_installation
mysql -p
USE データベース名
SHOW DATABASES;
SHOW TABLES;
DESCRIBE テーブル名;
CREATE DATABASE データベース名;
CREATE TABLE テーブル名 (列名① データ型);
ALTER TABLE テーブル名 ADD PRIMARY KEY (列名);
ALTER TABLE テーブル名 MODIFY 列名 データ型 ZEROFILL AUTO_INCREMENT;
ALTER TABLE テーブル名 ADD 列名 データ型(桁数) NOT NULL, ADD 列名 データ型(桁数) NOT NULL;
INSERT INTO テーブル名 (列名,列名) VALUES ('値','値');

使用していないが役に立つ削除コマンド

DROP TABLE テーブル名;
DELETE FROM テーブル名 WHERE 列名=値;
DELETE FROM テーブル名; //すべての行を削除

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)