web-dev-qa-db-ja.com

python)の認証情報ストレージを保護します

攻撃

資格情報ストレージのコンテキストで考えられる脅威モデルの1つは、次の機能を持つ攻撃者です。

  • (ユーザー)プロセスメモリを検査します
  • ローカル(ユーザー)ファイルを読み取る

AFAIK、このタイプの攻撃に関するコンセンサスは、防ぐことは不可能であるということです(プログラムが実際に資格情報を使用するには、資格情報をメモリに保存する必要があるため)が、それを軽減するためのテクニックがいくつかあります。

  • 機密データがメモリに保存される時間を最小限に抑える
  • データが不要になったらすぐにメモリを上書きします
  • メモリ内のデータをマングルし、移動し続け、隠すことによるその他のセキュリティ

特にPython

最初の手法は実装が簡単で、おそらく キーリングを介して (できればカーネルスペースストレージ)

2つ目は、私の知る限り、Cモジュールを作成しないとまったく達成できません(ただし、ここで間違っていることが証明されるか、既存のモジュールのリストが必要です)。

3つ目は注意が必要です。

特に、pythonは非常に強力なイントロスペクションとリフレクション機能を備えた言語であるため、pythonコードを実行できる人が資格情報にアクセスするのを防ぐことは困難です。通訳プロセス。

プライベート属性を強制する方法はありません そして それを試みるとせいぜいあなたのコードを使用している他のプログラマーを苛立たせるでしょう というコンセンサスがあるようです。

質問

これらすべてを考慮に入れて、Pythonを使用して認証資格情報を安全に保存するにはどうすればよいですか?ベストプラクティスは何ですか? 「すべてが公になっている」という言葉の哲学について何かできるでしょうか。私は知っています 「私たちはここで大人に同意しています」 しかし、パスワードを攻撃者と共有するか、別の言語を使用するかを選択することを強制する必要がありますか?

14
goncalopp

認証資格情報を保存する理由は2つあります。

  1. your ユーザーを認証するには:たとえば、ユーザーがプログラムに対して認証した後にのみ、ユーザーにサービスへのアクセスを許可します。
  2. プログラムを別のプログラムまたはサービスで認証するには:たとえば、ユーザーはプログラムを起動し、IMAPを使用してインターネット経由でユーザーの電子メールにアクセスします。

最初のケースでは、パスワード(または暗号化されたバージョンのパスワード)を保存しないでください。代わりに、高品質のソルトを使用してパスワードを hash し、使用するハッシュアルゴリズムがPBKDF2やbcryptなどの(辞書攻撃を防ぐために)計算コストが高いことを確認する必要があります。詳細については、 Salted Password Hashing-Doing it Right を参照してください。このアプローチに従うと、ハッカーが塩漬けの低速ハッシュトークンを取得したとしても、それをうまく処理することはできません。

2番目のケースでは、秘密の発見を困難にするために行われるいくつかのことがあります(質問で概説しているように)。

  • シークレットを必要になるまで暗号化したままにし、オンデマンドで復号化し、直後に再暗号化します
  • アドレス空間配置のランダム化を使用して、アプリケーションが実行されるたびに、キーが異なるアドレスに保存されるようにします
  • OSキーストアの使用
  • JavaまたはPythonなどのVMベースの内省的な言語ではなく、C/C++などの「ハード」言語を使用する

そのようなアプローチは確かに何もないよりはましですが、熟練したハッカーは遅かれ早かれそれを破るでしょう。

トークン

理論的な観点から、認証は、挑戦された人が彼らが言っている人であることを証明する行為です。従来、これは共有シークレット(パスワード)を使用して実現されていましたが、次のような他の方法で自分自身を証明できます。

  • 帯域外 認証。たとえば、私が住んでいる場所でインターネットバンクにログインしようとすると、電話でSMS)として ワンタイムパスワード (OTP)を受け取ります。この方法では、特定の電話番号を所有しているために自分がいることを証明します
  • セキュリティトークン :サービスにログインするには、トークンのボタンを押してOTPを取得し、それをパスワードとして使用する必要があります。
  • 他のデバイス:

そして、より完全なリスト ここ

これらすべてのアプローチの共通点は、エンドユーザーがこれらのデバイスを制御し、秘密が実際にトークン/カード/電話から離れることはなく、プログラムに保存されることもないということです。これにより、それらははるかに安全になります。

セッション盗み

ただし(ただし、常にあります):

ハッカーがセキュリティトークンにアクセスできないように、ログインを保護することに成功したとします。これで、アプリケーションはセキュリティで保護されたサービスとうまく相互作用しています。残念ながら、ハッカーがコンピュータ上で任意の実行可能ファイルを実行できる場合、ハッカーは、たとえばサービスの有効な使用に追加のコマンドを挿入することによって、セッションを乗っ取ることができます。つまり、パスワードを保護していても、ハッカーは「保護された」リソースにアクセスできるため、パスワードはまったく関係ありません。

複数のクロスサイトスクリプティング攻撃が示すように、これは非常に現実的な脅威です(1つの例は .S。Bank and Bank of America Websites Vulnerable ですが、他にも数え切れないほどあります)。

安全なプロキシ

上で説明したように、アプリケーションがログオンできるように、サードパーティのサービスまたはシステムでアカウントの資格情報を保持することには基本的な問題があります。特に、ログオン方法がユーザー名とパスワードのみの場合はそうです。

サービスへの通信を安全なプロキシに委任することでこれを部​​分的に軽減し、アプリケーションとプロキシ間の安全なサインオンアプローチを開発する1つの方法。このアプローチでは

  • アプリケーションは、PKIスキームまたは2要素認証を使用して、セキュアプロキシにサインオンします
  • ユーザーは、セキュリティ資格情報をサードパーティシステムのセキュアプロキシに追加します。資格情報がアプリケーションに保存されることはありません
  • その後、アプリケーションがサードパーティシステムにアクセスする必要がある場合、アプリケーションはプロキシに要求を送信します。プロキシはセキュリティ資格情報を使用してログオンし、要求を行い、結果をアプリケーションに返します。

このアプローチの欠点は次のとおりです。

  • ユーザーは、資格情報のストレージで安全なプロキシを信頼したくない場合があります
  • ユーザーは、データがサードパーティアプリケーションに流れることでセキュアプロキシを信頼できない可能性があります
  • アプリケーションの所有者には、プロキシを実行するための追加のインフラストラクチャとホスティングのコストがあります

いくつかの答え

それで、特定の答えに移ります:

Pythonを使用して認証資格情報を安全に保存するにはどうすればよいですか?

  • ユーザーを認証するためにアプリケーションのパスワードを保存する場合は、 https://www.dlitz.net/software/python-pbkdf2/ などのPBKDF2アルゴリズムを使用します。
  • 別のサービスにアクセスするためにパスワード/セキュリティトークンを保存する場合、絶対に安全な方法はありません。
  • ただし、たとえば pyscard を使用して、認証戦略をたとえばスマートカードに切り替えることを検討してください。スマートカードを使用して、アプリケーションに対してユーザーを認証することも、X.509証明書を使用して別のサービスに対してアプリケーションを安全に認証することもできます。

「すべてが公になっている」という言葉の哲学について何かできるでしょうか。 「私たちは皆、ここで大人に同意している」ことを知っていますが、パスワードを攻撃者と共有するか、別の言語を使用するかを選択する必要がありますか?

私見では、特定のモジュールをPythonに書き込むことには何の問題もありません。秘密情報を隠すのは最悪で、他の人にとっては正しいバガーになります再利用(他のプログラマーを煩わせるがその目的)。Cで大部分をコーディングしてリンクすることもできます。ただし、明らかな理由から、他のモジュールではこれを行わないでください。

ただし、最終的には、ハッカーがコンピューターを制御できる場合、コンピューターにプライバシーはまったくありません。理論上の最悪のケースは、プログラムがVMで実行されており、ハッカーがBIOSやグラフィックカードを含むコンピューター上の all メモリに完全にアクセスでき、アプリケーションをステップ実行できることです。その秘密を発見するための認証を通して。

絶対的なプライバシーがない場合、残りは難読化されます。保護のレベルは、難読化がどれだけ難しいかと、熟練したハッカーが情報をどれだけ必要としているかということです。そして、 カスタムハードウェア および 10億ドルの製品 であっても、 終了 の方法は誰もが知っています。

Pythonキーリングを使用する

これは他のアプリケーションに関して非常に安全にキーを管理しますが、すべてのPythonアプリケーションはトークンへのアクセスを共有します。これはほんの少しではありません心配している攻撃の種類に対応します。

28
Andrew Alcock

私はこの分野の専門家ではなく、実際にはあなたと同じ問題を解決しようとしていますが、 Hashicorp's Vault のように見えます。

特に、サードパーティサービスの資格情報を保存する問題に対するWRT。例えば。:

API主導のすべての現代の世界では、多くのシステムがアクセス資格情報のプログラムによる作成もサポートしています。 Vaultは、動的シークレットと呼ばれる機能を通じてこのサポートを利用します。これは、オンデマンドで生成されるシークレットであり、自動失効もサポートします。

Vault 0.1の場合、VaultはAWS、SQL、およびConsul認証情報の動的生成をサポートします。

その他のリンク:

1
toast38coza