企業ODSを構築するとき(場合によっては、データウェアハウスの場合でも)、汎用ジョブ(いわゆるジェネリック)を作成することは理にかなっています。これは、外部から完全に構成可能であり、各テーブルに固有の情報を含まないため、多くのETLプロセスに使用できます。 これは、ソースデータベースからデータを抽出するときに特に必要です(抽出)。 この場合、各データソースのパスワードを構成ファイルに保存する必要があります。 また、さまざまな企業のセキュリティポリシーを遵守し、信頼性の高い暗号化アルゴリズムであるというふりをし、暗号化されたDataStage形式で企業データのパスワードを保存する必要があります。
ただし、このようなパラメーターをジョブに渡したい場合は問題が発生します。 この記事では、どのような問題とそれらを解決するかについて説明します。
実際、問題は何ですか?
ETLプロセスを記述する構成ファイルがあるとします。 格納されている形式は関係ありません。 たとえば、XMLを使用します。 この設定では、次のように、パスワードを暗号化された形式でデータベースに保存します。
<export> <parameters> <parameter name="SQL" handleQuotes="Y"> <value><![CDATA[select * from STAGING.TABLE]]></value> </parameter> <parameter name="DB" value="SAMPLEDB"/> <parameter name="USER" value="USER"/> <parameter name="PASSWORD" value="L<I@@9V8M=;M07GILIJLBK96BLN"/> </parameters> </export>
構成を読み取り、必要なパラメーターをジェネリックに抽出します。 まあ、このパスワードを暗号化されたパラメーターとしてジョブに渡そうとすると、DataStageはそれを暗号化されていないパスワードと見なし、再暗号化します。 さらに、どのように渡すかは関係ありません。シーケンサーでJobActivityまたはBasic DSSetParam関数を使用します。
DSXchangeおよびその他のStackOverflowには、これを行う方法に関する情報が含まれています。 しかし、これは何とか非常に平凡です。 外部暗号化/復号化ツールの使用や、オープン(文字列)フォームでの引き渡しパラメーターの使用などのオプションは、DataStageディレクターログでパスワードが発光するため、適切ではありません(内部アルゴリズムの信頼性については黙っており、公開秘密を保持していることを覚えています)。
問題の可能な解決策
- DataStage C APIを使用します。
- パラメーターファイルを作成し、dsjob -run -paramfileで使用します。
- パスワードをジョブに送信する前に解読します。
- 各データソースのParameterSetを作成します。
簡単に言うと、これらの方法はどれも機能しません。 まあ、または私たちは幸せではありません。 そして、ここに理由があります。
- 実際、APIには次のように記述されたDSPARAM構造が含まれています
typedef struct _DSPARAM { int paramType; union { char *pString; char *pEncrypt; int pInt; float pFloat; char *pPath; char *pListValue; char *pDate; char *pTime; } paramValue; } DSPARAM;
暗号化されたchar *pEncrypt
へのポインタが含まれchar *pEncrypt
。paramType
フィールドには、パラメーターのタイプ(この場合はDSJ_PARAMTYPE_ENCRYPTED
が含まれている必要があります。
私はこの方法を試していません。 事実、私の意見では、これはジョブを開始するだけで不合理に高価な方法であり、さらに、 ジョブを操作するロジック全体を実装する必要があります:開始、すべてのパラメータを転送し、そのステータスを追跡し、緊急終了の逆伝播でシーケンサにステータスを返すその場合(この場合、エラーハンドラーは例外をキャッチしません)。 ETLプロセスの可読性は低下し、かなり熟練した唐辛子のみがそのようなプロジェクトをサポートできます(はい、DataStageを知っているだけでなく、Cの知識もあるシニアを全員が採用できるわけではありません)。 とりわけ、クライアントは、コンパイルされたオブジェクトを配置する必要があるServer / PXEngine / libディレクトリ(Server / PXEngine / user_lib)を書き込む権利を常に付与するわけではありません。
まとめ:この蒸気機関車は飛ぶように見えますが、試行することは必ずしも意味をなさない - このオプションは機能しません。 一般的に。 DataStageは、DSSetParamの場合と同様に、パラメーターも再度暗号化します。 繰り返しになりますが、シーケンサーの外部でジョブを立ち上げることは、ソリューションの持続可能性の観点からはかなり不快なことです。 このオプションにも注意してください。
- はい、パスワードを簡単かつ簡単に解読できます。また、必要に応じて簡単に暗号化することもできます。 しかし、IBMは8.7以降のバージョンで暗号化アルゴリズムを変更し、より堅牢なAESに変更しました。 つまり ソリューションを移行すると(そして、信じられますが、遅かれ早かれこれが発生します)、DataStageの新しいバージョンでは動作しなくなります。 このオプションにも注意してください。
- 最初に思い浮かぶのは、sいことです。 次に来るのは、不便です。 戦闘環境では、別のデータソースを追加するたびに新しいParameterSetをリリースする必要があります。 3番目に、ジョブの開始時にパラメーターセットの名前を動的に変更できないため、これは機能しません。
問題解決
この問題を解決する方法は1つしか見つかりませんでした。 別の、より明白な解決策があるかもしれません。 しかし、彼のことは知りません。
[値]タブのParameterSets構成ダイアログに気づきました
私はこれまでこのタブを使用したことがないので、ほとんどの人がそれを使用せず、一般的にそれが必要な理由を知っていると思います。 このタブでは、作成した一連のパラメーターの値が保存されるテキストファイルの名前を指定できます。
このファイルはディレクトリに保存されます。
${PROJECT_DIR}/ParameterSets/__/
暗号化されたパラメーターがクリアテキストでこのファイルに保存されるとは信じられませんでした。 そうでない場合、DataStageはそれらを再暗号化しません。 仮説をテストします。
いいね! このファイルの内容を他のパラメーター(必要な暗号化されたパスワードに置き換える)で置き換え、このパラメーターセットでジョブの実行可能性を確認すると、すべてが正常に機能することがわかります。
ここで、1つのジョブの複数の独立したインスタンス(複数のインスタンスの場合)にパラメーターを渡すには、次の手順を実行する必要があります。
- 必須フィールドを使用してParameterSetを作成します。 多くのセットを作成する必要はありません。 1つだけ。 1つのセットは、フィールド値に複数のファイルを使用できます。
- ParameterSets構成の[値]タブでファイル名を指定します。 どれでも。 これは、DataStageがパラメーターのディレクトリーを作成するために必要です
- このパラメーターセットをジョブパラメーターに追加します
- 暗号化されたパラメーターでジョブを開始する前に、ジョブの各インスタンスに一意の名前を持つファイルを追加(および必要に応じて上書き)するプロセスを作成します。 ファイルをディレクトリ
${PROJECT_DIR}/ParameterSets/__/
書き込む必要があることを思い出させてください - ジョブを開始するには、ParameterSetのパラメーター値としてファイル名を指定する必要があります
ジョブが開始されると、DataStageは適用されたパラメーターをFrom値ファイルとしてマークすることに注意してください。
結論の代わりに
上記の方法は、バージョン> 8.5ではテストされていませんが、ここでは超自然的なものは何も使用しなかったため、理論的には動作するはずです。 DataStageアドミニストレーターでプロジェクトレベルでパラメーター値自体を宣言し、実行時に受け取ることをお勧めします。 DSParamsでは、すべての暗号化されたパラメーターも暗号化された形式で保存されるため、上記の考慮事項はすべてこの場合にも当てはまります。 たとえば、プロセスを構成するこの方法を使用します。
<export> <parameters> <parameter name="SQL" handleQuotes="Y"> <value><![CDATA[select count(*) from STAGING.TABLE]]></value> </parameter> <parameter name="PASSWORD"> <value><![CDATA[${SOURCE_PASSWORD}]]></value> </parameter> <parameter name="DB"> <value><![CDATA[${SOURCE_DB}]]></value> </parameter> <parameter name="USER"> <value><![CDATA[${SOURCE_USER}]]></value> </parameter> </parameters> </export>
ここで、SOURCE_ *はプロジェクト変数です。