Pythonスクリプトでパスワードを使用しない方法





パスワードを保持することは常に頭痛の種でした。 クラシックバージョンでは、ひどい秘密の「qwerty123」と、このパスワードからのハッシュを保存する情報システムを忘れないように一生懸命努力しているユーザーがいます。 優れたシステムは、ハッシュされたパスワードでデータベースを盗むことができる悪人の生活を害するために、ハッシュを慎重に解決します。 ここではすべてが明確です。 一部のパスワードはヘッドに格納され、一部はキーパスで暗号化されます。



紙からキーを慎重に入力する人をスキームから削除すると、すべてが変わります。 2つの情報システムの相互作用では、どのような場合でも、パスワードを送信して参照ハッシュと比較できるように、システムのオープンフォームでクライアント側にパスワードを保存する必要があります。 そして、この段階で、管理者は通常、自転車工場のローカルブランチを開き、スクリプトコード内の秘密キーを慎重に隠し、難読化し、埋め始めます。 これらのオプションの多くは役に立たないだけでなく、危険でもあります。 この問題に対する便利で安全なpythonの解決策を提供しようとします。 そして、powershellに少し触れます。



しない方法



誰もが「一時スクリプト」の概念に精通しています。 ここでは、文字通り、データのみをデータベースからすばやく解析して削除できます。 そして、突然、スクリプトが開発ゾーンから本番環境のどこかに既に移行していることがわかりました。 そして、最初の「使い捨て性」からの不快な驚きが現れ始めます。



最も一般的なオプションは、次のスタイルです。



db_login = 'john.doe' password = 'password!'
      
      





問題は、ここでパスワードがクリアに点灯し、自動検索によって古いスクリプトのデポジットの中から非常に簡単に検出されることです。 もう少し複雑なオプションは、パスワードを暗号化された形式でコード内に保存し、セキュリティのパスをあいまいさで追跡します。 同時に、復号化バックをすぐに実行する必要があります。そうしないと、クライアントはこのパスワードをサーバー側に提示できなくなります。 この方法では、さりげない外観から最大値を保存できますが、コードを手動で真剣に分析すると、秘密鍵を簡単に抽出できます。 以下のコードは、そのような「ショルダーサーファー」からのみ保存します。



 >>> import base64 >>> print base64.b64encode("password") cGFzc3dvcmQ= >>> print base64.b64decode("cGFzc3dvcmQ=") password
      
      





最も不快なシナリオは、gitなどのバージョン管理システムを機密情報付きのファイルに使用することです。 作成者がすべてのパスワードを消去することを決定した場合でも、それらはリポジトリの履歴に残ります。 実際、Gitで秘密データを使用してファイルを実行すると、それらが自動的に侵害されたと見なし、影響を受けるすべての資格情報を置き換える手順をすぐに開始できます。



システムストレージの使用



クールなキーリングライブラリがあります。 操作の基本原理は、OSの各ユーザーが独自の暗号化ストレージを持ち、ユーザーがシステムにログインした後にのみアクセスできるという事実に基づいています。 これはクロスプラットフォームであり、オペレーティングシステムによって提供されるパスワードの保存にバックエンドを使用します。





絶対に奇妙なことが必要な場合は、 代替のバックエンドを使用するか、独自のバックエンドを作成することもできます。



攻撃の難易度を比較する



スクリプトにパスワードを直接保存する場合、次のものが必要です



  1. コード自体を盗む(簡単)
  2. 必要に応じて難読化を解除する(簡単)


ローカルキーリングを使用する場合、攻撃者は次のことを行う必要があります。



  1. コード自体を盗む(簡単)
  2. 必要に応じて難読化を解除する(簡単)
  3. 攻撃されたユーザーとしてログインしてローカルマシンを侵害するには(難しい)


理論的には、現在のユーザーがシークレットパスワードのアクセス設定を知っている場合、ローカルストレージへのアクセスは、現在のユーザーに代わって実行されているローカルプログラムによって取得できます。 ただし、アカウントが侵害された場合、攻撃者はすべての機密データを傍受できるため、これは問題ではありません。 他のユーザーとそのソフトウェアは、ローカルキーストアにアクセスできません。



使用例



 import argparse import getpass import keyring def parse_arguments(): parser = argparse.ArgumentParser() parser.add_argument("-n", "--newpass", required=False, help="Set new password", action="store_true") arguments = parser.parse_args() return arguments def fake_db_connection(): # ,       -  db_name = 'very_important_db' db_host = '147.237.0.71' passwd = keyring.get_password(systemname, username) print('Connecting to db: {}'.format(db_name)) print('Using very secret password from vault: {}'.format(passwd)) print('Doing something important...') print('Erasing the database...') print('Task completed') #    systemname = 'important_database' username = 'meklon' args = parse_arguments() #    ,    --newpass if args.newpass: #      CLI password = getpass.getpass(prompt="Enter secret password:") #       try: keyring.set_password(systemname, username, password) except Exception as error: print('Error: {}'.format(error)) #          fake_db_connection()
      
      





パスワードセキュリティ



もう1つの一般的な秘密のパスワードリークは、コマンドライン履歴です。 ここでは、標準入力の使用は許可されていません。



 age = input("What is your age? ") print "Your age is: ", age type(age) >>output What is your age? 100 Your age is: 100 type 'int'>
      
      





上記の例では、すでにgetpassライブラリについて言及しました



 #      CLI password = getpass.getpass(prompt="Enter secret password:")
      
      





使用時にデータを入力することは、ログイン時の従来の* nixアプローチに似ています。 システムログのどの画面にもデータは書き込まれず、表示もされません。



Powershellについて少し



Powershellの場合、正しいオプションは標準のWindows資格情報ロッカーを使用することです。

これは、 CredentialManagerモジュールによって実装されます。



使用例:



 Install-Module CredentialManager -force New-StoredCredential -Target $url -Username $ENV:Username -Pass .... Get-StoredCredential -Target ....
      
      






All Articles