Вопрос: Начальная задача в z / OS не имеет привилегий RACF


Я хочу протестировать реализацию сервера JDBC под управлением z / OS. Обычным подходом было бы определить процедуру JCL и запустить ее как запущенную задачу. Для запуска задачи требуется идентификатор пользователя, под которым он будет работать. Банки JDBC помещаются в файловую систему ZFS, установленную в OMVS.

Пользователь для запускаемой задачи требует определенных привилегий RACF. Этому был предоставлен следующий JCL

//RUNRACF  EXEC PGM=IKJEFT01
//SYSUADS  DD DSN=SYS1.UADS,DISP=SHR
//SYSLBC   DD DSN=SYS1.BRODCAST,DISP=SHR
//SYSTSPRT DD SYSOUT=*
//SYSTSIN  DD *
AU JDBCUSR NAME('JDBC STC USER') PASSWORD(JDBCUSR) -
    OWNER(IBMUSER) DFLTGRP(STCGROUP) -
    UACC(READ)  OMVS(HOME(/u/zfs4svr) PROGRAM(/bin/sh) UID(3005) -
FILEPROCMAX(131072))

RDEFINE STARTED SVRPROC.** STDATA(USER(JDBCUSR) GROUP(STCGROUP) -
TRUSTED(NO))

SETROPTS CLASSACT(STARTED)
SETROPTS RACLIST(STARTED) REFRESH

PERMIT BPX.SERVER ACCESS(READ) CLASS(FACILITY) -
  ID(JDBCUSR)

SETROPTS CLASSACT(FACILITY)
SETROPTS RACLIST(FACILITY) REFRESH

Когда я запускаю задачу, в SYSOUT появляется следующее сообщение об ошибке:

JVMJZBL1001N JZOS batch Launcher Версия: 2.4.4 2013-05-07
  JVMJZBL1002N (C) Copyright IBM Corp. 2005, 2012
  JVMJZBL1009E Процесс оболочки ребенка завершен без среды печати;   // STDENV не должен содержать «выход» JVMJZBL1042E JZOS пакетная пусковая установка   не удалось, код возврата = 101

Посмотрев это и прочитав, что Документация поддержки IBM должен был сказать, что я и мои коллеги были довольно смущены. Затем я попытался запустить сервер как прямое задание. У пользователя для задания были права системного администратора. Это работает, и мы можем протестировать сервер JDBC. Попытка выполнить задание с пользователем для процедуры приводит к той же ошибке, что и выше.

Очевидно, что JDBCUSR не имеет какой-либо привилегии. Чтобы запустить сервер как запущенную задачу, мне нужно знать, каких недостатков нет. Мы, конечно же, не хотим давать начальные права администратора системы пользователей.

Есть ли способ узнать, чего не хватает? Это очень расстраивает.

Изменить 11.10.2016

Следующий JCL - это работа, которая работает, когда <user> имеет права администратора системы:

//V4JSRV   JOB USER=<user>,PASSWORD=<password>,REGION=200M
//*
//*******************************************************************
//* Call the server as a job
//*******************************************************************
//PROCS    JCLLIB ORDER=(ACHIM.JDBCSRV.CNTL)
//SRV      EXEC PROC=SRVPROC
//STDENV   DD DISP=SHR,DSN=ACHIM.JDBCSRV.CNTL(SRVENV)
//STRCTREP DD DISP=SHR,DSN=ACHIM.JDBCSRV.STRCTREP

Процедура выглядит так:

//JDBCPROC  PROC JAVACLS='de.ubs.du.jdbcserver.Server',
//   ARGS='-p 5431 LOG-LEVEL=FINE',
//   LEPARM='',
//   LOGLVL='+T'
//JAVAJVM  EXEC PGM=JVMLDM70,REGION=200M,
//   PARM='&LEPARM/&LOGLVL &JAVACLS &ARGS'
//*JDBCPROC  PROC
//*JAVAJVM  EXEC PGM=JVMLDM70,REGION=200M,
//*   PARM='de.ubs.du.jdbcserver.Server -p 5431 LOG-LEVEL=FINE'
//STEPLIB  DD DSN=JVA700.SIEALNKE,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*
//CEEDUMP  DD SYSOUT=*
//ABNLIGNR DD DUMMY

Как вы видите, работа выполняет не что иное, как выполнение процедуры. когда <user> это имя пользователя для начатой ​​процедуры, вышеописанная ошибка возникает, когда пользователь является администратором, тогда работа выполняется нормально. Очевидно, чтобы запустить его как запущенную задачу, proc будет скопирован в общедоступную библиотеку proc (USER.PROCLIB, если быть точным).

Ничего особенного в этом нет. На самом деле это довольно банально. Вот почему мы подозреваем, что это проблема RACF.

Редактировать (2) 11.10.2016

Это еще не решение, но мне удалось локализовать проблему. Начальная процедура функционирует, если ей присваивается атрибут TRUSTED. Это фактически означает, что запущенная задача рассматривается как «суперпользователь» в z / OS Unix (другими словами, она имеет привилегии root). Итак, теперь нужно определить, что нужно нашему серверу, что на сегодняшний день доступно только при работе суперпользователя. Когда я узнаю, я отправлю решение.

Редактировать (3) 12.12.2016

После добавления трассировки (см. Модифицированный proc выше) возникает следующая ошибка:

JVMJZBL2999T ->invokeMain()                                                           
JVMJZBL2999T javaClassName: 'de.ubs.du.jdbcserver.Server'                              
JVMJZBL2999T Arg 1='-p'                                                                
JVMJZBL2999T Arg 2='5431'                                                              
JVMJZBL2999T Arg 3='LOG-LEVEL=FINE'                                                    
JVMJZBL1023N Invoking de.ubs.du.jdbcserver.Server.main()...                            
JVMJZBL1056I Arguments to main...                                                      
JVMJZBL1057I -p                                                                        
JVMJZBL1057I 5431                                                                      
JVMJZBL1057I LOG-LEVEL=FINE                                                            
JVMJZBL2999T -> JniUtil.convert()                                                      
JVMJZBL2999T <- JniUtil.convert()                                                      
JVMJZBL2008E Could not find or load class: de.ubs.du.jdbcserver.Server                 
JVMJZBL2999T -> JniUtil.writeStackTrace()                                              
JVMJZBL2007E Stack trace follows:                                                      
java.lang.NoClassDefFoundError: de.ubs.du.jdbcserver.Server                            
Caused by: java.lang.ClassNotFoundException: de.ubs.du.jdbcserver.Server               
.at java.net.URLClassLoader.findClass(URLClassLoader.java:588)                         
.at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:756)                        
.at java.lang.ClassLoader.loadClass(ClassLoader.java:724)                              
.at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:313)                      
.at java.lang.ClassLoader.loadClass(ClassLoader.java:703)                              
JVMJZBL2999T <- JniUtil.writeStackTrace()                                              

JVMJZBL2999T <- invokeMain()                                                           
JVMJZBL2999T <- run()                                                                  
JVMJZBL2999T -> cleanup()                                                              
JVMJZBL1014I Waiting for non-deamon Java threads to finish before exiting...           
JVMJZBL2999T JvmExitHook entered with exitCode=0, javaMainReturnedOrThrewException=0   
JVMJZBL1042E JZOS batch launcher failed, return code=100                               
JVMJZBL2999T DestroyJavaVM elapsed time=0.031311 seconds, cpu time=0.021000 seconds    
JVMJZBL2999I JZOS batch launcher elapsed time=7 seconds, cpu time=5.090000 seconds     
JVMJZBL1047W JZOS batch launcher completed with Java exception, return code=100        
JVMJZBL2999T <- cleanup()

Просто почему мы получаем эту ошибку времени выполнения, неясно. На этом этапе это больше не похоже на проблему с разрешениями.


5
2017-10-10 10:54


Источник


Я не уверен, что JDBCUSR не хватает полномочий. Я предполагаю, что это разница в профиле среды для этого пользователя и тех, которые работают. Или, может быть, это просто что-то странное в запущенной JCL-программе, которую вы не показывали, но если вы использовали тот же JCL с другим идентификатором пользователя, то это, вероятно, не так. - randomScott
Я редактировал исходный запрос, чтобы включить работу JCL и proc. Одна вещь, о которой говорили мои коллеги, это возможность того, что есть определенное разрешение RACF, которое требуется для того, чтобы пользователь мог запускать Java-программы в z / OS. Разрешение, которое имеет пользователь admin, но отсутствует для начального пользователя задачи (или любого другого в нашей системе, если на то пошло). - Achim Schmitz
Кажется, randomScott является правильным. У меня не было много времени, чтобы посвятить эту проблему, поскольку мы можем протестировать, используя идентификатор журнала системного администратора. Тем не менее мне удалось проследить, внеся некоторые изменения в proc. Результат показан в разделе «Редактировать» (3). NoClassDefFound немного сложно понять, так как класс точно там, где вы ожидаете. Когда я это выясню, я опубликую свои выводы. - Achim Schmitz


Ответы:


Наконец, я успел вернуться к этой проблеме. Первоначальная проблема была довольно неясной. Посмотрев на несколько форумов, выяснилось, что в элементе ACHIM.JDBCSRV.CNTL (SRVENV) произошла ошибка. В нем была строка:

. /etc/profile

Удаление этой исправленной первой ошибки, которая была вызвана неявным «выходом» в конце любого сценария bash. Если вы делаете что-то подобное и действительно требуете настройки в /etc/profile скрипт, тогда я могу только предложить вам скопировать содержимое скрипта в вас //STDENV данные.

После этого появилась новая ошибка:

java.lang.NoClassDefFoundError: de.ubs.du.jdbcserver.Server

Это было показано в правиле (3), выше. Это оказалось проблемой с разрешениями. В задании по настройке разрешений RACF в системе SYSTSIN DD есть следующее:

OMVS(HOME(/u/zfs4svr)...

Это указывает точку монтирования файловой системы ZFS, содержащую банки, используемые JDBCUSR, при запуске задачи. Соответствующее задание монтирования выполнялось пользователем администратора. Соответствующие этапы работы:

//REPRO    EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  DELETE '<HLQ>.JDBCSRV.ZFS'
  SET MAXCC = 0
  DEFINE CLUSTER ( -
     NAME('<HLQ>.JDBCSRV.ZFS') -
     LINEAR CYL(50 1) -
     SHAREOPTIONS(3,3) -
  )
  REPRO INDATASET(<HLQ>.JDBCSRV.REPRO) -
         OUTDATASET(<HLQ>.JDBCSRV.ZFS)
//****************************************************
//SHELLCMD EXEC PGM=BPXBATCH,COND=(4,LT),
//    PARM='SH mkdir -p /u/zfs4fb'
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*
//*************************************************
//SHELLCMD EXEC PGM=BPXBATCH,COND=(4,LT),
//    PARM='SH chown -R JDBCUSR:STCGROUP /u/zfs4fb'
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*
//**************************************************
//SHELLCMD EXEC PGM=BPXBATCH,COND=(4,LT),
//    PARM='SH chmod -R 770 /u/zfs4fb'
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*
//**************************************************
//MOUNT    EXEC PGM=IKJEFT01,COND=(4,LT)
//SYSTSPRT DD SYSOUT=*
//SYSTSIN  DD *
  MOUNT -
     FILESYSTEM('''<HLQ>.JDBCSRV.ZFS''') -
     TYPE(HFS) -
     MODE(RDWR) -
     MOUNTPOINT('/u/zfs4fb')        

Трудность здесь заключалась в том, что владелец и права на /u/zfs4fb установлены для разрешения доступа JDBCUSR, однако пакеты внутри все еще принадлежат пользователю, выполняющему задание. Мы изменили доступ для чтения / записи для содержимого непосредственно в OMVS. Это поставило проблему. Чтобы исправить это в скрипте, необходимо изменить порядок рабочих этапов. В этом случае размещение 2 //SHELCMD шаги с chmod а также chown команд после //MOUNT шаг исправил проблему

Были и другие проблемы с нашей задачей. При инициализации сервера свойство user.dir используется. Я не уверен, где именно, но, похоже, это связано с JVM для z / OS. Это заняло немного времени, потому что мы не могли определить, откуда взялась эта ценность. При запуске в качестве задания, представленного пользователем admin (IBMUSER), значение было «/ u / ibmuser». Однако при запуске как запущенной задачи значение было «.», Что вызвало ошибку:

java.lang.ExceptionInInitializerError                         
.at java.lang.J9VMInternals.initialize(J9VMInternals.java:258)
...
Caused by: java.lang.RuntimeException: default directory must be absolute 
.at sun.nio.fs.UnixFileSystem.<init>(UnixFileSystem.java:55)              
...

Исправление заключалось в том, чтобы поместить команду cd /u/zfs4fb в конце //STDENV сценарий среды. Фактически это может быть любой каталог, для которого пользователь STC (в данном случае JDBCUSR) имеет разрешение на чтение.

Надеюсь, этот тур по открытию поможет кому-то еще попытаться договориться с подобными проблемами.


0
2018-04-10 13:05



Если ваш /etc/profile вызывает ошибки, я бы попытался отладить это. По умолчанию это будет влиять на все интерактивные логины. - chicks
/etc/profile сам по себе устанавливает только некоторые переменные среды и umask, ни один из которых не имеет отношения к серверу или процессу, который его вызывает. Проблема заключается в том, что он создан в сценарии среды для proc. У исходного сценария всегда есть неявный «выход» в конце, вызывающий сообщение об ошибке: // STDENV не должен содержать «exit». Думаю, я должен объяснить это в своем ответе. - Achim Schmitz