Elisp: Wie kann man vertrauliche Informationen aus einer Init-Datei ausschließen? (dh Anmeldeinformationen)

11

Ich möchte eine Anmeldefunktion in meinem Init-Skript definieren, aber meine Anmeldeinformationen nicht fest codieren. Ich denke, eine gute Problemumgehung besteht darin, mein Init-Skript meine Anmeldeinformationen aus einer lokalen Datei lesen zu lassen und diese Werte als Variablen zu speichern. Auf diese Weise kann ich die Datei von meinem Git-Index ausschließen, wodurch meine Anmeldeinformationen sicher bleiben.

Gibt es Vorschläge zu diesem Ansatz oder Möglichkeiten, ein Argument auf einen Wert zu setzen, der in einer Datei definiert ist?

Zum Beispiel möchte ich Folgendes in meinem verwenden 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.
 )

Beachten Sie, dass in meinem Beispiel das znc.elModul hier verwendet wird . Ich ändere den automatisch generierten Code, der sich aus den Emacs-Konfigurationen in M-x customize-group RET znc RETund ergibt M-x customize-variable RET tls-program RET.

Mein Problem mit dem obigen Code ist, dass die Variablen nicht in meine custom-set-variablesobige Funktion geladen werden. Das Laden der richtigen Werte aus einer Datei scheint gut zu funktionieren, aber ich kann sie anscheinend nicht als Argument verwenden. Ich glaube, dies hängt mit der quoteFunktion zusammen, die eine Bewertung ihres Inhalts verhindert. Ich habe versucht, mit 'backquote' ( ,) eine Auswertung zu erzwingen, aber es funktioniert auch nicht. Vorschläge zur Behebung dieses Fehlers oder zur Bereitstellung eines anderen Ansatzes wären sehr hilfreich.

Modulitos
quelle

Antworten:

11

Emacs kommt mit auth-source.el. Ich würde nicht versuchen, meine eigene Version davon zu rollen.

auth-sourcemacht es einfach zu lesen ~/.authinfo.gpg. Gute Programme werden bereits unterstützt authinfo. Eine schnelle Suche legt nahe, dass ERC verwenden kannauthinfo .

Für Ihre zufälligen Standard- MELPA-Programme können Sie einfach authinfo verwenden, um Ihr Passwort auf ~/.authinfo.gpgdiese Weise abzurufen

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

wo ~/.authinfo.gpghält die folgende Zeile:

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

Natürlich ist das Gefühl der Sicherheit eine Lüge. Ihr Passwort wird jetzt im Klartext in einer Variablen gespeichert:

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

Aber zumindest ist es nicht irgendwo in einem Git-Repo oder einer Dropbox!

Wenn Sie einen Schlüsselring haben, können Sie möglicherweise mithilfe der Secret Service-API Anmeldeinformationen von dort abrufen (siehe (info "(auth) Secret Service API")).

Rasmus
quelle
6

custom-set-variablesist komisch - ich bin nicht 100% sicher, dass es solche Fälle behandeln kann. Sie können es versuchen (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), aber das kommt mir wie ein schmutziger Hack-Around vor.

Fügen Sie einfach die zusätzlichen Informationen in eine Datei mit der gpgErweiterung ein, speichern Sie sie, geben Sie ein Kennwort ein und laden Sie die Datei. Sie müssen das Kennwort für die Datei eingeben, wenn Sie sie laden.

Erstellen Sie beispielsweise eine Datei sensitive.el.gpgmit dem Inhalt:

(message "Hello, there!")

Speichern Sie die Datei, drücken Sie (oder tippen Sie auf) [OK]und geben Sie Ihr Passwort ein. Keine Sorge - vor dem Speichern wird eine Bestätigung angefordert. Geben Sie dann in Ihrer Init-Datei an

(load "sensitive.el.gpg")

Dadurch wird die Datei beim Start geladen, und Sie müssen Ihr Kennwort eingeben, damit Emacs die Datei entschlüsseln kann.

Wenn Sie Ihr Passwort beim Start nicht eingeben möchten, würde ich der Funktion einen Namen geben, der manuell ausgeführt werden soll:

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