来源:网海拾贝
目次:
情况要求
安置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%的静谧,但是这些门径可以维护我们的琐屑愈加静谧。
版权声明: 原创作品,允诺转载,转载时请务必以超链接形式标明文章 原始情由 、作者信息和本声明。不然将清查执法责任。