Pythonスクリプトからの資格情報の抽象化

Pythonは、自動化で最も人気のある言語のXNUMXつに急速に成長しました。 LogicMonitorがPythonをサポートしているのはそのためです LMポータルの管理 & スクリプトを使用して監視範囲を拡大する。 スクリプトの冒険中に、自分の仕事を次のレベルに引き上げたいと思うかもしれません。 広く適用できる改善のXNUMXつは、資格情報の抽象化です。

抽象化とその利点の定義

簡単に言えば、スクリプトの抽象化はコードの実装を隠します。 抽象化には、次のような多くの利点があります。

  • コードの読みやすさの向上またはコード実行の複雑さの軽減のポイント
  • コードの再利用性の向上
  • インターフェースの準備

これは、スクリプトでモジュールまたはライブラリを使用することについて話すときによく見られます。 他の誰かが手間のかかる作業を行い、詳細な作業をライブラリにパッケージ化しました。 私たちエンドユーザーは、抽象化されたバージョンの作業を使用するだけなので、より高いレベルの実装に集中できます。 Pythonの参入障壁が非常に低い理由の一部は、この一般的なアーキテクチャの抽象化によるものです。

資格情報を抽象化するためのユースケース

を使ってみましょう ロジックモニター REST API 例として。 API資格情報は、該当するポータルとXNUMX対XNUMXの関係にあります。XNUMXセットの資格情報は、XNUMXつのLMポータルに対してのみ機能します。 次の場合は、資格情報の抽象化を検討できます。

  1. ポータルごとにスクリプトの新しいコピーを保存する必要なしに、複数のLMポータルで使用するXNUMXつのスクリプトを作成しました。
  2. スクリプトを機能させたいが、スクリプトがホストされる場所の制御を支援する手段として、特定の環境で実行された場合のみ。
  3. スクリプトをGitリポジトリなどのバージョン管理システムにバックアップし、バックアップコピーに資格情報を直接保存しないようにします。

一般的な抽象化オプション

資格情報およびその他の潜在的に機密性の高いデータは、通常、次の場所から値を取得することにより、スクリプトから抽出されます。

  1. コマンドライン
  2. 環境変数

オプション1と2について説明します。スクリプト言語とプログラミング言語ごとに、これらのオプションの構文が異なることに注意してください。 Pythonでは、 引数解析 & os.getenv.

多くのインターネットの提案では、環境変数を取得するためにPythonのos.environメソッドを推奨しています。 ただし、アクセスしようとしている環境変数が実際に存在しない場合、os.environメソッドは例外をスローし、スクリプトの実行を途中で終了します。 os.getenvを使用すると、バックアップ値を定義して、環境変数が存在しない場合にデフォルト値が自動的に置き換えられるようにすることができます。 私の意見では、これはお互いに有利な状況です。

資格情報を抽象化するためのPythonスクリプトの例

#作成者:Jeoffri Davis#目的:#-LM REST API資格情報の抽象化の例#テスト対象:#-Python 3.7#-MacOS Mojave#必要なもの:#-Pythonモジュール:argparse#-LogicMonitor API資格情報(アクセスIDとアクセスキー)#入力:#-LogicMonitor API資格情報(アクセスIDとアクセスキー)#出力:#-資格情報をstdoutにエコーしますimport argparse import os def parse_command_line_arguments(): "" "コマンドラインから引数を解析し、結果をオブジェクトに返します。
 スクリプトから資格情報を抽象化すると、資格情報とセキュリティを変更する際の柔軟性を向上させることができます。
 argparseの使用:https://docs.python.org/3/howto/argparse.htmlデフォルト値も指定しながらOS環境変数を取得する:https://docs.python.org/3.7/library/os.html#os .getenv "" "#引数ヘルプ文字列を使用してハッシュテーブルを定義するarg_help = {'description': 'このスクリプトは、資格情報のハードコーディングを回避する方法を示しています。  \コマンドラインから資格情報を取得して\ out資格情報を抽象化するか、OS環境変数にフォールバックします。  \テストおよび本番環境でのスクリプトの実行を検討してください。  \テストでは、出力を標準出力に出力するデフォルトの出力\ verbosityが必要な場合があります。  \本番環境では、-qまたは--quietオプションを使用して、スクリプトの実行を高速化する必要がある場合があります。\標準出力への出力の出力をスキップします。 '、' access_key ':' LogicMonitor REST APIアクセスキー、\ LMポータルから入手可能> [設定]> [ユーザーと役割]> [APIトークン]、 'access_id': 'LogicMonitor REST APIアクセスID、\ LMポータルから入手可能> [設定]> [ユーザーと役割]> [APIトークン]、'会社 ':' LogicMonitorポータルの会社名 '、'静かな ':'スクリプト出力を非表示にする '}#引数を読み取るためにargparseを使用するparser = argparse.ArgumentParser(description = arg_help [' description '])parser.add_argument( "-a"、 "--access-key"、default = os .getenv( 'LM_ACCESS_KEY'、 'デフォルトキー')、help = arg_help ['access_key'])parser.add_argument( "-b"、 "--access-id"、default = os.getenv( 'LM_ACCESS_ID'、 'デフォルトID ')、help = arg_help [' access_id '])parser.add_argument( "-c"、 "--company-name"、default = os.getenv(' LM_COMPANY_NAME '、'デフォルトの会社 ')、help = arg_help ['company'])parser.add_argument( "-q"、 "--quiet"、action = 'store_true'、help = arg_help ['quiet '])args = parser.parse_args()return args def main():#コマンドラインから取得して資格情報を抽象化するか、#OS環境にフォールバックします。varscredentials= parse_command_line_arguments()#テストでのスクリプト実行を検討します。製造。
 #テストでは、デフォルトの出力の詳細度が必要な場合があります。これは、出力を標準出力に出力します。  実稼働環境では、#-qまたは--quietオプションを使用して、スクリプトの実行を高速化することができます。これにより、出力の出力が標準出力にスキップされます。

PythonArgparseなどのコマンドラインパーサーの利点

最新のコマンドラインパーサーには、一般にいくつかの利点があります。

  1. コマンドラインから、または事前定義されたデフォルトから値を取得する
  2. スクリプトの使用法を自動的に生成する

この例では、特定の情報(LogicMonitor資格情報(アクセスキー、アクセスID、会社))の値と、「quiet」と呼ばれる詳細オプションを定義するために、Pythonのargarseを使用しています。 これらは、値がスクリプトに直接ハードコーディングされていない変数です。 むしろ、値はスクリプトに渡されるか、スクリプトから「抽象化」されるため、別の情報ソースとのインターフェイスから取得される可能性があります。 XNUMX番目のスクリプトをラッパーとして使用して、PythonスクリプトのこのXNUMXつの元のコピーを複数のLMポータルに適用できます。 最初に資格情報を削除しなくても、スクリプトのコピーをXNUMX回または定期的にバックアップできます。 コマンドラインから明示的な資格情報を指定しなかった場合は、ターミナルセッションやコンテナなど、ホストのオペレーティングシステムレベル以下で定義された環境変数を利用できます。 これは、別の環境に移動して、環境変数を設定せずにスクリプトを実行しようとすると、同じスクリプトが失敗することを意味します。

言語のコマンドラインパーサーを使用するスクリプトは、通常、自動生成されたスクリプトの使用状況を確認するために、「-h」、「-help」、または同等のオプションを使用して呼び出すことができます。 Python の引数解析, グルーヴィーな ClBuilder, PowerShellコメントベースのヘルプ これが可能な場合の例です。

Pythonスクリプトの実行と出力の例

以下の例では、「ATX-JDAVIS:python_abstract_credentials jdavis $」はコマンドラインプロンプトであり、「abstracted_credentials.py」はサンプルコードを含むファイルであることに注意してください。

Pythonスクリプトの使用に関するヘルプの入手

これは、argparseによって自動的に生成されたスクリプトの使用状況を確認するために、Python argparseの「–help」オプションを使用してスクリプトを実行する例です。 

ATX-JDAVIS:python_abstract_credentials jdavis $ python3 ./abstracted_credentials.py --help使用法:abstracted_credentials.py [-h] [-a ACCESS_KEY] [-b ACCESS_ID] [-c COMPANY_NAME] [-q]このスクリプトは、資格情報のハードコーディングは避けてください。 コマンドラインから資格情報を取得して抽象化するか、OS環境変数にフォールバックします。 テストおよび本番環境でのスクリプトの実行を検討してください。 テストでは、出力を標準出力に出力するデフォルトの出力の詳細度が必要になる場合があります。 本番環境では、出力の標準出力への出力をスキップする-qまたは--quietオプションを使用して、スクリプトの実行を高速化することができます。 オプションの引数:-h、-helpこのヘルプメッセージを表示して終了します-a ACCESS_KEY、-access-key ACCESS_KEY LogicMonitor REST APIアクセスキー、LMポータル>設定>ユーザーとロール> APIトークンから利用可能-bACCESS_ID、- access-id ACCESS_ID LogicMonitor REST APIアクセスID、LMポータル>設定>ユーザーとロール> APIトークンから入手可能-cCOMPANY_NAME、-company-name COMPANY_NAME LogicMonitorポータルの会社名-q、-quietスクリプト出力を非表示にするATX-JDAVIS :python_abstract_credentials jdavis $

コマンドライン引数を使用した実行

この例では、デフォルトに依存するのではなく、コマンドライン引数の値を定義します。 このスクリプトを複数回、順次または並行して呼び出すと同時に、さまざまな入力を提供することもできます。 スクリプト自体。 ただし、すべての値が抽象化されるため、変更はありません。

ATX-JDAVIS:python_abstract_credentials jdavis $ python3 ./abstracted_credentials.py -a "「a」の短縮コマンドラインオプションを使用して、独自のアクセスキーを指定しました" --access-id "My Custom Access ID" -c " LogicMonitor "アクセスキー:「a」の短いコマンドラインオプションを使用して、独自のアクセスキーを指定しましたアクセスID:カスタムアクセスID会社:LogicMonitor静か:False ATX-JDAVIS:python_abstract_credentials jdavis $ 

デフォルトのコマンドライン引数値を使用した実行

これは、環境変数と事前定義されたデフォルトから値の組み合わせを取得しながらスクリプトを実行する興味深い例です。

 
ATX-JDAVIS:python_abstract_credentials jdavis $ python3 ./abstracted_credentials.pyアクセスキー:%c3)j}] 5_5mZ6gF)QkN $ 6-zV4L + [9Qd32V!{%n(}アクセスID:k9NzWaIQFImBu36aSWP8 :python_abstract_credentials jdavis $

コマンドライン引数を指定しませんでした。スクリプトが資格情報をチェックする順序は、コマンドライン、環境変数、そしてデフォルトです。 私の開発者環境には、アクセスキーとIDに対して定義された環境変数がありましたが、会社やクワイエットに対しては定義されていませんでした。 したがって、スクリプトは自動的にcompanyとquietのデフォルト値を使用しました。

静かなオプションでの実行

スクリプト出力を抑制する、刺激的ではないが必要な例。 クワイエットオプションはスイッチのように動作することに注意してください。 存在する場合、想定される値はブール値の「True」です。 それ以外の場合、想定される値はブール値の「False」です。

ATX-JDAVIS:python_abstract_credentials jdavis $ python3 ./abstracted_credentials.py --quiet ATX-JDAVIS:python_abstract_credentials jdavis $

通常、スクリプトの実行をリアルタイムで監視しない実稼働環境では、この静かなオプションが必要です。 この記事では取り上げていないログへの出力の書き込みは、出力を標準出力に抑制するための優れたコンパニオンです。

実装リスク

すべての点で完璧な実装はありません。 多くの場合、トレードオフを行い、不利な結果を軽減または受け入れる一方で、主要なメリットを追求します。 私たちが示したように資格情報を抽象化することのリスクのいくつかは以下を含みます。

コードの読みやすさと保守性

皮肉なことに、コードの複雑さは、特にコマンドライン解析が実装されている場所で増加します。 この例では、スクリプトのその部分を維持するために、Pythonargparseを理解する必要があります。 これは、スクリプトの柔軟性を高めるために避けられないトレードオフです。

大幅に強化されたセキュリティの誤った感覚

資格情報の可視性を下げることは、何もないよりはましです。 一方で、スクリプトがすぐに指数関数的に安全になったと考える人もいます。 セキュリティが主要な推進要因である場合、スクリプトから資格情報を抽象化することが重要な最初のステップになります。 ただし、プロセスレポートツールはスクリプトに渡されたコマンドラインオプションをキャプチャしてレポートできるため、そこで止まることはありません。

たとえば、macOSおよびLinux環境では、サンプルスクリプトに待機時間を挿入し、XNUMXつの端末でスクリプトを実行してから、 ps-ef 実行中のPythonプロセスをキャプチャするために、別のターミナルでコマンドを実行します。 ザ・ ps コマンドは、画面全体に相当する結果を返す場合があります。 結果をにパイプすることで、応答をフィルタリングできます。 grep、特定の文字列を検索できます。 「Canyoufind this?」のアクセスキーで実行されているサンプルスクリプトを見つけることができるため、資格情報は抽象化されていますが、完全に非表示になっているわけではありません。

ATX-JDAVIS:〜jdavis $ ps -ef | grep 'これを見つけることができますか?' 501 61873 61739 0 10:44 PM ttys000 0:00.04 /Library/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python ./abstracted_credentials.py --access-keyこれを見つけることができますか? 501 61979 61575 0 10:45 PM ttys005 0:00.00 grepこれを見つけることができますか? ATX-JDAVIS:〜jdavis $

セキュリティを強化するには、難読化と暗号化を調査します。 注目に値するトピックですが、この記事の焦点では​​ありません。

まとめ

この記事では、スクリプトから資格情報を抽象化する方法の多くの例のXNUMXつであるPythonargparseについて説明しました。 抽象化により、スクリプトを柔軟にし、さまざまな方法で拡張できます。 LM REST APIを利用するPythonスクリプトと、スクリプトを適用するポータルの数との間のXNUMX対XNUMXの関係を削除した例を確認しました。 全体的なユーザーエクスペリエンスを向上させるために、スクリプトの複雑さをXNUMXか所で増やすことに触れました。 最後に、抽象化は即時のセキュリティ改善とは一致しないことを明確にしました。