Elisp: Jak wykluczyć poufne informacje z pliku init? (tj. dane logowania)

11

Chcę zdefiniować funkcję logowania w skrypcie init, ale nie chcę zakodować na stałe moich danych logowania. Myślę, że dobrym obejściem jest odczytanie skryptu inicjującego w poświadczeniach logowania z pliku lokalnego i zapisanie tych wartości jako zmiennych. W ten sposób mogę wykluczyć plik z mojego indeksu git, który zabezpiecza moje dane logowania.

Czy są jakieś sugestie dotyczące tego podejścia lub sposobów ustawienia argumentu na wartość zdefiniowaną w pliku?

Na przykład chciałbym użyć następujących w moim 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.
 )

Zauważ, że mój przykład używa tutajznc.el modułu . Modyfikuję automatycznie generowany kod wynikający z konfiguracji Emacsa w i .M-x customize-group RET znc RETM-x customize-variable RET tls-program RET

Mój problem z powyższym kodem polega na tym, że zmienne nie ładują się wewnątrz mojej custom-set-variablesfunkcji powyżej. Załadowanie poprawnych wartości z pliku wydaje się działać dobrze, ale nie mogę ich użyć jako argumentu. Uważam, że jest to związane z quotefunkcją, która uniemożliwia ocenę jej zawartości. Podjąłem próbę „backquote” ( ,), aby wymusić ocenę, ale ona również nie działa. Wszelkie sugestie dotyczące rozwiązania tego błędu lub oferowania innego podejścia byłyby bardzo pomocne.

modulitos
źródło

Odpowiedzi:

11

Emacs pochodzi z auth-source.el. Nie próbowałbym stworzyć własnej wersji.

auth-sourceułatwia czytanie z ~/.authinfo.gpg. Dobre programy będą już wspierać authinfo. Szybkie wyszukiwanie sugeruje, że ERC może użyćauthinfo .

Na Twój losowo off z półki programów MELPA można łatwo korzystać AuthInfo odzyskać hasła z ~/.authinfo.gpgtak

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

gdzie ~/.authinfo.gpgzawiera następujący wiersz:

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

Oczywiście poczucie bezpieczeństwa jest kłamstwem. Twoje hasło jest teraz przechowywane w postaci zwykłego tekstu w zmiennej:

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

Ale przynajmniej nie ma go gdzieś w git-repo lub dropbox!

Jeśli masz jakiś klucz, być może będziesz w stanie uzyskać poświadczenia stamtąd za pomocą interfejsu API Secret Service API (patrz (info "(auth) Secret Service API")).

rasmus
źródło
6

custom-set-variablesjest dziwne - nie jestem w 100% pewien, że poradzi sobie z takimi przypadkami. Możesz spróbować (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), ale uderza mnie to jako brudny hack.

Po prostu umieść dodatkowe informacje w pliku z gpgrozszerzeniem, zapisz go, podaj hasło, a następnie załaduj plik. Podczas ładowania musisz podać hasło do pliku.

Na przykład utwórz plik sensitive.el.gpgz zawartością:

(message "Hello, there!")

Zapisz plik, naciśnij (lub przejdź do) [OK]i podaj hasło. Nie martw się - poprosi o potwierdzenie przed zapisaniem. Następnie w pliku init podaj

(load "sensitive.el.gpg")

Spowoduje to załadowanie pliku podczas uruchamiania, wymagając podania hasła, aby Emacs mógł odszyfrować plik.

Jeśli nie chcesz wpisywać hasła przy uruchamianiu, nadałbym tej funkcji nazwę do uruchomienia ręcznego:

(defun my:keys () (interactive) (load "sensitive.el.gpg"))
Sean Allred
źródło