/TITLE FTPRQSVLD Firewall Program for FTP Request Validation
*--------------------------------------------------------------*
* Programmers Group & Management Resources Copyright 1999 *
* *
* \\\\\\\ *
* ( o o ) *
*---------------------oOOO----(_)----OOOo----------------------*
* *
* System name. . : Security *
* System name. . : Technical Support *
* Module/Program : FTPRQSVLD *
* Text . . . . . : Firewall for FTP Request Validation *
* *
* Author . . . . : Alex Nubla *
* Description. . : This program must be added to the exit *
* point QIBM_QTMF_CLIENT_REQ and *
* QIBM_QTMF_SERVER_REQ. *
* *
* OOOOO OOOOO *
* ( ) ( ) *
*--------------------( )-------------( )-------------------*
* (_) (_) *
* *
* Modification Log : *
* *
* Task Programmer/ *
* Date No. Description *
* -------- ------ -------------------------------------------- *
* 10/19/98 Alex Nubla *
* Creation Date *
* *
*--------------------------------------------------------------*
* *
* Modules: *
* *
* 1. FTPRQSVLD RPGLE FTP Request Validation Exit Program *
* *
* Service Programs: *
* *
* 1. *NONE *
* *
* Programs: *
* *
* 1. *NONE *
* *
*--------------------------------------------------------------*
* *
* APIs Used: *
* *
* QSYRUSRA Retrieve user authority to object *
* *
*--------------------------------------------------------------*
H COPYRIGHT('(C) Alex Nubla of PGMR, Inc. 1998')
D/EJECT
****************************************************************
* D E F I N I T I O N S P E C I F I C A T I O N *
****************************************************************
*--------------------------------------------------------------*
*
* Retrieve user authority to Object (QSYRUSRA) API
*
D@RtnObjAut DS 93
D @UA2byte 9B 0 Inz
D @UA2avail 9B 0 Inz
D @UA2ObjAut 10 Inz
*
D @UA2Len S 9B 0 Inz(93)
D @UA2Format S 8 Inz('USRA0100')
D @UA2User S 10 Inz
D @UA2Object S 20 Inz('FTPLOGON QSYS ')
D @UA2OType S 10 Inz('*AUTL')
*--------------------------------------------------------------*
*
* Retrieve library description (QLIRLIBD) API
*
D@RtnLibDsc DS 33
D @LDByte 9B 0 Inz
D @LDAvail 9B 0 Inz
D @LDLenRtn 9B 0 Inz
D @LDLenAvail 9B 0 Inz
D @LDRecord 17 Inz
D @LDRLen 9B 0 overlay(@LDRecord: 1)
D @LDRKey 9B 0 overlay(@LDRecord: 5)
D @LDRSize 9B 0 overlay(@LDRecord: 9)
D @LDRType 1 overlay(@LDRecord: 13)
*
D@RtvAttr DS
D @AttrElm 9B 0 Inz(1)
D @ReqKey 9B 0 Inz(1)
*
D @LDLen S 9B 0 Inz(33)
D FtpLib S 10 Inz
D FtpPath S 256 Inz
D Str S 5S 0 Inz
D Pos S 5S 0 Inz
D Len S 5S 0 Inz
*
D Production C '0'
D Test C '1'
*--------------------------------------------------------------*
*
* Record structure for error code parameter
*
D@ErrData DS
D @BytesProv 9B 0 Inz(200)
D @BytesAval 9B 0
D @ExcpId 7
D @Reserved1 1
D @ExcpData 184
*--------------------------------------------------------------*
*
* TCP/IP Application Request Validation Exit Point Interface
*
* *------------------------------------------------------------*
* | 1 | Application identifier | Input | Binary(4) |
* | | | | |
* | | 0 = FTP client program | | |
* | | 1 = FTP server program | | |
* | | | | |
* |----+------------+----------------+--------+----------------|
* | 2 | Operations identified | Input | Binary(4) |
* | | | | |
* | | 0 = Session initialization | | |
* | | 1 = Directory/library | | |
* | | creation | | |
* | | 2 = Directory/library | | |
* | | deletion | | |
* | | 3 = Set current directory | | |
* | | 4 = List files | | |
* | | 5 = File deletion | | |
* | | 6 = Sending file | | |
* | | 7 = Receiving file | | |
* | | 8 = Renaming file | | |
* | | 9 = Execute CL command | | |
* | | | | |
* |----+------------+----------------+--------+----------------|
* | 3 | User profile | Input | Char(10) |
* |----+------------+----------------+--------+----------------|
* | 4 | Remote IP address | Input | Char(*) |
* |----+------------+----------------+--------+----------------|
* | 5 | Length of remote IP address | Input | Binary(4) |
* |----+------------+----------------+--------+----------------|
* | 6 | Operation-specific | Input | Char(*) |
* | | information | | |
* |----+------------+----------------+--------+----------------|
* | 7 | Length of | Input | Binary(4) |
* | | operation-specific | | |
* | | information | | |
* |----+------------+----------------+--------+----------------|
* | 8 | Allow operation | Output | Binary(4) |
* | | | | |
* | | -1 = Never allow the | | |
* | | operation identifier | | |
* | | 0 = Reject the operation | | |
* | | 1 = Allow the operation | | |
* | | 2 = Always allow this | | |
* | | operation identifier | | |
* | | | | |
* *------------------------------------------------------------*
*
* Exit Point: QIBM_QTMF_CLIENT_REQ
* QIBM_QTMF_SERVER_REQ
* QIBM_QTMX_SERVER_REQ
* QIBM_QTOD_SERVER_REQ
*
D AppId S 9B 0
D OperRqs S 9B 0
D User S 10
D IpAddr S 15
D IpAddrLen S 9B 0
D OperInf S 999
D OperInfLen S 9B 0
D AllowOper S 9B 0
D FullJob S 26
D SessionInz C 0
D MakeDir C 1
D DelDir C 2
D ChgDir C 3
D ListFile C 4
D DelFile C 5
D PutFile C 6
D GetFile C 7
D RnmFile C 8
D SysCmd C 9
D NeverAllow C -1
D Reject C 0
D Allow C 1
D AlwaysAllw C 2
*--------------------------------------------------------------*
*
* Standalone fields
*
D Message S 52
D Internet S 15
*--------------------------------------------------------------*
*
* Constants
*
D @LO C 'abcdefghijklmnopqrstuvwxyz'
D @UP C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
*
D Client C 0
D Server C 1
*
D Warn1 C ' FTP REQUEST: '
D Warn2 C ' =================================-
D =================='
D Warn3 C ' The following info was logged fro-
D m the Server:'
*
D Anonymous C 'ANONYMOUS '
D Special C 'ZFTP'
D Qtcp C 'QTCP'
D QsysLib C '/QSYS.LIB/'
D DotLib C '.LIB'
C/EJECT
****************************************************************
* C A L C U L A T I O N S P E C I F I C A T I O N *
****************************************************************
*
C *Entry Plist
*
* Input parameters
C Parm AppId
C Parm OperRqs
C Parm User
C Parm IpAddr
C Parm IpAddrLen
C Parm OperInf
C Parm OperInfLen
*
* Return parameters
C Parm AllowOper
*
C Eval AllowOper = Allow
C If User <> Special and
C User <> Qtcp
*----------------------------------------------------*
* Determine client or server request *
*----------------------------------------------------*
B01 C Select
* *------------------------------------------*
* * Client FTP request *
* *------------------------------------------*
C When AppId = Client
C Exsr $ClientRq
* *------------------------------------------*
* * Server FTP request *
* *------------------------------------------*
C When AppId = Server
C Exsr $ServerRq
E01 C EndSl
*
E01 C EndIf
*
C Eval *InLR = *On
C Return
/EJECT
****************************************************************
* S U B R O U T I N E S *
****************************************************************
/SPACE
*==============================================================*
* *
* Validate FTP Client Request *
* *
C $ClientRq BegSr
*==============================================================*
*----------------------------------------------------*
* Validate client request (job on this server) *
*----------------------------------------------------*
C Select
* *------------------------------------------*
* * Rejected requests *
* *------------------------------------------*
C When OperRqs = MakeDir or
C OperRqs = DelDir or
C OperRqs = DelFile or
C OperRqs = RnmFile or
C OperRqs = SysCmd
C Eval AllowOper = NeverAllow
*
* *------------------------------------------*
* * Accepted requests - have the server *
* * system validate our request. *
* *------------------------------------------*
C When OperRqs = ChgDir or
C OperRqs = ListFile or
C OperRqs = PutFile or
C OperRqs = GetFile
C Eval AllowOper = Allow
E02 C EndSl
*
C #ClientRq EndSr
C/EJECT
*==============================================================*
* *
* Validate FTP Server Request *
* *
C $ServerRq BegSr
*==============================================================*
*----------------------------------------------------*
* User id accepted at this point *
*----------------------------------------------------*
*
B02 C Select
* *------------------------------------------*
* * Rejected requests *
* *------------------------------------------*
C When OperRqs = MakeDir or
C OperRqs = DelDir or
C OperRqs = DelFile or
C OperRqs = RnmFile or
C OperRqs = SysCmd
C Eval AllowOper = NeverAllow
*
* *------------------------------------------*
* * Accepted requests - only for TEST type *
* * library. *
* *------------------------------------------*
C When OperRqs = ChgDir or
C OperRqs = ListFile or
C OperRqs = PutFile or
C OperRqs = GetFile
C Eval AllowOper = Allow
*
C Reset FtpLib
C Eval FtpPath = %Subst(OperInf: 1: OperInfLen)
C @Lo:@Up Xlate FtpPath FtpPath
C QSysLib Scan FtpPath Pos 90
*
C If *In90
C Eval Str = Pos + 10
C DotLib Scan FtpPath:Str Pos 89
C If *In89
C Eval Len = Pos - Str
C Eval FtpLib = %Subst(FtpPath: Str: Len)
C Else
C Eval FtpLib = 'QSYS'
C EndIf
*
C Call 'QLIRLIBD'
C Parm @RtnLibDsc
C Parm @LDLen
C Parm FtpLib
C Parm @RtvAttr
C Parm @ErrData
*
C If @LDRType = Production
C Eval AllowOper = Reject
C Else
* *------------------------------------------*
* * Log the request to QSYSOPR *
* *------------------------------------------*
C Warn2 Dsply 'QSYSOPR'
C Select
C When OperRqs = ChgDir
C Eval Message = %Trimr(Warn1) +
C ' CHANGE DIRECTORY'
C When OperRqs = ListFile
C Eval Message = %Trimr(Warn1) +
C ' LIST THE NAMES'
C When OperRqs = PutFile
C Eval Message = %Trimr(Warn1) +
C ' COPY OUR PATH TO REMOTE IP'
C When OperRqs = GetFile
C Eval Message = %Trimr(Warn1) +
C ' COPY FROM IP INTO OUR PATH'
C EndSl
C Message Dsply 'QSYSOPR'
C Warn3 Dsply 'QSYSOPR'
C Eval Message = ' User Id : ' + User
C Message Dsply 'QSYSOPR'
C Eval Internet = %Subst(IpAddr: 1: IpAddrLen)
C Eval Message = ' IP Address: ' + Internet
C Message Dsply 'QSYSOPR'
C Eval Message = ' Path Rqs : '
C Message Dsply 'QSYSOPR'
C Eval Message = ' ' + FtpPath
C Message Dsply 'QSYSOPR'
C Warn2 Dsply 'QSYSOPR'
C EndIf
C EndIf
*
C Other
* *------------------------------------------*
* * If this is a secured system, use the *
* * Reject statement instead. *
* *------------------------------------------*
C Eval AllowOper = Allow
*@@@@@@@@ Eval AllowOper = Reject
E02 C EndSl
*
C #ServerRq EndSr
               (
geocities.com/siliconvalley/Pines)                   (
geocities.com/siliconvalley)