Can an unauthorized login attempt occupy a MySQL connection for a long time?
My MySQL has a limited number of concurrent connections defined by the max_connections
variable by my cloud provider. Currently limited to 151
connections.
There is only one web server using this database therefore it should be more than enough. However, I was surprised to see that I currently have 30+ active connections to my server:
mysql> show status where `variable_name` = 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 34 |
+-------------------+-------+
While there shouldn't be almost anything using it at the moment and I can verify it with show processlist: (only one connection here)
mysql> show processlist;
+--------+------------+--------------------+------------+---------+------+----------+------------------+-----------+---------------+
| Id | User | Host | db | Command | Time | State | Info | Rows_sent | Rows_examined |
+--------+------------+--------------------+------------+---------+------+----------+------------------+-----------+---------------+
| 272130 | ********** | ****************** | ********** | Query | 0 | starting | show processlist | 0 | 0 |
+--------+------------+--------------------+------------+---------+------+----------+------------------+-----------+---------------+
I've been struggling to try to account for the remaining 33 connection's whereabouts and finally I realized: could those be mass brute-force attacks? Maybe 30-40 hackers are trying to guess my password and that blocks a thread per each attacker?
Is my assumption correct?
UPDATE 2021-07-07: Added more details of MySQL status
mysql> show status where `variable_name` like '%threads%' or `variable_name` like '%connection%';
+-----------------------------------+---------------------+
| Variable_name | Value |
+-----------------------------------+---------------------+
| Connection_errors_accept | 0 |
| Connection_errors_internal | 0 |
| Connection_errors_max_connections | 0 |
| Connection_errors_peer_address | 8 |
| Connection_errors_select | 0 |
| Connection_errors_tcpwrap | 0 |
| Connections | 482365 |
| Delayed_insert_threads | 0 |
| Max_used_connections | 74 |
| Max_used_connections_time | 2021-07-05 09:10:27 |
| Slow_launch_threads | 0 |
| Threadpool_idle_threads | 0 |
| Threadpool_threads | 0 |
| Threads_cached | 5 |
| Threads_connected | 36 |
| Threads_created | 2882 |
| Threads_running | 1 |
+-----------------------------------+---------------------+
Solution 1:
-
SHOW PROCESSLIST
only shows connections for the user running that command. Be sure to connect asroot
to get the complete list. "root" is actually more powerful than you need; there may be some other user ("admin"?) that is powerful enough. In terms ofGRANT
, all the 'user' needs isPROCESS
. -
Once you get the processlist,
Time
will indicate how many seconds since they connected. -
SHOW STATUS LIKE 'Threads_running';
will show how many connections are currently active. -
SHOW STATUS LIKE 'Max_used_connections';
is a high water mark. If it has not yet hitmax_connections
(you mentioned 151), then you have not yet (since restart) "run out of connections". -
The timeout may be large, leading to connections hanging around.