質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

Q&A

解決済

5回答

3886閲覧

クライアントプログラムにおける利用者パスワードの取り扱い

arican

総合スコア12

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

0グッド

1クリップ

投稿2019/08/03 05:27

編集2019/08/03 06:21

あるウェブサービスにログインした上で情報を取得したりPOSTしたりするクライアントプログラムを作っています。公開して使ってもらいたいと思っているので、ウェブサービスにログインするための利用者自身のユーザ名・パスワードの取り扱いについて考えています。

ユーザ名とパスワードを環境変数に設定してプログラム側からそれを読み取るというテクニックがセキュアな取り扱い方法とされているのを知りましたが、実際の運用では.zshrcなりにexport文を平文でベタ書きすることになると思い(自分が日常的に使うならそうする)、結局パスワードファイルを作るのと差がないような気がしています。またwindowsでの環境変数設定は初心者には少し難しいとも思います。

またユーザ名・パスワードを入力させて暗号化ファイルを作るにしても、githubにソースコードを上げるならばそれを見て復号は容易にできてしまいますよね?

具体的なプログラムの提示のないふわっとした質問で申し訳ないのですが

  • 日常的に頻繁に叩くCLIプログラムのつもりである(一々パスを打たせるのは辛い)
  • Golangで同一ソースからWindows/Linuxのバイナリを作る(OSに依存したパスワード管理は使わない)
  • どんなサービスであれパスが漏れていいということはありませんが、金融系のようなクリティカルなサービスへのアクセスではない

以上のような条件で、プログラム利用者のウェブサービスへのパスワードはどのように保存しておくのが一般的でしょうか?

#####追記
この場合のパスワード等はもちろん利用者本人には見えても構わないので、例えば何らかの攻撃によってローカルのファイルが覗かれたり…のような万一の場合を考えた時にセキュアな取り扱いはどうすべきなのだろう、というのが観点です(侵入されることまで考慮したらどうにもできない、というのはもっともですが)。
というか、完成したプログラムを公開した経験がないので、その辺りどの程度まで気にするべきかという感覚的なものがイマイチわからないので、アドバイスいただけたらと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ockeghem

2019/08/03 05:53

そのパスワードはユーザが知っているものでしょうか、あるいはユーザにも秘匿したいものでしょうか? 「利用者のパスワード」というからには、ユーザ自身には見えてもよいのでしょうか?
arican

2019/08/03 05:59

はい、そのとおりです。自分がそのサービスへログインするときに打ち込むパスですから、自分には見えてもよいものです。
guest

回答5

0

ベストアンサー

質問文に書かれている検討内容は概ね妥当です。ただ、すでに指摘のあるように、環境変数にパスワードを保持するのは、特殊な状況での便法であり、一般的な状況ではセキュアとは言えません。クライアントアプリの場合、環境変数にパスワードを入れるのは(wget等では使われていますが)好ましくありません。envコマンド等で簡単にパスワードを参照できてしまうからです。

検討にあたり、以下の記事が参考になるかと思います。環境変数にパスワードを入れるべきでない理由も書かれています。

ではどうすればよいかですが、実はあまり良い方法はありません。極論すると、平文のファイルにパスワードを格納する方法もありです。
…などというと、徳丸はセキュリティ専門家なのになんて暴論を言うのだ…みたいな反応が予想されますが…実は非常に機密性の要求される情報がLinuxでは平文で置かれています。たとえば、sshで他のサーバーに接続する時の秘密鍵がそうです。そのなっている理由は知りませんが、おそらく、他によい方法がないので、マルウェア感染等により鍵が漏洩することは許容しているのでしょう。

ただ、ご指摘のようにあまり堅牢になるわけでもないですが、平文はあんまりだということであれば、暗号化して保存することよく行われます。この場合、暗号化や鍵管理の部分を「難読化」することにより、簡単には暗号方式や鍵がばれないようにすることも多いですが、根本的に安全になるわけでもないので、適当なところで妥協するしかありません。

投稿2019/08/03 10:54

編集2019/08/03 11:29
ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arican

2019/08/03 11:38

なんとなく根本的で100%な対策なんてないよなぁと思いながら質問したのですが、記事と回答を読んでやっぱり(サービス側でAPI等用意してもらえない限り)銀の弾丸なんて無いということがわかりよかった(?)です。結局トレードオフを考えるしかないのですね。 やるならばそれほどセキュアじゃないことを自覚しつつ、暗号化・パーミッション設定等を適切にしてファイルに保存する程度の感じになりそうです。ありがとうございました。
otn

2019/08/03 12:19

https://diary.sorah.jp/2014/06/05/securing-environment-variables > 昔の BSD 系 UNIX マシンでは、ps e でコマンドライン引数同様、他人のプロセスについている環境変数を覗く事が可能でした。 ああ、やっぱり、記憶違いじゃ無かった。Linuxでやるとrootで実行しない限り自分のプロセスしか環境変数が見えないので、「あれ?何時から?」と思っていました。
guest

0

プログラム利用者のウェブサービスへのパスワードはどのように保存しておくのが一般的でしょうか?

【回答】何らかの資格情報マネージャ(credentials manager)に保存する方式を採用すると良いと思います。

資格情報マネージャ(credentials manager)

最近のOSには資格情報の管理を担ってくれる仕組み・機能があります。Windowsではそのまま資格情報マネージャという名前の機能があり、共有フォルダやWEBサイト等のいろいろなパスワードを覚えさせることができます。情報の取り出しには覚えさせたユーザーの権限が必要なだけなので、環境変数とあまり大差がない気もしますが、平文ベタ書きよりは幾分セキュアに情報が管理されていると思います。(信じています。)

ちなみにPythonだとこの資格情報マネージャへはkeyringというパッケージを使用して、

python

1import keyring 2keyring.set_password("service_name", "user", "pass") 3keyring.get_password("service_name", "user")

というふうに簡単にアクセスすることができます。そしてこういったライブラリを介することによって、Windowsの資格情報マネージャ以外のバックエンド(例えばmacOS Keychain)にも同じマナーでアクセスできるようになるというメリットが発生します。つまり、資格情報マネージャへの委任&ライブラリの使用がオススメです。

あと詳しくは知りませんが、資格情報マネージャの中ならたぶんGitの仕組み(git credential-manager?)がよりセキュアな部類に入ると思います。私のWindows環境では、Windowsの資格情報マネージャよりもGitの資格情報マネージャのほうが、情報の取り出し毎にパスワード入力が必要になる分、セキュアな感じがします。

投稿2019/08/03 11:51

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arican

2019/08/03 13:56

pythonのkeyringモジュールをlubuntu環境で試してみましたがちゃんとパスワード入力が促されて機能しました!キーリング系のツールが入ってない環境での挙動が気になりますが、とりあえずlinux含めた一般的な環境では動作するようで、golangにも同様のパッケージがあるようなので試してみます。情報ありがとうございました!
guest

0

秘匿情報を環境変数に書き込む手法はサーバーサイドでは常套手段ですが、クライアントプログラムでやってる事例は知りません。
動かすプログラムをコントロールできるサーバーならともかく、どんなプログラムが動くかわからないクライアントサイドでは普通に危険だと思います。
で、普通はサーバー側も正当なユーザーのアクセスであるのか判別する必要があり、その情報を保持しているはずなので、サーバー側で管理すべきだと思いますが。

ユーザー名とパスワードの組み合わせは使い回されるケースも多いので、そのシステムがクリティカルじゃないからといって流出しても良いということは絶対にありません。

投稿2019/08/03 09:31

gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arican

2019/08/03 09:42

書き漏れすみません、非公式なクライアントであるためID/パスでの認証しかできません。そもそもそういうプログラムの公開自体どうなの、というご意見はもっともですので、ちょっと考えてみたいと思います(もともとコマンドラインから手軽に投稿するスクリプトみたいなのを自分用に作って使っていて、需要がありそうなので公開しようと思った次第です)。 >ユーザー名とパスワードの組み合わせは使い回されるケースも多いので、そのシステムがクリティカルじゃないからといって流出しても良いということは絶対にありません。 改めて肝に銘じておきます。
gentaro

2019/08/03 10:12

「クライアントプログラムでやってる事例は知りません。」と書きましたが、自分で作ったちょっとしたツールで手抜きのためにそのような実装をしたことはあります。(今回の事例と似ていると思います) ただしその場合も、環境変数というのは他のプログラムから容易に参照可能であるため、平文では保存せず、暗号化した情報を書いてました。
gentaro

2019/08/03 10:15 編集

ついでに全然別な話ですが > 実際の運用では.zshrcなりにexport文を平文でベタ書きすることになると思い(自分が日常的に使うならそうする)、結局パスワードファイルを作るのと差がないような気がしています。またwindowsでの環境変数設定は初心者には少し難しいとも思います。 これについてはプログラム側で環境変数を読み書きすれば良いだけなので、もし環境変数を使うにしても、この理由はあまり障壁になるとは思いません。(少なくとも私なら入力用のインターフェイスは用意します)
arican

2019/08/03 11:27

なるほど、環境変数設定もプログラムにさせるのですね。暗号化したものを手打ちで設定とかさせませんよね。環境変数案を採用するかはともかく覚えておきます。ありがとうございます。
guest

0

ウェブサービス側も変更できるなら
サービス側でアクセストークンを発行→環境変数で設定。
GitHubはトークンをパスワード代わりにgitコマンドでcloneなどができる。それと同じ。

トークンが使えない場合はパスワードそのまま環境変数に設定。
PCのセキュリティはユーザーの責任。
サーバー上に比べればローカルPCは安全なはずという前提。

投稿2019/08/03 08:57

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arican

2019/08/03 09:37

非公式な勝手クライアントであるため、サービス側はいじれません(度々情報抜けすみません…)から、やっぱり環境変数を使うなどになりそうですね。 >PCのセキュリティはユーザーの責任。 >サーバー上に比べればローカルPCは安全なはずという前提。 そりゃそうですよね…それ以上手を出しようもないですし。 ありがとうございました。
guest

0

パスワードはどのように保存しておくのが一般的でしょう

以下のような記事は読まれているでしょうか? (質問者さんの条件はともかくとして・・・)

本当は怖いパスワードの話 (1/4)
https://www.atmarkit.co.jp/ait/articles/1110/06/news154.html

投稿2019/08/03 07:28

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arican

2019/08/03 08:18

ありがとうございます。拝見しましたが、サーバ側のパスワード取り扱いの話であって今回のクライアント側の話には適合しないかなと思いました。 サーバ側にユーザ名・パスワードを投げてログインをしなければならないので復号できなければならず、復号不可なハッシュ化などは使えないように思います。質問がわかりにくくてすみません。
退会済みユーザー

退会済みユーザー

2019/08/03 09:59

クライアント側の話ですか、失礼しました。 でも、そんなのはユーザーの裁量に任せるべきで、「クライアントプログラム」でコンロトールしようとすること自体が自分的には理解できません。何か問題が起こったとして、プログラムを配布した側が責任を取ってくれるとは思えませんし。責任を取ってもらえないなら、自分は、そういうプログラムは絶対に使いたくないです。
arican

2019/08/03 11:22

自分用のプログラムの延長線上で作っていましたが、確かに他人のクライアントプログラムにそれらを任せられないという考えはもっともだと思います。ご意見ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問