Utiliser l'audit de base de données MySQL

Cet article explique comment activer et utiliser le plug-in d'audit Cloud SQL pour MySQL. Pour une présentation générale, consultez la page Audit de la base de données MySQL. Pour en savoir plus sur les plug-ins MySQL, consultez la page Chargement des plug-ins MySQL.

Avant de commencer

Journaux d'audit pour l'accès aux données

Activez et configurez les journaux d'audit pour l'accès aux données. Consultez la section Configurer les journaux d'audit pour l'accès aux données.

Droits requis pour les utilisateurs chargés de l'audit

Vous devez disposer des droits EXECUTE sur les procédures d'audit stockées pour les exécuter. Si un administrateur doit modifier les droits d'un auditeur pour l'accès aux procédures d'audit stockées, il doit utiliser les commandes GRANT ou REVOKE dans le client mysql. Pour en savoir plus sur les droits des utilisateurs, consultez la page Droits d'utilisateur de MySQL. Par exemple, si un administrateur souhaite accorder à un auditeur nommé user l'accès permettant de gérer les règles d'audit, il peut accorder les droits à l'aide de l'instruction suivante :

CREATE USER 'user'@'%' IDENTIFIED BY 'password';
GRANT EXECUTE ON PROCEDURE mysql.cloudsql_list_audit_rule TO 'user'@'%';

Si, par la suite, cet administrateur souhaite révoquer l'accès de l'auditeur, il peut révoquer les droits à l'aide de l'instruction suivante :

REVOKE ALL ON PROCEDURE mysql.cloudql_list_audit_rule FROM 'user'@'%';

Par défaut, les utilisateurs créés avec Cloud SQL (à l'exception des utilisateurs IAM) sont des administrateurs disposant de tous les droits, à l'exception de FILE et de SUPER, mais incluant tous les droits sur les procédures d'audit stockées. Par défaut, les utilisateurs de base de données IAM ne disposent d'aucun droit.

Activer le plug-in d'audit Cloud SQL pour MySQL

Le plug-in d'audit Cloud SQL pour MySQL (cloudsql_mysql_audit) contrôle le comportement d'audit pour une instance de base de données spécifique. Pour utiliser le plug-in, vous devez d'abord l'activer sur l'instance Cloud SQL.

Pour activer le plug-in cloudsql_mysql_audit, utilisez l'une des options suivantes :

  • --cloudsql_mysql_audit=ON

    Indique au serveur d'activer le plug-in. Si l'initialisation du plug-in échoue, le serveur s'exécute avec le plug-in désactivé.

  • --cloudsql_mysql_audit=FORCE

    Indique au serveur d'activer le plug-in, mais si l'initialisation du plug-in échoue, le serveur ne démarre pas. En d'autres termes, cette option impose au serveur de s'exécuter avec le plug-in activé ou pas du tout.

  • --cloudsql_mysql_audit=FORCE_PLUS_PERMANENT

    Semblable à FORCE, mais empêche également le déchargement du plug-in lors de l'exécution. Si un utilisateur tente de décharger le plug-in avec UNINSTALL PLUGIN, une erreur se produit.

Les états d'activation du plug-in sont visibles dans la colonne PLUGIN_STATUS de la table INFORMATION_SCHEMA.PLUGINS.

Console

  1. Dans Google Cloud Console, accédez à la page Instances Cloud SQL.

    Accéder à la page Instances Cloud SQL

  2. Ouvrez l'instance et cliquez sur Modifier.
  3. Faites défiler jusqu'à la section Options.
  4. Pour définir une nouvelle option sur l'instance, cliquez surAjouter une option, sélectionnezcloudsql_mysql_audit dans le menu déroulant, puis définissez sa valeur sur ON.
  5. Cliquez sur Enregistrer pour enregistrer les modifications.
  6. Confirmez les modifications effectuées dans la section Options à partir de la page de présentation.

gcloud

Remplacez les éléments suivants :

  • INSTANCE_NAME : nom de l'instance sur laquelle vous définissez l'option.
gcloud sql instances patch INSTANCE_NAME \
           --database-flags cloudsql_mysql_audit=ON

Cette commande écrase toutes les options de base de données précédemment définies. Pour les conserver et en ajouter d'autres, vous devez inclure les valeurs de toutes les options que vous souhaitez définir sur l'instance. Toute option non spécifiquement incluse est définie sur sa valeur par défaut. Pour les options sans valeur, spécifiez le nom de l'option suivi d'un signe égal (=).

REST v1beta4

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID du projet
  • instance-id : ID de l'instance.

Méthode HTTP et URL :

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

Corps JSON de la requête :

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "ON"
      }
    ]
  }
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

REST v1

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID du projet
  • instance-id : ID de l'instance.

Méthode HTTP et URL :

PATCH https://sqladmin.googleapis.com/sql/v1/projects/project-id/instances/instance-id

Corps JSON de la requête :

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "ON"
      }
    ]
  }
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

Paramètres du plug-in d'audit Cloud SQL pour MySQL

Vous pouvez affiner le comportement du plug-in d'audit Cloud SQL pour MySQL à l'aide des options ci-dessous. Toutes les options peuvent être modifiées sans redémarrer la base de données. Pour comprendre comment gérer les options, consultez la page Configurer des options de base de données.

  • cloudsql_mysql_audit_data_masking_regex

    Une expression régulière utilisée pour le masquage de données et conforme aux expressions régulières compatibles avec celles du langage Perl.

    Par défaut, dans le journal d'audit de sortie, les mots de passe utilisateur (<psw>) sont remplacés par un masque de mot de passe "***".

    L'expression régulière n'est appliquée qu'aux instructions dont le type de commande est spécifié à l'aide de cloudsql_mysql_audit_data_masking_cmds. Lorsque vous utilisez gcloud, vous devez utiliser un fichier d'options pour définir des valeurs comportant des caractères spéciaux complexes.

    Valeurs par défaut de cette option :

    
    identified(?:/\*.*?\*/|\s)*?by(?:/\*.*?\*/|\s)*?(?:password)?(?:/\*.*?\*/|
    \s)*?['|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?\((?:/\*.*?\*/|
    \s)*?['|"](?<psw>.*?)(?<!\\)['|"](?:/\*.*?\*/|\s)*?\)|password(?:/\*.*?\*/|
    \s)*?(?:for(?:/\*.*?\*/|\s)*?\S+?)?(?:/\*.*?\*/|\s)*?=(?:/\*.*?\*/|\s)*?[
    '|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)
    (?<!\\)['|"]
    
    

    Consultez les exemples suivants.

    • Sans expression régulière cloudsql_mysql_audit_data_masking_regex, une entrée de journal d'audit décrivant une commande de création d'utilisateur s'affiche comme suit :

      {..."cmd":"create_user","query":"create user user1@'localhost' identified
      by 'pw'"}
    • Avec la valeur par défaut cloudsql_mysql_audit_data_masking_regex, la même entrée de journal d'audit apparaît comme :

      {..."cmd":"create_user","query":"create user user1@'localhost' identified by
      '***'"}
    • Si vous définissez cloudsql_mysql_audit_data_masking_regex sur (?<psw>.*), Cloud SQL peut filtrer l'ensemble du contenu de la requête.

      {..."cmd":"create_user","query":"***"}
  • cloudsql_mysql_audit_data_masking_cmds

    Liste des commandes séparées par des virgules auxquelles l'expression régulière de masquage de données (cloudsql_mysql_audit_data_masking_regex) est appliquée. Définissez une chaîne vide ("") pour arrêter le filtrage. Lorsque vous utilisez gcloud, vous devez utiliser un fichier d'options pour définir une liste d'éléments séparés par des virgules. La valeur par défaut inclut les commandes MySQL avec la clause de mot de passe suivante :

    create_user,alter_user,grant,update
  • cloudsql_mysql_audit_max_query_length

    Contrôle la longueur maximale des requêtes à enregistrer dans le journal d'audit. Si vous n'avez pas besoin de voir les détails de la requête, vous pouvez utiliser 0, ce qui signifie que la requête n'est pas enregistrée dans le journal d'audit. Cela permet de réduire l'espace de stockage utilisé par le journal et de réduire les coûts. -1 signifie qu'il n'y a aucune limitation. La valeur par défaut est -1.

  • cloudsql_mysql_audit_log_write_period

    Période d'écriture du journal : le thread d'écriture écrit le contenu du tampon sur le disque une fois que le nombre de millisecondes défini pour cette option est atteint ou lorsque le tampon est plein. Si vous définissez cette option sur 0, le thread utilisateur est contraint d'attendre une notification du thread d'écriture indiquant que l'écriture est terminée. La valeur par défaut est 500 (millisecondes).

Console

  1. Dans Google Cloud Console, accédez à la page Instances Cloud SQL.

    Accéder à la page Instances Cloud SQL

  2. Ouvrez l'instance et cliquez sur Modifier.
  3. Faites défiler jusqu'à la section Options.
  4. Pour définir une nouvelle option sur l'instance, cliquez sur Ajouter une option. Ensuite, choisissez une des options de base de données de la liste ci-dessus dans le menu déroulant et définissez ses paramètres.
  5. Cliquez sur Enregistrer pour enregistrer les modifications.
  6. Confirmez les modifications effectuées dans la section Options à partir de la page de présentation.

gcloud

Remplacez les éléments suivants :

  • INSTANCE_NAME : nom de l'instance sur laquelle vous définissez l'option.
  • FLAG_NAME : nom de l'option de configuration.
  • FLAG_VALUE : valeur à utiliser pour l'option.

        gcloud sql instances patch INSTANCE_NAME /
                   --database-flags FLAG_NAME=FLAG_VALUE
    

REST v1beta4

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID du projet
  • instance-id : ID de l'instance.

Méthode HTTP et URL :

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

Corps JSON de la requête :

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "flag_name",
        "value": "flag_value"
      }
    ]
  }
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

REST v1

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID du projet
  • instance-id : ID de l'instance.

Méthode HTTP et URL :

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

Corps JSON de la requête :

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "flag_name",
        "value": "flag_value"
      }
    ]
  }
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

Configurer l'audit de base de données

Gérer les règles d'audit

Cloud SQL utilise un ensemble de procédures stockées pour gérer les règles d'audit du plug-in d'audit Cloud SQL pour MySQL. Quatre procédures stockées vous permettent de créer, répertorier, mettre à jour et supprimer des règles d'audit.

Chaque procédure stockée renvoie deux variables : @outval et @outmsg. Ces variables indiquent respectivement le code d'état et le message d'erreur de la procédure stockée. Vous pouvez utiliser un astérisque (*) comme caractère générique pour rechercher des noms d'utilisateur, d'hôte, de base de données et de table. Utilisez l'astérisque comme suffixe, préfixe ou les deux. En outre, vous pouvez utiliser le caractère générique % uniquement pour les hôtes. Vous pouvez utiliser l'accent grave (`) pour indiquer qu'une chaîne doit être utilisée de manière littérale. Par exemple, `ta*ble` doit correspondre littéralement.

Pour que les modifications prennent effet, vous devez soit exécuter les procédures stockées avec le paramètre d'entrée reload_mode=1, soit appeler mysql.cloudsql_reload_audit_rule(1).

Créer des règles d'audit

Vous pouvez utiliser mysql.cloudsql_create_audit_rule pour créer une règle d'audit.

Pour créer la règle d'audit et la charger en un seul appel, utilisez l'instruction suivante :

CALL mysql.cloudsql_create_audit_rule('user@host','db','obj','ops','op_result',1, @outval,@outmsg);
SELECT @outval, @outmsg;

Pour créer la règle et la charger dans des appels distincts, utilisez l'instruction suivante :

CALL mysql.cloudsql_create_audit_rule('user@host','db','obj','ops','op_result',0, @outval,@outmsg);
SELECT @outval, @outmsg;
CALL mysql.cloudsql_reload_audit_rule(1);

La commande précédente vous permet de créer plusieurs règles, puis de charger simultanément toutes les modifications.

Les tableaux suivants présentent les paramètres d'entrée et de sortie de la commande précédente.

Paramètres d'entrée
Nom Type Description Exemple
user@host ou user@ip chaîne Liste des utilisateurs de base de données à auditer, séparés par des virgules. Utilisez le format user@host ou user@ip.

user1@localhost,
user1@*,
user1@%,
user@ip
db chaîne Liste des bases de données à auditer, séparées par des virgules. db1,db2,db3*
obj chaîne Liste des objets de base de données à auditer, séparés par des virgules. table1,table2,table3*
ops chaîne Liste des actions de base de données à auditer, séparées par des virgules. select,delete,insert
op_result chaîne Auditer les opérations ayant réussi (S), ayant échoué (U), ou les deux (B). S,U ou B
reload_mode Entier 0 pour ne pas recharger la règle et 1 pour la recharger. 0 ou 1
Paramètres de sortie
Nom Type Description Exemple
@outval int Code d'état de la procédure stockée. 0 pour une réussite et 1 pour un échec.
@outmsg chaîne Message d'erreur de la procédure stockée.

Les règles d'audit présentent les limites suivantes :

Limites
Longueur de user, db, obj et ops. La taille maximale est de 2 048 caractères.
Nombre de combinaisons de user, db, obj et ops. Le nombre maximum est de 1 000 combinaisons. Par exemple, une règle d'audit s'appliquant à user1,user2, db1, db2, table1,table2 et select,delete génère 2 x 2 x 2 x 2 = 16 combinaisons.

Répertorier les règles d'audit

Les auditeurs peuvent utiliser mysql.cloudsql_list_audit_rule pour répertorier les règles d'audit existantes.

Pour répertorier les règles d'audit 1 et 2, utilisez les commandes suivantes :

CALL mysql.cloudsql_list_audit_rule('1,2',@outval,@outmsg);
SELECT @outval, @outmsg;

Pour répertorier toutes les règles d'audit, procédez comme suit :

CALL mysql.cloudsql_list_audit_rule('*',@outval,@outmsg);
SELECT @outval, @outmsg;

Les tableaux suivants présentent les paramètres d'entrée et de sortie de la commande précédente.

Paramètres d'entrée
Nom Type Description Exemple
rule_id chaîne Liste des ID de règle à supprimer, séparés par des virgules. 1,2,3
Paramètres de sortie
Nom Type Description Exemple
@outval int Code d'état de la procédure stockée. 0 pour une réussite et 1 pour un échec.
@outmsg chaîne Message d'erreur de la procédure stockée.

Mettre à jour les règles d'audit

Vous pouvez utiliser mysql.cloudsql_update_audit_rule pour mettre à jour une règle d'audit existante.

Pour mettre à jour la règle d'audit et la recharger en un seul appel, utilisez l'instruction suivante :

CALL mysql.cloudsql_update_audit_rule(1,'user@host','db','obj','ops','op_result',1,@outval,@outmsg);
SELECT @outval, @outmsg;

Vous pouvez mettre à jour plusieurs règles d'audit au cours d'une session avant de les recharger. Vous pouvez utiliser la procédure stockée suivante pour mettre à jour des règles au cours d'une étape, puis les recharger lors d'une étape ultérieure.

CALL mysql.cloudsql_update_audit_rule(1,'user@host','db','obj','ops','op_result',0,@outval,@outmsg);
SELECT @outval, @outmsg;
CALL mysql.cloudsql_reload_audit_rule(1);

Les tableaux suivants présentent les paramètres d'entrée et de sortie de la commande précédente.

Paramètres d'entrée
Nom Type Description Exemple
rule_id int ID de la règle à mettre à jour. 5
user@host chaîne Liste des utilisateurs de base de données à auditer, séparés par des virgules. Utilisez le format user@host.

user1@localhost,user1@*
user1@%
db chaîne Liste des bases de données à auditer, séparées par des virgules. db1,db2,db3*
obj chaîne Liste des objets de base de données à auditer, séparés par des virgules. table1,table2,table3*
ops chaîne Liste des actions de base de données à auditer, séparées par des virgules. SELECT,DELETE,INSERT
op_result chaîne Auditer les opérations ayant réussi (S), ayant échoué (U), ou les deux (B). S,U ou B
reload_mode Entier 0 pour ne pas recharger la règle et 1 pour la recharger. 0 ou 1
Paramètres de sortie
Nom Type Description Exemple
@outval int Code d'état de la procédure stockée. 0 pour une réussite et 1 pour un échec.
@outmsg chaîne Message d'erreur de la procédure stockée.

Les règles d'audit présentent les limites suivantes :

Limites
Longueur de user, db, obj et ops. La taille maximale est de 2 048 caractères.
Nombre de combinaisons de user, db, obj et ops. Le nombre maximum est de 1 000 combinaisons. Par exemple, une règle d'audit s'appliquant à user1,user2, db1, db2, table1,table2 et select,delete génère 2 x 2 x 2 x 2 = 16 combinaisons.

Supprimer des règles d'audit

Vous pouvez utiliser la commande mysql.cloudsql_delete_audit_rule pour supprimer une règle d'audit existante.

Pour supprimer la règle d'audit et la recharger en un seul appel, utilisez l'instruction suivante :

CALL mysql.cloudsql_delete_audit_rule('1,2',1,@outval,@outmsg);
SELECT @outval, @outmsg;

Pour supprimer la règle et la recharger charger dans des appels distincts, utilisez l'instruction suivante :

CALL mysql.cloudsql_delete_audit_rule('1,2',0,@outval,@outmsg);
SELECT @outval, @outmsg;
CALL cloudsql_reload_audit_rule(1);

La commande précédente vous permet de supprimer plusieurs règles, puis de recharger simultanément toutes les modifications.

Les tableaux suivants présentent les paramètres d'entrée et de sortie de la commande précédente.

Paramètres d'entrée
Nom Type Description Exemple
rule_id chaîne Liste des ID de règle à supprimer, séparés par des virgules. 1,2,3
reload_mode Entier 0 pour ne pas recharger la règle et 1 pour la recharger. 0 ou 1
Paramètres de sortie
Nom Type Description Exemple
@outval int Code d'état de la procédure stockée. 0 pour une réussite et 1 pour un échec.
@outmsg chaîne Message d'erreur de la procédure stockée.

Groupes d'opérations

Le plug-in d'audit Cloud SQL pour MySQL permet d'utiliser des groupes d'opérations dans les définitions de règles pour auditer des collections d'activités. Vous pouvez utiliser les groupes d'opérations suivants pour simplifier la création de règles d'audit.

Groupes d'opérations Opérations incluses
dql select
dml delete,delete_multi, insert, insert_select, load, replace, replace_select, truncate, update, update_multi,
ddl alter_db, alter_event, alter_function, alter_procedure, alter_table, alter_user, create_db, create_event, create_function, create_index, create_procedure, create_table, create_trigger, create_user, create_udf, create_view, drop_db, drop_event, drop_function, drop_index, drop_procedure, drop_table, drop_trigger, drop_user, drop_view, rename_table, rename_user
dcl grant, revoke, revoke_all
show show_binlog_events, show_create_func, show_create_proc, show_procedure_code, show_create_event, show_create_trigger, show_events, show_function_code, show_grants, show_relaylog_events, show_triggers,
call call_procedure

Afficher les journaux d'audit de base de données Cloud SQL

Afficher les enregistrements des journaux d'audit de base de données dans Cloud Logging

Pour afficher les journaux d'audit de base de données, commencez par vous assurer que vous avez activé les journaux d'audit pour l'accès aux données dans votre projet. Les journaux d'audit MySQL générés pour une instance donnée sont envoyés à Cloud Logging en tant que journaux d'audit pour l'accès aux données. Vous pouvez afficher les journaux d'audit générés pour la base de données MySQL via l'application Explorateur de journaux.

Dans l'explorateur de journaux, vous pouvez afficher les journaux d'audit MySQL à l'aide de la requête suivante. Elle affiche tous les journaux d'audit de base de données MySQL d'un projet Cloud SQL donné via l'interface de filtrage avancé.

Remplacez les éléments suivants :

  • PROJECT_NAME : nom du projet pour lequel vous souhaitez obtenir des journaux d'audit.
    resource.type="cloudsql_database"
    logName="projects/PROJECT_NAME/logs/cloudaudit.googleapis.com%2Fdata_access"
    protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry"

Vous pouvez également sélectionner le filtre de journal cloudaudit.googleapis.com/data_access.

Format des journaux d'audit

Un journal d'audit comporte les champs suivants.

Nom du champ Description
msgType Chaîne représentant le type de message du journal d'audit. La seule valeur possible pour msgType est activity.
status État de l'opération, success ou unsuccessful.
date Horodatage indiquant l'heure à laquelle l'événement d'audit a été généré.
threadId ID du thread MySQL.
queryId ID de la requête MySQL.
user Chaîne représentant le nom d'utilisateur envoyé par le client. Elle peut être différente de la valeur "privUser".
privUser Chaîne représentant le nom d'utilisateur sous lequel le serveur a authentifié le client. Il s'agit du nom d'utilisateur utilisé par le serveur pour la vérification des droits. Il peut différer de la valeur "user".
gcpIamAccount Chaîne représentant le compte de service ou compte IAM GCP.
ip Chaîne représentant l'adresse IP du client.
host Chaîne représentant le nom d'hôte du client.
errCode Code d'erreur MySQL en cas d'échec d'une opération. Consultez la documentation de référence de MySQL sur les messages d'erreur du serveur.
cmd Chaîne qui indique l'instruction SQL (type d'opération) à utiliser. Par exemple, INSERT, UPDATE ou DELETE.
objects Objets de l'audit. Normalement, il s'agit d'une table. Ce champ inclut les informations suivantes concernant l'objet :

db Chaîne représentant le nom de la base de données par défaut.
name Chaîne représentant le nom de l'objet. Normalement, il s'agit du nom de la table.
objType Chaîne représentant le type de l'objet. Normalement, il s'agit de TABLE.
query Une instruction SQL (exécutée directement).
chunkCount Nombre total de fragments si la taille de la requête de journal d'audit est supérieure au seuil cloudsql_mysql_audit_event_split_threshold (90 000).
chunkIndex Index du fragment. chunk_index commence à 1.
@type Le type est toujours type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry.

Voici un exemple d'entrée de journal d'audit.

{
"msgType":"activity",
"status":"unsuccessful",
"date":"2021-11-11T06:16:16.163603Z",
"threadId":"750",
"queryId":"26763",
"user":"root",
"priv_user":"root",
"ip":"",
"host":"localhost",
"errCode":"1146",
"cmd":"select",
"objects":[{"db":"test","name":"t4","obj_type":"TABLE"}],
"query":"select * from test.t4",
"chunkCount":2,
"chunkIndex":2,
"@type":"type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry"
}

Désactiver l'audit de base de données

Pour désactiver le plug-in d'audit Cloud SQL pour MySQL, définissez l'option de base de données cloudsql_mysql_audit sur OFF ou supprimez-la.

Console

  1. Dans Google Cloud Console, accédez à la page Instances Cloud SQL.

    Accéder à la page Instances Cloud SQL

  2. Ouvrez l'instance et cliquez sur Modifier.
  3. Faites défiler jusqu'à la section Options.
  4. Pour définir une nouvelle option sur l'instance, cliquez surAjouter une option, sélectionnezcloudsql_mysql_audit dans le menu déroulant, puis définissez sa valeur sur OFF.
  5. Cliquez sur Enregistrer pour enregistrer les modifications.
  6. Confirmez les modifications effectuées dans la section Options à partir de la page de présentation.

gcloud

Remplacez les éléments suivants :

  • INSTANCE_NAME : nom de l'instance sur laquelle vous définissez l'option.

    gcloud sql instances patch INSTANCE_NAME \
               --database-flags cloudsql_mysql_audit=OFF
    

REST v1beta4

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID du projet
  • instance-id : ID de l'instance.

Méthode HTTP et URL :

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

Corps JSON de la requête :

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "OFF"
      }
    ]
  }
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

REST v1

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID du projet
  • instance-id : ID de l'instance.

Méthode HTTP et URL :

PATCH https://sqladmin.googleapis.com/sql/v1/projects/project-id/instances/instance-id

Corps JSON de la requête :

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "OFF"
      }
    ]
  }
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

Exemples de règles d'audit

  1. Auditer toutes les activités pour tous les utilisateurs :

    CALL mysql.cloudsql_create_audit_rule('*','*','*','*','B',1,@outval,@outmsg);
  2. Auditer toutes les activités d'un seul utilisateur user1 :

    CALL mysql.cloudsql_create_audit_rule('user1@*','*','*','*','B',1,@outval,@outmsg);
  3. Auditer toutes les activités de tous les utilisateurs dont le nom commence par user :

    CALL mysql.cloudsql_create_audit_rule('user*@*','*','*','*','B',1, @outval,@outmsg);
  4. Auditer toutes les opérations LMD pour tous les utilisateurs :

    CALL mysql.cloudsql_create_audit_rule('*','*','*','dml','B',1,@outval,@outmsg);
  5. Auditer l'opération "select" pour une base de données particulière db1 :

    CALL mysql.cloudsql_create_audit_rule('*','db1','*','select','B',1,@outval,@outmsg);
  6. Auditer toutes les activités d'une base de données comportant le caractère spécial db~1 :

    CALL mysql.cloudsql_create_audit_rule('*','`db~1`','*','*','B',1,@outval,@outmsg);
  7. Auditer les opérations "select" et "delete" pour la table db1.table1 :

    CALL mysql.cloudsql_create_audit_rule('*','db1','table1','select,delete','B',1,@outval,@outmsg);
  8. Auditer toutes les opérations ayant réussi :

    CALL mysql.cloudsql_create_audit_rule('*','*','*','*','S',1,@outval,@outmsg);
  9. Ne pas auditer toutes les activités de tous les utilisateurs dont le nom commence par user :

    CALL mysql.cloudsql_create_audit_rule('user*@*','*','*','*','E',1, @outval,@outmsg);

Résoudre les problèmes

Problème Dépannage
Je ne vois pas cloudsql_mysql_audit lorsque j'appelle la commande :

SHOW (global) variables
cloudsql_mysql_audit est le nom du plug-in. Pour vérifier s'il est actif, utilisez la commande suivante :

SHOW PLUGINS

Vérifiez l'entrée status.
Pourquoi les journaux d'audit mysql ne s'affichent-ils pas après activation de cloudsql_mysql_audit ? Vous devez activer les journaux d'audit pour l'accès aux données, comme décrit dans la page Configurer les journaux d'audit pour l'accès aux données. En outre, des règles d'audit sont nécessaires pour que le plug-in d'audit Cloud SQL pour MySQL puisse auditer les journaux d'audit souhaités. Créez des règles d'audit à l'aide des procédures stockées avec "reload_mode=1", ou exécutez la commande suivante puis redémarrez la base de données pour que les règles d'audit nouvellement ajoutées prennent effet :

CALL mysql.cloudsql_reload_audit_rule(1)
L'erreur suivante s'affiche lors de la mise à jour de l'option de base de données :

Error 1193: Unknown system variable 'cloudsql_mysql_audit_xxx' (Erreur 1193 : variable système 'cloudsql_mysql_audit_xxx' inconnue)
Les options cloudsql_mysql_audit_xxx ne fonctionnent que lorsque le plug-in d'audit est actif. Supprimez toutes les options cloudsql_mysql_audit_xxx existantes de l'instance, puis activez le plug-in à l'aide de la commande suivante avant de mettre à jour les options cloudsql_mysql_audit_xxx :

cloudsql_mysql_audit=ON
Je peux voir des journaux d'audit générés même si je n'ai défini aucune règle d'audit. Les modifications apportées aux tables des règles d'audit (mysql.audit_log_rules et mysql.audit_log_rules_expanded) et aux procédures d'audit stockées (mysql.cloudsql_xxxx_audit_rule) sont consignées par défaut.
Après avoir modifié l'instance principale, je ne vois pas les journaux d'audit sur mes instances dupliquées. Les threads de réplication et les threads de récupération après un plantage ne sont pas consignés. Cloud SQL audite les activités sur l'instance principale, mais pas sur l'instance dupliquée.
J'ai tenté d'exécuter la commande suivante pour définir des valeurs dans une liste d'éléments séparés par des virgules, mais cela ne fonctionne pas.

gcloud instances patch --database-flags
Si vous spécifiez une liste de valeurs d'options séparées par des virgules à l'aide des commandes gcloud, utilisez l'argument --flags-file. Avant tout, vous devez créer un fichier contenant les informations suivantes :

--database-flags:
general_log: OFF
cloudsql_mysql_audit_max_query_length: '20'
cloudsql_mysql_audit_data_masking_cmds: select,update

Exécutez ensuite la commande suivante :

gcloud sql instances patch --flags-file=flagfile
La commande suivante renvoie une erreur :

CALL mysql.cloudsql_create_canonical_rules
Cela est intentionnel. mysql.cloudsql_create_canonical_rules ne doit être appelé qu'en interne par mysql.cloudsql_create_audit_rule et mysql.cloudsql_update_audit_rule.
Quelles opérations puis-je auditer ? Les opérations compatibles sont répertoriées dans la liste complète des opérations compatibles. Certaines opérations, comme celles répertoriées ci-dessous, ne sont pas auditées, car elles n'affectent pas la base de données :

USE db_name


ou

SHOW VARIABLES


Par ailleurs, dans certains cas, les fonctions ne peuvent pas être auditées en tant qu'objets (fonctionnalités non compatibles).
Je souhaite auditer toutes les opérations d'une table spécifique. J'ai donc créé la règle d'audit suivante :

mysql.cloudsql_create_audit_rule("user@*","db", "table","*","B",1,@1,@2);
Toutefois, je peux voir des journaux d'audit qui ne sont pas associés à cette table, tels que disconnect et connect.
Certaines opérations, telles que la déconnexion ou la connexion, sont considérées comme globales. Elles ignorent les champs d'entrée db et object.
Lorsque je crée, mets à jour ou supprime une règle d'audit à l'aide de procédures stockées, l'erreur suivante s'affiche.

Le serveur MySQL s'exécute avec l'option read-only et ne peut donc pas exécuter cette instruction.
Cloud SQL ne peut pas modifier les procédures stockées sur une instance en lecture seule. S'il s'agit de l'instance principale, supprimez les options read_only. S'il s'agit d'une instance dupliquée, effectuez les modifications sur l'instance principale associée. Une fois les modifications des règles répliquées sur l'instance dupliquée, exécutez la commande suivante sur l'instance dupliquée pour y actualiser les règles :
CALL mysql.cloudsql_reload_audit_rule(1)
Lorsque je crée, mets à jour ou supprime une règle d'audit, l'erreur suivante s'affiche, même si la modification a réussi.

0 rows affected
La réponse 0 rows affected concerne la dernière instruction exécutée dans la procédure stockée, et non les tables. Pour vérifier si la règle d'audit a bien été modifiée, utilisez la commande suivante :

mysql.cloudsql_list_audit_rule
Je ne peux pas définir cloudsql_mysql_audit_data_masking_cmds et cloudsql_mysql_audit_data_masking_regexp avec gcloud. gcloud nécessite d'utiliser l'argument --flags-file pour définir des valeurs d'options complexes (options qui incluent des caractères spéciaux).
J'ai créé une procédure stockée à l'aide de l'instruction CREATE USER, mais le mot de passe n'est pas masqué. Par défaut, le masquage ne fonctionne que pour les opérations cmds telles que :

CREATE_USER, ALTER_USER, GRANT, UPDATE.

Pour filtrer le mot de passe à la création de la procédure stockée, ajoutez create_procedure à cloudsql_mysql_audit_data_masking_cmds.
J'ai reçu une erreur de dépassement du délai d'attente de verrouillage lors de la création, mise à jour ou suppression de règles d'audit. Normalement, cette erreur est générée lorsque deux sessions ou plus tentent de modifier les règles d'audit en même temps. Si cela se produit fréquemment, augmentez la valeur de la variable innodb_lock_wait_timeout. Vous pouvez l'augmenter de manière globale (à l'aide de l'option de base de données) ou uniquement pour la session, par exemple à l'aide de la commande suivante :
SET innodb_lock_wait_timeout=120
.

Étapes suivantes