0

Les dessous de la désactivation de ~/.mysql_history

twitterlinkedinmail

Comme le dit très bien la doc, il est possible et même souhaitable de protéger ou désactiver l’historique des commandes lancées par tous les comptes ayant accès au client mysql, dans la mesure où celui-ci peut contenir des informations sensibles comme des noms d’objets, des mots de passe, etc… Par défaut, les commandes seront loggées dans un fichier ~/.mysql_history.

Deux manières sont possibles pour désactiver complètement ce mécanisme:
– Soit utiliser la variable d’environnement MYSQL_HISTFILE et la faire pointer vers /dev/null
– Soit créer un lien soft entre ~/.mysql_history -> /dev/null

Mais ce qui est assez curieux, c’est que dans les 2 cas mysqld n’enverra rien du tout en sortie, pas même vers le device /dev/null. Extrait des sources ~/client/mysql.cc (Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved) :

 #ifdef HAVE_READLINE
    if (!quick)
    {
      initialize_readline((char*) my_progname);

      /* read-history from file, default ~/.mysql_history*/
      if (getenv("MYSQL_HISTFILE"))
        histfile=my_strdup(PSI_NOT_INSTRUMENTED,
                           getenv("MYSQL_HISTFILE"),MYF(MY_WME));
      else if (getenv("HOME"))
      {
        histfile=(char*) my_malloc(PSI_NOT_INSTRUMENTED,
                                   (uint) strlen(getenv("HOME"))
				   + (uint) strlen("/.mysql_history")+2,
				   MYF(MY_WME));
        if (histfile)
	  sprintf(histfile,"%s/.mysql_history",getenv("HOME"));
        char link_name[FN_REFLEN];
        if (my_readlink(link_name, histfile, 0) == 0 &&
            strncmp(link_name, "/dev/null", 10) == 0)
        {
          /* The .mysql_history file is a symlink to /dev/null, don't use it */
          my_free(histfile);
          histfile= 0;
        }
      }

      /* We used to suggest setting MYSQL_HISTFILE=/dev/null. */
      if (histfile && strncmp(histfile, "/dev/null", 10) == 0)
        histfile= NULL;

      if (histfile && histfile[0])
      {
        if (verbose)
	  tee_fprintf(stdout, "Reading history-file %s\n",histfile);
        read_history(histfile);
        if (!(histfile_tmp= (char*) my_malloc(PSI_NOT_INSTRUMENTED,
                                              (uint) strlen(histfile) + 5,
					      MYF(MY_WME))))
        {
	  fprintf(stderr, "Couldn't allocate memory for temp histfile!\n");
	  exit(1);
        }
        sprintf(histfile_tmp, "%s.TMP", histfile);
      }
    }
#endif

Donc effectivement l’effet désiré est atteint, mais pas de la manière qu’on aurait imaginé 🙂 La façon la plus optimisée de faire quelque chose, ça reste toujours de ne pas le faire si on n’en a pas besoin…

Bonnes vacances à celles et ceux qui sont partis, et bon courage à celles et ceux qui sont restés.

A+ ~David

Continuez votre lecture sur le blog :

twitterlinkedinmail

David Baffaleuf

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.