MySQL已經成為當前網絡中使用最多的數據庫之一
特別是在Web應用上
它占據了中小型應用的絕對優勢
這一切都源於它的小巧易用
安全有效
開放式許可和多平台
更主要的是它與三大Web語言之一——PHP的完美結合
但不幸的是
一個缺省安全的MySQL
會因為root密碼為空及程序漏洞導致被溢出
使得安裝MySQL的服務器成為被經常攻擊的對象
更嚴重的是
被攻擊之後數據庫往往遭破壞
易造成災難性的後果
下面將進入為了保護數據而進行的保衛戰中
環境要求 .系統環境
有一台Red Hat Linux
自定義安裝的服務器
系統安裝了GCC及一些軟件包
比如Apache
PHP等
安裝完系統後的第一件事就是升級系統的軟件包
作為Web服務器
系統接受PHP腳本的請求
PHP則使用下面將要安裝的MySQL數據庫作為動態發布的接觸
分區情況的要求和一般系統差不多
惟一不同之處在於後面建立的/chroot與/tmp要求在同一個分區上
.安全要求
(
)MySQL運行在一個獨立的(Chroot)環境下
(
)mysqld進程運行於一個獨立的用戶/用戶組下
此用戶和用戶組沒有根目錄
沒有Shell
也不能用於其它程序
(
)修改MySQL的root賬號
並使用一個復雜的密碼
(
)只允許本地連接MySQL
啟動MySQL時網絡連接被禁止掉
(
)保證連接MySQL的nobody賬號登錄被禁止
(
)刪除test數據庫
安裝MySQL .安裝准備
安裝MySQL之前
按照上述安全要求需要創建一個用於啟動MySQL的用戶和組
#groupadd mysql
#useradd mysql
c
start mysqld
s account
d /dev/null
g mysql
s /sbin/nologin
.編譯和安裝
下載MySQL源代碼包:
#wget
/mysql
tar
gz
解壓縮:
#tar
zxvf mysql
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本身連接成靜態後就無需再創建一些庫環境了
.配置與啟動
MySQL的配置文件需要手工選擇
拷貝幾個模板文件中的一個到/etc下
這幾個模板文件位於源文件的support
files目錄
一共有
個
small
medium
large
huge
#cp support
files/f /etc/f
#chown root:sys /etc/f
#chmod
/etc/f
啟動MySQL
注意使用用戶為mysql
#/usr/local/mysq/bin/mysqld_safe
user=mysql &
.測試
為了測試安裝的程序是否正確及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
to server version:
Type
help;
or
\h
for help
Type
\c
to clear the buffer
mysql>
mysql> show databases;
+
+
Database
+
+
mysql
test
+
+
rows in set (
sec)
mysql>quit
連接成功
可以關閉數據庫
#/usr/local/mysql/bin/mysqladmin
uroot shutdown
如果連接失敗則需要仔細分析出錯原因
#more /usr/local/mysql/var/`hostname`
err
Chrooting
.Chrooting環境
Chroot是Unix/類Unix的一種手段
它的建立會將其與主系統幾乎完全隔離
也就是說
一旦遭到什麼問題
也不會危及到正在運行的主系統
這是一個非常有效的辦法
特別是在配置網絡服務程序的時候
.Chroot的准備工作
首先
應當建立如圖
示目錄結構
#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
);
然後設定目錄權限
#chown
R root:sys /chroot/mysql
#chmod
R
/chroot/mysql
#chmod
/chroot/mysql/tmp
.拷貝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/nf /chroot/mysql/etc/
#cp
p /etc/nf /chroot/mysql/etc/
#cp
p /etc/group /chroot/mysql/etc/
#cp
p /etc/passwd /chroot/mysql/etc/passwd
#cp
p /etc/f /chroot/mysql/etc/
.編輯chroot下的passwd文件和group文件
#vi /chroot/etc/passwd
如上命令打開passwd文件
請刪除除了mysql
root
sys的所有行
#vi /chroot/etc/group
如上命令打開group文件
請刪除除了mysql
root的所有行
.創建特殊的設備文件/dev/null
參照系統的樣子做即可
#ls
al /dev/null
crw
rw
rw
root root
Jan
/dev/null
#mknod /chroot/mysql/dev/null c
#chown root:root /chroot/mysql/dev/null
#chmod
/chroot/mysql/dev/null
.拷貝mysql的數據庫文件到chroot下
#cp
R /usr/local/mysql/var/ /chroot/mysql/usr/local/mysql/var
#chown
R mysql:mysql /chroot/mysql/usr/local/mysql/var
.安裝chrootuid程序
下載chrootuid
然後RPM安裝即可
/stat/
/idpl/
/com/chrootuid
l
.測試Chroot環境下的MySQL配置
#chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &
如果失敗請注意chroot目錄下面的權限問題
.測試連接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的原因
配置文件也會有所不同
.關閉遠程連接
首先
應該關閉
端口
這是MySQL的默認監聽端口
由於此處MySQL只服務於本地腳本
所以不需要遠程連接
盡管MySQL內建的安全機制很嚴格
但監聽一個TCP端口仍然是危險的行為
因為如果MySQL程序本身有問題
那麼未授權的訪問完全可以繞過MySQL的內建安全機制
關閉網絡監聽的方法很簡單
在/chroot/mysql/etc/f文件中的[mysqld]部分
去掉#skip
networking前面的
#
即可
關閉了網絡
本地程序如何連接MySQL數據庫呢?本地程序可以通過mysql
sock來連接
速度比網絡連接更快
後文將提到關於mysql
sock的具體情況
MySQL的備份通常使用SSH來執行
.禁止MySQL導入本地文件
下面將禁止MySQL中用
LOAD DATA LOCAL INFILE
命令
這個命令會利用MySQL把本地文件讀到數據庫中
然後用戶就可以非法獲取敏感信息了
為了禁止上述命令
在/chroot/mysql/etc/f文件的[mysqld]部分加入下面語句
set
variable=local
infile=
From:http://tw.wingwit.com/Article/Security/201401/30214.html