首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 資料庫安全強化:Chroot 隔離與最佳實踐全攻略

     編輯:MySQL 資料庫相關知識

預設安裝的風險與防禦目標

預設安裝的 MySQL 因 root 空密碼、程式漏洞導致溢位攻擊,頻繁成為入侵目標,資料毀損後果災難性。本文建立六大安全基線:

  1. MySQL 運行於獨立 Chroot 環境
  2. 專屬用戶/群組運行,無 Shell、無根目錄權限
  3. 修改 root 帳號並設定強密碼
  4. 僅允許本地連接,禁用網路埠(3306)
  5. 禁止 nobody 帳號登入
  6. 刪除測試資料庫

編譯安裝關鍵參數

./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

關鍵點:--with-mysqld-ldflags=-all-static 靜態編譯,避免 Chroot 環境需額外動態庫依賴。

Chroot 環境建立完整步驟

1. 目錄結構與權限

mkdir -p /chroot/mysql/{dev,etc,tmp,var/tmp,usr/local/mysql/libexec,usr/local/mysql/share/mysql/english}
chown -R root:sys /chroot/mysql
chmod -R 755 /chroot/mysql
chmod 1777 /chroot/mysql/tmp

2. 核心檔案複製

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,host.conf,resolv.conf,group,passwd,my.cnf} /chroot/mysql/etc/

3. 精簡系統帳號檔案

編輯 /chroot/mysql/etc/passwd 僅保留 mysql、root、sys;group 僅保留 mysql、root。

4. 建立裝置檔案

mknod /chroot/mysql/dev/null c 1 3
chown root:root /chroot/mysql/dev/null
chmod 666 /chroot/mysql/dev/null

5. 資料目錄遷移與啟動測試

cp -R /usr/local/mysql/var/ /chroot/mysql/usr/local/mysql/var
chown -R mysql:mysql /chroot/mysql/usr/local/mysql/var
# 安裝 chrootuid 套件後
chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &

MySQL 進階安全配置

禁用網路監聽

編輯 /chroot/mysql/etc/my.cnf,[mysqld] 區段取消註解 skip-networking。本地連線改用 Unix Socket,速度更快、更安全。

禁止 LOAD DATA LOCAL INFILE

同一配置區段新增 set-variable=local-infile=0,防止本地檔案被惡意讀入資料庫。

Root 帳號強化

mysql> SET PASSWORD FOR root@localhost=PASSWORD('strong_pass');
mysql> USE mysql;
mysql> UPDATE user SET user='custom_admin' WHERE user='root';
mysql> DELETE FROM user WHERE user='' OR password='' OR host='%';
mysql> DROP DATABASE test;
mysql> FLUSH PRIVILEGES;

清除歷史紀錄

cat /dev/null > ~/.bash_history
cat /dev/null > ~/.mysql_history

PHP 連線與自動啟動腳本

建立硬連結解決 Socket 路徑差異:ln /chroot/mysql/tmp/mysql.sock /tmp/mysql.sock(須同分區)。

自動啟動腳本 /etc/rc.d/init.d/mysqld 範例:

#!/bin/sh
CHROOT_MYSQL=/chroot/mysql
SOCKET=/tmp/mysql.sock
MYSQLD=/usr/local/mysql/libexec/mysqld
CHROOTUID=/usr/bin/chrootuid

case "$1" in
start)
  rm -f ${SOCKET}
  nohup ${CHROOTUID} ${CHROOT_MYSQL} mysql ${MYSQLD} >/dev/null 2>&1 &
  sleep 5 && ln ${CHROOT_MYSQL}${SOCKET} ${SOCKET}
  ;;
stop)
  kill `cat ${CHROOT_MYSQL}/usr/local/mysql/var/\`hostname\`.pid`
  rm -f ${CHROOT_MYSQL}${SOCKET}
  ;;
esac

雖無法達 100% 安全,但此多層防護大幅提升系統抗風險能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved