教您怎样和平的运用 MySQL

  滥觞:网海拾贝  




目次:
情形要求
装置MySQL
Chrooting
设置效力器
PHP和MySQL通信
自启动设置

MySQL已经成为当前搜集中运用最多的数据库之一,希奇是在Web运用上,它占有了中小型运用的相对劣势。这完整绝对都源于它的小巧易用、和平有效、开放式答允和多平台,更紧张的是它与三大大Web言语之一——PHP的美满连系。

但不幸的是,一个缺省和平的MySQL,会由于root密码为空及递次缝隙招致被溢出,使得装置MySQL的效力器成为被经常加害的对象。更紧张的是,被加害之后数据库经常遭损坏,易形成苦难性的下场。上面将进入为了维护数据而停止的守护战中。

情形要求

1.系统情形

有一台Red Hat Linux 9.0自界说装置的效力器,系统装置了GCC及一些软件包,好比Apache、PHP等。装置完系统后的第一件事即是晋级系统的软件包。作为Web效力器,系统承继PHP脚本的恳求,PHP则运用上面将要装置的MySQL数据库作为静态颁发的接触。

分区情形的要乞降一样伟大系统差未几,专一差异之处在于后面树立的/chroot与/tmp要求在一致个分区上。

2.和平要求

(1)MySQL运转在一个自力的(Chroot)情形下;
(2)mysqld进程运转于一个自力的用户/用户组下,此用户和用户组没有根目次,没有Shell,也不能用于其它递次;
(3)点窜MySQL的root账号,并运用一个重大的密码;
(4)只答允当地连接MySQL,启动MySQL时搜集连接被避免丧失;
(5)保证连接MySQL的nobody账号登录被避免;
(6)删除test数据库。

装置MySQL

1.装置准备

装置MySQL之前,凭据上述和平要求需求建树一个用于启动MySQL的用户和组。

#groupadd mysql
#useradd mysql -c "start mysqld's account" -d /dev/null -g mysql -s /sbin/nologin



2.编译和装置

下载MySQL源代码包:

#wget http://mysql.he.net/Downloads/MySQL-4.0/mysql-4.0.16.tar.gz



解膨胀:

#tar -zxvf mysql-4.0.16.tar.gz



一样伟大把MySQL装置在/usr/local/mysql下,若是有希奇要求,也可自行调解。不过多么做意义不大大,由于后面将Chrooting,到时只是运用这里的客户对象罢了,好比mysql,mysqladmin,mysqldump等。上面就出手出手编译装置吧。

#./configure  --prefix=/usr/local/mysql  
--with-mysqld-user=mysql  
--with-unix-socket-path=/tmp/mysql.sock  
--with-mysqld-ldflags=-all-static
#make && make install
#strip /usr/local/mysql/libexec/mysqld
#scripts/mysql_install_db
#chown -R root /usr/local/mysql
#chown -R mysql /usr/local/mysql/var
#chgrp -R mysql /usr/local/mysql



上面各递次的详细感化在MySQL手册里已有引见,专一需求讲明、和一样伟大递次差另外处地点于--with-mysqld-ldflags=-all-static。由于需求用到Chroot情形,而MySQL自己连接成静态后就无需再建树一些库情形了。

3.设置与启动

MySQL的设置文件需求手工选择、拷贝几个模板文件中的一个到/etc下,这几个模板文件位于源文件的support-files目次,一共有4个:small、medium、large、huge。

#cp support-files/my-medium.cnf   /etc/my.cnf
#chown  root:sys  /etc/my.cnf
#chmod 644 /etc/my.cnf



启动MySQL,详细运用用户为mysql:

#/usr/local/mysq/bin/mysqld_safe --user=mysql &



4.测试

为了测试装置的递次可否正确及MySQL可否已经正常启动,最好的门径即是用MySQL客户端来连接数据库。

#/usr/local/mysql/bin/mysql
[root@ftp bin]# mysql
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 687 to server version: 3.23.58
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql>
mysql> show databases;
 -------------- 
| Database     |
 -------------- 
| mysql       |
| test         |
 -------------- 
2 rows in set (0.00 sec)
mysql>quit



连接乐成,可以封闭数据库:

#/usr/local/mysql/bin/mysqladmin -uroot shutdown



若是连接丧失败则需求详细分析出错缘由:

#more /usr/local/mysql/var/`hostname`.err



Chrooting

1.Chrooting情形

Chroot是Unix/类Unix的一种才力,它的树立会将其与主系统险些完全阻遏。也即是说,一旦遭到什么题目,也不会危及到正在运转的主系统。这是一个很是有效的门径,希奇是在设置搜集效力递次的时分。

2.Chroot的准备使命

起首,理当树立如图1示目次结构:

#mkdir -p /chroot/mysql/dev
#mkdir -p /chroot/mysql/etc
#mkdir -p /chroot/mysql/tmp
#mkdir -p /chroot/mysql/var/tmp
#mkdir -p /chroot/mysql/usr/local/mysql/libexec
#mkdir -p /chroot/mysql/usr/local/mysql/share/mysql/english



 

图1 目次结构


然后设定目次权限:

#chown -R root:sys /chroot/mysql
#chmod -R 755 /chroot/mysql
#chmod 1777 /chroot/mysql/tmp



3.拷贝mysql下的递次和文件到chroot下

#cp -p /usr/local/mysql/libexec/mysqld /chroot/mysql/usr/local/mysql/libexec/
#cp -p /usr/local/mysql/share/mysql/english/errmsg.sys
/chroot/mysql/usr/local/mysql/share/mysql/english/
#cp -p /etc/hosts /chroot/mysql/etc/
#cp -p /etc/host.conf /chroot/mysql/etc/
#cp -p /etc/resolv.conf /chroot/mysql/etc/
#cp -p /etc/group /chroot/mysql/etc/
#cp -p /etc/passwd /chroot/mysql/etc/passwd
#cp -p /etc/my.cnf /chroot/mysql/etc/



4.编辑chroot下的passwd文件和group文件

#vi /chroot/etc/passwd



如上敕令翻开passwd文件,请删除除了mysql、root、sys的一切行。

#vi /chroot/etc/group



如上敕令翻开group文件,请删除除了mysql、root的一切行。

5.建树希奇的设置文件/dev/null

参照系统的样子做即可:

#ls -al /dev/null
crw-rw-rw-    1 root     root       1,   3 Jan 30  2003 /dev/null
#mknod /chroot/mysql/dev/null c 1 3
#chown root:root  /chroot/mysql/dev/null
#chmod 666  /chroot/mysql/dev/null



6.拷贝mysql的数据库文件到chroot下

#cp -R /usr/local/mysql/var/ /chroot/mysql/usr/local/mysql/var
#chown -R mysql:mysql /chroot/mysql/usr/local/mysql/var



7.装置chrootuid递次

下载chrootuid,然后RPM装置即可。

http://rpm.pbone.net/index.php3/stat/4/idpl/355932/com/chrootuid-1.3-alt2.i586.rpm.html

8.测试Chroot情形下的MySQL设置

#chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &



若是丧失败请详细chroot目次上面的权限题目。

9.测试连接chroot下的MySQL

#/usr/local/mysql/bin/mysql --socket=/chroot/mysql/tmp/mysql.sock
.......
mysql>show databases;
mysql>create database wgh;
mysql>quit;
#ls -al /chroot/mysql/var/
.......



设置效力器

为了愈加和平地运用MySQL,需求对MySQL的数据库停止和平设置。由于Chroot的缘由,设置文件也会有所差异。

1.封闭远程连接

起首,应该封闭3306端口,这是MySQL的默许监听端口。由于此处MySQL只效力于当地脚本,所以不需求远程连接。虽然MySQL内建的和平机制很严厉,但监听一个TCP端口仿照照旧是毁伤的行为,由于若是MySQL递次自己有题目,那么未授权的拜访完全可以绕过MySQL的内建和平机制。封闭搜集监听的门径很重大,在/chroot/mysql/etc/my.cnf文件中的[mysqld]部门,去丧失#skip-networking后面的“#”即可。

封闭了搜集,当地递次怎样连接MySQL数据库呢?当地递次可以颠末mysql.sock来连接,速率比搜集连接更快。后文将提到关于mysql.sock的详细情形。

MySQL的备份伟大运用SSH来实行。

2.避免MySQL导入当地文件

上面将避免MySQL中用“LOAD DATA LOCAL INFILE”敕令。这个敕令会应用MySQL把当地文件读到数据库中,然后用户就可以不法获取敏感信息了。

为了避免上述敕令,在/chroot/mysql/etc/my.cnf文件的[mysqld]部门加入上面语句:

set-variable=local-infile=0



为了办理随便,一样伟大在系统中的MySQL办理敕令如mysql、mysqladmin、mysqldump等,运用的都是系统的/etc/my.cnf文件。若是要连接,它会寻觅/tmp/mysql.sock文件来试图连接MySQL效力器,然则这里要连接的是chroot下的MySQL效力器。处理门径有两个:一个是在办理敕令后面加入--socket=/chroot/mysql/tmp/mysql.sock。比方:

#/usr/local/mysql/bin/mysql -root -p --socket=/chroot/mysql/tmp/mysql.sock



另一个即是在/etc/my.cnf的[client]部门加入socket=/chroot/mysql/tmp/mysql.sock。显然,第二种门径随便多了。

3.点窜MySQL的root用户ID和密码

#chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &
#/usr/local/mysql/bin/mysql -uroot
.......
mysql>SET PASSWORD FOR root@localhost=PASSWORD('new_password');



要尽管即使养成在mysql下输出密码的风气,由于Shell上面输出的时分可以会被其它人瞥见。

mysql>use mysql;
mysql>update user set user="wghgreat" where user="root";
mysql>select Host,User,Password,Select_priv,Grant_priv from user;
mysql>delete from user where user='';
mysql>delete from user where password='';
mysql>delete from user where host='%';
mysql>drop database test;



点窜为一个不容易猜的ID:

mysql>flush privileges;
mysql>quit;



4.删除历史敕令记实

这些历史文件包罗~/.bash_history、~/.mysql_history等。若是翻开它们,你会大大吃一惊,怎样竟然有一些明文的密码在这里?!

#cat /dev/null > ~/.bash_history
#cat /dev/null > ~/.mysql_history



PHP和MySQL通信

默许情形下,PHP会颠末/tmp/mysql.sock来和MySQL通信,但这里的一个大大题目是MySQL天生的根本不是它,而是/chroot/mysql/tmp/mysql.sock。处理的门径即是做一个连接:

#ln /chroot/mysql/tmp/mysql.sock /tmp/mysql.sock



详细:由于hard links不能在文件系统的分区之间做,所以该处的连接必须位于一致分区外部。

自启动设置

自启动设置前先提醒一点,用于PHP的数据库需求用一个新建的账号,其上罕见据库权限设置,好比FILE、GRANT、ACTER、SHOW DATABASE、RELOAD、SHUTDOWN、PROCESS、SUPER等。

自启动脚本示例:

#!/bin/sh
CHROOT_MYSQL=/chroot/mysql 
SOCKET=/tmp/mysql.sock
MYSQLD=/usr/local/mysql/libexec/mysqld
PIDFILE=/usr/local/mysql/var/`hostname`.pid
CHROOTUID=/usr/bin/chrootuid
echo -n " mysql"
case " $1" in
start)
   rm -rf  ${SOCKET}
   nohup  ${CHROOTUID}  ${CHROOT_MYSQL} mysql  ${MYSQLD} >/dev/null 2>&1 &
   sleep 5 && ln  ${CHROOT_MYSQL}/ ${SOCKET}  ${SOCKET}
   ;;
stop)
   kill `cat  ${CHROOT_MYSQL}/ ${PIDFILE}`
   rm -rf  ${CHROOT_MYSQL}/ ${SOCKET}
   ;;
*)
   echo ""
   echo "Usage: `basename  $0` {start|stop}" >&2
   exit 64
   ;;
esac
exit 0



文件位于/etc/rc.d/init.d下,名为mysqld,详细要可实行。

#chmod  x /etc/rc.d/init.d/mysqld
#ln  -s /etc/rc.d/init.d/mysql /etc/rc3.d/S90mysql
#ln  -s /etc/rc.d/init.d/mysql /etc/rc0.d/K20mysql



虽然不能做到100%的和平,然则这些递次可以维护我们的系统愈加和平。




版权声明: 原创作品,答允转载,转载时请务必以超链接方式标明文章 原始来由 、作者信息和本声明。不然将穷究司法责任。

posted @ 2011-03-07 19:57  蓝色的天空III  阅读(117)  评论(0)    收藏  举报