Elisp: Làm thế nào để loại trừ thông tin nhạy cảm khỏi tệp init? (tức là thông tin đăng nhập)


11

Tôi muốn xác định chức năng đăng nhập trong tập lệnh init của mình, nhưng tôi không muốn mã hóa thông tin đăng nhập của mình. Tôi nghĩ rằng một cách giải quyết tốt là để tập lệnh init của tôi được đọc trong thông tin đăng nhập của tôi từ một tệp cục bộ và lưu các giá trị này dưới dạng các biến. Bằng cách đó, tôi có thể loại trừ tệp khỏi chỉ mục git của mình, điều này giúp bảo mật thông tin đăng nhập của tôi.

Có bất kỳ đề xuất nào về cách tiếp cận này hoặc các cách để đặt một đối số thành một giá trị được xác định trong một tệp không?

Ví dụ: tôi muốn sử dụng như sau trong 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.
 )

Lưu ý rằng ví dụ của tôi sử dụng znc.elmô-đun ở đây . Tôi đang sửa đổi mã được tạo tự động do các cấu hình Emacs trong M-x customize-group RET znc RETM-x customize-variable RET tls-program RET.

Vấn đề của tôi với mã ở trên là các biến không được tải bên trong custom-set-variableshàm của tôi ở trên. Tải các giá trị phù hợp từ một tệp có vẻ hoạt động tốt, nhưng tôi dường như không thể sử dụng chúng làm đối số. Tôi tin rằng điều này có liên quan đến quotechức năng, ngăn chặn đánh giá nội dung của nó. Tôi đã thử một 'backquote' ( ,) để buộc đánh giá, nhưng nó cũng không hoạt động. Bất kỳ đề xuất để sửa lỗi này hoặc đưa ra một cách tiếp cận khác sẽ rất hữu ích.

Câu trả lời:


11

Emacs đi kèm auth-source.el. Tôi sẽ không thử cuộn phiên bản của riêng nó.

auth-sourcelàm cho nó dễ dàng để đọc từ ~/.authinfo.gpg. Các chương trình tốt sẽ hỗ trợ authinfo. Một tìm kiếm nhanh cho thấy ERC có thể sử dụngauthinfo .

Đối với ngẫu nhiên, các chương trình MELPA có sẵn, bạn có thể dễ dàng sử dụng authinfo để lấy lại mật khẩu của mình ~/.authinfo.gpgnhư thế này

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

nơi ~/.authinfo.gpggiữ dòng sau:

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

Tất nhiên cảm giác an toàn là một lời nói dối. Mật khẩu của bạn hiện được lưu trữ trong văn bản gốc trong một biến:

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

Nhưng ít nhất nó không có trong một số git-repo hoặc dropbox ở đâu đó!

Nếu bạn đã có một loại khóa nào đó, bạn có thể có được thông tin đăng nhập từ đó bằng API Dịch vụ bí mật (xem (info "(auth) Secret Service API")).


6

custom-set-variableslà lạ - tôi không chắc chắn 100% nó có thể xử lý các trường hợp như thế này. Bạn có thể thử (eval `(custom-set-variables … (erc-password … ,(special-value) …) …), nhưng điều đó gây ấn tượng với tôi như một vụ hack bẩn thỉu.

Chỉ cần đặt thông tin bổ sung vào một tệp có gpgphần mở rộng, lưu nó, cung cấp mật khẩu và sau đó tải tệp. Bạn sẽ phải đặt mật khẩu cho tệp khi bạn tải nó.

Ví dụ: tạo một tệp sensitive.el.gpgcó nội dung:

(message "Hello, there!")

Lưu tệp, nhấn (hoặc tab qua) [OK]và cung cấp mật khẩu của bạn. Đừng lo lắng - nó sẽ yêu cầu xác nhận trước khi lưu nó. Sau đó, trong tập tin init của bạn, đưa ra

(load "sensitive.el.gpg")

Thao tác này sẽ tải tệp khi khởi động, yêu cầu bạn nhập mật khẩu để Emacs có thể giải mã tệp.

Nếu bạn không muốn nhập mật khẩu khi khởi động, tôi sẽ đặt tên cho chức năng để chạy thủ công:

(defun my:keys () (interactive) (load "sensitive.el.gpg"))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.