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%的静谧,但是这些门径可以维护我们的琐屑愈加静谧。




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

  • 相关阅读:
    java 测试 (junit+ junit 断言 + postman)
    junit 运行(eclipse + IDEA)
    junit 常用注解 + junit 断言详解
    工作周报模板
    spring boot tomcat 部署
    spring boot 集成JSP
    spring boot 集成 Mybatis,JPA
    JPA 常用注解
    员工年终绩效考核表模板
    2013 Noip提高组 Day1
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1975686.html
Copyright © 2011-2022 走看看