mysql(mariadb)主要安全性。
1,新安装mysql,运行mysql_secure_installation。
修改root密码、删除空密码用户、禁止root远程连接、删除测试库。
$ Security in MySQL
Change the root password? [Y/n] y
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
2、修改mysql默认管理员账号root。
MariaDB [mysql]> select * from user where user='root';
3、使用独立用户运行mysql服务。
系统默认使用mysql用户运行mysql服务。
$ ps -ef |grep mariadb
mysql 13323 13166 0 Aug12 ? 00:00:28 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
如用linux系统root运行服务,局域FILE权限的mysql用户可以通过root权限创建文件。
#指定用户运行
$ mysqld-safe --user=mysql &
4、远程连接管理。
直接禁用远程连接,或至少修改远程端口3306。主要防火墙,selinux配置。
限制用户连接数max_user_connections。
$ vi /etc/my.cnf
[mysqld]
max_user_connections=2 #分终端
5,mysql数据目录权限
数据目录所有者默认为mysql,不允许未授权用户读取数据。
$ ls -l /var/lib/mysql/
total 28700
-rw-rw----. 1 mysql mysql 16384 Aug 13 19:10 aria_log.00000001
-rw-rw----. 1 mysql mysql 52 Aug 13 19:10 aria_log_control
-rw-rw----. 1 mysql mysql 18874368 Aug 13 19:10 ibdata1
-rw-rw----. 1 mysql mysql 5242880 Aug 13 19:11 ib_logfile0
-rw-rw----. 1 mysql mysql 5242880 Aug 7 19:37 ib_logfile1
drwx------. 2 mysql mysql 4096 Aug 7 19:37 mysql
srwxrwxrwx. 1 mysql mysql 0 Aug 13 19:11 mysql.sock
drwx------. 2 mysql mysql 4096 Aug 7 19:37 performance_schema
drwx------. 2 mysql mysql 33 Aug 12 00:11 testphp
drwx------. 2 mysql mysql 33 Aug 11 23:51 textphp
修改目录所有者。
$ chown -R mysql.mysql /usr/local/mysql/
6,命令历史记录 ~/.mysql_history 。
history里包含user,password信息,应该删除。
$ rm ~/.mysql_history
$ sed -i '/user/'d
$ sed -i '/password/'d
$ ln -s /dev/null .mysql_history #不记录命令
7,禁止load data loacl infile 读取本地文档。
$ cat /etc/my.cnf
[mysqld]
~~
local-infile=0
~~
8,MySQL服务器权限控制。
grant ,revoke管理对应用户、数据库、表的权限。
grant全部权限:
- usage
连接(登陆)权限,建立一个用户,就会自动授予其usage权限(默认授予)。- select
必须有select的权限,才可以使用select table- create
必须有create的权限,才可以使用create table- create routine
必须具有create routine的权限,才可以使用{create |alter|drop} {procedure|function}- create temporary tables(注意这里是tables,不是table)
必须有create temporary tables的权限,才可以使用create temporary tables.- create view
必须有create view的权限,才可以使用create view- create user
要使用CREATE USER,必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。- insert
必须有insert的权限,才可以使用insert into ….. values….- alter
必须有alter的权限,才可以使用alter table- alter routine
必须具有alter routine的权限,才可以使用{alter |drop} {procedure|function}- update
必须有update的权限,才可以使用update table- delete
必须有delete的权限,才可以使用delete from ….where….(删除表中的记录)- drop
必须有drop的权限,才可以使用drop database db_name; drop table tab_name;- show database
通过show database只能看到你拥有的某些权限的数据库,除非你拥有全局SHOW DATABASES权限。- show view
必须拥有show view权限,才能执行show create view。- index
必须拥有index权限,才能执行[create |drop] index- excute
执行存在的Functions,Procedures- lock tables
必须拥有lock tables权限,才可以使用lock tables- references
有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。- reload
必须拥有reload权限,才可以执行flush [tables | logs | privileges]- replication client
拥有此权限可以查询master server、slave server状态。- replication slave
拥有此权限可以查看从服务器,从主服务器读取二进制日志。- Shutdown
关闭MySQL:- grant option
拥有grant option,就可以将自己拥有的权限授予其他用户(仅限于自己已经拥有的权限)- file
拥有file权限才可以执行 select ..into outfile和load data infile…操作,但是不要把file, process, super权限授予管理员以外的账号,这样存在严重的安全隐患。- super
这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。- process
通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。默认情况下,每个用户都可以执行SHOW PROCESSLIST命令,但是只能查询本用户的进程。