skip-networking 或 bind-address=127.0.0.1);test 資料庫與匿名使用者。groupadd mysql
useradd -r -s /sbin/nologin -M -g mysql -c "MySQL Server" mysql
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-4.0.16.tar.gz
tar zxvf mysql-4.0.16.tar.gz
cd mysql-4.0.16
./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,lib,usr/local/mysql,var/lib/mysql,tmp}
# 複製必要檔案
cp /usr/local/mysql/bin/mysqld /chroot/mysql/usr/local/mysql/bin/
cp /usr/local/mysql/share/mysql/charsets /chroot/mysql/usr/local/mysql/share/mysql/ -r
cp /etc/passwd /etc/group /chroot/mysql/etc/
# 建立裝置節點
mknod -m 666 /chroot/mysql/dev/null c 1 3
mknod -m 666 /chroot/mysql/dev/zero c 1 5
# 掛載 /tmp(需與 /chroot 同分區)
mount --bind /tmp /chroot/mysql/tmp
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/var/lib/mysql
socket=/tmp/mysql.sock
pid-file=/var/run/mysqld.pid
skip-networking
bind-address=127.0.0.1
skip-show-database
local-infile=0
secure-file-priv=/tmp
log-error=/var/log/mysqld.log
slow-query-log=1
slow-query-log-file=/var/log/slow.log
long-query-time=2
# /etc/init.d/mysql 片段
start() {
/usr/sbin/chroot /chroot/mysql /usr/local/mysql/bin/mysqld_safe \
--user=mysql --datadir=/var/lib/mysql --socket=/tmp/mysql.sock \
--pid-file=/var/run/mysqld.pid &
}
mysql -u root -p
mysql> RENAME USER 'root'@'localhost' TO 'dbadmin'@'localhost';
mysql> SET PASSWORD FOR 'dbadmin'@'localhost' = PASSWORD('ComplexPass!2024');
mysql> DELETE FROM mysql.user WHERE User='';
mysql> DROP DATABASE test;
mysql> FLUSH PRIVILEGES;
至此 MySQL 已在受限、隔離、最小權限環境下安全運行。