Elisp: Como excluir informações confidenciais de um arquivo init? (ou seja, credenciais de login)


11

Quero definir uma função de logon no meu script init, mas não quero codificar minhas credenciais de logon. Eu acho que uma boa solução é fazer com que meu script init leia minhas credenciais de logon de um arquivo local e salve esses valores como variáveis. Dessa forma, posso excluir o arquivo do meu índice git, o que mantém minhas credenciais de login seguras.

Existem sugestões sobre essa abordagem ou maneiras de definir um argumento para um valor definido em um arquivo?

Por exemplo, eu gostaria de usar o seguinte no meu 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.
 )

Observe que meu exemplo usa o znc.elmódulo aqui . Estou modificando o código gerado automaticamente, resultante das configurações do Emacs em M-x customize-group RET znc RETe M-x customize-variable RET tls-program RET.

Meu problema com o código acima é que as variáveis ​​não estão carregando dentro da minha custom-set-variablesfunção acima. Carregar os valores adequados de um arquivo parece funcionar bem, mas não consigo usá-los como argumento. Acredito que isso esteja relacionado à quotefunção, o que impede a avaliação de seu conteúdo. Tentei uma 'citação' ( ,) para forçar a avaliação, mas também não está funcionando. Qualquer sugestão para corrigir esse bug ou oferecer outra abordagem seria muito útil.

Respostas:


11

O Emacs vem com auth-source.el. Eu não tentaria lançar minha própria versão.

auth-sourcefacilita a leitura ~/.authinfo.gpg. Bons programas já serão compatíveis authinfo. Uma pesquisa rápida sugere que o ERC pode usarauthinfo .

Para sua aleatória as prateleiras programas Melpa você pode facilmente usar AUTHINFO para recuperar sua senha de ~/.authinfo.gpgcomo este

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

onde ~/.authinfo.gpgmantém a seguinte linha:

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

Claro que a sensação de segurança é uma mentira. Sua senha agora está armazenada em texto sem formatação em uma variável:

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

Mas pelo menos não está em algum git-repo ou dropbox em algum lugar!

Se você tiver algum tipo de chaveiro, poderá obter credenciais usando a API do Serviço Secreto (consulte (info "(auth) Secret Service API")).


6

custom-set-variablesé estranho - não tenho 100% de certeza de que ele possa lidar com casos como este. Você pode tentar (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), mas isso me parece um truque sujo.

Basta colocar as informações extras em um arquivo com a gpgextensão, salve-a, forneça uma senha e carregue o arquivo. Você precisará inserir a senha do arquivo ao carregá-lo.

Por exemplo, crie um arquivo sensitive.el.gpgcom o conteúdo:

(message "Hello, there!")

Salve o arquivo, pressione (ou tabule para) [OK]e forneça sua senha. Não se preocupe - ele solicitará confirmação antes de salvá-lo. Então, no seu arquivo init, dê

(load "sensitive.el.gpg")

Isso carregará o arquivo na inicialização, exigindo que você digite sua senha para que o Emacs possa descriptografar o arquivo.

Se você não quiser digitar sua senha na inicialização, eu daria à função um nome para executar manualmente:

(defun my:keys () (interactive) (load "sensitive.el.gpg"))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.