最低限知っておくべきMySQL8.0の権限管理

# はじめに
2024年7月現在、ハッカー集団がKADOKAWAに対してランサムウェアによる攻撃を行ったというニュースが印象に残っているかと思います。

ユーザーのデータといった情報を保存しておくデータベースの権限管理はとても重要です。

そこで、「最低限知っておくべきデータベースの権限管理」というタイトルで、ぜひ知っておいて損はないデータベースの権限管理についての記事を書くこととしました。設定を見直す良い機会にしてもらえれば幸いです。

# データベースの権限管理の基本
データベースの権限管理は、適切なアクセス制御を通じて、データの安全性を確保するために重要です。
以下では、MySQLを例に、最低限知っておくべき権限管理の基本と具体的な設定方法について解説します。

## 1. ユーザー作成と基本権限の付与
データベースにアクセスするユーザーを作成し、必要な権限を付与する基本的な方法です。

### ユーザーの作成
まず、新しいユーザーを作成します。
```sql
CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'secure_password';
```
このコマンドは、`new_user`という名前のユーザーを作成し、`localhost`からの接続に対して`secure_password`をパスワードとして設定します。

### 基本権限の付与
新しく作成したユーザーに、特定のデータベースへのアクセス権限を付与します。
```sql
GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.* TO 'new_user'@'localhost';
```
このコマンドは、`new_user`に対して`database_name`内の全てのテーブルに対する`SELECT`、`INSERT`、`UPDATE`、`DELETE`権限を付与します。

## 2. 特定テーブルへの権限の付与
ユーザーに対して、特定のテーブルだけにアクセス権限を付与する方法です。

### 特定テーブルの権限付与
```sql
GRANT SELECT ON database_name.specific_table TO 'new_user'@'localhost';
```
このコマンドは、`new_user`に対して`database_name`内の`specific_table`に対する`SELECT`権限を付与します。

## 3. 読み取り権限の付与
不要なアクセスや誤操作を防ぐ一例として、ここでは読み取り専用のユーザー作成についてのコマンドを載せています

### 例: 読み取り専用ユーザーの作成
```sql
CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'readonly_password';
GRANT SELECT ON database_name.* TO 'readonly_user'@'localhost';
```
このコマンドは、`readonly_user`という名前のユーザーを作成し、`database_name`内の全てのテーブルに対する`SELECT`権限のみを付与します。

## 4. すべての権限の付与
ここでは管理者ユーザーとして、すべての権限を付与するというコマンドを載せていますが、コマンドを入力する際には特に気をつけてください。

### 管理者ユーザーの作成
```sql
CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'admin_password';
GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION;
```
このコマンドは、`admin_user`という名前のユーザーを作成し、全てのデータベースとテーブルに対する全ての権限を付与します。権限を付与する際には気をつけてください。

## 5. 接続の許可設定
特定のホストからの接続のみを許可する設定です。

### 特定ホストからの接続制限
```sql
CREATE USER 'remote_user'@'192.168.1.100' IDENTIFIED BY 'remote_password';
GRANT ALL PRIVILEGES ON database_name.* TO 'remote_user'@'192.168.1.100';
```
このコマンドは、`remote_user`という名前のユーザーを`192.168.1.100`というIPアドレスからの接続に対して作成し、`database_name`内の全てのテーブルに対する全ての権限を付与します。

## 6. 権限の確認と取り消し
付与した権限を確認し、不要になった権限を取り消す方法です。

### 権限の確認
```sql
SHOW GRANTS FOR 'new_user'@'localhost';
```
このコマンドは、`new_user`に付与されている全ての権限を表示します。

### 権限の取り消し
```sql
REVOKE INSERT, UPDATE ON database_name.specific_table FROM 'new_user'@'localhost';
```
このコマンドは、`new_user`から`database_name`内の`specific_table`に対する`INSERT`と`UPDATE`権限を取り消します。

# まとめ
データベースの権限管理は、データの安全性を保つために欠かせない重要な作業です。最低限知っておくべき権限管理の基本を押さえることで、不適切なアクセスを防ぎ、データの安全性を保つことができます。
ぜひ、この記事をお読みの皆さん！
定期的に権限設定を見直し、最適な権限管理を心がけることにこの記事がつながれば幸いです！


# 参考文献/記事
- [読売新聞オンライン / ハッカー集団、ＫＡＤＯＫＡＷＡ内部情報を公開…闇サイト上に給与明細など](https://www.yomiuri.co.jp/national/20240702-OYT1T50064/)
- [MySQL 公式ドキュメント - ユーザーアカウント管理](https://dev.mysql.com/doc/refman/8.4/en/access-control.html)
- [OWASP Foundation - Database Security](https://cheatsheetseries.owasp.org/cheatsheets/Database_Security_Cheat_Sheet.html)
- [How to manage users and authentication in MySQL](https://www.prisma.io/dataguide/mysql/authentication-and-authorization/user-management-and-authentication)
- [Digital Ocean / MySQLで新しいユーザーを作成して権限を付与する方法](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql-ja)