Elisp: come escludere le informazioni sensibili da un file init? (ad es. credenziali di accesso)


11

Voglio definire una funzione di accesso nel mio script init, ma non desidero codificare le mie credenziali di accesso. Penso che una buona soluzione sia quella di leggere il mio script init nelle credenziali di accesso da un file locale e salvare questi valori come variabili. In questo modo, posso escludere il file dal mio indice git, che protegge le mie credenziali di accesso.

Ci sono suggerimenti su questo approccio o modi per impostare un argomento su un valore definito in un file?

Ad esempio, vorrei utilizzare quanto segue nel mio 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.
 )

Nota che il mio esempio usa il znc.elmodulo qui . Sto modificando il codice generato automaticamente derivante dalle configurazioni di Emacs in M-x customize-group RET znc RETe M-x customize-variable RET tls-program RET.

Il mio problema con il codice sopra è che le variabili non si caricano all'interno della mia custom-set-variablesfunzione sopra. Il caricamento dei valori corretti da un file sembra funzionare correttamente, ma non riesco a usarli come argomento. Credo che ciò sia legato alla quotefunzione, che impedisce la valutazione del suo contenuto. Ho tentato un "backquote" ( ,) per forzare la valutazione, ma non funziona neanche. Qualsiasi suggerimento per correggere questo bug o offrire un altro approccio sarebbe molto utile.

Risposte:


11

Emacs arriva auth-source.el. Non proverei a pubblicare la mia versione di esso.

auth-sourcerende facile da leggere ~/.authinfo.gpg. Buoni programmi supporteranno già authinfo. Una rapida ricerca suggerisce che ERC può usareauthinfo .

Per il vostro caso fuori il ripiano programmi Melpa da poter usare facilmente authinfo per recuperare la password da ~/.authinfo.gpgcome questo

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

dove ~/.authinfo.gpgcontiene la seguente riga:

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

Naturalmente il senso di sicurezza è una bugia. La password è ora memorizzata in testo normale in una variabile:

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

Ma almeno non è in qualche git-repo o dropbox da qualche parte!

Se hai un portachiavi di qualche tipo potresti essere in grado di ottenere le credenziali da lì utilizzando l'API dei servizi segreti (vedi (info "(auth) Secret Service API")).


6

custom-set-variablesè strano - non sono sicuro al 100% che possa gestire casi come questo. Potresti provare (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), ma questo mi sembra un brutto scherzo.

Basta inserire le informazioni extra in un file con l' gpgestensione, salvarlo, fornire una password e quindi caricare il file. Dovrai inserire la password per il file quando lo carichi.

Ad esempio, creare un file sensitive.el.gpgcon il contenuto:

(message "Hello, there!")

Salvare il file, premere (o tab su per) [OK]e fornire la password. Non ti preoccupare, ti chiederà conferma prima di salvarlo. Quindi, nel tuo file init, dai

(load "sensitive.el.gpg")

Questo caricherà il file all'avvio, richiedendo di inserire la password in modo che Emacs possa decrittografare il file.

Se non si desidera inserire la password all'avvio, darei alla funzione un nome da eseguire manualmente:

(defun my:keys () (interactive) (load "sensitive.el.gpg"))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.