怎样加固MySQL
前言
特别是 Web 应用上, MySQL 已经成为当前网络中使用最多的数据库之一。占据了中小型应用的绝对优势。这一切都源于它小巧易用、平安有效、开放式许可、多平台,更主要的与三大 Web 语言之 — PHP 完美结合。
使得装置 MySQL 服务器成为被经常攻击的对象。更严重的被攻击之后数据库往往遭破坏,但不幸的一个缺省安全的 MySQL 会因为 root 密码为空及顺序漏洞导致被溢出。造成灾难性的后果。下面将进入为了维护数据而进行的捍卫战中。
环境要求
1 .系统环境
系统装置了 GCC 及一些其它要求的软件包,一台 Red Hat 9.0 自定义安装的服务器。比方 Apach PHP 等。装置完系统后的第一件事就是升级系统的软件包。作为 Web 服务器,系统接受 PHP 脚本的请求, PHP 则使用下面将要装置的 MySQL 数据库作为动态发布的接触。
惟一不同之处在于后面建立的 /chroot 与 /tmp 要求在同一个分区上。 分区情况的要求和一般系统差不多。
2 .安全要求
1 MySQL 运行在一个独立的 Chroot 环境下;
2 mysqld 进程运行于一个独立的用户 / 用户组下。
没有 shell 也不能用于其它顺序; 此用户和用户组没有根目录。
并使用一个复杂的密码; 3 修改 MySQL root 帐号。
4 只允许外地连接 MySQL 启动 MySQL 时网络连接被禁止掉;
5 保证连接 MySQL nobodi 帐号登陆被禁止;
6 删除 test 数据库。
装置 MySQL
1 .安装准备
依照上述平安要求需要创建一个用于启动 MySQL 用户和组。 装置 MySQL 之前。
#groupadd mysql
#useradd mysql -c "start mysqld' account" -d /dev/nul -g mysql -s /sbin/nologin
2 .编译和安装
下载 MySQL 源代码包 :
#wget http://mysql.he.net/Downloads/MySQL...l-4.0.16.tar.gz
解压缩 :
#tar -zxvf mysql-4.0.16.tar.gz
如果有特殊要求,一般把 MySQL 装置在 /usr/local/mysql 下。也可自行调整。不过这样做意义不大,因为后面将 Chroot 时只是使用这里的客户工具而已,比方 mysql mysqladmin mysqldump 等。下面就开始编译装置吧。
#./configur --prefix=/usr/local/mysql
--with-mysqld-user=mysql
--with-unix-socket-path=/tmp/mysql.sock
--with-mysqld-ldflags=-all-static
#mak && 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
惟一需要解释、和一般方法不同的地方在于 --with-mysqld-ldflags=-all-stat 因为需要用到 Chroot 环境,上面各步骤的具体作用在 MySQL 手册里已有介绍。而 MySQL 自身连接成静态后就无需再创建一些库环境了
3 .配置与启动
这几个模板文件位于源文件的 support-fil 目录, MySQL 配置文件需要手工选择、拷贝几个模板文件中的一个到 /etc 下。一共 4 个: small medium larg huge
#cp support-files/my-medium.cnf /etc/my.cnf
#chown root:si /etc/my.cnf
#chmod 644 /etc/my.cnf
启动 MySQL 注意使用用户为 mysql
#/usr/local/mysq/bin/mysqld_saf --user=mysql &
4 .测试
最好的方法就是用 MySQL 客户端来连接数据库。 为了测试装置的顺序是否正确及 MySQL 否已经启动正常。
#/usr/local/mysql/bin/mysql
[root@ftp bin]# mysql
Welcom to the MySQL monitor. Command end with ; or g.
Your MySQL connect 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;
+--------------+
| Databas |
+--------------+
| mysql |
| test |
+--------------+
2 row in set 0.00 sec
mysql>quit
可以关闭数据库: 连接胜利。
#/usr/local/mysql/bin/mysqladmin -uroot shutdown
如果连接失败则需要仔细分析出错原因:
#more /usr/local/mysql/var/`hostname`.err
Chrooting
1 . Chroot 环境
建立会将其与主系统几乎完全隔离, Chroot Unix/ 类 Unix 一种手段。也就是说,一旦遭到什么问题,也不会危及到正在运行的主系统。这是一个非常有效的方法,特别是配置网络服务顺序的时候。