以前SSHの設定についていろいろ書いたんで今回はMySQLに関して。
Contents
基本的な処方箋(MySQLに限らないかも)
- ウィルスソフトのインストール
- できればデータベースサーバーとアプリのサーバーは分ける
- ポートを閉じる
- 入れるソフトは必要最小限
- アップデートやパッチは最新のものを取り入れよう
- 基本的な考え方としては権限をなるべく小さくする
ホストのアクセスを制限する
全て /etc/my.cnf へ入力です。
ローカルのみの接続にする
1 2 |
[mysqld] skip-networking |
上記を/etc/my.cnfにいれるとローカルのみの接続になります。
また下記のように書くとつなげることのできるホストを制限できます。
1 2 3 |
[mysqld] #127.0.0.1だけにするとローカルだけになる。 bind-address=XXX.XXX.XXX.XXX |
LOCAL INFILEコマンドを無効にする
1 |
set-variable=local-infile=0 |
これまた不正な攻撃を許してしまうので、使用不能にしてしまいましょう。
昔はCSVを入れたりしたときに使ったんですけど、今はあまり使わないですな。
rootのユーザー名とパスワードを変更
rootユーザーは最大の権限を持つユーザーであり、非常に危険なので、絶対に使われてはいけません。
そこでセキュアな設定としてはrootユーザーの名称とパスワードを変更してしまうことです。
1 2 3 4 5 |
#ユーザー名を変更する mysql> RENAME USER root TO new_user; #パスワードを変更する mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass'); |
パスワードを変更するのはよくあることだけどユーザー名を変更するという発想はなかったですね。
テストデータベースや匿名ユーザーの消去
普段、使っているとあまり気づきませんが、ディフォルトでtest databaeやパスワード無しの匿名ユーザーが設定されています。特に意図がなければ消してしまいましょう。MySQL5.7からは最初の設定のrootパスワード変更時オプションで消えるようになっております。
1 2 3 4 5 6 |
#テストデータベースの削除 drop database test; #匿名ユーザーの抽出と削除 mysql> select * from mysql.user where user=""; mysql> DROP USER ""; |
設定できる範囲であらゆる権限を低くする
例えばmysqlディレクトリですが、こちらもrootユーザーやmysqlユーザー以外には入れないようにしましょう。
ディレクトリやファイルの権限を弱くしましょう。
またshow databasesは簡単に全データベースの情報を与えてしまうコマンドなのでできればセーブしましょう。下記で使えなくすることが可能です。
1 |
[mysqld] skip-show-database |
他にもありますが、とりあえずこれぐらいで。