資格情報ストレージのコンテキストで考えられる脅威モデルの1つは、次の機能を持つ攻撃者です。
AFAIK、このタイプの攻撃に関するコンセンサスは、防ぐことは不可能であるということです(プログラムが実際に資格情報を使用するには、資格情報をメモリに保存する必要があるため)が、それを軽減するためのテクニックがいくつかあります。
最初の手法は実装が簡単で、おそらく キーリングを介して (できればカーネルスペースストレージ)
2つ目は、私の知る限り、Cモジュールを作成しないとまったく達成できません(ただし、ここで間違っていることが証明されるか、既存のモジュールのリストが必要です)。
3つ目は注意が必要です。
特に、pythonは非常に強力なイントロスペクションとリフレクション機能を備えた言語であるため、pythonコードを実行できる人が資格情報にアクセスするのを防ぐことは困難です。通訳プロセス。
プライベート属性を強制する方法はありません そして それを試みるとせいぜいあなたのコードを使用している他のプログラマーを苛立たせるでしょう というコンセンサスがあるようです。
これらすべてを考慮に入れて、Pythonを使用して認証資格情報を安全に保存するにはどうすればよいですか?ベストプラクティスは何ですか? 「すべてが公になっている」という言葉の哲学について何かできるでしょうか。私は知っています 「私たちはここで大人に同意しています」 しかし、パスワードを攻撃者と共有するか、別の言語を使用するかを選択することを強制する必要がありますか?
認証資格情報を保存する理由は2つあります。
最初のケースでは、パスワード(または暗号化されたバージョンのパスワード)を保存しないでください。代わりに、高品質のソルトを使用してパスワードを hash し、使用するハッシュアルゴリズムがPBKDF2やbcryptなどの(辞書攻撃を防ぐために)計算コストが高いことを確認する必要があります。詳細については、 Salted Password Hashing-Doing it Right を参照してください。このアプローチに従うと、ハッカーが塩漬けの低速ハッシュトークンを取得したとしても、それをうまく処理することはできません。
2番目のケースでは、秘密の発見を困難にするために行われるいくつかのことがあります(質問で概説しているように)。
そのようなアプローチは確かに何もないよりはましですが、熟練したハッカーは遅かれ早かれそれを破るでしょう。
理論的な観点から、認証は、挑戦された人が彼らが言っている人であることを証明する行為です。従来、これは共有シークレット(パスワード)を使用して実現されていましたが、次のような他の方法で自分自身を証明できます。
他のデバイス:
そして、より完全なリスト ここ
これらすべてのアプローチの共通点は、エンドユーザーがこれらのデバイスを制御し、秘密が実際にトークン/カード/電話から離れることはなく、プログラムに保存されることもないということです。これにより、それらははるかに安全になります。
ただし(ただし、常にあります):
ハッカーがセキュリティトークンにアクセスできないように、ログインを保護することに成功したとします。これで、アプリケーションはセキュリティで保護されたサービスとうまく相互作用しています。残念ながら、ハッカーがコンピュータ上で任意の実行可能ファイルを実行できる場合、ハッカーは、たとえばサービスの有効な使用に追加のコマンドを挿入することによって、セッションを乗っ取ることができます。つまり、パスワードを保護していても、ハッカーは「保護された」リソースにアクセスできるため、パスワードはまったく関係ありません。
複数のクロスサイトスクリプティング攻撃が示すように、これは非常に現実的な脅威です(1つの例は .S。Bank and Bank of America Websites Vulnerable ですが、他にも数え切れないほどあります)。
上で説明したように、アプリケーションがログオンできるように、サードパーティのサービスまたはシステムでアカウントの資格情報を保持することには基本的な問題があります。特に、ログオン方法がユーザー名とパスワードのみの場合はそうです。
サービスへの通信を安全なプロキシに委任することでこれを部分的に軽減し、アプリケーションとプロキシ間の安全なサインオンアプローチを開発する1つの方法。このアプローチでは
このアプローチの欠点は次のとおりです。
それで、特定の答えに移ります:
Pythonを使用して認証資格情報を安全に保存するにはどうすればよいですか?
「すべてが公になっている」という言葉の哲学について何かできるでしょうか。 「私たちは皆、ここで大人に同意している」ことを知っていますが、パスワードを攻撃者と共有するか、別の言語を使用するかを選択する必要がありますか?
私見では、特定のモジュールをPythonに書き込むことには何の問題もありません。秘密情報を隠すのは最悪で、他の人にとっては正しいバガーになります再利用(他のプログラマーを煩わせるがその目的)。Cで大部分をコーディングしてリンクすることもできます。ただし、明らかな理由から、他のモジュールではこれを行わないでください。
ただし、最終的には、ハッカーがコンピューターを制御できる場合、コンピューターにプライバシーはまったくありません。理論上の最悪のケースは、プログラムがVMで実行されており、ハッカーがBIOSやグラフィックカードを含むコンピューター上の all メモリに完全にアクセスでき、アプリケーションをステップ実行できることです。その秘密を発見するための認証を通して。
絶対的なプライバシーがない場合、残りは難読化されます。保護のレベルは、難読化がどれだけ難しいかと、熟練したハッカーが情報をどれだけ必要としているかということです。そして、 カスタムハードウェア および 10億ドルの製品 であっても、 終了 の方法は誰もが知っています。
Pythonキーリングを使用する
これは他のアプリケーションに関して非常に安全にキーを管理しますが、すべてのPythonアプリケーションはトークンへのアクセスを共有します。これはほんの少しではありません心配している攻撃の種類に対応します。
私はこの分野の専門家ではなく、実際にはあなたと同じ問題を解決しようとしていますが、 Hashicorp's Vault のように見えます。
特に、サードパーティサービスの資格情報を保存する問題に対するWRT。例えば。:
API主導のすべての現代の世界では、多くのシステムがアクセス資格情報のプログラムによる作成もサポートしています。 Vaultは、動的シークレットと呼ばれる機能を通じてこのサポートを利用します。これは、オンデマンドで生成されるシークレットであり、自動失効もサポートします。
Vault 0.1の場合、VaultはAWS、SQL、およびConsul認証情報の動的生成をサポートします。
その他のリンク: