スクリプトに認証情報を埋め込まないようにする
データレイクや各種情報サービスなどからWeb APIを使ってデータを取得することは珍しくありません。たとえばSplunkからデータを取得する方法としては、同社のブログ「Leveraging External Data Science Stacks with Splunk Today」(2019-03-18)が参考になります。
ただ、リンク先の例のような、パスワードをコードの中に平文で書き込む方法は安全ではありません。では、どうするか? 古典的には、環境変数に書いたり暗号化して別ファイルに保存することが行われます。しかしクライアント端末で実行する際には、OSが備えている鍵管理システムを利用するのが便利です。Windowsでは資格情報マネージャー(Credential Manager)が相当します。
資格情報マネージャーはどこにあるか?
資格情報マネージャーは、〈コントロールパネル/ユーザーアカウント/資格情報マネージャー〉にあります。Windows+R(ファイル名を指定して実行)でcontrol /name Microsoft.CredentialManager
と入力しても構いません。左側の「Web 資格情報」は、Internet Explorerが使用するもののようです。私たちがスクリプトで使うのは、右の「Windows 資格情報」です。
以下に、Rで資格情報マネージャーを取り扱う方法を示します。登録は永続化されますから、いちど登録すれば二度と登録する必要はありません。
keyringパッケージを使う
Rのkeyringパッケージは、資格情報マネージャーだけでなく、Keychain(macOS)やSecret Service API(Linux)にも対応しています。GitHubのページから付け加えることはないのですが、いちおう先のSplunkでの具体例を挙げておきます。
keyringパッケージをインストールする
KeyringはCRANに登録されているので、
install.packages("keyring")
でインストール可能です。
パスワードを登録する
keyring::key_set_with_value("splunk", username = "test@example.jp", password = "testpassword")
登録すると、資格情報マネージャーの「汎用資格情報」欄に追加されます。
登録一覧を眺める
keyring::key_list() service username 1 splunk test@example.jp
登録されたパスワードを取り出す
pwd <- keyring::key_get("splunk", "test@exapmle.jp")
(代入するとRStudioから丸見えになるので注意。)
登録されたパスワードを削除する
keyring::key_delete("splunk", "test@example.jp")
おまけ
Pythonの場合
keyringはPythonにもあります。私はふだんanacondaを使っているのですが、この環境では最初から入っていました。使い方はまったく同じです。
import keyring keyring.set_password("splunk", "test@exapmle.jp", "testpassword") pwd = keyring.get_password("splunk", "test@example.jp")
ならば形式も同じで両言語のkeyringが共用できるかというと、残念ながらうまくいきませんでした。RはUTF-8で、PythonはUTF-16で登録されるようです。
Splunk Authentication Token
Splunk 7.3からは、パスワードを使った認証ではなくAuthentication Tokenを使うことができます。ただし設定で有効化する必要があるので、Splunkの管理者に相談するのがよいでしょう。