Elisp: Как исключить конфиденциальную информацию из файла инициализации? (т.е. учетные данные для входа)


11

Я хочу определить функцию входа в мой скрипт инициализации, но я не хочу жестко задавать свои учетные данные для входа. Я думаю, что хороший обходной путь состоит в том, чтобы мой скрипт инициализации считывал мои учетные данные для входа из локального файла и сохранял эти значения как переменные. Таким образом, я могу исключить файл из моего индекса git, который сохраняет мои учетные данные в безопасности.

Есть ли какие-либо предложения относительно этого подхода или способов установить аргумент для значения, определенного в файле?

Например, я хотел бы использовать следующее в моем 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.
 )

Обратите внимание, что мой пример использует znc.elмодуль здесь . Я изменяю автоматически сгенерированный код, полученный из конфигов Emacs в M-x customize-group RET znc RETи M-x customize-variable RET tls-program RET.

Моя проблема с приведенным выше кодом заключается в том, что переменные не загружаются внутри моей custom-set-variablesфункции выше. Кажется, что загрузка правильных значений из файла работает нормально, но я не могу использовать их в качестве аргумента. Я считаю, что это связано с quoteфункцией, которая препятствует оценке ее содержимого. Я попытался использовать 'backquote' ( ,) для принудительной оценки, но он тоже не работает. Любые предложения по исправлению этой ошибки или предложению другого подхода были бы очень полезны.

Ответы:


11

Emacs поставляется с auth-source.el. Я бы не стал накатывать свою собственную версию.

auth-sourceоблегчает чтение из ~/.authinfo.gpg. Хорошие программы уже будут поддерживать authinfo. Быстрый поиск показывает, что ERC может использоватьauthinfo .

Для ваших случайных готовых программ MELPA вы можете легко использовать authinfo, чтобы восстановить свой пароль, ~/.authinfo.gpgкак это

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

где ~/.authinfo.gpgсодержит следующую строку:

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

Конечно, чувство безопасности это ложь. Ваш пароль теперь хранится в виде открытого текста в переменной:

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

Но, по крайней мере, его нет в каком-нибудь git-repo или dropbox!

Если у вас есть какой-то набор ключей, вы можете получить оттуда учетные данные с помощью API секретной службы (см. (info "(auth) Secret Service API")).


6

custom-set-variablesстранно - я не уверен на 100%, что он может справиться с такими случаями. Вы можете попробовать (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), но это кажется мне грязным взломом.

Просто поместите дополнительную информацию в файл с gpgрасширением, сохраните его, введите пароль и загрузите файл. Вам нужно будет ввести пароль для файла, когда вы загрузите его.

Например, создайте файл sensitive.el.gpgс содержимым:

(message "Hello, there!")

Сохраните файл, нажмите (или перейдите на) [OK]и введите свой пароль. Не волнуйтесь - он запросит подтверждение перед сохранением. Затем в вашем файле инициализации, дайте

(load "sensitive.el.gpg")

Это загрузит файл при запуске, и вам потребуется ввести пароль, чтобы Emacs мог расшифровать файл.

Если вы не хотите вводить пароль при запуске, я бы дал имя функции, которую нужно запустить вручную:

(defun my:keys () (interactive) (load "sensitive.el.gpg"))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.