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

lundi, juillet 29, 2019
By David Baffaleuf in MySQL (dbaffaleuf@capdata-osmozium.com) [81 article(s)]

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 :




Cliquer pour partager cet article sur Viadeo
Cliquer sur "CAPTURER" pour sauvegarder cet article dans Evernote Clip to Evernote

Tags: , ,

Leave a Reply