- PVSM.RU - https://www.pvsm.ru -
Не секрет, что зашифрованные параметры (т.е. имеющие тип Encrypted), используемые в IBM DataStage в версиях до 8.7 очень легко расшифровать. Эти зашифрованные параметры часто используются для передачи паролей, необходимых для соединения с базами данных.
При постороении корпоративных ODS (а в некоторых случаях даже и в случае хранилищ данных) имеет смысл создавать универсальные джобы — так называемые генерики, которые полностью конфигурируются извне и не содержат специфичной для каждой таблицы информации, а поэтому их можно использовать для многих ETL процессов. Особенно это необходимо при извлечении данных из баз данных источников (Extraction). В таком случае необходимо хранить в файлах конфигураии пароли для каждого источника данных. И вам приходится, прогибаясь под политики безопасности различных предприятий, делать вид, что это надежный алгоритм шифрования и хранить пароли к корпоративным данным в зашифрованном 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>
Вы считываете конфигурацию, извлекаете необходимые параметры генерику. Ну и вот если этот пароль вы попытаетесь передать в качестве Encrypted параметра джобу, то DataStage расценит его как незашифрованный пароль и зашифрует повторно. Причем, не важно как вы передадите: в секвенсере через JobActivity или через фукнцию Basic DSSetParam.
DSXchange и прочие StackOverflow содержат кое-какую информацию о способах как это сделать. Но все это как-то очень посредственно относится к делу. Варианты вроде использования внешних средств шифрования/дешифрования и последующей передачи параметров в открытом (String) виде нас не устроят, так как пароли будут светиться в логе DataStage Director (мы же помним, что относительно надежности внутреннего алгоритма мы молчим и храним секрет Полишинеля).
Кратко: ни один из этих способов не работает. Ну или нас не устраивает. И вот почему.
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. Поле paramType должно содержать тип параметра, в данном случае — DSJ_PARAMTYPE_ENCRYPTED.
Я не пробовал этот способ. Дело в том, что, на мой взгляд, это слишком неоправданно затратный способ всего лишь запустить джоб, кроме того, придется реализовывать всю логику работы с джобом: запуск, передача всех параметров, отслеживание его состояния и возвращение статуса в секвенсер с обратной пропагацией аварийного завершения в случае чего (Error Handler не поймает исключение в таком случае). Читаемость ETL процесса упадет и поддерживать такой проект уже будет под силу только довольно скилованным перцам (да, не все могут нанимать сеньоров, обладающих помимо знания DataStage еще и знаниями C). Помимо всего прочего, не всегда клиент вам предоставит право на запись каталога Server/PXEngine/lib (Server/PXEngine/user_lib) куда необходимо будет положить скомпилированный объект.
Резюмируя: похоже, что этот паровоз полетит, но пробовать не всегда имеет смысл
Я нашел только один способ решения этой проблемы. Может быть существует и другое, более очевидное решение. Но я о нем не знаю.
Я обратил внимание в диалоге конфигурации ParameterSets на вкладку Values

Я никогда ранее не использовал эту вкладку и смею предположить, мало кто ее использовал и вообще знает зачем она нужна. В этой вкладке можно указать имя текстового файла, в котором будут храниться значения созданного вами набора параметров.
Этот файл хранится в каталоге
${PROJECT_DIR}/ParameterSets/ИМЯ_НАБОРА_ПАРАМЕТРОВ/
Я не мог поверить, что Encrypted параметры будут храниться в этом файле в открытом виде. А раз это не так, то DataStage не будет их шифровать повторно. Проверяем гипотезу.

Отлично! Если заменить теперь содержимое этого файла на другие параметры (подставив нужный нам зашифрованный пароль) и проверить работоспособность джоба с этим набором параметров то мы увидим, что все работает как нужно.
Теперь, для того, чтобы передать параметры для нескольких независимых инстанций одного джоба (если он Multiple Instance), нужно будет выполнить следующие шаги:
${PROJECT_DIR}/ParameterSets/ИМЯ_НАБОРА_ПАРАМЕТРОВ/
Указанный выше способ не тестировался нами в версиях >8.5, но по идее должен работать, так как ничего сверхъестественного мы здесь не использовали. Сами значения параметров лучше объявлять на уровне проекта в DataStage Administrator и получать их в процессе выполнения. В DSParams все Encrypted параметры хранятся также в зашифрованном виде, поэтому все приведенные выше размышления касаются и этого случая. Например, мы используем такой способ конфигурирования наших процессов:
<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_* — это переменные проекта.
Автор: Geckelberryfinn
Источник [1]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/sql/51060
Ссылки в тексте:
[1] Источник: http://habrahabr.ru/post/206530/
Нажмите здесь для печати.