47417
# 環境

  * Python 3.6 
    * requestsモジュール

# 現状

自分のローカルマシンからWebAPI Xにアクセスして、情報を取得したいです。  
WebAPI Xには仕様は以下の通りです。

  * 認証が必要。
  * 認証するには、Login用のAPIを実行する。
  * Login用APIには、LoginIDとPasswordを渡す。

WebApiへのアクセスには、Pythonのrequestsモジュールを使っています。

WebAPIにアクセスするツール（Pythonスクリプト）は、今のところ自分しか使っていませんが、いずれは他の社員にも使ってもらえるようにしたいです。

# 問題だと感じていること

パスワードは、以下のような設定ファイル`config.ini`に記述しています。

```

    [login]
    id=xxx
    password=yyy
    
```

`config.ini`は、Gitリポジトリにコミットしないようにしています（`.gitignore`に記述）。

以下の点が、私は問題に感じています。

  * 設定ファイルにはパスワード以外の情報も記載していて、頻繁にエディタで開いている。 
    * パスワードを見られる可能性が高い
  * `.gitignore`に書いてあるとはいえ、間違ってコミットしてしまうリスクがある

# 質問

一般的に「WebApiにアクセスするためのパスワード」は、どのような形で、どこに保存すべきでしょうか？

  * 環境変数
  * 別の鍵で、パスワードを暗号/復号できるようにする

自分が問題だと思っていることの解決方法はいろいろあると思いますが、より一般的で簡単な方法を採用したいです。
CC BY-SA 4.0
2018-08-09T14:19:57.513
47388
2018-08-17T00:57:38.283
19524
question
python
「WebAPIにアクセスするためのパスワード」は、一般的にどのような形でどこに保存すべきですか？
私は [The Twelve Factors](https://12factor.net/ja/) の思想が好みなので環境変数へ保存する方法を選びます。  
開発時は direnv や dotenv を使って環境変数を設定しています。
CC BY-SA 4.0
2018-08-10T10:34:39.180
47416
2018-08-10T10:34:39.180
5375
47388
answer
各OSにはパスワードを保存する仕組みを用意している場合があります。

Windowsの場合、資格情報マネージャーがあり、IEなどのパスワード保存に使われています。Macの場合も同様にキーチェーンアクセスがあります。

Xubuntuを含むUNIX系OSには汎用的なものはありませんが、その昔 `~/.netrc`
にパスワードを保存することがありました。[netrc(5)](http://surf.ml.seikei.ac.jp/~nakano/JMwww/html/netkit/man5/netrc.5.html)に説明があります。そしてPythonにはこのファイルを解析する[netrcクラス](https://docs.python.jp/3/library/netrc.html)が用意されているそうです。

一つの選択肢としてどうぞ。
CC BY-SA 4.0
2018-08-10T10:45:15.660
47417
2018-08-10T10:45:15.660
4236
47388
answer
`config.ini`から「LoginID」と「Password」の項目を分離して別のiniファイルと  
してはいかがでしょうか? (スクリプトは両方を読み込むよう処理する)

ファイルの場所としては、各ユーザのホームディレクトリ以下が一般的かと思います。

＃認証情報なので「必要な場面でユーザが入力する」のが適切な気がしますが。
CC BY-SA 4.0
2018-08-10T12:47:37.500
47422
2018-08-10T12:47:37.500
20098
47388
answer
一般論はなく状況によって変えるべきです。そのIDの重要度や使う状況によって適切な方法を考えないといけない問題です。LoginIDが個人別に発行されるのか、それとも会社に発行されるのかによっても違ってきます

LoginIDが個人別に発行される場合は、開発者が使うのであれば環境変数に保存するのが便利だと思います。しかし、一般ユーザーが使うのであれば、ログイン画面を作成してパスワードマネージャーを使ってもらった方が楽に設定できます。linuxにもパスワードマネージャーはあります。

単に情報を取得するだけのような場合には、会社全体でLoginIDが一つの方が便利なケースがあります。その場合は開発をローカルマシンでおこなっても、社内全体で使う分はサーバー経由で運用してLoginIDとPasswordはサーバーに置くようにプログラムを作成すべきです。そうしないとLoginIDとPasswordの管理ができなくなります。

開発者が利用するということなので、参考までに Google API のキーを利用する場合のベスト
プラクティスをのせておきます（[キーの使用](https://cloud.google.com/docs/authentication/api-
keys?hl=ja)）。セキュリティを守るために重要なのは、全ての権限があるユーザーID、パスワードを使うのではなくて、それとは別にアプリケーション専用のものを作成することです。ユーザーID、パスワードについては暗号化だけでなく多重認証が必要と思いますが、一方アプリケーション用のものについては、暗号化しても復号するためのコードが必要になるのであまり意味がありません。

> アプリケーションで API
> キーを利用するときは、キーの安全確保に努めてください。認証情報が公開されると、アカウントが侵害され、アカウントに対して予想外の料金が課される可能性があります。API
> キーの安全性を保つには、以下のベスト プラクティスに従ってください。
>
>   * API キーをコードに直接埋め込まないでください。コードに埋め込まれた API
> キーは、誤って公開されてしまう可能性があります。たとえば、共有するコードからキーを削除し忘れた場合などです。API
> キーはアプリケーションに埋め込む代わりに、アプリケーションのソースツリー外部にある環境変数やファイル内に保存してください。
>
>   * アプリケーションのソースツリー内のファイルに API キーを保存しないでください。API
> キーをファイルに保存する場合は、キーがソースコード制御システム内に保存されないよう、ファイルをアプリケーションのソースツリー外部に保持するようにします。これは特に、GitHub
> のような公共のソースコード管理システムを使用する場合に重要です。
>
>   * キーを必要とする IP アドレス、参照 URL、モバイルアプリのみに使用が制限されるように、API キー制限を設定します。
>
>   * 定期的に API キーを再生成します。各キーの [キーを再生成] をクリックして、[認証情報] ページから API
> キーを再生成できます。その後、新たに生成したキーが使用されるようにアプリケーションを更新します。古いキーは置換用のキーを生成した後も 24
> 時間は機能し続けます。
>
>   * 公開する前に、コードを確認します。コードを公開する前に、コードに API キーやその他のプライベート情報が含まれていないことを確認してください。
>
>
CC BY-SA 4.0
2018-08-10T22:27:52.727
47432
2018-08-17T00:57:38.283
2018-08-17T00:57:38.283
15171
15171
47388
answer