預設安裝的 MySQL 因 root 空密碼、程式漏洞導致溢位攻擊,頻繁成為入侵目標,資料毀損後果災難性。本文建立六大安全基線:
./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 環境需額外動態庫依賴。
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
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/
編輯 /chroot/mysql/etc/passwd 僅保留 mysql、root、sys;group 僅保留 mysql、root。
mknod /chroot/mysql/dev/null c 1 3
chown root:root /chroot/mysql/dev/null
chmod 666 /chroot/mysql/dev/null
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 &
編輯 /chroot/mysql/etc/my.cnf,[mysqld] 區段取消註解 skip-networking。本地連線改用 Unix Socket,速度更快、更安全。
同一配置區段新增 set-variable=local-infile=0,防止本地檔案被惡意讀入資料庫。
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
建立硬連結解決 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% 安全,但此多層防護大幅提升系統抗風險能力。