zoukankan      html  css  js  c++  java
  • 教您怎样和平的运用 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%的和平,然则这些递次可以维护我们的系统愈加和平。




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

  • 相关阅读:
    is(C# 参考)
    索引器(C# 编程指南)
    修改IIS文件上传大小限制
    Sql Server判断某列字段是否为空或判断某列字段长度
    Linq分页查询
    H5网页播放器播不了服务器上的mp4视频文件
    [你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理
    如何通过ildasm/ilasm修改assembly的IL代码
    Python实战之set学习笔记及简单练习
    Python实战之int学习笔记及简单练习
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1975787.html
Copyright © 2011-2022 走看看