滥觞:网海拾贝
目次:
情形要求
装置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%的和平,然则这些递次可以维护我们的系统愈加和平。
版权声明: 原创作品,答允转载,转载时请务必以超链接方式标明文章 原始来由 、作者信息和本声明。不然将穷究司法责任。