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

私の例では、使用することに注意してくださいznc.elモジュールをここにM-x customize-group RET znc RETおよびのEmacs構成から生成された自動生成コードを変更していM-x customize-variable RET tls-program RETます。

上記のコードの私の問題は、変数がcustom-set-variables上記の関数内に読み込まれていないことです。ファイルから適切な値をロードすることは問題なく動作するようですが、それらを引数として使用することはできません。これはquoteその内容の評価を妨げる機能に関係していると思います。,評価を強制するために 'バッククォート'()を試みましたが、それも機能しません。このバグを修正するための提案や別のアプローチを提供することは非常に役立ちます。

回答:


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やドロップボックスのどこかにありません!

なんらかのキーリングがある場合は、シークレットサービス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.