web-dev-qa-db-ja.com

コードで使用される資格情報を保存するためのベストプラクティス

現在、多くのタスクを自動化するためにスーパーユーザーとしてログインする必要がある多くのスクリプトがあります。 (たとえば、データベースでのテーブルの作成、他のユーザーの作成など)

資格情報(特にパスワード)をスクリプトに直接格納する代わりに、ルートユーザーのみがアクセスできるファイル(pwds.txtと呼びます)から資格情報を読み取っています。

一部の同僚は、より安全なアプローチは、pswds.txtでパスワードを暗号化し、どこかにキーを隠し、スクリプトの暗号化されたデータを使用前に復号化することだと言っています。

私はそれが問題を減らして、キーがどこにあるかを見つけることを主張します、それはスクリプトを読むことができる敵対者にとって全く難しくないと思われます。このプロセスは、実際の保護層を実際に提供することなく、プログラミングを複雑にするだけだと思います。

2つの質問:

  1. 私と彼らのどちらがより正しいですか? (なぜ)
  2. 100%のセキュリティは存在しないことを知っていますが、私の問題のベストプラクティスは何ですか?
14
sel

1)あなたは100%正しいです、なぜですか?マシンが危険にさらされても、アプリで復号化するには対称暗号化である必要があり、キーファイルにはアプリと同じ読み取り権限がなければアプリが読み取れないため、攻撃者は引き続き復号化キーを取得できます。

アプリがまだハードコードされた秘密の復号化キーディレクトリを必要とするため、攻撃者はそれを探すだけです:D、たとえアプリがバイナリ実行可能ファイルであっても、攻撃者はファイルディレクトリの文字列とファイルを簡単にダンプできます。

デバッグに必要なGo言語プログラムから実行したため、ソースコード(サーバーでホストされているクライアントアプリの1つ)がなかったので、わかりました。

アプリイーサウェイがデータをメモリに格納してデータベース認証などで再利用するため、ホールが存在する場合、バッファオーバーフローなどの攻撃が機能します。

2)最善の解決策は、各アプリがシークレットをリクエストしてリースする中央のボールトを用意することです。この種のソリューションの1つは https://www.vaultproject.io/ であり、その詳細 https: //www.vaultproject.io/docs/internals/architecture.html

一般的なベストプラクティスは、各アプリリソースの各役割のアクセス権と制御権を最小限に抑えることです。例:アプリが1つのデータベースのみを使用する場合、そのユーザーに他のデータベースを表示したり、他のデータベースでDMLを実行したりする権限を与えません。アプリが移行を行わない場合は、テーブルのドロップ権限を削除します。

スクリプトが例によって実行される場合にボールトを使用しない場合、rootユーザーは、権限の低いユーザーの所有権でシークレットを保存しないでください。所有者を同じユーザーにし、実際に必要なものだけを読み取り、書き込み、実行のアクセス許可を使用します。

攻撃者が認証フェーズを取得したにもかかわらず秘密データを保存した場合、1つのtcpダンプがデータをリークするため、リソースに可能な場合はTLSを使用します。

10