A.1: Where can I find documentation that addresses security issues for MySQL?
A.2: What is the default authentication plugin in MySQL 8.0?
A.3: Does MySQL 8.0 have native support for SSL?
A.4: Is SSL support built into MySQL binaries, or must I recompile the binary myself to enable it?
A.5: Does MySQL 8.0 have built-in authentication against LDAP directories?
A.6: Does MySQL 8.0 include support for Roles Based Access Control (RBAC)?
A.7: Does MySQL 8.0 support TLS 1.0 and 1.1?
Questions and Answers
The best place to start is Chapter 1, Security.
Other portions of the MySQL Documentation which you may find useful with regard to specific security concerns include the following:
There is also the Secure Deployment Guide, which provides procedures for deploying a generic binary distribution of MySQL Enterprise Edition Server with features for managing the security of your MySQL installation.
The default authentication plugin in MySQL 8.0 is
caching_sha2_password. For information about
this plugin, see
Section 6.1.2, “Caching SHA-2 Pluggable Authentication”.
caching_sha2_password plugin provides
more secure password encryption than the
mysql_native_password plugin (the default
plugin in previous MySQL series). For information about the
implications of this change of default plugin for server
operation and compatibility of the server with clients and
connectors, see caching_sha2_password as the Preferred Authentication Plugin.
Most 8.0 binaries have support for SSL connections between the client and server. See Chapter 5, Using Encrypted Connections.
You can also tunnel a connection using SSH, if (for example) the client application does not support SSL connections. For an example, see Section 5.4, “Connecting to MySQL Remotely from Windows with SSH”.
Most 8.0 binaries have SSL enabled for client/server connections that are secured, authenticated, or both. See Chapter 5, Using Encrypted Connections.
The Enterprise edition includes a PAM Authentication Plugin that supports authentication against an LDAP directory.
Not at this time.
Support for the TLSv1 and TLSv1.1 connection protocols is removed as of MySQL 8.0.28. The protocols were deprecated from MySQL 8.0.26. For the consequences of that removal, see Removal of Support for the TLSv1 and TLSv1.1 Protocols.
Support for TLS versions 1.0 and 1.1 is removed because those protocol versions are old, released in 1996 and 2006, respectively. The algorithms used are weak and outdated.
Unless you are using very old versions of MySQL Server or connectors, you are unlikely to have connections using TLS 1.0 or 1.1. MySQL connectors and clients select the highest TLS version available by default.
When was support for TLS 1.2 added to MySQL Server? MySQL Community Server added TLS 1.2 support when the community server switched to OpenSSL for MySQL 5.6, 5.7, and 8.0 in 2019. For MySQL Enterprise Edition, OpenSSL added TLS 1.2 support in 2015, in MySQL Server 5.7.10.
How can one view which TLS versions are in active use? For MySQL 5.7 or 8.0, review whether TLS 1.0 or 1.1 is in use by running this query:
SELECT `session_ssl_status`.`thread_id`, `session_ssl_status`.`ssl_version`, `session_ssl_status`.`ssl_cipher`, `session_ssl_status`.`ssl_sessions_reused` FROM `sys`.`session_ssl_status` WHERE ssl_version NOT IN ('TLSv1.3','TLSv1.2');
If a thread using TLSv1.0 or TLSv1.1 is listed, you can determine where this connection is coming from by running this query:
SELECT thd_id,conn_id, user, db, current_statement, program_name FROM sys.processlist WHERE thd_id IN ( SELECT `session_ssl_status`.`thread_id` FROM `sys`.`session_ssl_status` WHERE ssl_version NOT IN ('TLSv1.3','TLSv1.2') );
Alternatively, you can run this query:
SELECT * FROM sys.session WHERE thd_id IN ( SELECT `session_ssl_status`.`thread_id` FROM `sys`.`session_ssl_status` WHERE ssl_version NOT IN ('TLSv1.3','TLSv1.2') );
These queries provide details needed to determine which application is not supporting TLS 1.2 or 1.3, and target upgrades for those.
Are there other options for testing for TLS 1.0 or
1.1? Yes, you can disable those versions prior to
upgrading your server to a newer version. Explicitly specify
which version to use, either in
mysql.ini) or by using
PERSIST, for example:
Do all MySQL Connectors (5.7 and 8.0) support TLS 1.2
and higher? What about C and C++ applications using
libmysql? For C and C++
applications using the community
libmysqlclient library, use an OpenSSL-based
library (that is, do not use YaSSL). Usage
of OpenSSL was unified in 2018 (in MySQL 8.0.4 and 5.7.28,
respectively). The same applies for Connector/ODBC and
Connector/C++. To determine what library dependencies are used,
run the following commands to see if OpenSSL is listed. On
Linux, use this command:
$> sudo ldd usr/local/mysql/lib/libmysqlclient.a | grep -i openssl
On MacOS, use this command:
$> sudo otool -l /usr/local/mysql/lib/libmysqlclient.a | grep -i openssl
What about Connector/J? Java 8 moved to TLS 1.2 as the default in January 2014; TLS 1.2 was supported prior to that, so unless you are running a very old version of Connector/J, you have TLS 1.2 support.
What about Connector/NET? For .NET applications, Microsoft stopped support of TLS 1.0 and 1.1 at the end of 2020. Support for TLS 1.2 was added in 2012. You would need to have a very old version of Connector/NET not to have support for TLS 1.2.
What about Connector/Python? It depends on what version of Python you are running. The SSL module in Python 2.6 supports TLS up to version 1.0 only. In that case, you will need to upgrade to Python 2.7.9 or higher, or Python 3.x, both of which support newer versions of TLS. For details, see Connector/Python Versions and https://www.calazan.com/how-to-check-if-your-python-app-supports-tls-12/.
What about Connector/Node.js or Node
MySQL2? TLS comes with
all supported versions of Node.js use OpenSSL v1.1.1 (as of
April 2020), which again supports TLS 1.2 and higher.
What about PHP? These versions of PHP support TLS 1.2 and higher.