Elisp: Bagaimana cara mengecualikan informasi sensitif dari file init? (mis. kredensial masuk)

11

Saya ingin mendefinisikan fungsi masuk dalam skrip init saya, tetapi saya tidak ingin meng-hardcode kredensial login saya. Saya pikir solusi yang baik adalah membuat skrip init saya membaca kredensial login saya dari file lokal dan menyimpan nilai-nilai ini sebagai variabel. Dengan begitu, saya dapat mengecualikan file dari indeks git saya, yang menjaga kredensial login saya aman.

Apakah ada saran tentang pendekatan ini, atau cara untuk mengatur argumen ke nilai yang didefinisikan dalam file?

Misalnya, saya ingin menggunakan yang berikut ini di 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.
 )

Perhatikan bahwa contoh saya menggunakan znc.elmodul di sini . Saya memodifikasi kode yang dibuat secara otomatis yang dihasilkan dari konfigurasi Emacs di M-x customize-group RET znc RETdan M-x customize-variable RET tls-program RET.

Masalah saya dengan kode di atas adalah bahwa variabel tidak memuat di dalam custom-set-variablesfungsi saya di atas. Memuat nilai-nilai yang tepat dari suatu file tampaknya berfungsi dengan baik, tetapi sepertinya saya tidak dapat menggunakannya sebagai argumen. Saya percaya ini terkait dengan quotefungsi, yang mencegah evaluasi isinya. Saya mencoba 'backquote' ( ,) untuk memaksa evaluasi, tetapi tidak berhasil juga. Setiap saran untuk memperbaiki bug ini atau menawarkan pendekatan lain akan sangat membantu.

modulitos
sumber

Jawaban:

11

Emacs hadir auth-source.el. Saya tidak akan mencoba untuk memutar versi saya sendiri.

auth-sourcemembuatnya mudah dibaca ~/.authinfo.gpg. Program yang baik sudah akan mendukung authinfo. Pencarian cepat menunjukkan bahwa ERC dapat digunakanauthinfo .

Untuk acak Anda dari program rak MELPA Anda dapat dengan mudah menggunakan authinfo untuk mengambil kata sandi Anda dari ~/.authinfo.gpgseperti ini

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

di mana ~/.authinfo.gpgmemegang baris berikut:

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

Tentu saja rasa aman itu bohong. Kata sandi Anda sekarang disimpan dalam plaintext dalam sebuah variabel:

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

Tapi setidaknya tidak di git-repo atau dropbox di suatu tempat!

Jika Anda mendapatkan semacam keyring, Anda mungkin bisa mendapatkan kredensial dari sana menggunakan API Layanan Rahasia (lihat (info "(auth) Secret Service API")).

rasmus
sumber
6

custom-set-variablesaneh - saya tidak yakin 100% bisa menangani kasus seperti ini. Anda mungkin mencoba (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), tetapi menurut saya ini hack-around yang kotor.

Cukup masukkan informasi tambahan dalam file dengan gpgekstensi, simpan, berikan kata sandi, lalu muat file. Anda harus memasukkan kata sandi untuk file ketika Anda memuatnya.

Misalnya, buat file sensitive.el.gpgdengan konten:

(message "Hello, there!")

Simpan file, tekan (atau tab ke) [OK], dan berikan kata sandi Anda. Jangan khawatir - itu akan meminta konfirmasi sebelum menyimpannya. Kemudian, dalam file init Anda, berikan

(load "sensitive.el.gpg")

Ini akan memuat file pada saat startup, mengharuskan Anda memasukkan kata sandi Anda sehingga Emacs dapat mendekripsi file tersebut.

Jika Anda tidak ingin memasukkan kata sandi saat startup, saya akan memberikan fungsi nama untuk dijalankan secara manual:

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