認証情報の隠し方

harayaman

2019/10/11

背景

# パッケージ読込
# 略

# 認証情報
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)

背景

調べてみたらありました

  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

本日紹介する方法

  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

前提

3.Encrypt credentials with keyring pakcage

登録例

service = db_auth_info
username password
db_user dbuser
db_password dbpassword
db_name dbname
db_host dbhost
db_port 99999

コンソールか別のスクリプトファイルで実行

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

取得例

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>

# パッケージ読込
# 略

# 認証情報取得
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>←既存のファイルに追記or新規作成

db_user='dbuser'
db_password='dbpassword'
db_name='dbname'
db_host='dbhost' 
db_port='99999'


or コンソールか別のスクリプトファイルで実行

Sys.setenv(db_user = 'dbuser')
Sys.setenv(db_password = 'dbpassword')
Sys.setenv(db_name='dbname')
Sys.setenv(db_host='dbhost')
Sys.setenv(db_port='99999')

取得例

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>

# パッケージ読込
# 略

# 認証情報取得
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

# 文字コード変更
options(encoding = 'UTF-8')

登録例

コンソールか別のスクリプトファイルで実行

options(db_user = 'dbuser')
options(db_password = 'dbpassword')
options(db_name = 'dbname')
options(db_host = 'dbhost')
options(db_port = '99999')

取得例

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>

# パッケージ読込
# 略

# 認証情報取得
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)

自分なりの整理

手法比較
手法 特徴
  1. keyringパッケージ
鍵のセットに名前をつけられるため、同じ名前を異なる鍵のセットで使用できる。
  1. Renvironファイル
もともと環境変数を設定するファイルのため、隠し場所としてはわかりやすい。
鍵のセットに名前をつけられないため、同じ名前の変数を作れない。
  1. Global Option
もともと自分で変数を作成するための場所ではないと思われるため、紛らわしい?

自分なりの結論











ありがとうございました!