Elisp : init 파일에서 민감한 정보를 제외하는 방법? (즉, 로그인 자격 증명)


11

init 스크립트에서 로그인 기능을 정의하고 싶지만 로그인 자격 증명을 하드 코딩하고 싶지 않습니다. 좋은 해결 방법은 init 스크립트가 로컬 파일에서 로그인 자격 증명을 읽고이 값을 변수로 저장하는 것입니다. 이렇게하면 로그인 자격 증명을 안전하게 유지하는 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.
 )

내 예제는 hereznc.el 모듈을 사용합니다 . 및 에서 Emacs 구성으로 인한 자동 생성 코드를 수정 하고 있습니다.M-x customize-group RET znc RETM-x customize-variable RET tls-program RET

위의 코드에서 내 문제는 변수가 custom-set-variables위의 함수 내에서로드되지 않는다는 것 입니다. 파일에서 적절한 값을로드하면 잘 작동하는 것처럼 보이지만 인수로 사용할 수는 없습니다. 나는 이것이 quote내용에 대한 평가를 방해 하는 기능 과 관련이 있다고 생각합니다 . ,평가를 강제하기 위해 'backquote'( )를 시도했지만 작동하지 않습니다. 이 버그를 수정하거나 다른 접근 방식을 제공하기위한 제안은 매우 유용합니다.

답변:


11

이맥스와 함께 제공됩니다 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에 없습니다!

어떤 종류의 열쇠 고리가 있다면 Secret Service 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]다음 비밀번호를 입력하십시오. 걱정하지 마십시오. 저장하기 전에 확인을 요청합니다. 그런 다음 init 파일에서

(load "sensitive.el.gpg")

시작시 파일을로드하므로 암호를 입력해야 Emacs가 파일을 해독 할 수 있습니다.

시작할 때 암호를 입력하지 않으려면 수동으로 실행할 이름을 지정하십시오.

(defun my:keys () (interactive) (load "sensitive.el.gpg"))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.