Skip to content

Commit c522a5b

Browse files
authored
fix(unified-storage): proper setup TLS in new db_engine for MySQL (grafana#100686)
1 parent 4d7b9a3 commit c522a5b

File tree

3 files changed

+353
-131
lines changed

3 files changed

+353
-131
lines changed

pkg/storage/unified/sql/db/dbimpl/dbEngine_test.go

-118
This file was deleted.

pkg/storage/unified/sql/db/dbimpl/dbEngine.go pkg/storage/unified/sql/db/dbimpl/db_engine.go

+52-13
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,17 @@ import (
77
"time"
88

99
"github.com/go-sql-driver/mysql"
10+
"github.com/grafana/dskit/crypto/tls"
11+
1012
"xorm.io/xorm"
1113

1214
"github.com/grafana/grafana/pkg/storage/unified/sql/db"
1315
)
1416

17+
// tlsConfigName is the name of the TLS config that we register with the MySQL
18+
// driver.
19+
const tlsConfigName = "db_engine_tls"
20+
1521
func getEngineMySQL(getter confGetter) (*xorm.Engine, error) {
1622
config := mysql.NewConfig()
1723
config.User = getter.String("user")
@@ -25,29 +31,22 @@ func getEngineMySQL(getter confGetter) (*xorm.Engine, error) {
2531
// See: https://dev.mysql.com/doc/refman/en/sql-mode.html
2632
"@@SESSION.sql_mode": "ANSI",
2733
}
28-
sslMode := getter.String("ssl_mode")
29-
if sslMode == "true" || sslMode == "skip-verify" {
30-
config.Params["tls"] = "preferred"
31-
}
32-
tls := getter.String("tls")
33-
if tls != "" {
34-
config.Params["tls"] = tls
35-
}
3634
config.Collation = "utf8mb4_unicode_ci"
3735
config.Loc = time.UTC
3836
config.AllowNativePasswords = true
3937
config.ClientFoundRows = true
4038
config.ParseTime = true
4139

40+
// Setup TLS for the database connection if configured.
41+
if err := configureTLS(getter, config); err != nil {
42+
return nil, fmt.Errorf("failed to configure TLS: %w", err)
43+
}
44+
4245
// allow executing multiple SQL statements in a single roundtrip, and also
4346
// enable executing the CALL statement to run stored procedures that execute
4447
// multiple SQL statements.
4548
//config.MultiStatements = true
4649

47-
// TODO: do we want to support these?
48-
// config.ServerPubKey = getter.String("server_pub_key")
49-
// config.TLSConfig = getter.String("tls_config_name")
50-
5150
if err := getter.Err(); err != nil {
5251
return nil, fmt.Errorf("config error: %w", err)
5352
}
@@ -56,7 +55,6 @@ func getEngineMySQL(getter confGetter) (*xorm.Engine, error) {
5655
config.Net = "unix"
5756
}
5857

59-
// FIXME: get rid of xorm
6058
engine, err := xorm.NewEngine(db.DriverMySQL, config.FormatDSN())
6159
if err != nil {
6260
return nil, fmt.Errorf("open database: %w", err)
@@ -69,6 +67,47 @@ func getEngineMySQL(getter confGetter) (*xorm.Engine, error) {
6967
return engine, nil
7068
}
7169

70+
func configureTLS(getter confGetter, config *mysql.Config) error {
71+
sslMode := getter.String("ssl_mode")
72+
73+
if sslMode == "true" || sslMode == "skip-verify" {
74+
tlsCfg := tls.ClientConfig{
75+
CAPath: getter.String("ca_cert_path"),
76+
CertPath: getter.String("client_cert_path"),
77+
KeyPath: getter.String("client_key_path"),
78+
ServerName: getter.String("server_cert_name"),
79+
}
80+
81+
rawTLSCfg, err := tlsCfg.GetTLSConfig()
82+
if err != nil {
83+
return fmt.Errorf("failed to get TLS config for mysql: %w", err)
84+
}
85+
86+
if sslMode == "skip-verify" {
87+
rawTLSCfg.InsecureSkipVerify = true
88+
}
89+
90+
if err := mysql.RegisterTLSConfig(tlsConfigName, rawTLSCfg); err != nil {
91+
return fmt.Errorf("failed to register TLS config for mysql: %w", err)
92+
}
93+
94+
config.TLSConfig = tlsConfigName
95+
}
96+
97+
// If the TLS mode is set in the database config, we need to set it here.
98+
if tls := getter.String("tls"); tls != "" {
99+
// If the user has provided TLS certs, we don't want to use the tls=<value>, as
100+
// they would override the TLS config that we set above. They both use the same
101+
// parameter, so we need to check for that.
102+
if sslMode == "true" {
103+
return fmt.Errorf("cannot provide tls certs and tls=<value> at the same time")
104+
}
105+
config.Params["tls"] = tls
106+
}
107+
108+
return nil
109+
}
110+
72111
func getEnginePostgres(getter confGetter) (*xorm.Engine, error) {
73112
dsnKV := map[string]string{
74113
"user": getter.String("user"),

0 commit comments

Comments
 (0)