Elisp: ¿Cómo excluir información confidencial de un archivo init? (es decir, credenciales de inicio de sesión)

11

Quiero definir una función de inicio de sesión en mi script de inicio, pero no quiero codificar mis credenciales de inicio de sesión. Creo que una buena solución es leer mi script de inicio en mis credenciales de inicio de sesión desde un archivo local y guardar estos valores como variables. De esa manera, puedo excluir el archivo de mi índice git, lo que mantiene seguras mis credenciales de inicio de sesión.

¿Hay alguna sugerencia sobre este enfoque o formas de establecer un argumento para un valor que se define en un archivo?

Por ejemplo, me gustaría usar lo siguiente en mi 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.
 )

Tenga en cuenta que mi ejemplo usa el znc.elmódulo aquí . Estoy modificando el código autogenerado resultante de las configuraciones de Emacs en M-x customize-group RET znc RETy M-x customize-variable RET tls-program RET.

Mi problema con el código anterior es que las variables no se cargan dentro de mi custom-set-variablesfunción anterior. Cargar los valores adecuados de un archivo parece funcionar bien, pero parece que no puedo usarlos como argumento. Creo que esto está relacionado con la quotefunción, que impide la evaluación de sus contenidos. Intenté un 'backquote' ( ,) para forzar la evaluación, pero tampoco funciona. Cualquier sugerencia para corregir este error u ofrecer otro enfoque sería muy útil.

modulitos
fuente

Respuestas:

11

Emacs viene con auth-source.el. No intentaría rodar mi propia versión.

auth-sourcehace que sea fácil de leer ~/.authinfo.gpg. Los buenos programas ya serán compatibles authinfo. Una búsqueda rápida sugiere que ERC puede usarauthinfo .

Para su aleatoria de las estanterías programas Melpa puede utilizar simplemente AUTHINFO para recuperar la contraseña de ~/.authinfo.gpgesta manera

(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))))

donde ~/.authinfo.gpgcontiene la siguiente línea:

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

Por supuesto, la sensación de seguridad es una mentira. Su contraseña ahora se almacena en texto sin formato en una variable:

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

¡Pero al menos no está en algún git-repo o dropbox en alguna parte!

Si tiene un llavero de algún tipo, puede obtener credenciales a partir de allí utilizando la API del Servicio Secreto (ver (info "(auth) Secret Service API")).

rasmus
fuente
6

custom-set-variableses extraño: no estoy 100% seguro de que pueda manejar casos como este. Puedes intentarlo (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), pero eso me parece un truco sucio.

Simplemente coloque la información adicional en un archivo con la gpgextensión, guárdela, proporcione una contraseña y luego cargue el archivo. Deberá ingresar la contraseña del archivo cuando lo cargue.

Por ejemplo, cree un archivo sensitive.el.gpgcon el contenido:

(message "Hello, there!")

Guarde el archivo, presione (o presione sobre) [OK]y proporcione su contraseña. No se preocupe: solicitará confirmación antes de guardarlo. Luego, en su archivo init, dé

(load "sensitive.el.gpg")

Esto cargará el archivo al inicio, requiriéndole que ingrese su contraseña para que Emacs pueda descifrar el archivo.

Si no desea ingresar su contraseña al inicio, le daría a la función un nombre para que se ejecute manualmente:

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