教您若何静谧的运用 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%的静谧,但是这些门径可以维护我们的琐屑愈加静谧。 down_info.asp?id=2407




版权声明: 原创作品,允诺转载,转载时请务必以超链接形式标明文章 原始情由 、作者信息和本声明。不然将清查执法责任。

转载于:https://www.cnblogs.com/zgqjymx/archive/2011/03/07/1975686.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值