How to secure and harden MySQL

Securing MySQL is critical to protecting sensitive data and ensuring database integrity. This guide provides an overview of MySQL security best practices with detailed explanations of each example.


Securing MySQL involves hardening various components of the system. Here's a rundown of key areas where security can be enhanced:

  1. User Authentication:
    • Strong Passwords: Enforce complex passwords for all user accounts.
    • Limit User Privileges: Grant minimal necessary privileges to users.
    • Account Locking and Expiry: Implement account locking after multiple failed attempts and set expiration for user passwords.
  2. Network Security:
    • Encrypted Connections: Use SSL/TLS for encrypting data in transit.
    • Firewall Configuration: Limit access to the MySQL port to trusted sources only.
    • Change Default Port: Alter the default MySQL port to reduce the risk of automated attacks.
  3. Database Configuration and Management:
    • Configuration File Protection: Secure the my.cnf or my.ini configuration files.
    • Disable Remote Root Access: Prevent the root account from being accessed remotely.
    • Remove Anonymous Accounts: Eliminate default anonymous user accounts that MySQL sometimes creates during installation.
  4. Data Encryption:
    • At-Rest Encryption: Encrypt data stored on disk to protect it from unauthorized access.
    • In-Transit Encryption: Secure data as it moves between the database and application.
  5. Access Control:
    • Host-Based Access Control: Restrict user connections to specific hosts or IP addresses.
    • Use of Roles: Manage privileges more efficiently through roles.
  6. SQL Injection Protection:
    • Prepared Statements: Use prepared statements in applications to prevent SQL injection.
  7. Auditing and Monitoring:
    • Enable Logging: Use MySQL's logging capabilities to monitor database activities.
    • Audit Plugins: Install and configure audit plugins for advanced monitoring.
  8. Regular Updates and Patch Management:
    • Update MySQL: Regularly update MySQL to the latest version to ensure all known vulnerabilities are patched.
    • Update Associated Software: Keep the operating system and other related software updated.
  9. Backup and Recovery:
    • Regular Backups: Implement a routine for regular database backups.
    • Backup Encryption: Encrypt backup data for additional security.
  10. Application-Level Security:
    • Validate Input: Ensure that application inputs interacting with the database are properly validated and sanitized.
    • Update Applications: Regularly update the applications interfacing with MySQL to patch any security holes.
  11. Physical Security:
    • Server Security: Ensure that physical servers hosting MySQL are in a secure location and have restricted access.


Strong User Authentication and Privileges

Securing MySQL starts with robust user authentication and minimal privilege assignment.

Creating Users with Strong Passwords

Use complex passwords for all MySQL accounts.

Example:

SQL
CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'StrongPassw0rd!';
  • CREATE USER: Creates a new user.
  • 'new_user'@'localhost': Username is new_user, and localhost means access is allowed only from the local machine.
  • IDENTIFIED BY: Specifies the password for the user.

Granting Minimal Necessary Privileges

Grant only the required privileges to perform necessary operations.

Example:

SQL
GRANT SELECT, INSERT ON mydb.mytable TO 'new_user'@'localhost';
  • GRANT: Assigns specific privileges to a user.
  • SELECT, INSERT: User can only read and insert data.
  • ON mydb.mytable: Privileges are restricted to mytable in mydb.

Revoking Unnecessary Privileges

Periodically review and revoke privileges that are no longer needed.

Example:

SQL
REVOKE DELETE ON mydb.mytable FROM 'new_user'@'localhost';
  • REVOKE: Removes specified privileges.
  • DELETE: The user can no longer delete data from mytable.

Encrypting Connections

Using encrypted connections prevents data interception.

Configuring SSL/TLS

Enable SSL/TLS in MySQL’s configuration file to secure data in transit.

Example Configuration:

In my.cnf or my.ini:

Code
[mysqld]
ssl-ca=ca.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem
  • These settings specify the paths to SSL certificates and keys for encrypted connections.

Database and Network Configuration

Enhance security through database and network configurations.

Changing Default MySQL Port

Switch from the default port (3306) to reduce risk of automated attacks.

Example Configuration:

In my.cnf or my.ini:

Code
[mysqld]
port = 5600
  • Changes the MySQL port to 5600.

Configuring Firewalls

Restrict access to MySQL port using firewall rules.

Example Firewall Rule:

Bash
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 5600 -j ACCEPT
  • Allows MySQL connections only from the 192.168.1.0/24 subnet on port 5600.

Regular Updates and Backups

Keeping MySQL updated and performing regular backups are critical.

Updating MySQL

Regularly update to the latest version to patch vulnerabilities.

Implementing Backups

Regular backups help in data recovery.

Example Backup Command:

Bash
mysqldump -u new_user -p mydb > mydb_backup.sql
  • Creates a backup of mydb in the file mydb_backup.sql.

Monitoring and Auditing

Use monitoring and auditing tools to track database activities.

Installing Audit Plugins

Audit plugins can help track and log database activities.

Example:

SQL
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
  • Installs the audit_log plugin for auditing purposes.

Regular Log Reviews

Review MySQL logs for unusual activities.

Application-Level Security

Secure application-level interactions with the database.

Using Prepared Statements

Prepared statements prevent SQL injection.

Example in PHP:

PHP
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $username]);
  • prepare: Creates a prepared statement.
  • execute: Executes the statement with the provided username. This method prevents SQL injection.

Keeping Applications Updated

Regular updates to applications and dependencies help prevent exploiting known vulnerabilities.