|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
曾经的功能列表可能会迅速变得过时了。而且,有些功能对有的应用程序非常重要,但是对别的应用程序则不一定。MySQL是完整收集化的跨平台干系型数据库体系,同时是具有客户机/服务器系统布局的散布式数据库办理体系。 MySQL是完整收集化的跨平台干系型数据库体系,同时是具有客户机/服务器系统布局的散布式数据库办理体系。它具有功效强、利用烦琐、办理便利、运转速率快、平安牢靠性强等长处,用户可使用很多言语编写会见MySQL数据库的程序,出格是与php更是黄金组合,使用非常普遍。
因为MySQL是多平台的数据库,它的默许设置要思索各类情形下都能合用,以是在我们本人的利用情况下应当举行进一步的平安加固。作为一个MySQL的体系办理员,我们有义务保护MySQL数据库体系的数据平安性和完全性。
MySQL数据库的平安设置必需从两个方面动手,体系外部平安和内部收集平安,别的我们还将复杂先容编程时要注重的一些成绩和一些小秘诀。
体系外部平安
起首复杂先容一下MySQL数据库目次布局。MySQL安装好,运转了mysql_db_install剧本今后就会创建数据目次和初始化数据库。假如我们用MySQL源码包安装,并且安装目次是/usr/local/mysql,那末数据目次一样平常会是/usr/local/mysql/var。数据库体系由一系列数据库构成,每一个数据库包括一系列数据库表。MySQL是用数据库名在数据目次创建创建一个数据库目次,各数据库表分离以数据库表名作为文件名,扩大名分离为MYD、MYI、frm的三个文件放到数据库目次中。
MySQL的受权表给数据库的会见供应了天真的权限把持,可是假如当地用户具有对库文件的读权限的话,打击者只需把数据库目次打包拷走,然后拷到本人本机的数据目次下就可以会见夺取的数据库。以是MySQL地点的主机的平安性是最主要的成绩,假如主机不平安,被打击者把持,那末MySQL的平安性也无从谈起。其次就是数据目次和数据文件的平安性,也就是权限设置成绩。
从MySQL主站一些老的binary刊行版来看,3.21.xx版本中数据目次的属性是775,如许十分伤害,任何当地用户都能够读数据目次,以是数据库文件很不平安。3.22.xx版本中数据目次的属性是770,这类属性也有些伤害,当地的同组用户既能读也能写,以是数据文件也不平安。3.23.xx版本数据目次的属性是700,如许就对照好,只要启动数据库的用户能够读写数据库文件,包管了当地数据文件的平安。
假如启动MySQL数据库的用户是mysql,那末象以下的目次和文件的是平安的,请注重数据目次及上面的属性:
shell>ls-l/usr/local/mysql
total40
drwxrwxr-x2rootroot4096Feb2720:07bin
drwxrwxr-x3rootroot4096Feb2720:07include
drwxrwxr-x2rootroot4096Feb2720:07info
drwxrwxr-x3rootroot4096Feb2720:07lib
drwxrwxr-x2rootroot4096Feb2720:07libexec
drwxrwxr-x3rootroot4096Feb2720:07man
drwxrwxr-x6rootroot4096Feb2720:07mysql-test
drwxrwxr-x3rootroot4096Feb2720:07share
drwxrwxr-x7rootroot4096Feb2720:07sql-bench
drwx------4mysqlmysql4096Feb2720:07var
shell>ls-l/usr/local/mysql/var
total8
drwx------2mysqlmysql4096Feb2720:08mysql
drwx------2mysqlmysql4096Feb2720:08test
shell>ls-l/usr/local/mysql/var/mysql
total104
-rw-------1mysqlmysql0Feb2720:08columns_PRiv.MYD
-rw-------1mysqlmysql1024Feb2720:08columns_priv.MYI
-rw-------1mysqlmysql8778Feb2720:08columns_priv.frm
-rw-------1mysqlmysql302Feb2720:08db.MYD
-rw-------1mysqlmysql3072Feb2720:08db.MYI
-rw-------1mysqlmysql8982Feb2720:08db.frm
-rw-------1mysqlmysql0Feb2720:08func.MYD
-rw-------1mysqlmysql1024Feb2720:08func.MYI
-rw-------1mysqlmysql8641Feb2720:08func.frm
-rw-------1mysqlmysql0Feb2720:08host.MYD
-rw-------1mysqlmysql1024Feb2720:08host.MYI
-rw-------1mysqlmysql8958Feb2720:08host.frm
-rw-------1mysqlmysql0Feb2720:08tables_priv.MYD
-rw-------1mysqlmysql1024Feb2720:08tables_priv.MYI
-rw-------1mysqlmysql8877Feb2720:08tables_priv.frm
-rw-------1mysqlmysql428Feb2720:08user.MYD
-rw-------1mysqlmysql2048Feb2720:08user.MYI
-rw-------1mysqlmysql9148Feb2720:08user.frm
假如这些文件的属主及属性不是如许,请用以下两个命令修改之:
shell>chown-Rmysql.mysql/usr/local/mysql/var
shell>chmod-Rgo-rwx/usr/local/mysql/var
用root用户启动远程服务一向是平安年夜忌,由于假如服务程序呈现成绩,远程打击者极有大概取得主机的完整把持权。MySQL从3.23.15版本入手下手时作了小小的修改,默许安装后服务要用mysql用户来启动,不同意root用户启动。假如非要用root用户来启动,必需加上--user=root的参数(./safe_mysqld--user=root&)。由于MySQL中有LOADDATAINFILE和SELECT...INTOOUTFILE的SQL语句,假如是root用户启动了MySQL服务器,那末,数据库用户就具有了root用户的写权限。不外MySQL仍是做了一些限定的,好比LOADDATAINFILE只能读全局可读的文件,SELECT...INTOOUTFILE不克不及掩盖已存在的文件。
当地的日记文件也不克不及无视,包含shell的日记和MySQL本人的日记。有些用户在当地上岸或备份数据库的时分为了图便利,偶然会在命令行参数里间接带了数据库的暗码,如:
shell>/usr/local/mysql/bin/mysqldump-uroot-ptesttest>test.sql
shell>/usr/local/mysql/bin/mysql-uroot-ptest
这些命令会被shell纪录在汗青文件里,好比bash会写进用户目次的.bash_history文件,假如这些文件失慎被读,那末数据库的暗码就会泄露。用户上岸数据库后实行的SQL命令也会被MySQL纪录在用户目次的.mysql_history文件里。假如数据库用户用SQL语句修正了数据库暗码,也会因.mysql_history文件而泄露。以是我们在shell上岸及备份的时分不要在-p后间接加暗码,而是在提醒后再输出数据库暗码。
别的这两个文件我们也应当不让它纪录我们的操纵,以防万一。
shell>rm.bash_history.mysql_history
shell>ln-s/dev/null.bash_history
shell>ln-s/dev/null.mysql_history
上门这两条命令把这两个文件链接到/dev/null,那末我们的操纵就不会被纪录到这两个文件里了。
内部收集平安
MySQL数据库安装好今后,Unix平台的user表是如许的:
mysql>usemysql;
Databasechanged
mysql>selectHost,User,PassWord,Select_priv,Grant_privfromuser;
+-----------+------+----------+-------------+------------+
|Host|User|Password|Select_priv|Grant_priv|
+-----------+------+----------+-------------+------------+
|localhost|root||Y|Y|
|redhat|root||Y|Y|
|localhost|||N|N|
|redhat|||N|N|
+-----------+------+----------+-------------+------------+
4rowsinset(0.00sec)
Windows平台的user表是如许的:
mysql>usemysql;
Databasechanged
mysql>selectHost,User,Password,Select_priv,Grant_privfromuser;
+-----------+------+----------+-------------+------------+
|Host|User|Password|Select_priv|Grant_priv|
+-----------+------+----------+-------------+------------+
|localhost|root||Y|Y|
|%|root||Y|Y|
|localhost|||Y|Y|
|%|||N|N|
+-----------+------+----------+-------------+------------+
4rowsinset(0.00sec)
我们先来看Unix平台的user表。个中redhat只是我实验机的呆板名,以是实践上Unix平台的MySQL默许只同意本机才干毗连数据库。可是缺省root用户口令是空,以是燃眉之急是给root用户加上口令。给数据库用户加口令有三种办法:
1)在shell提醒符下用mysqladmin命令来改root用户口令:
shell>mysqladmin-urootpasswordtest
如许,MySQL数据库root用户的口令就被改成test了。(test只是举例,我们实践利用的口令必定不克不及利用这类易猜的弱口令)
2)用setpassword修正口令:
mysql>setpasswordforroot@localhost=password(test);
这时候root用户的口令就被改成test了。
3)间接修正user表的root用户口令:
mysql>usemysql;
mysql>updateusersetpassword=password(test)whereuser=root;
mysql>flushprivileges;
如许,MySQL数据库root用户的口令也被改成test了。个中最初一句命令flushprivileges的意义是强迫革新内存受权表,不然用的仍是缓冲中的口令,这时候不法用户还能够用root用户及空口令上岸,直到重启MySQL服务器。
我们还看到user为空的匿名用户,固然它在Unix平台下没甚么权限,但为了平安起见我们应当删除它:
mysql>deletefromuserwhereuser=;
据我的观察,现在有一个趋势,那些经过正式培训的数据库管理员DBA更倾向于选择一个专有关系数据库,例如Oracle。对于一些具有专门数据库管理员的比较大的环境来说,MySQL很难得到宠爱,这时候,关于MySQL是否真的具有良好的可扩展性的争论已经没有意义。 |
|