Wednesday, September 18, 2013

Chroot mysql

1. Yêu cầu bảo mật

Để mysql được bảo mật hơn các bạn cần cấu hình theo các yêu cầu sau:

  • Cơ sở dữ liệu MySQL phải được chạy trong môi trường Chrooted ;
  • Tiến trình(processes) MySQL phải chạy bằng một tài khoản riêng, chuyên dụng (tạo một tải khoản chỉ dùng để chạy mysql)
  • Chỉ cho phép truy cập từ localhost (Disabled tính năng cho phép truy cập cơ sở dữ liệu từ xa)
  • Đặt password phức tạp cho tài khoản quản trị cao nhất của MySQL (Root)
  • Đổi tên tài khoản quản trị Mysql (root)
  • Cấm truy cập Nạt danh (Anonymous access) đến cơ sở dữ liệu (tài khoản nobody) phải bị disabled
  • Xóa tất cả các cơ sở dữ liệu và tables mẩu được tạo bởi Mysql (như test...)
2. Cài đặt MySQL

2.0 Tạo tài khoản để chạy mysql

Mã:
pw groupadd mysql

pw useradd mysql -c "MySQL Server" -d /dev/null -g mysql -s /sbin/nologin

2.1 Cài đặt mysql
 

Mã:
#cd /usr/local/mysql 
#./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --with-unix-socket-path=/tmp/mysql.sock --with-mysqld-ldflags=-all-static
#make
#su
#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
2.2 Copy tập tin cấu hình

Mã:
#cp support-files/my-medium.cnf /etc/my.cnf
#chown root:sys /etc/my.cnf
#chmod 644 /etc/my.cnf
2.3 Start Mysql

Mã:
   /usr/local/mysql/bin/mysqld_safe &

2.4 Kiểm tra kết nối đến Mysql
 

Mã:
  
#/usr/local/mysql/bin/mysql -u root mysql  -> Enter




mysql> show databases;
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.00 sec)

mysql> quit;
2.4 Stop Mysql

Mã:
   /usr/local/mysql/bin/mysqladmin -u root shutdown


3. Chrooting the server

Áp dụng cho hầu hết hệ nên tảng linux, unix..

3.2 Chuẩn bị môi trường chrooted

Mã:
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

3.3 Set quyền
 

Mã:
chown -R root:sys /chroot/mysql
chmod -R 755 /chroot/mysql
chmod 1777 /chroot/mysql/tmp

3.4 Tạo cấu trúc thư mục
 

Mã:
cp /usr/local/mysql/libexec/mysqld /chroot/mysql/usr/local/mysql/libexec/
cp /usr/local/mysql/share/mysql/english/errmsg.sys /chroot/mysql/usr/local/mysql/share/mysql/english/
cp /etc/hosts /chroot/mysql/etc/
cp /etc/host.conf /chroot/mysql/etc/
cp /etc/resolv.conf /chroot/mysql/etc/
cp /etc/group /chroot/mysql/etc/
cp /etc/master.passwd /chroot/mysql/etc/passwords
cp /etc/my.cnf /chroot/mysql/etc/
3.5 Xóa mật khẩu và nhóm không cần thiết

Mã:
cd /chroot/mysql/etc
pwd_mkdb -d /chroot/mysql/etc passwords
rm -rf /chroot/mysql/etc/master.passwd
3.6 Special considerations


Mã:
/dev/null:   
ls -al /dev/null
 crw-rw-rw-  1 root  sys    2,   2 Jun 21 18:31 /dev/null
mknod /chroot/mysql/dev/null c 2 2
chown root:sys /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

3.7 Cấu hình Charset ngôn ngữ
 

nếu muốn sử dụng thêm một ngôn ngữ khác ngoài tiếng anh thì chúng ta có thể copy charsets thích hợp vào 

Mã:
  /usr/local/mysql/share/mysql/charsets .
3.8 Kiểm tra sau khi cấu hình

Mã:
/chroot/mysql mysql /usr/local/mysql/libexec/mysqld &

4 Disable truy cập từ xa (không cho kết nối từ xa vào mysql)

thêm dòng: skip-networking vào trong thẻ [mysqld]

Mã:
   vi /chroot/mysql/etc/my.cnf
 skip-networking
4.2 Cải thiện bảo mật Local

thêm dòng: set-variable=local-infile=0 vào trong thẻ [mysqld]

Mã:
/chroot/mysql/etc/my.cnf: 
  set-variable=local-infile=0
Không cho phép sử dụng: mysqladmin, mysqldump..

Mã:
 [client] section of /etc/my.cnf: 
  socket = /chroot/mysql/tmp/mysql.sock
Khi nào cần sử dụng mysqladmin, mysqldump thì sử dụng lênh sau: 

Mã:

--socket=/chroot/mysql/tmp/mysql.sock
4.3 Thay đổi mật khẩu root

Mã:
 chrootuid /chroot/mysql mysql /usr/local/mysql/libexec/mysqld &
 
   /usr/local/mysql/bin/mysql -u root 
 mysql> SET PASSWORD FOR root@localhost=PASSWORD('new_password');

4.4 Xóa người dùng và cở sở dữ liệu mặc đinh
 

Mã:
 mysql> drop database test;
 mysql> use mysql;
 mysql> delete from db;
 mysql> delete from user where not (host="localhost" and user="root");
 mysql> flush privileges;

4.5 Đổi tên tài khoản root
 

Mã:
mysql> update user set user="mydbadmin" where user="root";
mysql> flush privileges;


4.6 Xóa history
 


Cuối cùng chúng ta nên xóa nội dung file: history của mysql (~/.mysql_history), tập tin này chủa tất cả các lệnh mà mysql đã thực thi (Đặt biệt mật khẩu được lưu trữ theo dạng Plain Test trong tập tin này  


Mã:
 cat /dev/null > ~/.mysql_history
Vậy là chúng ta đã cấu hình bảo mật cở bản cho Mysql rồi đó,


chúc các bạn năm mới vui vẽ và thành công

Tham khảo:

Securing MySQL: step-by-step

Securing Apache: Step-by-Step
http://www.symantec.com/connect/articles/securing-mysql-step-step