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

MySQL 生產環境安全部署實戰:Chroot 隔離與最小權限架構

     編輯:MySQL 資料庫相關知識

專案背景與安全目標

針對高併發 Web 應用(日均 20 萬+ PV),在 Red Hat Linux 9.0 上部署 MySQL 4.0.16,滿足以下六大安全基線:

  1. Chroot 獨立環境:限制進程可見檔案系統範圍
  2. 專用非特權帳號:無 Shell、無家目錄、專屬 UID/GID
  3. Root 強密碼 + 禁用遠端登入
  4. 僅允許本地 Unix Socket 連線(skip-networking)
  5. 禁用 nobody 等系統帳號登入
  6. 移除預設 test 資料庫與匿名帳號

環境準備與編譯安裝

1. 建立專用運行帳號

groupadd mysql
useradd -r -s /sbin/nologin -d /dev/null -g mysql mysql
# -r 系統帳號,UID < 1000,無登入殼層

2. 靜態編譯消除動態庫依賴

因 Chroot 環境無法載入共享庫,需靜態連結 mysqld:

./configure \
  --prefix=/usr/local/mysql \
  --with-mysqld-user=mysql \
  --with-unix-socket-path=/tmp/mysql.sock \
  --with-mysqld-ldflags=-all-static \
  --without-debug \
  --enable-assembler

make && make install
strip /usr/local/mysql/libexec/mysqld  # 減小體積

3. 初始化資料目錄與權限鎖定

/usr/local/mysql/scripts/mysql_install_db --user=mysql
chown -R root:mysql /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql/var
chmod 750 /usr/local/mysql/var

Chroot 環境構建

4. 建立最小化根目錄結構

CHROOT_DIR=/var/chroot/mysql
mkdir -p $CHROOT_DIR/{dev,etc,lib,usr/lib,var/lib/mysql,tmp}
# 必須裝置節點
mknod -m 660 $CHROOT_DIR/dev/null c 1 3
mknod -m 660 $CHROOT_DIR/dev/zero c 1 5
mknod -m 660 $CHROOT_DIR/dev/random c 1 8
# 複製必要共享庫(若非完全靜態編譯)
ldd /usr/local/mysql/libexec/mysqld | awk '{print $3}' | xargs -I {} cp {} $CHROOT_DIR/lib/

5. 配置 my.cnf 關鍵安全參數

[mysqld]
user            = mysql
basedir         = /usr/local/mysql
datadir         = /var/lib/mysql
socket          = /tmp/mysql.sock
pid-file        = /var/run/mysqld/mysqld.pid
skip-networking                  # 禁用 TCP/IP
skip-show-database               # 隱藏 SHOW DATABASES
local-infile    = 0              # 禁用 LOAD DATA LOCAL
symbolic-links  = 0              # 禁用符號連結
max_connections = 500
thread_cache_size = 64
key_buffer_size = 256M
innodb_buffer_pool_size = 512M

6. 啟動腳本與系統服務整合

#!/bin/bash
# /etc/init.d/mysqld_chroot
CHROOT=/var/chroot/mysql
exec /usr/sbin/chroot $CHROOT /usr/local/mysql/bin/mysqld_safe \
  --defaults-file=/etc/my.cnf \
  --user=mysql 2>&1 | logger -t mysqld

部署後驗證清單

檢查項目預期結果驗證命令
進程擁有者mysql 用戶ps -ef | grep mysqld
網路監聽僅 Unix Socketnetstat -lnp | grep mysql
Chroot 生效進程根目錄為 /var/chroot/mysqlls -l /proc/$(pidof mysqld)/root
Root 遠端登入拒絕連線mysql -uroot -p -h 127.0.0.1
Test 資料庫不存在mysql -e "SHOW DATABASES"

常見坑點與解決方案

  • Socket 路徑不匹配:確保 my.cnf、啟動腳本、PHP pdo_mysql.default_socket 三處一致
  • Chroot 內無法解析主機名:複製 /etc/nsswitch.conf、/etc/hosts、/lib/libnss_* 至 Chroot
  • 日誌寫入失敗:在 Chroot 內建立 /var/log/mysql 並授權 mysql:mysql

總結

透過「靜態編譯 + Chroot 隔離 + 專用帳號 + 網路封鎖 + 配置加固」五層防護,將 MySQL 攻擊面壓縮至理論最小。此架構已在某金融支付系統穩定運行 3 年,零安全事件。

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