MySQL数据库安装后的安全设置
导语:
已经通过报的方式安装了mysql,装完之后有些安全设置必须要做。
装完以后数据库已经可以使用了,但是有安全风险。
风险在访问数据库不需要任何信息就可以访问。
[10:17:02 [ ~]#mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 8 Server version: 10.4.13-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement. MariaDB [(none)]>
先期检查
查看一下服务器端程序状态
- 服务器端主程序:1035 (mysqld)
- 主程序路径:/usr/sbin/mysqld
[10:15:59 [ ~]#systemctl status mysql ● mariadb.service - MariaDB 10.4.13 database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: > Drop-In: /etc/systemd/system/mariadb.service.d └─migrated-from-my.cnf-settings.conf Active: active (running) since Thu 2020-06-04 10:15:21 CST; 50s ago Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ Process: 1192 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_PO> Process: 1011 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||> Process: 984 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSI> Main PID: 1035 (mysqld) #***服务器端主程序*** Status: "Taking your SQL requests now..." Tasks: 30 (limit: 11330) Memory: 100.8M CGroup: /system.slice/mariadb.service └─1035 /usr/sbin/mysqld #***主程序路径*** Jun 04 10:15:21 C8 mysqld[1035]: 2020-06-04 10:15:21 0 [Note] InnoDB: 10.4.13 starte> Jun 04 10:15:21 C8 mysqld[1035]: 2020-06-04 10:15:21 0 [Note] Plugin ‘FEEDBACK‘ is d> Jun 04 10:15:21 C8 mysqld[1035]: 2020-06-04 10:15:21 0 [Note] InnoDB: Loading buffer> Jun 04 10:15:21 C8 mysqld[1035]: 2020-06-04 10:15:21 0 [Note] InnoDB: Buffer pool(s)> Jun 04 10:15:21 C8 mysqld[1035]: 2020-06-04 10:15:21 0 [Note] Server socket created > Jun 04 10:15:21 C8 mysqld[1035]: 2020-06-04 10:15:21 0 [Note] Reading of all Master_> Jun 04 10:15:21 C8 mysqld[1035]: 2020-06-04 10:15:21 0 [Note] Added new Master_info > Jun 04 10:15:21 C8 mysqld[1035]: 2020-06-04 10:15:21 0 [Note] /usr/sbin/mysqld: read> Jun 04 10:15:21 C8 mysqld[1035]: Version: ‘10.4.13-MariaDB‘ socket: ‘/var/lib/mysql> Jun 04 10:15:21 C8 systemd[1]: Started MariaDB 10.4.13 database server.
查看主程序进程信息
通过查看进程信息,我们可以看到,主进程是通过mysql这个用户运行的。
这个进程是一个l,目前mysql运行的方式是以多线程运行的。
[10:21:55 [ ~]#ps aux | grep 1035 mysql 1035 0.0 4.9 1298628 92332 ? Ssl 10:15 0:00 /usr/sbin/mysqld root 1823 0.0 0.0 12108 1028 pts/0 R+ 10:26 0:00 grep --color=auto 1035
可以通过pstree查看进程树。可以通过 ps auxf 查看父进程。
有一个进程,里面生成了若干个线程。
[10:32:31 [ ~]#pstree -p |grep mysql |-mysqld(1035)-+-{mysqld}(1037) | |-{mysqld}(1088) | |-{mysqld}(1106) | |-{mysqld}(1110) | |-{mysqld}(1111) | |-{mysqld}(1112) | |-{mysqld}(1113) | |-{mysqld}(1114) | |-{mysqld}(1115) | |-{mysqld}(1116) | |-{mysqld}(1117) | |-{mysqld}(1118) | |-{mysqld}(1119) | |-{mysqld}(1159) | |-{mysqld}(1160)
确定mysql账号信息
可以看出mysql是安装软件时自动创建的
- 用户mysql家目录:/var/lib/mysql
- 用户mysql的Shell类型:/sbin/nologin
[10:32:41 [ ~]#cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin …… mysql:x:989:985:MySQL server:/var/lib/mysql:/sbin/nologin
查看目录/var/lib/mysql内容
/var/lib/mysql 里放的就是真正数据库的数据
[10:42:33 [ ~]#ll -h /var/lib/mysql total 121M -rw-rw----. 1 mysql mysql 24K Jun 2 08:47 aria_log.00000001 -rw-rw----. 1 mysql mysql 52 Jun 2 08:47 aria_log_control -rw-rw----. 1 mysql mysql 5 Jun 4 10:15 C8.pid -rw-rw----. 1 mysql mysql 972 Jun 2 08:47 ib_buffer_pool -rw-rw----. 1 mysql mysql 12M Jun 2 08:47 ibdata1 -rw-rw----. 1 mysql mysql 48M Jun 4 10:15 ib_logfile0 -rw-rw----. 1 mysql mysql 48M Jun 2 08:47 ib_logfile1 -rw-rw----. 1 mysql mysql 12M Jun 4 10:15 ibtmp1 -rw-rw----. 1 mysql mysql 0 Jun 2 08:56 multi-master.info drwx------. 2 mysql mysql 4.0K Jun 2 08:47 mysql srwxrwxrwx. 1 mysql mysql 0 Jun 4 10:15 mysql.sock drwx------. 2 mysql mysql 20 Jun 2 08:47 performance_schema drwx------. 2 mysql mysql 20 Jun 2 08:47 test
mysql内部账户
mysql有自己的用户账户列表,和系统的账户没有关系
用户的账户列表也是存放在数据库的这个目录里的
客户端工具mysql
在安装好服务器主程序的同时,已经安装好客户端程序,也叫mysql
[10:42:50 [ ~]#type mysql mysql is hashed (/usr/bin/mysql) [10:53:18 [ ~]#which mysql /usr/bin/mysql
我们可以看一些这个工具来自哪个包
[11:21:21 [ ~]#rpm -qf `which mysql` MariaDB-client-10.4.13-1.el8.x86_64
这个客户端工具可以用它来连接数据库,不仅可以用来连接当前主机的数据库,还可以用来连接远程主机的数据库。
连接本机的数据库
[11:21:26 [ ~]#mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 10 Server version: 10.4.13-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement. MariaDB [(none)]>
安装好数据库之后,默认有3个实体数据库。
有一个数据库比较特殊,information_schema内存中的数据库,没有文件夹。
MariaDB [(none)]> show datanases; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘datanases‘ at line 1 MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.005 sec)
进入默认mysql数据库
mysql文件夹中有很多很多的表
[11:39:39 [ ~]#ll -h /var/lib/mysql/mysql total 2.7M -rw-------. 1 mysql mysql 2.1K Jun 2 08:47 columns_priv.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 columns_priv.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 columns_priv.MAI -rw-------. 1 mysql mysql 2.6K Jun 2 08:47 column_stats.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 column_stats.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 column_stats.MAI -rw-------. 1 mysql mysql 2.7K Jun 2 08:47 db.frm -rw-------. 1 mysql mysql 16K Jun 2 08:47 db.MAD -rw-------. 1 mysql mysql 24K Jun 2 08:47 db.MAI -rw-------. 1 mysql mysql 65 Jun 2 08:47 db.opt -rw-------. 1 mysql mysql 3.7K Jun 2 08:47 event.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 event.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 event.MAI -rw-------. 1 mysql mysql 1.6K Jun 2 08:47 func.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 func.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 func.MAI -rw-------. 1 mysql mysql 35 Jun 2 08:47 general_log.CSM -rw-------. 1 mysql mysql 0 Jun 2 08:47 general_log.CSV -rw-------. 1 mysql mysql 804 Jun 2 08:47 general_log.frm -rw-------. 1 mysql mysql 1.5K Jun 2 08:47 global_priv.frm -rw-------. 1 mysql mysql 16K Jun 2 08:47 global_priv.MAD -rw-------. 1 mysql mysql 16K Jun 2 08:47 global_priv.MAI -rw-------. 1 mysql mysql 1.0K Jun 2 08:47 gtid_slave_pos.frm -rw-------. 1 mysql mysql 96K Jun 2 08:47 gtid_slave_pos.ibd -rw-------. 1 mysql mysql 1.7K Jun 2 08:47 help_category.frm -rw-------. 1 mysql mysql 16K Jun 2 08:47 help_category.MAD -rw-------. 1 mysql mysql 24K Jun 2 08:47 help_category.MAI -rw-------. 1 mysql mysql 1.6K Jun 2 08:47 help_keyword.frm -rw-------. 1 mysql mysql 16K Jun 2 08:47 help_keyword.MAD -rw-------. 1 mysql mysql 24K Jun 2 08:47 help_keyword.MAI -rw-------. 1 mysql mysql 968 Jun 2 08:47 help_relation.frm -rw-------. 1 mysql mysql 16K Jun 2 08:47 help_relation.MAD -rw-------. 1 mysql mysql 16K Jun 2 08:47 help_relation.MAI -rw-------. 1 mysql mysql 1.8K Jun 2 08:47 help_topic.frm -rw-------. 1 mysql mysql 1.6M Jun 2 08:47 help_topic.MAD -rw-------. 1 mysql mysql 40K Jun 2 08:47 help_topic.MAI -rw-------. 1 mysql mysql 1.6K Jun 2 08:47 index_stats.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 index_stats.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 index_stats.MAI -rw-------. 1 mysql mysql 5.3K Jun 2 08:47 innodb_index_stats.frm -rw-------. 1 mysql mysql 96K Jun 2 08:47 innodb_index_stats.ibd -rw-------. 1 mysql mysql 1.9K Jun 2 08:47 innodb_table_stats.frm -rw-------. 1 mysql mysql 96K Jun 2 08:47 innodb_table_stats.ibd -rw-------. 1 mysql mysql 1.5K Jun 2 08:47 plugin.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 plugin.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 plugin.MAI -rw-------. 1 mysql mysql 3.5K Jun 2 08:47 proc.frm -rw-------. 1 mysql mysql 16K Jun 2 08:47 proc.MAD -rw-------. 1 mysql mysql 16K Jun 2 08:47 proc.MAI -rw-------. 1 mysql mysql 2.9K Jun 2 08:47 procs_priv.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 procs_priv.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 procs_priv.MAI -rw-------. 1 mysql mysql 2.8K Jun 2 08:47 proxies_priv.frm -rw-------. 1 mysql mysql 16K Jun 2 08:47 proxies_priv.MAD -rw-------. 1 mysql mysql 24K Jun 2 08:47 proxies_priv.MAI -rw-------. 1 mysql mysql 1.7K Jun 2 08:47 roles_mapping.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 roles_mapping.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 roles_mapping.MAI -rw-------. 1 mysql mysql 9.8K Jun 2 08:47 servers.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 servers.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 servers.MAI -rw-------. 1 mysql mysql 35 Jun 2 08:47 slow_log.CSM -rw-------. 1 mysql mysql 0 Jun 2 08:47 slow_log.CSV -rw-------. 1 mysql mysql 2.4K Jun 2 08:47 slow_log.frm -rw-------. 1 mysql mysql 3.0K Jun 2 08:47 tables_priv.frm -rw-------. 1 mysql mysql 16K Jun 2 08:47 tables_priv.MAD -rw-------. 1 mysql mysql 24K Jun 2 08:47 tables_priv.MAI -rw-------. 1 mysql mysql 1.4K Jun 2 08:47 table_stats.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 table_stats.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 table_stats.MAI -rw-------. 1 mysql mysql 971 Jun 2 08:47 time_zone.frm -rw-------. 1 mysql mysql 969 Jun 2 08:47 time_zone_leap_second.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 time_zone_leap_second.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 time_zone_leap_second.MAI -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 time_zone.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 time_zone.MAI -rw-------. 1 mysql mysql 1.2K Jun 2 08:47 time_zone_name.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 time_zone_name.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 time_zone_name.MAI -rw-------. 1 mysql mysql 1011 Jun 2 08:47 time_zone_transition.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 time_zone_transition.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 time_zone_transition.MAI -rw-------. 1 mysql mysql 1.1K Jun 2 08:47 time_zone_transition_type.frm -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 time_zone_transition_type.MAD -rw-------. 1 mysql mysql 8.0K Jun 2 08:47 time_zone_transition_type.MAI -rw-------. 1 mysql mysql 2.6K Jun 2 08:47 transaction_registry.frm -rw-------. 1 mysql mysql 144K Jun 2 08:47 transaction_registry.ibd -rw-------. 1 mysql mysql 14K Jun 2 08:47 user.frm
相同文件名的每个表由多个不同文件组成。
数据库服务器上可以跑好多好多独立的数据库
每个数据库由好多张不同的表组成。
mysql内部用户文件表
user.frm 存放着用户信息,不是文本文件,不能直接看。
想要看user.frm这个表,需要先进入mysql这个数据库。
- 使用use命令进入数据库mysql。(use可以理解为进入,实际是打开、加载、使用这些use的本意)类似于cd。
MariaDB [(none)]> use mysql 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 MariaDB [mysql]>
- 显示有哪些表
MariaDB [mysql]> show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | column_stats | | columns_priv | | db | | event | | func | | general_log | | global_priv | | gtid_slave_pos | | help_category | | help_keyword | | help_relation | | help_topic | | index_stats | | innodb_index_stats | | innodb_table_stats | | plugin | | proc | | procs_priv | | proxies_priv | | roles_mapping | | servers | | slow_log | | table_stats | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | transaction_registry | | user | +---------------------------+ 31 rows in set (0.000 sec)
- 显示指定表中列的名称
一个表中有很多行很多列,列名一般表示一列的用途
MariaDB [mysql]> desc user; +------------------------+---------------------+------+-----+----------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------------+---------------------+------+-----+----------+-------+ | Host | char(60) | NO | | | | | User | char(80) | NO | | | | | Password | longtext | YES | | NULL | | | Select_priv | varchar(1) | YES | | NULL | | | Insert_priv | varchar(1) | YES | | NULL | | | Update_priv | varchar(1) | YES | | NULL | | | Delete_priv | varchar(1) | YES | | NULL | | | Create_priv | varchar(1) | YES | | NULL | | | Drop_priv | varchar(1) | YES | | NULL | | | Reload_priv | varchar(1) | YES | | NULL | | | Shutdown_priv | varchar(1) | YES | | NULL | | | Process_priv | varchar(1) | YES | | NULL | | | File_priv | varchar(1) | YES | | NULL | | | Grant_priv | varchar(1) | YES | | NULL | | | References_priv | varchar(1) | YES | | NULL | | | Index_priv | varchar(1) | YES | | NULL | | | Alter_priv | varchar(1) | YES | | NULL | | | Show_db_priv | varchar(1) | YES | | NULL | | | Super_priv | varchar(1) | YES | | NULL | | | Create_tmp_table_priv | varchar(1) | YES | | NULL | | | Lock_tables_priv | varchar(1) | YES | | NULL | | | Execute_priv | varchar(1) | YES | | NULL | | | Repl_slave_priv | varchar(1) | YES | | NULL | | | Repl_client_priv | varchar(1) | YES | | NULL | | | Create_view_priv | varchar(1) | YES | | NULL | | | Show_view_priv | varchar(1) | YES | | NULL | | | Create_routine_priv | varchar(1) | YES | | NULL | | | Alter_routine_priv | varchar(1) | YES | | NULL | | | Create_user_priv | varchar(1) | YES | | NULL | | | Event_priv | varchar(1) | YES | | NULL | | | Trigger_priv | varchar(1) | YES | | NULL | | | Create_tablespace_priv | varchar(1) | YES | | NULL | | | Delete_history_priv | varchar(1) | YES | | NULL | | | ssl_type | varchar(9) | YES | | NULL | | | ssl_cipher | longtext | NO | | | | | x509_issuer | longtext | NO | | | | | x509_subject | longtext | NO | | | | | max_questions | bigint(20) unsigned | NO | | 0 | | | max_updates | bigint(20) unsigned | NO | | 0 | | | max_connections | bigint(20) unsigned | NO | | 0 | | | max_user_connections | bigint(21) | NO | | 0 | | | plugin | longtext | NO | | | | | authentication_string | longtext | NO | | | | | password_expired | varchar(1) | NO | | | | | is_role | varchar(1) | YES | | NULL | | | default_role | longtext | NO | | | | | max_statement_time | decimal(12,6) | NO | | 0.000000 | | +------------------------+---------------------+------+-----+----------+-------+ 47 rows in set (0.001 sec)
- 显示想要看的表中的列
表中的值太多,选想要的列看内容
mysql的用户名由两部分组成,一部分是用户名,一部分是主机名
mysql中不仅需要验证用户名和密码,还要确保访问数据库的主机是合法的。
早期mysql密码存放在password中,现在存放在authentication_string中
MariaDB [mysql]> select user,host,password,authentication_string from user; +-------------+-----------+----------+-----------------------+ | User | Host | Password | authentication_string | +-------------+-----------+----------+-----------------------+ | mariadb.sys | localhost | | | | root | localhost | invalid | invalid | | mysql | localhost | invalid | invalid | | | localhost | | | | | c8 | | | +-------------+-----------+----------+-----------------------+ 5 rows in set (0.001 sec)
mysql本身提供了一个超级用户root,权限很大。
Current user显示当前登录的用户
Current user:
有两个账户给特定服务用的 mariadb.sys 和mysql
还有两个空账户,代表匿名帐户,随便输入用户名都可以登录。
除了root都是普通账号
[12:29:25 [ ~]#mysql -ubaipangzi Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 12 Server version: 10.4.13-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement. MariaDB [(none)]> status -------------- mysql Ver 15.1 Distrib 10.4.13-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 12 Current database: Current user: SSL: Not in use Current pager: stdout Using outfile: ‘‘ Using delimiter: ; Server: MariaDB Server version: 10.4.13-MariaDB MariaDB Server Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 2 hours 14 min 29 sec Threads: 7 Questions: 56 Slow queries: 0 Opens: 36 Flush tables: 1 Open tables: 30 Queries per second avg: 0.006 -------------- MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | test | +--------------------+ 2 rows in set (0.000 sec) MariaDB [(none)]> use mysql ERROR 1044 (42000): Access denied for user ‘‘@‘localhost‘ to database ‘mysql‘
查看当前数据库状态
MariaDB [mysql]> status -------------- mysql Ver 15.1 Distrib 10.4.13-MariaDB, for Linux (x86_64) using readline 5.1 Connection id: 11 Current database: mysql Current user: SSL: Not in use Current pager: stdout Using outfile: ‘‘ Using delimiter: ; Server: MariaDB Server version: 10.4.13-MariaDB MariaDB Server Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 2 hours 6 min 33 sec Threads: 7 Questions: 52 Slow queries: 0 Opens: 36 Flush tables: 1 Open tables: 30 Queries per second avg: 0.006 --------------
默认以root身份登录mysql
安装完mysql后,密码为空,在敲mysql登录数据库的时候,事实上省略了-u选项。
默认为-uroot
10.4版之前,root账户空口零都是可以登陆的,早前的版本任何账户都可以匿名成root登录。
安全加固脚本
软件本身自带mysql_secure_installation安全加固脚本
[12:38:33 [ ~]#rpm -qf `which mysql_secure_installation` MariaDB-server-10.4.13-1.el8.x86_64
运行脚本
[12:39:12 [ ~]#mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we‘ll need the current password for the root user. If you‘ve just installed MariaDB, and haven‘t set the root password yet, you should just press enter here. Enter current password for root (enter for none):