Elisp: Comment exclure des informations sensibles d'un fichier init? (c'est-à-dire les informations de connexion)

11

Je veux définir une fonction de connexion dans mon script init, mais je ne veux pas coder en dur mes informations de connexion. Je pense qu'une bonne solution de contournement consiste à lire mon script init dans mes informations d'identification de connexion à partir d'un fichier local et à enregistrer ces valeurs en tant que variables. De cette façon, je peux exclure le fichier de mon index git, ce qui sécurise mes informations de connexion.

Existe-t-il des suggestions sur cette approche ou des moyens de définir un argument sur une valeur définie dans un fichier?

Par exemple, je voudrais utiliser ce qui suit dans mon init.el:

;; Set up our login variables here:
(setq file-location "~/.emacs.d/.login")
(setq erc-username "default-name")
(setq erc-password "default-password")
(setq erc-url "default-url")
(setq erc-port "default-port")
(defun read-lines (filePath)
  "Return a list of lines of a file at filePath."
  (with-temp-buffer
    (insert-file-contents filePath)
    (split-string (buffer-string) "\n" t)))
(if (file-exists-p file-location)
    (progn (setq login-credentials (read-lines file-location))
           (setq erc-username (nth 0 login-credentials))
           (setq erc-password (nth 1 login-credentials))
           (setq erc-url (nth 2 login-credentials))
           (setq erc-port (nth 3 login-credentials)))
    (message "No ERC login credentials provided. Please add login credentials as '<username>\n<password>\n<url>\n<port>' in ~/.emacs.d/.login to activate ERC mode."))

;; These message the values from my file correctly.
;; Everything up to this point works as expected
(message erc-username) 
(message erc-password)
(message erc-url)
(message erc-port)

;; Use our login variables here 
;; This doesn't work because the 'quote' function prevents evaluation of my variables, and a 'backquote' did not resolve it either
(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(markdown-command "/usr/bin/pandoc")
 '(tls-program (quote ("openssl s_client -connect %h:%p -no_ssl2 -ign_eof -CAfile ~/.ssl/spi_ca.pem -cert ~/.ssl/znc.pem")))
 '(znc-servers (quote ((,erc-url ,erc-port t ((irc\.freenode\.net ,erc-username ,erc-password)))))))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )

Notez que mon exemple utilise le znc.elmodule ici . Je modifie le code généré automatiquement à partir des configurations Emacs dans M-x customize-group RET znc RETet M-x customize-variable RET tls-program RET.

Mon problème avec le code ci-dessus est que les variables ne se chargent pas dans ma custom-set-variablesfonction ci-dessus. Le chargement des valeurs appropriées à partir d'un fichier semble fonctionner correctement, mais je n'arrive pas à les utiliser comme argument. Je crois que cela est lié à la quotefonction, ce qui empêche l'évaluation de son contenu. J'ai tenté une 'backquote' ( ,) pour forcer l'évaluation, mais cela ne fonctionne pas non plus. Toute suggestion pour corriger ce bogue ou proposer une autre approche serait très utile.

modulitos
la source

Réponses:

11

Emacs est livré avec auth-source.el. Je n'essaierais pas d'en rouler ma propre version.

auth-sourcefacilite la lecture ~/.authinfo.gpg. De bons programmes soutiendront déjà authinfo. Une recherche rapide suggère que l'ERC peut utiliserauthinfo .

Pour votre sort hors des étagères programmes de Melpa vous pouvez facilement utiliser authinfo pour récupérer votre mot de passe ~/.authinfo.gpgcomme celui - ci

(with-eval-after-load 'random-mode
  (require 'auth-source)
  (let ((auth (nth 0 (auth-source-search :host "secrets.com"
                                         :requires '(user secret)))))
    (setq random-psk (funcall (plist-get auth :secret))
          random-user (plist-get auth :user))))

~/.authinfo.gpgcontient la ligne suivante:

## Used by random-mode.el
machine secrets.com login rasmus password my-secret-password

Bien sûr, le sentiment de sécurité est un mensonge. Votre mot de passe est désormais stocké en clair dans une variable:

random-psk => "my-secret-password"

Mais au moins, ce n'est pas dans quelque git-repo ou dropbox quelque part!

Si vous avez un trousseau de clés, vous pourrez peut-être en obtenir les informations d'identification à l'aide de l'API Secret Service (voir (info "(auth) Secret Service API")).

rasmus
la source
6

custom-set-variablesest bizarre - je ne suis pas sûr à 100% qu'il puisse gérer des cas comme celui-ci. Vous pouvez essayer (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), mais cela me semble être un sale hack-around.

Il suffit de mettre les informations supplémentaires dans un fichier avec l' gpgextension, de l'enregistrer, de donner un mot de passe, puis de charger le fichier. Vous devrez saisir le mot de passe du fichier lors de son chargement.

Par exemple, créez un fichier sensitive.el.gpgavec le contenu:

(message "Hello, there!")

Enregistrez le fichier, appuyez sur (ou sur l'onglet pour) [OK]et donnez votre mot de passe. Ne vous inquiétez pas - il vous demandera une confirmation avant de l'enregistrer. Ensuite, dans votre fichier init, donnez

(load "sensitive.el.gpg")

Cela chargera le fichier au démarrage, vous obligeant à entrer votre mot de passe afin qu'Emacs puisse décrypter le fichier.

Si vous ne voulez pas entrer votre mot de passe au démarrage, je donnerais à la fonction un nom à exécuter manuellement:

(defun my:keys () (interactive) (load "sensitive.el.gpg"))
Sean Allred
la source