class: center, middle, inverse, title-slide # 認証情報の隠し方 ### harayaman ### 2019/10/11 --- --- ## 背景 - DB接続のテストコードを書いていた時<br> <br> <get_data_from_DB.R> ```r # パッケージ読込 # 略 # 認証情報 db_user <- 'dbuser' db_password <- 'dbpassword' db_name <- 'dbname' db_host <- 'dbhost' db_port <- 99999 # DB接続オブジェクト mydb <- dbConnect(MySQL(), user = db_user, password = db_password, dbname = db_name, host = db_host, port = db_port) # クエリを送ってデータ取得 rs <- dbSendQuery(mydb, "select * from table") df <- fetch(rs, n = -1) ``` --- ## 背景 - このコードはそのまま共有できない!<br> - 認証情報のところは隠したい!<br> --- ## 調べてみたらありました - https://db.rstudio.com/best-practices/managing-credentials/ - ↑DB接続に必要な認証情報の隠し方に関する記事 - 上から推奨順(多い!) 1. Integrated Security with DSN 2. Integrated Security without DSN 3. Encrypt credentials with keyring pakcage 4. Use a configuration file with the config package 5. Environment variables using the .Renviron file 6. Using the options base R command 7. Prompt for credentials using RStudio IDE --- ## 本日紹介する方法 - DB接続以外でも使えるものからピックアップ(<span style="color:red">赤字</span>) 1. Integrated security with DSN <br> 2. Integrated security without DSN <br> 3. <span style="color:red">Encrypt credentials with keyring pakcage</span> 4. Use a configuration file with the config package 5. <span style="color:red">Environment variables using the .Renviron file</span> 6. <span style="color:red">Using the options base R command</span> 7. Prompt for credentials using RStudio IDE --- ## 前提 - RStudio Desktopを使用 --- ## 3.Encrypt credentials with keyring pakcage - keyringパッケージでOSの鍵管理機能を使用する方法 - WindowsならCredential Store, MacOSならKeychain --- ## 登録例 <table border="1" cellpadding="6" cellspacing="0"> <caption>service = db_auth_info</caption> <tr> <td>username</td> <td>password</td> </tr> <tr> <td>db_user</td> <td>dbuser</td> </tr> <tr> <td>db_password</td> <td>dbpassword</td> </tr> <tr> <td>db_name</td> <td>dbname</td> </tr> <tr> <td>db_host</td> <td>dbhost</td> </tr> <tr> <td>db_port</td> <td>99999</td> </tr> </table> コンソールか別のスクリプトファイルで実行 ```r keyring::key_set_with_value(service = "db_auth_info", username = "db_user", password = 'dbuser') keyring::key_set_with_value(service = "db_auth_info", username = "db_password", password = 'dbpassword') keyring::key_set_with_value(service = "db_auth_info", username = "db_name", password = 'dbname') keyring::key_set_with_value(service = "db_auth_info", username = "db_host", password = 'dbhost') keyring::key_set_with_value(service = "db_auth_info", username = 'db_port', password = '99999') ``` --- ## 取得例 ```r db_user <- keyring::key_get(service = "db_auth_info", username = 'db_user') db_password <- keyring::key_get(service = "db_auth_info", username = 'db_password') db_name <- keyring::key_get(service = "db_auth_info", username = 'db_name') db_host <- keyring::key_get(service = "db_auth_info", username = 'db_host') db_port <- keyring::key_get(service = "db_auth_info", username = 'db_port') ``` --- ## 使用例 <get_data_from_DB.R> ```r # パッケージ読込 # 略 # 認証情報取得 db_user <- keyring::key_get(service = "db_auth_info", username = 'db_user') db_password <- keyring::key_get(service = "db_auth_info", username = 'db_password') db_name <- keyring::key_get(service = "db_auth_info", username = 'db_name') db_host <- keyring::key_get(service = "db_auth_info", username = 'db_host') db_port <- as.integer(keyring::key_get(service = "db_auth_info", username = 'db_port')) # DB接続オブジェクト mydb <- dbConnect(MySQL(), user = db_user, password = db_password, dbname = db_name, host = db_host, port = db_port) # クエリを送ってデータ取得 rs <- dbSendQuery(mydb, "select * from table") df <- fetch(rs, n = -1) ``` --- ## 5. Environment variables using the .Renviron file - .RenvironはRの環境変数を設定するファイル - .RenvironはRの起動時に読み込まれる - ユーザーのHomeディレクトリに置かれることが多い? --- ## 登録例 <.Renviron> ```r db_user='dbuser' db_password='dbpassword' db_name='dbname' db_host='dbhost' db_port='99999' ``` --- ## 取得例 ```r db_user <- Sys.getenv('db_user') db_password <- Sys.getenv('db_password') db_name <- Sys.getenv('db_name') db_host <- Sys.getenv('db_host') db_port <- as.integer(Sys.getenv('db_port')) ``` --- ## 使用例 <get_data_from_DB.R> ```r # パッケージ読込 # 略 # 認証情報取得 db_user <- Sys.getenv('db_user') db_password <- Sys.getenv('db_password') db_name <- Sys.getenv('db_name') db_host <- Sys.getenv('db_host') db_port <- as.integer(Sys.getenv('db_port')) # DB接続オブジェクト mydb <- dbConnect(MySQL(), user = db_user, password = db_password, dbname = db_name, host = db_host, port = db_port) # クエリを送ってデータ取得 rs <- dbSendQuery(mydb, "select * from table") df <- fetch(rs, n = -1) ``` --- ## 6.Using the options base R command - RのGloabl Optionsに書き込む方法 - Global Optionsは計算の仕方や表示に関する設定 - 例 : 'encoding' (文字コード) - 例 : 'max.print' (printできる最大のデータ量) ```r # 文字コード変更 options(encoding = 'UTF-8') ``` - 既存の設定変更以外に、自分で名前をつけて変数を作成することができる。 --- ## 登録例 コンソールか別のスクリプトファイルで実行 ```r options(db_user = 'dbuser') options(db_password = 'dbpassword') options(db_name = 'dbname') options(db_host = 'dbhost') options(db_port = '99999') ``` --- ## 取得例 ```r db_user <- getOption('db_user') db_password <- getOption('db_password') db_name <- getOption('db_name') db_host <- getOption('db_host') db_port <- as.integer(getOption('db_port')) ``` --- ## 使用例 <get_data_from_DB.R> ```r # パッケージ読込 # 略 # 認証情報取得 db_user <- getOption('db_user') db_password <- getOption('db_password') db_name <- getOption('db_name') db_host <- getOption('db_host') db_port <- as.integer(getOption('db_port')) # DB接続オブジェクト mydb <- dbConnect(MySQL(), user = db_user, password = db_password, dbname = db_name, host = db_host, port = db_port) # クエリを送ってデータ取得 rs <- dbSendQuery(mydb, "select * from table") df <- fetch(rs, n = -1) ``` --- ## 自分なりの整理 <table border="1" cellpadding="6" cellspacing="0"> <caption>手法比較</caption> <tr> <td>手法</td> <td>特徴</td> </tr> <tr> <td>3. keyringパッケージ</td> <td>鍵のセットに名前をつけられるため、同じ名前を異なる鍵のセットで使用できる。</td> </tr> <tr> <td>5. Renvironファイル</td> <td>もともと環境変数を設定するファイルのため、隠し場所としてはわかりやすい。<br>鍵のセットに名前をつけられないため、同じ名前の変数を作れない。</td> </tr> <tr> <td>6. Global Option</td> <td>.Renvironファイルと同様の使い方<br>もともと自分で変数を作成するための場所ではないと思われるため、わざわざ使用するメリットはなさそう?</td> </tr> </table> --- ## 自分なりの結論 - 特に理由がなければ3.keyring パッケージでいいのでは? - ※RStudio Desktopを使用する場合。 --- <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <center><font size = 7>ありがとうございました!</font></center>