2699 lines
106 KiB
Plaintext
2699 lines
106 KiB
Plaintext
|
||
|
||
|
||
|
||
|
||
|
||
A Practical Exercise in
|
||
|
||
|
||
Securing an OpenVMS System
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Rob McMillan
|
||
Prentice Centre
|
||
The University Of Queensland
|
||
|
||
|
||
|
||
|
||
|
||
Now at Griffith University
|
||
E-Mail: R.McMillan@itc.gu.edu.au
|
||
Phone: 07 875 6557
|
||
Postal: Information Technology Services
|
||
Griffith University
|
||
Nathan Qld 4111
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
A Practical Exercise In Securing An OpenVMS System
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Abstract
|
||
|
||
|
||
_________________________________________________________
|
||
|
||
OpenVMS machines have many features that can be used to
|
||
defend them from attack. To properly defend your
|
||
machine, you need to make use of these features from the
|
||
moment of delivery.
|
||
|
||
In this paper, I present the series of steps taken by a
|
||
typical systems programmer (namely the author) in tuning
|
||
the defense mechanisms of an OpenVMS machine, and
|
||
outline some non-standard mechanisms employed in the
|
||
defence of this machine.
|
||
|
||
All too often, emphasis is placed on particular accents,
|
||
such as access prevention, or reactive examination and
|
||
monitoring after attack. This paper attempts a more
|
||
holistic approach to the host-based mechanisms that
|
||
could be employed to defend a machine. Access control
|
||
mechanisms (such as passwords, user authorisation
|
||
parameters, and access control wrappers) and activity
|
||
logging mechanisms (such as audit trails, terminal
|
||
monitors and FAL logging) are considered.
|
||
_________________________________________________________
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
The information contained in this paper is given freely
|
||
as an account of my own experience, and may be used by
|
||
the reader as the reader sees fit.
|
||
|
||
No responsibility or liability will be accepted by the
|
||
author for any damages caused by direct or indirect use
|
||
of the information or functionality described in this
|
||
paper.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Introduction
|
||
|
||
|
||
|
||
1.1 Assumptions
|
||
|
||
This paper will discuss some of the features that can be
|
||
used to defend an OpenVMS machine from outside attack.
|
||
The ideas presented in this paper are the result of an
|
||
exercise in configuring a machine in a university
|
||
department used for a sensitive research project.
|
||
|
||
All of the mechanisms I consider in this paper can be
|
||
classed as host based mechanisms. However, the defence
|
||
of an computer system is not limited to these measures
|
||
only.
|
||
|
||
Measures that should be used, but that I don't discuss
|
||
in this paper are:
|
||
|
||
* network based security,
|
||
* backups, and
|
||
* physical security.
|
||
|
||
This paper is not intended to present an "expert's view"
|
||
of securing an OpenVMS machine. The reason for this is
|
||
simple - whilst my knowledge of OpenVMS security is
|
||
quite solid, I would not put myself in the "expert"
|
||
category. Therefore this paper should not be seen as the
|
||
canonical guide to OpenVMS security - rather, it should
|
||
be seen as the series of measures that programmers
|
||
should typically consider in defending their machine.
|
||
There is absolutely no substitute for reading the Guide
|
||
to VAX/VMS System Security manual.
|
||
|
||
Finally, this paper is concerned with the defence of a
|
||
machine. I do not personally make any attempt to crack
|
||
machines. I will not present any information on how to
|
||
crack an OpenVMS machine.
|
||
|
||
|
||
|
||
1.2 What This Paper Contains
|
||
|
||
The following topics are those considered during the
|
||
configuration of the machine referred to above. This
|
||
list is not exhaustive.
|
||
|
||
* System Mechanisms For Configuring The Machine To
|
||
Control Access :
|
||
|
||
* SYS$MANAGER Command Files
|
||
* Welcome Messages
|
||
* Accounts To Disable, Passwords To Change, And
|
||
Objects To Modify
|
||
* System Logicals And Logical Definitions
|
||
* System Passwords
|
||
* The UAF File
|
||
* File Protections
|
||
* ACLs
|
||
* Tailoring UCX
|
||
* Proxies
|
||
|
||
* System Mechanisms For Configuring The Machine To Log
|
||
Activity :
|
||
|
||
* Accounting
|
||
* Auditing
|
||
* FAL and Poor Man's Routing
|
||
|
||
* Using Homegrown Or Publicly Available Software :
|
||
|
||
* Wrappers
|
||
* Single Use PINs
|
||
* Terminal Monitors
|
||
|
||
* Monitoring The Use of The Machine :
|
||
|
||
* The SHOW INTRUSION Command
|
||
* Daily Activities
|
||
* Having a Live Console
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
System Mechanisms For Configuring
|
||
The Machine To Control Access
|
||
|
||
|
||
|
||
2.1 SYS$MANAGER Command Files
|
||
|
||
There are three files in SYS$MANAGER: that are of
|
||
importance in terms of this paper. They are
|
||
SYSTARTUP_V5.COM, SYLOGIN.COM and SYLOGICALS.COM. I have
|
||
left comments about SYLOGICALS.COM for Section 2.4,
|
||
System Logicals And Logical Definitions.
|
||
|
||
|
||
|
||
2.1.1 SYSTARTUP_V5.COM
|
||
|
||
There are several different things to be done here.
|
||
|
||
As discussed in Section 2.5, System Passwords, a system
|
||
password should be installed. A system password means
|
||
that the user must enter a password before the login
|
||
prompt appears. The procedure for doing this is
|
||
discussed in Section 2.5. However, this is the change
|
||
you could make in SYSTARTUP_V5.COM to ensure that a
|
||
console user does not need to enter the password. (The
|
||
console should be located in a physically secure area.)
|
||
|
||
$! No system password required for console.
|
||
$ write sys$output "[Modifying console settings]"
|
||
$ SET TERMINAL OPA0: /PERMANENT /NOSYSPASSWORD
|
||
|
||
This ensures that should the user log in from the
|
||
console, a system password will not be required. This
|
||
prevents situations where you are locked out from the
|
||
machine should the password be changed or forgotten.
|
||
|
||
$! The following commands turn off account logging and
|
||
$! delete the account log.
|
||
$! To keep an account log on your system, delete the
|
||
$! following 5 command lines.
|
||
$!
|
||
$! IF (.NOT. MICROVAX) THEN GOTO SKIP_ACCOUNTING
|
||
$! SET ACCOUNTING/DISABLE
|
||
$! IF F$SEARCH("SYS$MANAGER:ACCOUNTNG.DAT") .NES. "" THEN -
|
||
$! DELETE SYS$MANAGER:ACCOUNTNG.DAT;*
|
||
$!SKIP_ACCOUNTING:
|
||
|
||
When the operating system is installed, this code is not
|
||
commented out. That is, account logging is not enabled
|
||
by default. It is good practice to use all logging
|
||
facilities available to you, and system accounting is
|
||
one of those facilities that is strongly recommended.
|
||
|
||
You need accounting to provide an extra audit trail on
|
||
the system. To enable accounting, comment out these
|
||
lines, as shown on the following page.
|
||
|
||
$! The following commands purge the operator and network
|
||
$! logs to two versions.
|
||
$!
|
||
$! IF (.NOT. MICROVAX) THEN GOTO SKIP_PURGING
|
||
$! IF F$SEARCH("SYS$MANAGER:OPERATOR.LOG;-1") .NES. "" THEN -
|
||
$! PURGE SYS$MANAGER:OPERATOR.LOG
|
||
$! IF F$SEARCH("SYS$MANAGER:EVL.LOG;-1") .NES. "" THEN -
|
||
$! PURGE SYS$MANAGER:EVL.LOG
|
||
$!SKIP_PURGING:
|
||
|
||
Here the machine is trying to make a guess about how
|
||
much information should be saved as current information
|
||
(the tradeoff being information currency and usefulness
|
||
against disk space). A more reasonable figure is 10
|
||
versions (working on the basis of a new file per day).
|
||
To implement this, do the following:
|
||
|
||
* Comment out the lines above.
|
||
|
||
* Create artificial OPERATOR.LOG and EVL.LOG files,
|
||
each 1 version higher than the logs currently open
|
||
and in use by the system.
|
||
|
||
* Issue SET FILE OPERATOR.LOG /VERSION_LIMIT=10 and
|
||
SET FILE EVL.LOG /VERSION_LIMIT=10. This is done
|
||
against the files just created, as the SET FILE
|
||
command will fail against the logs open and in use
|
||
by the system. When new files are opened for use
|
||
by the system, they will be created with a version
|
||
number of one higher than the logs created
|
||
artificially, but will inherit the version limit.
|
||
|
||
$! This command defines a message to be displayed before
|
||
$! each user logs in.
|
||
$!
|
||
$! DEFINE /SYSTEM SYS$ANNOUNCE " Welcome to VAX/VMS ''F$GETSYI("VERSION")'"
|
||
$ DEFINE /SYSTEM SYS$ANNOUNCE "@SYS$MANAGER:ANNOUNCE.TXT"
|
||
$!
|
||
$! This command defines a message or file to be
|
||
$! displayed after each user logs in.
|
||
$!
|
||
$ DEFINE /SYSTEM SYS$WELCOME "@SYS$MANAGER:WELCOME.TXT"
|
||
$!
|
||
|
||
For legal reasons, as set out in SERT Advisory SA-93.03
|
||
(See Appendix 1, SERT Advisory SA-93.03, Suggested Login
|
||
Banner) give people fair warning of the consequences of
|
||
misuse. The contents of the files ANNOUNCE.TXT and
|
||
WELCOME.TXT are discussed in Section 2.2, Welcome
|
||
Messages. To make these files appear, the definitions
|
||
above are used.
|
||
|
||
|
||
|
||
|
||
2.1.2 SYLOGIN.COM
|
||
|
||
SYLOGIN.COM is a command file executed when any user
|
||
logs in. This is the ideal place to install mechanisms
|
||
to universally check a user's credentials (such as
|
||
username, source of login, time, terminal or knowledge-
|
||
based authenticators).
|
||
|
||
The first three lines of SYLOGIN.COM should be as
|
||
follows (but aren't in the supplied file).
|
||
|
||
$ SET NOON
|
||
$ SET NOCONTROL_Y
|
||
$ SET NOVERIFY
|
||
|
||
|
||
This prevents a user (and hence crackers in the first
|
||
instance) from seeing what mechanisms you have
|
||
installed, and also interrupting the execution of this
|
||
file to avoid these mechanisms.
|
||
|
||
$! Place your site-specific LOGIN commands below
|
||
$!
|
||
$! If they get this far, then there may have been a breakin,
|
||
$! but at least we can stop them at this point.
|
||
$! Call the wrapper.
|
||
$!
|
||
$ @LOCAL$WRAP:INTERACTIVE.COM
|
||
$ IF ($Status .NE. %x10000001)
|
||
$ THEN
|
||
$ STOP/ID=0
|
||
$ ENDIF
|
||
|
||
As the comments outline, we use a command procedure at
|
||
this point to check credentials. This may or may not
|
||
involve interactive exchanges. If the person logging in
|
||
fails to pass the tests, then they are logged out. (You
|
||
will need to define LOCAL$WRAP, for example, in
|
||
SYLOGICALS.COM.)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
2.2 Welcome Messages
|
||
|
||
For legal reasons, as set out in SERT Advisory SA-93.03
|
||
(See Appendix 1, SERT Advisory SA-93.03, Suggested Login
|
||
Banner) give people fair warning of the consequences of
|
||
misuse. By default, there is no SYS$WELCOME issued, and
|
||
SYS$ANNOUNCE welcomes the person logging in. SYS$WELCOME
|
||
needs to be enabled, and point to a file, and
|
||
SYS$ANNOUNCE should also point to a file (as shown in
|
||
Section 2.1.1, SYSTARTUP_V5.COM). These files should
|
||
outline to people conditions of use, and legal
|
||
consequences of misuse.
|
||
|
||
SYS$ANNOUNCE is the message or banner that appears
|
||
immediately before the login prompt (but after the
|
||
system password has been entered). SYS$WELCOME is the
|
||
message or banner that appears immediately after the
|
||
person has logged in. In this way, users should normally
|
||
see this warning before and after logging in.
|
||
|
||
This message should appear in SYS$MANAGER:ANNOUNCE.TXT:
|
||
|
||
|
||
|
||
----- Warning Message -----
|
||
|
||
***** This service is for authorised staff only *****
|
||
|
||
*************************************************************************
|
||
* *
|
||
* WARNING: It is a criminal offence to: *
|
||
* i. Obtain access to data without authority *
|
||
* (Penalty 2 years imprisonment) *
|
||
* ii Damage, delete, alter or insert data without authority *
|
||
* (Penalty 10 years imprisonment) *
|
||
* *
|
||
*************************************************************************
|
||
|
||
|
||
The following message should appear in
|
||
SYS$MANAGER:WELCOME.TXT.
|
||
|
||
|
||
This is {nodename} (VAX/VMS V5.5-2) - Unauthorised access prohibited!
|
||
|
||
***** This service is for authorised staff only *****
|
||
|
||
*************************************************************************
|
||
* *
|
||
* WARNING: It is a criminal offence to: *
|
||
* i. Obtain access to data without authority *
|
||
* (Penalty 2 years imprisonment) *
|
||
* ii Damage, delete, alter or insert data without authority *
|
||
* (Penalty 10 years imprisonment) *
|
||
* *
|
||
*************************************************************************
|
||
|
||
|
||
|
||
|
||
2.3 Accounts To Disable, Passwords To Change, And Objects
|
||
To Modify
|
||
|
||
2.3.1 Accounts
|
||
|
||
VMS is supplied with a number of default accounts. It
|
||
should be assumed that crackers will attempt to
|
||
compromise a machine using default account names and
|
||
passwords. This principle applies to any operating
|
||
system.
|
||
|
||
The following default accounts should have their
|
||
passwords changed, and the accounts disabled: DEFAULT,
|
||
FIELD, MIRRO$SERVER, SYSTEST, SYSTEST_CLIG.
|
||
|
||
The accounts can be disabled thus:
|
||
|
||
$ MCR AUTHORIZE
|
||
UAF> MODIFY DEFAULT /FLAGS=DISUSER
|
||
UAF> MODIFY FIELD /FLAGS=DISUSER
|
||
UAF> MODIFY MIRRO$SERVER /FLAGS=DISUSER
|
||
UAF> MODIFY SYSTEST /FLAGS=DISUSER
|
||
UAF> MODIFY SYSTEST_CLIG /FLAGS=DISUSER
|
||
UAF> EXIT
|
||
$
|
||
|
||
Depending upon how you wish to execute batch jobs and
|
||
carry out general system administration, you may also
|
||
wish to either similarly treat the SYSTEM account, or
|
||
alternative apply strict access controls on this account
|
||
on the UAF file (See Section 2.6, The UAF File).
|
||
|
||
|
||
|
||
2.3.2 Objects
|
||
|
||
There are several objects that needed tailoring. Some of
|
||
the tailoring is to prevent simple security breaches,
|
||
whereas others (like the modifications to PHONE, TASK
|
||
and FAL) are to prevent breaches that could occur in
|
||
whole or in part to Poor Man's Routing (See Section 3.3,
|
||
FAL and Poor Man's Routing).
|
||
|
||
In the first stage, the PHONE and TASK objects are
|
||
disabled.
|
||
|
||
In the PHONE application, the directory command can be
|
||
used to obtain a directory listing of users on remote
|
||
DECNet nodes. It is essentially a default "finger".
|
||
Whilst security through obscurity is no security at all,
|
||
any access to system details should be suppressed where
|
||
possible.
|
||
|
||
The TASK object is used to execute jobs on your node
|
||
from remote nodes. Since this is not a desired feature
|
||
on the machine used in the preparation of this paper,
|
||
this object was disabled. Alternatively, the object
|
||
could have been loaded with false information into the
|
||
permanent database.
|
||
|
||
These objects are created at boot time using default
|
||
information if there is no information about them in the
|
||
NCP permanent database. Therefore, a job can be run
|
||
immediately after booting to remove these objects.
|
||
|
||
The objects can be removed thus:
|
||
|
||
$ MCR NCP CLEAR OBJECT PHONE ALL
|
||
$ MCR NCP PURGE OBJECT PHONE ALL
|
||
$ MCR NCP CLEAR OBJECT TASK ALL
|
||
$ MCR NCP PURGE OBJECT TASK ALL
|
||
|
||
They could alternatively be modified thus:
|
||
|
||
$ MCR NCP SET OBJECT TASK USER ILLEGAL PASSWORD DISABLED
|
||
$ MCR NCP SET OBJECT TASK PROXY NONE
|
||
$ MCR NCP SET OBJECT TASK ALIAS INCOMING DISABLED
|
||
$ MCR NCP SET OBJECT TASK ALIAS OUTGOING DISABLED
|
||
$ MCR NCP DEFINE OBJECT TASK USER ILLEGAL PASSWORD DISABLED
|
||
$ MCR NCP DEFINE OBJECT TASK PROXY NONE
|
||
$ MCR NCP DEFINE OBJECT TASK ALIAS INCOMING DISABLED
|
||
$ MCR NCP DEFINE OBJECT TASK ALIAS OUTGOING DISABLED
|
||
$ MCR NCP SET OBJECT PHONE USER ILLEGAL PASSWORD DISABLED
|
||
$ MCR NCP SET OBJECT PHONE PROXY NONE
|
||
$ MCR NCP SET OBJECT PHONE ALIAS INCOMING DISABLED
|
||
$ MCR NCP SET OBJECT PHONE ALIAS OUTGOING DISABLED
|
||
$ MCR NCP DEFINE OBJECT PHONE USER ILLEGAL PASSWORD DISABLED
|
||
$ MCR NCP DEFINE OBJECT PHONE PROXY NONE
|
||
$ MCR NCP DEFINE OBJECT PHONE ALIAS INCOMING DISABLED
|
||
$ MCR NCP DEFINE OBJECT PHONE ALIAS OUTGOING DISABLED
|
||
|
||
In the second stage below, objects are modified so that
|
||
they are still usable, but subject to tighter controls
|
||
than the default.
|
||
|
||
The simplest change is made to the MIRROR object by
|
||
disabling the MIRRO$SERVER account in the User
|
||
Authorisation File. The MIRROR object should be kept to
|
||
allow loopback testing should it become necessary. The
|
||
account is disabled since it serves no useful purpose
|
||
(other than for loopback testing), and should be
|
||
disabled unless in use.
|
||
|
||
The MAIL object should be modified thus according to the
|
||
VMS v5.5-2 release notes, Section 2.8.7, to restrict
|
||
outgoing access on the mail server. In v5.5-2, MAIL
|
||
enables system privileges when it opens a DECnet
|
||
connection to a remote mail server. By restricting
|
||
outgoing access on the mail server object (as below),
|
||
unauthorised users are prevented from placing
|
||
connections on the mail server object.
|
||
|
||
$ MCR NCP SET OBJECT MAIL OUTGOING CONNECT PRIVILEGE SYSPRV
|
||
$ MCR NCP DEFINE OBJECT MAIL OUTGOING CONNECT PRIVILEGE SYSPRV
|
||
|
||
This can be undone by executing the same commands with
|
||
"NOSYSPRV". MAIL_SERVER.EXE (the executable associated
|
||
with the MAIL object) is installed as a privileged
|
||
image.
|
||
|
||
Wrappers should also be installed for the FAL and NML
|
||
objects. The executable images for these are, by
|
||
default, normally FAL.EXE and NML.EXE respectively.
|
||
Modify the object database as shown below.
|
||
|
||
$ MCR NCP SET OBJECT FAL FILE LOCAL$WRAP:FAL.COM
|
||
$ MCR NCP DEFINE OBJECT FAL FILE LOCAL$WRAP:FAL.COM
|
||
$ MCR NCP SET OBJECT NML FILE LOCAL$WRAP:NML.COM
|
||
$ MCR NCP DEFINE OBJECT NML FILE LOCAL$WRAP:NML.COM
|
||
|
||
The contents of the wrappers are discussed in Section
|
||
4.1, Wrappers.
|
||
|
||
|
||
|
||
|
||
2.4 System Logicals And Logical Definitions
|
||
|
||
SYS$MANAGER:SYLOGICALS.COM is used to establish
|
||
important site-specific logical names across the entire
|
||
system. You can put meaningful local definitions in here
|
||
as well as the definitions already supplied with the
|
||
delivered system.
|
||
|
||
$! Undocumented feature to disable poor man's routing
|
||
$ DEFINE /SYSTEM /EXEC FAL$LOG "03/DISABLE=8"
|
||
|
||
Poor Man's Routing is explained in Section 3.3, FAL and
|
||
Poor Man's Routing.
|
||
|
||
That section also explains the significance of this
|
||
definition. It's relevance to this section is merely
|
||
that it is centrally defined in SYLOGICALS.COM.
|
||
|
||
$! Make network server processes die after 10 seconds
|
||
$! (to give separate NETSERVER.LOG files for
|
||
$! each distinct operation)
|
||
$ DEFINE /SYSTEM /EXEC NETSERVER$TIMEOUT "0000 00:00:10"
|
||
|
||
This forces network server processes to die after 10
|
||
seconds of lying idle, thus creating separate
|
||
NETSERVER.LOG files for each essentially distinct
|
||
operation. The tradeoff for these distinct files is the
|
||
price that must be paid in terms of process creation on
|
||
each network connection.
|
||
|
||
$! System databases
|
||
$ DEFINE /SYSTEM /EXEC LMF$LICENSE SYS$SYSTEM:LMF$LICENSE.LDB
|
||
$ DEFINE /SYSTEM /EXEC NETNODE_REMOTE SYS$SYSTEM:NETNODE_REMOTE.DAT
|
||
$ DEFINE /SYSTEM /EXEC NETPROXY SYS$SYSTEM:NETPROXY.DAT
|
||
$ DEFINE /SYSTEM /EXEC NETUAF SYS$SYSTEM:NETUAF.DAT
|
||
$ DEFINE /SYSTEM /EXEC RIGHTSLIST SYS$SYSTEM:RIGHTSLIST.DAT
|
||
$ DEFINE /SYSTEM /EXEC SYSUAF SYS$SYSTEM:SYSUAF.DAT
|
||
$ DEFINE /SYSTEM /EXEC VMSMAIL SYS$SYSTEM:VMSMAIL_PROFILE.DAT
|
||
|
||
If these aren't defined, and a user attempts operations
|
||
on them, new ones can be created by that user. These
|
||
definitions prevent this. Note file protections for
|
||
these files in Section 2.7, File Protections.
|
||
|
||
Other system-wide logical symbols (such as LOCAL$WRAP)
|
||
would also be defined in this file.
|
||
|
||
|
||
|
||
|
||
2.5 System Passwords
|
||
|
||
VMS systems can have what is called a "system password".
|
||
This is a password that must be typed BEFORE the host
|
||
prompts you for login information. So when you initially
|
||
connect to a system with a "system password", you don't
|
||
get any prompting on the screen. Once you have typed in
|
||
the password, the normal prompt message appears.
|
||
|
||
The system password will appear or not depending on the
|
||
value of the sysgen parameter TTY_DEFCHAR2. A value of
|
||
%X80000 (i.e. Hex) enables system password. This
|
||
parameter is not dynamic.
|
||
|
||
The SYSGEN parameter TTY_DEFCHAR2 (bit represented by
|
||
%X80000) enables system password by default for all
|
||
terminals (including LAT, X.25 and telnet terminals).
|
||
|
||
The default value for TTY_DEFCHAR2 is 4098 (decimal):
|
||
|
||
$ RUN SYS$SYSTEM:SYSGEN
|
||
SYSGEN> USE DEFAULT
|
||
SYSGEN> SHO TTY_DEFCHAR2
|
||
Parameter Name Current Default Min. Max. Unit Dynamic
|
||
-------------- ------- ------- ------ ------ ---- -------
|
||
TTY_DEFCHAR2 4098 4098 0 -1 Bit-Encode
|
||
|
||
|
||
The correct value can be set by modifying
|
||
SYS$SYSTEM:MODPARAMS.DAT, and AUTOGENing the system. The
|
||
required value in MODPARAMS.DAT is set by adding the
|
||
following lines (amongst other values):
|
||
|
||
TTY_DEFCHAR2 = %X80000 + %X1000 + %X2 ! = 528386
|
||
! %X80000 (bit 19) TT2$M_SYSPWD System password
|
||
! %X1000 (bit 12) TT2$M_EDITING Cmd line editing
|
||
! %X2 (bit 1) TT2$M_AUTOBAUD Autobaud
|
||
|
||
The actual system password can be set either by DCL or
|
||
by AUTHORIZE.
|
||
|
||
$ SET PASSWORD /SYSTEM
|
||
|
||
or else by
|
||
|
||
$ RUN SYS$SYSTEM:AUTHORIZE
|
||
UAF> MODIFY /SYSTEM_PASSWORD={password}
|
||
|
||
Terminals can be set /NOSYSPWD /PERM or /SYSPWD. See
|
||
Section 2.1.1 SYSTARTUP_V5.COM for an example.
|
||
|
||
|
||
2.6 The UAF File
|
||
|
||
This is an extremely useful file for tuning security on
|
||
an OpenVMS machine. The UAF file (and associated files)
|
||
allow you to control access to the system and allocate
|
||
resources to users.
|
||
|
||
For the purposes of this paper, there are several fields
|
||
worth considering. Specifically, the ones that can be
|
||
used include (but are not restricted to) access control
|
||
fields, password control fields and the rights list.
|
||
|
||
On the particular machine used in the preparation of
|
||
this paper, there are several accounts that are used for
|
||
specific purposes, and should be used only within
|
||
specific time frames. For instance, consider an account
|
||
(the "USER1" account for the purposes of this example)
|
||
which should only be used interactively during the hours
|
||
of 8am to 7pm on primary days (Monday to Friday), but
|
||
can run batch jobs at any time on any day. All other
|
||
access is to be denied.
|
||
|
||
This is achieved by the following commands:
|
||
|
||
$ RUN SYS$SYSTEM:AUTHORIZE
|
||
UAF> MODIFY USER1 /NONETWORK /NODIALUP -
|
||
/LOCAL=(PRIMARY:8-18) /REMOTE=(PRIMARY:8-18)
|
||
|
||
|
||
This results in an access control matrix like the one
|
||
below.
|
||
|
||
Primary days: Mon Tue Wed Thu Fri
|
||
Secondary days: Sat Sun
|
||
Primary 000000000011111111112222 Secondary 00000000001111111111222
|
||
Day Hours 012345678901234567890123 Day Hours 012345678901234567890123
|
||
Network: ----- No access ------ ----- No access ------
|
||
Batch: ##### Full access ###### ##### Full access######
|
||
Local: --------###########----- ----- No access ------
|
||
Dialup: ----- No access ------ ----- No access ------
|
||
Remote: --------###########----- ----- No access ------
|
||
|
||
|
||
Full access can be restored using:
|
||
|
||
$ RUN SYS$SYSTEM:AUTHORIZE
|
||
UAF> MODIFY USER1 /ACCESS=(PRIMARY:0-24,SECONDARY:0-24)
|
||
|
||
Passwords are historically a weak point in computer
|
||
systems. A weak password on a single account leaves the
|
||
entire system vulnerable to attack. (See Appendix 2,
|
||
SERT Advisory SA-93.04, Guidelines For Developing A
|
||
Sensible Password Policy.)
|
||
|
||
You must therefore ensure that all accounts have a
|
||
minimum password length of 8 characters, and that they
|
||
expire at regular intervals. In addition, privileged
|
||
accounts should have password lengths greater than that,
|
||
and passwords should be set using the MODIFY
|
||
{accountname} /GENERATE_PASSWORD command.
|
||
|
||
The other important use of the AUTHORIZE utility is
|
||
creating rights list identifiers and using these in
|
||
conjunction with ACLs to control access to files and
|
||
devices at individual levels.
|
||
|
||
For instance, on the machine used while preparing this
|
||
paper, there is a particular device and a directory that
|
||
should only ever be accessed by a small group of people.
|
||
This device is used for a research project, and the
|
||
results are kept in the directory. The entire group of
|
||
people involved with the experiment needed to read the
|
||
results (kept in the DISKE:[EXPERIMENT1] directory),
|
||
whereas only a few people needed write access to this
|
||
directory. Furthermore, because they were all in the
|
||
same project team, they were all allocated the same
|
||
group number. Finally, there was a restricted number of
|
||
people in this group who were authorised to access the
|
||
device used in the experiment in question.
|
||
|
||
The first step in controlling this is to create various
|
||
rights list identifiers, and granting them to people who
|
||
should access them. The rights list identifiers are
|
||
created as follows:
|
||
|
||
$ RUN SYS$SYSTEM:AUTHORIZE
|
||
UAF> ADD /IDENTIFIER EXP1_READ
|
||
UAF> ADD /IDENTIFIER EXP1_WRITE
|
||
UAF> ADD /IDENTIFIER EXP1_CONTROL
|
||
UAF> EXIT
|
||
|
||
|
||
Users 1..10 are allowed read access to the results;
|
||
users 5, 6 and 7 are allowed write access and users 6
|
||
and 7 are allowed to control the transducer.
|
||
|
||
$ RUN SYS$SYSTEM:AUTHORIZE
|
||
UAF> GRANT /IDENTIFIER EXP1_READ USER1
|
||
UAF> GRANT /IDENTIFIER EXP1_READ USER2
|
||
UAF> GRANT /IDENTIFIER EXP1_READ USER3
|
||
UAF> GRANT /IDENTIFIER EXP1_READ USER4
|
||
UAF> GRANT /IDENTIFIER EXP1_READ USER8
|
||
UAF> GRANT /IDENTIFIER EXP1_READ USER9
|
||
UAF> GRANT /IDENTIFIER EXP1_READ USER10
|
||
UAF> GRANT /IDENTIFIER EXP1_WRITE USER5
|
||
UAF> GRANT /IDENTIFIER EXP1_WRITE USER6
|
||
UAF> GRANT /IDENTIFIER EXP1_WRITE USER7
|
||
UAF> GRANT /IDENTIFIER EXP1_CONTROL USER6
|
||
UAF> GRANT /IDENTIFIER EXP1_CONTROL USER7
|
||
UAF> EXIT
|
||
$
|
||
|
||
ACLs and protection are then set on the device and
|
||
directory as set out in Section 2.8, ACLs.
|
||
|
||
Finally, great care has been taken in the allocation of
|
||
privileges to individual user accounts. In particular,
|
||
the default privileges must be kept to the minimum
|
||
required.
|
||
|
||
|
||
|
||
2.7 File Protections
|
||
|
||
File protection is an important aspect in preventative
|
||
security. Checks should be periodically carried out for
|
||
world-writeable files and directories, and appropriate
|
||
action taken.
|
||
|
||
In addition, various sensitive files should be confirmed
|
||
as having the following protection.
|
||
|
||
<disk>:[000000]000000.DIR (S:RWE,O:RWE,G:RE,W:E)
|
||
<disk>:[000000]INDEXF.SYS (S:RWE,O:RWE,G:RE,W)
|
||
|
||
* This prevents unauthorised users from finding
|
||
directory and file names.
|
||
|
||
SYS$SYSTEM:AUTHORIZE.EXE (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NCP.EXE (S:RWE,O:RWE,G:RWE,W)
|
||
|
||
* This ensures that unauthorised users cannot change
|
||
the NCP and authorisation databases through the use
|
||
of these programs. Note that merely protecting
|
||
these programs does not prevent modification of the
|
||
data files - it is imperative that the data files
|
||
themselves are protected.
|
||
|
||
SYS$SYSTEM:NETCIRC.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NETCONF.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NETLINE.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NETLOGING.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NETNODE_LOCAL.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NETNODE_REMOTE.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NETOBJECT.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NETPROXY.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NETUAF.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NETX25.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
SYS$SYSTEM:NETX29.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
|
||
* This ensures that unauthorised users cannot change
|
||
information in these databases, nor gain
|
||
information about other users or system
|
||
configuration from these files.
|
||
|
||
SYS$SYSTEM:RIGHTSLIST.DAT (S:RWE,O:RWE,G:RE,W:RE)
|
||
|
||
SYS$SYSTEM:SYSUAF.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
ACL=(NETWORK,ACCESS=EXECUTE)
|
||
|
||
SYS$SYSTEM:VMSMAIL.DAT (S:RWE,O:RWE,G:RWE,W)
|
||
|
||
SYS$SYSTEM:VMSMAIL_PROFILE.DATA (S:RWE,O:RWE,G:RWE,W)
|
||
|
||
* This ensures that unauthorised users cannot change
|
||
information in these databases, nor gain
|
||
information about other users from these files.
|
||
|
||
For more details on File Protections, see Managing
|
||
Security in a Multi-Vendor Network by Ron Tencati, and
|
||
also the Guide to VAX/VMS System Security manual.
|
||
|
||
|
||
|
||
|
||
2.8 ACLs
|
||
|
||
This section, is a continuation of the example supplied
|
||
in Section 2.6, The UAF File, about access control using
|
||
rights list identifiers.
|
||
|
||
In a particular experiment, experimental results are
|
||
being kept in the DISKE:[EXPERIMENT1] directory. The
|
||
results are obtained using a transducer controlled on
|
||
device RCD0:.
|
||
|
||
Various rights list identifiers to read results
|
||
(EXP1_READ), write a file to the results directory
|
||
(EXP1_WRITE) and control the transducer (EXP1_CONTROL)
|
||
have been created. These rights identifiers are used in
|
||
the the creation of access control lists to enforce
|
||
these access control principles.
|
||
|
||
The transducer is the first object so modified:
|
||
|
||
$ SET ACL /OBJECT=DEVICE /ACL=( -
|
||
(IDENTIFIER=SYSTEM,ACCESS=READ+WRITE+EXECUTE+DELETE+CONTROL), -
|
||
(IDENTIFIER=EXP1_CONTROL,ACCESS=READ+WRITE+DELETE+CONTROL), -
|
||
(IDENTIFIER=[*,*],ACCESS=NONE)) RCD0:
|
||
|
||
$ SHOW DEVICE RCD0: /FULL
|
||
:
|
||
{Device details on NODE1$RCD0: deleted}
|
||
:
|
||
device, error logging is enabled.
|
||
Error count 0 Operations completed 26
|
||
Owner process "" Owner UIC [0,0]
|
||
Owner process ID 00000000 Dev Prot S:RWED,O:RWED,G:RWED,W:RWED
|
||
Reference count 0 Default buffer size 2048
|
||
Density unknown Format {deleted}
|
||
Volume status: {deleted}
|
||
|
||
Device access control list:
|
||
(IDENTIFIER=[SYSTEM],ACCESS=READ+WRITE+EXECUTE+DELETE+CONTROL)
|
||
(IDENTIFIER=EXP1_CONTROL,ACCESS=READ+WRITE+EXECUTE+DELETE+CONTROL)
|
||
(IDENTIFIER=[*,*],ACCESS=NONE)
|
||
|
||
|
||
On the machine used for preparing this paper, the nature
|
||
of the device prevented us from changing the protection
|
||
using the SET PROTECTION/DEVICE command. However, the
|
||
ACL is sufficient to control access to this device.
|
||
|
||
The next step is to protect the directory (and files
|
||
under it). An ACL is applied to the directory file
|
||
usinfg the commands on the next page.
|
||
|
||
$ SET ACL /OBJECT=FILE /ACL=( -
|
||
(IDENTIFIER=EXP1_WRITE,ACCESS=READ+WRITE+EXECUTE+DELETE+CONTROL), -
|
||
(IDENTIFIER=EXP1_READ, ACCESS=READ+EXECUTE), -
|
||
(IDENTIFIER=SYSTEM, ACCESS=READ+EXECUTE), -
|
||
(IDENTIFIER=[*,*], ACCESS=NONE)) DISKE:[000000]EXPERIMENT1.DIR
|
||
$
|
||
$ SET PROTECTION DISKE:[000000]EXPERIMENT1.DIR /PROTECTION=(S,O,G,W)
|
||
$
|
||
|
||
|
||
$ DIR DISKE:[000000]EXPERIMENT1.DIR /SECURITY
|
||
Directory DISKE:[000000]
|
||
|
||
EXPERIMENT1.DIR;1 4 17-JUN-1992 11:19:27.01 [SYSTEM] (,,,)
|
||
(IDENTIFIER=EXP1_WRITE,ACCESS=READ+WRITE+EXECUTE+DELETE+CONTROL)
|
||
(IDENTIFIER=EXP1_READ,ACCESS=READ+EXECUTE)
|
||
(IDENTIFIER=[SYSTEM],ACCESS=READ+EXECUTE)
|
||
(IDENTIFIER=[*,*],ACCESS=NONE)
|
||
Total of 1 file, 4 blocks.
|
||
|
||
|
||
This means that only people who specifically possess the
|
||
EXP1_WRITE rights list identifier can write to this
|
||
directory. Users who possess the EXP1_READ identifier
|
||
can read the contents of the directory as can the SYSTEM
|
||
account (but not system privileged accounts or system
|
||
UIC group members). All other access is denied.
|
||
|
||
Note that action is taken on the first match of the ACL.
|
||
So, for example, if the SYSTEM account is being used to
|
||
access data in DISKE:[EXPERIMENT1], and the system
|
||
account has the EXP1_READ right, then SYSTEM can read
|
||
the data by virtue of this right as opposed to being the
|
||
system account. The reason for this is that the
|
||
EXP1_READ identifier occurs before [SYSTEM] in the ACL.
|
||
|
||
Any directories created in this directory after the
|
||
creation of this ACL will inherit this ACL.
|
||
|
||
|
||
|
||
|
||
2.9 SYSGEN Parameters
|
||
|
||
There are various SYSGEN parameters that must be
|
||
considered and/or changed during configuration. Many of
|
||
these are related to system performance and are not
|
||
within the scope of this paper. Parameters that must be
|
||
considered from a security point of view are listed
|
||
below, with extracts from the SYSGEN HELP facility on
|
||
their use. (See SYSGEN> HELP PARAMETERS for more
|
||
details.)
|
||
|
||
TTY_DEFCHAR2: Bit 19 (TT2$M_SYSPWD) is set to allow the
|
||
use of system passwords. The password was set using the
|
||
AUTHORIZE utility (see Section 2.5, System Passwords),
|
||
and the console is modified such that the password is
|
||
not required when logging on from that source (using SET
|
||
TERMINAL OPA0: /PERMANENT /NOSYSPASSWORD). (See Section
|
||
2.1.1, SYSTARTUP_V5.COM.) All other terminals must enter
|
||
the system password before the login prompt is issued.
|
||
|
||
|
||
This parameter (TTY_DEFCHAR2). amongst others, can be
|
||
set in SYS$SYSTEM:MODPARAMS.DAT with a single line:
|
||
|
||
TTY_DEFCHAR2 = %X80000 + %X1000 + %X2 ! = 528386
|
||
! %X80000 (bit 19) TT2$M_SYSPWD System password
|
||
! %X1000 (bit 12) TT2$M_EDITING Cmd line editing
|
||
! %X2 (bit 1) TT2$M_AUTOBAUD Autobaud
|
||
|
||
|
||
LGI_PWD_TMO: Period of time, in seconds, a user has to
|
||
correctly enter the system password on a terminal on
|
||
which the system password is in effect.
|
||
|
||
LGI_BRK_TMO: Specifies the number of seconds that a
|
||
user, terminal, or node is permitted to attempt a login
|
||
before the system assumes that a breakin attempt is
|
||
occurring and evasive action is required.
|
||
|
||
LGI_BRK_LIM: Specifies the number of failures that may
|
||
occur at login time before the system will take action
|
||
against a possible breakin.
|
||
|
||
LGI_RETRY_TMO: Specifies the number of seconds allowed
|
||
between login retry attempts after a login failure.
|
||
|
||
LGI_RETRY_LIM: Specifies the number of retry attempts
|
||
allowed for users attempting to login over dialup lines.
|
||
|
||
LGI_HID_TIM: Specifies the number of seconds that
|
||
evasive action will persist following the detection of a
|
||
possible breakin attempt. The evasive action consists of
|
||
refusing to allow any logins during this period,
|
||
regardless of whether a valid user name and password are
|
||
specified.
|
||
|
||
LGI_BRK_DISUSER: When set, turns on the DISUSER flag in
|
||
the UAF record when an attempted breakin is detected,
|
||
thus permanently locking out that account.
|
||
|
||
LGI_BRK_TERM: Causes the terminal name to be part of the
|
||
association string for the terminal mode of breakin
|
||
detection.
|
||
|
||
Note that if parameters are changed using SYSGEN, modify
|
||
both the CURRENT image and the ACTIVE, running system.
|
||
Leave DEFAULT as it is.
|
||
|
||
|
||
|
||
|
||
2.10 Tailoring UCX
|
||
|
||
The machine being configured required only incoming
|
||
telnet access, and outgoing telnet and ftp. SMTP is
|
||
handled by a dedicated mail package (MX). Other services
|
||
like SNMP, NFS and Berkeley "r" commands are not
|
||
required (or, in fact, desirable).
|
||
|
||
Services not required are shutdown thus:
|
||
|
||
$! -- Shutdown what we don't need
|
||
$!
|
||
$ @SYS$MANAGER:RPC$UCX_SHUTDOWN.COM
|
||
$ @SYS$MANAGER:UCX$LPD_SHUTDOWN.COM
|
||
$ @SYS$MANAGER:UCX$NFS_SHUTDOWN.COM
|
||
$ @SYS$MANAGER:UCX$SMTP_SHUTDOWN.COM
|
||
$ @SYS$MANAGER:UCX$SNMP_SHUTDOWN.COM
|
||
$!
|
||
$! -- Disable incoming connections on other services
|
||
$!
|
||
$ UCX DISABLE SERVICE FTP
|
||
$ UCX DISABLE SERVICE REXEC
|
||
$ UCX DISABLE SERVICE RLOGIN
|
||
$ UCX DISABLE SERVICE RSH
|
||
|
||
|
||
In addition, the relevant UCX accounts are disabled in
|
||
the User Authorization File (using UAF> MODIFY <account>
|
||
/flag=DisUser): UCX$FTP, UCX$NFS, UCX$REXEC, UCX$RSH,
|
||
UCX$SNMP, UCX_LPD, UCX_SMTP. Telnet (interactive) access
|
||
should be monitored using a wrapper (as discussed in
|
||
Section 4.1, Wrappers).
|
||
|
||
|
||
2.11 Proxies
|
||
|
||
Proxies should not be allowed if they are not required!
|
||
If a net proxy is required for file transfer, the proxy
|
||
must be created on the remote machine, and the required
|
||
command issued on the local machine. The theory here is
|
||
that the local machine is less likely to be compromised
|
||
than an outside machine, and the use of proxies will
|
||
reduce the instances of access information being
|
||
transmitted over a network connection.
|
||
|
||
Only allow proxy access to a non-privileged account on
|
||
the target system.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
System Mechanisms For Configuring
|
||
The Machine To Log Activity
|
||
|
||
|
||
|
||
|
||
There are several facilities available to the system
|
||
administrator to achieve effective logging. Specifically
|
||
these are accounting and auditing. There is also scope
|
||
for development of local tools. In this section, I will
|
||
outline the use of the standard facilities, while
|
||
homegrown mechanisms will be considered in the next
|
||
section.
|
||
|
||
Firstly, it will be useful to have a brief look at
|
||
accounting and auditing. System accounting is a facility
|
||
for recording information about the use of the machine
|
||
from a normal system accounting perspective, whereas the
|
||
system audit logger records similar information, but
|
||
from a system security perspective. Both of these can be
|
||
used to construct audit trails of activity. Information
|
||
from the system audit logger can be gleaned not only
|
||
from the audit journal, but also from the operator log,
|
||
as the auditor also sends it's messages to OPCOM.
|
||
|
||
Consider, for example, a situation in which a user
|
||
(USER1) has made a modification to USER2's entry in the
|
||
User Authorization File.
|
||
|
||
The audit logger returns the following information:
|
||
|
||
Security alarm (SECURITY) and security audit (SECURITY) on NODE1,
|
||
system id: 1072 / System UAF record modification
|
||
Event time: 27-JUL-1993 12:15:17.47
|
||
PID: 0000005F
|
||
Username: USER1
|
||
Image name: NODE1$DKA0:[SYS0.SYSCOMMON.][SYSEXE]AUTHORIZE.EXE
|
||
Object name: SYS$COMMON:[SYSEXE]SYSUAF.DAT;1
|
||
Object type: file
|
||
User record modified: USER2
|
||
Fields modified: FLAGS,PRIVILEGES
|
||
|
||
|
||
The accounting facility contains this:
|
||
|
||
AUTHORIZE Image Termination
|
||
---------------------------
|
||
Username: USER1 UIC: [STAFF,USER1]
|
||
Account: STAFF Finish time: 27-JUL-1993 12:15:27.79
|
||
Process ID: 0000005F Start time: 27-JUL-1993 12:14:51.23
|
||
Owner ID: Elapsed time: 0 00:00:36.56
|
||
Terminal name: RTA1: Processor time: 0 00:00:00.22
|
||
Remote node addr: 1038 Priority: 4
|
||
Remote node name: NODE2 Privilege <31-00>: 10148001
|
||
Remote ID: USER2 Privilege <63-32>: 00000040
|
||
Queue entry: Final status code: 00000001
|
||
Queue name:
|
||
Job name:
|
||
Final status text: %SYSTEM-S-NORMAL, normal successful completion
|
||
|
||
Page faults: 238 Direct IO: 32
|
||
Page fault reads: 9 Buffered IO: 58
|
||
Peak working set: 631 Volumes mounted: 0
|
||
Peak page file: 1166 Images executed: 244
|
||
Image name: NODE1$DKA0:[SYS0.SYSCOMMON.][SYSEXE]AUTHORIZE.EXE
|
||
|
||
|
||
Both facilities tell us that USER1 ran the AUTHORIZE
|
||
utility successfully under PID 5F at 12:15 pm on 27-Jul-
|
||
1993. From the accounting, we can see at a glance where
|
||
USER1 logged in from. The audit logger tells us exactly
|
||
what USER1 did whilst running this utility.
|
||
|
||
Consider another example, in which a computer cracker
|
||
has logged in from an X.25 network address in an attempt
|
||
to maintain anonymity. The audit server has recorded the
|
||
following information in the operator log:
|
||
|
||
%%%%%%%%%%% OPCOM 27-Jul-1993 19:38:23.60 %%%%%%%%%%%
|
||
Message from user AUDIT$SERVER on NODE1
|
||
Security alarm (SECURITY) and security audit (SECURITY) on NODE1,
|
||
system id: 1038
|
||
Auditable event: Dialup interactive login
|
||
Event time: 27-Jul-1993 19:38:23.59
|
||
PID: 20205316
|
||
Username: USER1
|
||
Terminal name: _VTA1514 ({X.25 address deleted})
|
||
|
||
|
||
The system accounting record from the same user logging
|
||
out returns the following information:
|
||
|
||
LOGINOUT Image Termination
|
||
--------------------------
|
||
Username: USER1 UIC: [STAFF,USER1]
|
||
Account: STAFF Finish time: 27-Jul-1993 03:36:17.69
|
||
Process ID: 20205316 Start time: 27-Jul-1993 19:38:07.19
|
||
Owner ID: Elapsed time: 0 07:58:10.50
|
||
Terminal name: VTA1514 Processor time: 0 00:00:46.14
|
||
Remote node addr: Priority: 4
|
||
Remote node name: Privilege <31-00>: 00108000
|
||
Remote ID: Privilege <63-32>: 00000000
|
||
Queue entry: Final status code: 00000001
|
||
Queue name:
|
||
Job name:
|
||
Final status text: %SYSTEM-S-NORMAL, normal successful completion
|
||
|
||
Page faults: 4716 Direct IO: 20927
|
||
Page fault reads: 208 Buffered IO: 85056
|
||
Peak working set: 970 Volumes mounted: 0
|
||
Peak page file: 4813 Images executed: 28
|
||
Image name: NODE1$DKA0:[SYS0.SYSCOMMON.][SYSEXE]LOGINOUT.EXE
|
||
|
||
|
||
The two records act as a useful cross check for each
|
||
other. The audit logger shows the X.25 address from
|
||
which the user logged in from (which is not available in
|
||
this accounting record). The accounting facility shows
|
||
the length of time that the user was on the system. When
|
||
this information is collated with the network accounting
|
||
information, then the cost of the connection can be
|
||
calculated. Furthermore the accounting records and audit
|
||
records can be examined to aid in determining the extent
|
||
of the damage caused by the attacker.
|
||
|
||
3.1 Accounting
|
||
|
||
Confirm that required system accounting is enabled thus:
|
||
|
||
$ SET ACCOUNTING /ENABLE[=(Keyword...)]
|
||
|
||
The command above enables logging of all activities on
|
||
the system in the accounting file. Accounting can be
|
||
enabled to log the following activities.
|
||
|
||
PROCESS any process termination
|
||
IMAGE image execution
|
||
INTERACTIVE interactive job termination
|
||
LOGIN_FAILURE login failures
|
||
SUBPROCESS subprocess termination
|
||
DETACHED detached job termination
|
||
BATCH batch job termination
|
||
NETWORK network job termination
|
||
PRINT all print jobs
|
||
MESSAGE user messages
|
||
|
||
|
||
Each day, a new accounting file should be created in
|
||
order to keep the accounting files of a manageable size,
|
||
using the command -
|
||
|
||
$ SET ACCOUNTING /NEW_FILE
|
||
|
||
|
||
|
||
|
||
3.2 Auditing
|
||
|
||
The auditor can be configured to log the following
|
||
events:
|
||
|
||
ACL Event requested by an Access Control List Item
|
||
AUTHORIZATION Modification of the system user authorization file
|
||
BREAKIN Occurrence of a breakin attempt
|
||
(from various sources)
|
||
FILE_ACCESS File or global section access
|
||
(by various methods)
|
||
INSTALL Occurrence of any INSTALL operation
|
||
LOGFAILURE Occurrence of a login failure
|
||
(from various sources)
|
||
LOGIN A login attempt (from various sources)
|
||
LOGOUT Occurrence of a logout
|
||
MOUNT Issuance of a mount or dismount request
|
||
|
||
This is done using SET AUDIT /ENABLE=(keyword[,...]).
|
||
The /ALARM qualifier is also used to raise an alarm to
|
||
all terminals enabled as security operators.
|
||
|
||
You can examine the configuration of your system audit
|
||
server using SHOW AUDIT /ALL. The categories that should
|
||
be carefully considered are the auditing server
|
||
characteristics, the alarm failure mode, and the enabled
|
||
security alarms.
|
||
|
||
Note that within the auditing server characteristics,
|
||
the default final resource action is to crash the system
|
||
if the system runs out of virtual memory. This means
|
||
that if the disk containing the audit journal log is
|
||
full, the system will crash, thus exposing the system to
|
||
denial of service attacks. When configuring the audit
|
||
server, you should carefully consider the final resource
|
||
action parameter. It can be set using the SET AUDIT
|
||
command.
|
||
|
||
$ SET AUDIT /SERVER=FINAL_ACTION=action
|
||
|
||
(where action can be one of CRASH, IGNORE_NEW or
|
||
PURGE_OLD)
|
||
|
||
As with system accounting, a new audit journal should be
|
||
created each day:
|
||
|
||
$ SET AUDIT /SERVER=NEW_LOG
|
||
|
||
|
||
|
||
|
||
3.3 FAL and Poor Man's Routing
|
||
|
||
In order to properly explain the step taken in this
|
||
phase, it is necessary to understand what Poor Man's
|
||
Routing is, and how it is linked with the File Access
|
||
Listener (FAL) object and the logical FAL$LOG.
|
||
|
||
The FAL object (File Access Listener) is the DECnet
|
||
object that allows a remote user to access files on your
|
||
node. It can be used to browse your node, or perform
|
||
file transfers. For legitimate users, this is extremely
|
||
useful - unfortunately, people with malintent also find
|
||
it useful if your system is not protected.
|
||
|
||
In the context of DECnet networking operations (and
|
||
specifically FAL), "Poor Man's Routing (PMR) refers to
|
||
the technique of supplying an explicit path to the
|
||
required target, rather than letting assigned DECnet
|
||
routers pick the most optimal path" [Tencati]. When PMR
|
||
is used, a process is created on each node in the path
|
||
to forward the connection to the next node in the path.
|
||
Each of these nodes (including the destination node)
|
||
only sees the connection from it's path predecessor. It
|
||
is therefore very difficult to ascertain from the
|
||
destination node where the connection originated from.
|
||
|
||
The legitimate use of this is in cases where the source
|
||
node may not know anything about the remote note.
|
||
Unfortunately, people with malintent can use the
|
||
properties described above to create a convoluted path
|
||
to the node they wish to attack (possibly via several
|
||
timezones and countries) to hide themselves effectively.
|
||
|
||
PMR can also be used to defeat the hiding of DECnet
|
||
subnets. There is a parameter in the NCP database called
|
||
the maximum area (see NCP> HELP SET EXECUTOR MAXIMUM
|
||
AREA). This parameter specifies the largest area number
|
||
known to an executor's routing layer. If used carefully,
|
||
this parameter can be used to hide subnets. PMR can be
|
||
used to circumvent this technique if the attacker has
|
||
appropriate information about your network design. (The
|
||
lesson here is to never trust security through obscurity
|
||
- always rely on robust, proactive methods rather than
|
||
ignorance.) Ron Tencati's Managing Security in a Multi-
|
||
Vendor Network gives a good explanation of PMR, and the
|
||
use of Area Routing.
|
||
|
||
You can configure FAL by use of the logical symbol
|
||
FAL$LOG. In the machine used in the preparation of this
|
||
paper, this logical was configured to do two things:
|
||
|
||
* refuse connections made by PMR
|
||
* supply audit trail information in NETSERVER.LOG
|
||
files in the case of successful FAL connections.
|
||
|
||
The logical name FAL$LOG translates to a string of the
|
||
form xx_yy where:
|
||
|
||
* xx is a hexadecimal number representing a longword
|
||
string value
|
||
* yy is a hexadecimal number specifying how many bytes
|
||
of each DAP message are to be displayed in the log
|
||
file (SYS$OUTPUT:).
|
||
|
||
The hexadecimal flags are:
|
||
|
||
0001 - log filename/function requests
|
||
0002 - log throughput statistics
|
||
0004 - log individual DAP messages
|
||
0008 - log DAP message packet AST requests (logged at AST level)
|
||
0010 - log DAP message packet QIO requests
|
||
0020 - reserved
|
||
0040 - disable DAP message blocking
|
||
0080 - disable DAP CRC error checking
|
||
|
||
In SYS$MANAGER:SYLOGICALS.COM, FAL$LOG should be defined
|
||
to be the character string "03/DISABLE=8" (See Section
|
||
2.4, System Logicals And Logical Definitions). By
|
||
setting this logical to this value, the following is
|
||
achieved:
|
||
|
||
* PMR is disabled ("/DISABLE=8")
|
||
* filename/function requests and throughput statistics
|
||
are logged (the setting "03" being the addition of
|
||
"01" and "02"
|
||
|
||
Consider an example where NODE1::USER1 is executing a
|
||
directory on NODE2::USER2's home directory. In the file
|
||
NETSERVER.LOG in USER2's directory, we would see the
|
||
following results.
|
||
|
||
With no definition for FAL$LOG:
|
||
|
||
--------------------------------------------------------
|
||
Connect request received at 28-JUL-1993 15:36:45.78
|
||
from remote process NODE1::"0=USER1"
|
||
for object "SYS$COMMON:[SYSEXE]FAL.EXE"
|
||
--------------------------------------------------------
|
||
|
||
With FAL$LOG defined to be "03/DISABLE=8", extra
|
||
information is appended:
|
||
|
||
--------------------------------------------------------
|
||
Connect request received at 28-JUL-1993 15:55:40.28
|
||
from remote process NODE1::"0=USER1"
|
||
for object "SYS$COMMON:[SYSEXE]FAL.EXE"
|
||
--------------------------------------------------------
|
||
|
||
========================================================
|
||
FAL V5.1-D3 started execution on 28-JUL-1993 15:55:41.12
|
||
with SYS$NET = NODE1::"0=USER1" and with FAL$LOG = 03
|
||
|
||
Logical link was established on 28-JUL-1993 15:55:41.13
|
||
|
||
Requested file access operation: Directory List
|
||
Specified file: DISKE:[USER2]L*.*;*
|
||
Resultant file: DISKE:[USER2]LOGIN.COM;3
|
||
Resultant file: DISKE:[USER2]LWK_PERSONAL.LINKBASE;1
|
||
|
||
Logical link was terminated on 28-JUL-1993 15:55:41.18
|
||
|
||
Total connect time for logical link was 0 00:00:00.05
|
||
Total CPU time used for connection was 0 00:00:00.02
|
||
|
||
File Access Statistics for RECV-Side XMIT-Side Composite
|
||
-------------------------- --------- --------- --------
|
||
# DAP Message QIO Calls 2 2 4
|
||
# DAP Messages Exchanged 2 14 16
|
||
# User Records/Blocks 0 0 0
|
||
NETSERVER.LOG (continued)
|
||
|
||
# Bytes of User Data 0 0 0
|
||
# Bytes in DAP Layer 49 310 359
|
||
User Data Throughput (bps) 0 0 0
|
||
DAP Layer Throughput (bps) 7840 49600 57440
|
||
Average Record/Block Size 0 0 0
|
||
% User Data in DAP Layer 0.0% 0.0% 0.0%
|
||
-------------------------- --------- --------- ---------
|
||
|
||
Negotiated DAP buffer size = 1060 bytes
|
||
Buffered I/O count during connection = 13
|
||
Direct I/O count during connection = 0
|
||
Peak working set size for process = 470 pages
|
||
|
||
Successful Start Transaction Branch = 0
|
||
Start Transaction Branch loops = 0
|
||
|
||
FAL terminated execution on 28-JUL-1993 15:55:41.21
|
||
========================================================
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Using Homegrown Or Publicly Available Software
|
||
|
||
|
||
4.1 Wrappers
|
||
|
||
A "wrapper" is a piece of software that monitors an
|
||
attempt to use a service, and based on the details about
|
||
the source of the attempt (such as remote host and user,
|
||
time, and connection type), determine whether to allow
|
||
the use of the service or not. This is the feature that
|
||
a wrapper has available to it over and above standard
|
||
system logging software: the use of the wrapper gives
|
||
the system manager freedom to make decisions whether to
|
||
allow the use of the machine from a remote site in
|
||
addition to simply logging that use.
|
||
|
||
Wrappers should be constructed for the NML and FAL
|
||
objects, and also for interactive logins. Section 2.1.2,
|
||
SYLOGIN.COM and Section 2.3.2, Objects gives the details
|
||
on how to install these wrappers.
|
||
|
||
Because the NML and FAL wrappers need to handle DECnet
|
||
connections only, they are more simple than the
|
||
interactive login wrapper.
|
||
|
||
The DECnet object wrappers evaluate the connection by
|
||
comparing the remote node and user combination against a
|
||
set of rules. The set of rules is described in two
|
||
files:
|
||
AllowFile which describes which combinations may make
|
||
the connection, and
|
||
DenyFile which describes which combinations may not
|
||
make the connection.
|
||
|
||
Wildcards are allowed. The general algorithm is:
|
||
|
||
Main ()
|
||
{
|
||
RemoteUser = f$trnlnm("SYS$REM_ID")
|
||
RemoteNode = f$trnlnm("SYS$REM_NODE")
|
||
ConnectionOkay = CheckRules(RemoteNode, RemoteUser)
|
||
if (ConnectionOkay = Allow) /* ConnectionOkay = Allow|Deny */
|
||
then
|
||
write successful connection record to wrapper log
|
||
request/to=(network,security) "<Succesful connection details>"
|
||
run SYS$SYSTEM:FAL.EXE
|
||
else
|
||
write failed connection record to wrapper log
|
||
request/to=(network,security) "<Failed connection details>"
|
||
logout
|
||
endif
|
||
} end Main
|
||
CheckRules (RemoteNode, RemoteUser)
|
||
{
|
||
if ((result = CheckCombination(RemoteNode, RemoteUser)) != Unknown)
|
||
then return result
|
||
if ((result = CheckCombination(RemoteNode, "*")) != Unknown)
|
||
then return result
|
||
if ((result = CheckCombination("*", "*")) != Unknown)
|
||
then return result
|
||
return Deny
|
||
} end CheckRules
|
||
CheckCombination (RemoteNode, RemoteUser)
|
||
{
|
||
Search AllowFile for RemoteNode::RemoteUser
|
||
if found then return Allow
|
||
Search DenyFile for RemoteNode::RemoteUser
|
||
if found then return Deny
|
||
return Unknown
|
||
} end CheckCombination
|
||
|
||
The search commands used above should be such that a
|
||
wildcard search matches the literal "*" in a file, not
|
||
any string (in a similar manner to the VMS "SEARCH"
|
||
command). Hence the wildcard value of "*" is placed in
|
||
the file by the system manager. The general philosophy
|
||
that should be adopted is to use a blanket denial (a
|
||
single line of "*::*" in the deny file) with specific
|
||
allowed node::user combinations in the allow file.
|
||
|
||
The interactive connection wrapper is similar, with only
|
||
a slightly more complicated top level algorithm:
|
||
|
||
Main ()
|
||
{
|
||
| Establish RemoteUser
|
||
| Establish RemoteNode
|
||
ConnectionOkay = CheckRules(RemoteNode, RemoteUser)
|
||
if (ConnectionOkay = Allow) /* ConnectionOkay = Allow|Deny */
|
||
then
|
||
write successful connection record to wrapper log
|
||
request/to=(network,security) "<Succesful connection details>"
|
||
| exit(Success)
|
||
else
|
||
write failed connection record to wrapper log
|
||
request/to=(network,security) "<Failed connection details>"
|
||
| exit(Failure)
|
||
endif
|
||
} end Main
|
||
|
||
The main problem here is to establish remote user and
|
||
node identities. Interactive access may take place using
|
||
DECnet, LAT, TCP/IP and so on. System values used to
|
||
find this information are:
|
||
|
||
* F$TRNLNM("SYS$REM_ID")
|
||
* F$TRNLNM("SYS$REM_NODE")
|
||
* F$GETDVI("SYS$COMMAND","TT_ACCPORNAM")
|
||
* the DECnet database
|
||
* the local terminal type of the connection
|
||
* information from F$TRNLNM("DECW$DISPLAY")
|
||
|
||
Connections are then evaluated not only on remote node
|
||
and user (if provided by the protocol), but also by the
|
||
protocol used for the connection and local
|
||
characteristics (such as the time).
|
||
|
||
It is important to note that any reading from AllowFile
|
||
or DenyFile, and writing to the wrapper log should be
|
||
carried out by installed, protected images, and that the
|
||
command file(s) and executable(s) used are writeable
|
||
only by system privileged accounts. This prevents
|
||
modification of behaviour and recorded results by
|
||
potential attackers.
|
||
|
||
Example code and configuration files appear in Appendix
|
||
3, Wrapper Example.
|
||
|
||
|
||
|
||
|
||
4.2 Single Use PINs
|
||
|
||
A Personal Identification Number (PIN) is simply the
|
||
numerical equivalent of a text-based password. Unlike a
|
||
normal password system, though, a single use PIN relies
|
||
on algorithmic knowledge rather than static value
|
||
knowledge.
|
||
|
||
The system works thus: when a user logs in, system and
|
||
user passwords must be supplied as described in previous
|
||
sections. A numerical challenge is then issued. The user
|
||
must supply the correct reply to this challenge, or the
|
||
login will be denied. The correct reply is some
|
||
permutation of the original challenge. The challenge
|
||
must be randomly generated, so that every time the user
|
||
logs in, a different numerical challenge is supplied,
|
||
requiring a unique reply - only the algorithm used to
|
||
deduce the reply from the challenge is static.
|
||
Furthermore, this algorithm is different for each user.
|
||
The software which issues the challenge and receives the
|
||
reply must be robust, so that an attacker cannot simply
|
||
"crash" the software and hence bypass this mechanism.
|
||
|
||
Such systems are available commercially. A smart-card is
|
||
usually supplied with such systems. The user keys the
|
||
challenge supplied by the host into the smartcard using
|
||
the keypad. The smartcard then displays the response,
|
||
and the user enters this as the reply to the host.
|
||
|
||
A cheaper alternative is to write such a system locally,
|
||
fulfilling all of these criteria. A usage policy must be
|
||
in place to effectively manage this system.
|
||
|
||
|
||
|
||
4.3 Terminal Monitors
|
||
|
||
Terminal monitors are useful utilities for providing
|
||
help to users who may be working remotely, or may not be
|
||
reachable by telephone and require some type of help in
|
||
real-time (i.e. electronic mail would not suffice).
|
||
|
||
Where such utilities are available on the system, they
|
||
must be adequately protected to ensure that unauthorised
|
||
users can neither use them nor copy them. Care must be
|
||
taken to ensure that explicit permission is sought by
|
||
the legitimate users concerned or a relevant authority
|
||
when such a utility is used.
|
||
|
||
Similar principles apply when using system software for
|
||
capturing a process's recall buffer in order to examine
|
||
the commands issued by that process.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Monitoring The Use Of The Machine
|
||
|
||
|
||
It is essential to carry out monitoring on any machine
|
||
in order to evaluate the health of the system. In
|
||
addition to checks that should be carried out on a
|
||
regular basis, steps should be taken to be allow for
|
||
investigation of unusual security related events as soon
|
||
as possible.
|
||
|
||
|
||
|
||
5.1 The SHOW INTRUSION Command
|
||
|
||
Use the command SHOW INTRUSION regularly. This command
|
||
displays the contents of the break-in database,
|
||
providing a quick technique for checking if there have
|
||
been attempts to break into your system in the immediate
|
||
past.
|
||
|
||
When using the SHOW INTRUSION command, you must first
|
||
get some idea if the host has detected any potential
|
||
breakins:
|
||
|
||
$ SET PROC/PRIV=(CMKRNL,SYSPRV)
|
||
$ SHOW INTRUSION
|
||
Intrusion Type Count Expiration Source
|
||
NETWORK SUSPECT 6 16:32:23.03 NODE2::USER2
|
||
TERM_USER SUSPECT 3 16:18:14.16 USER1
|
||
|
||
|
||
In this case, there are two suspect incidents. The
|
||
records below show that the first was an attempt by
|
||
USER2 on node NODE2 to login as USER1 on the local host
|
||
(NODE1) via DECnet. The second is an attempt to login as
|
||
USER1 on the local host using telnet from NODE3 (which
|
||
in this case was actually the localhost - 127.0.0.1).
|
||
|
||
The accounting records show the following:
|
||
|
||
LOGIN FAILURE
|
||
-------------
|
||
Username: USER1 UIC: [SYSTEM]
|
||
Account: <login> Finish time: 3-AUG-1993 16:02:28.80
|
||
Process ID: 2080D073 Start time: 3-AUG-1993 16:02:19.59
|
||
Owner ID: Elapsed time: 0 00:00:09.21
|
||
Terminal name: RTA3: Processor time: 0 00:00:00.23
|
||
Remote node addr: 1038 Priority: 4
|
||
Remote node name: NODE2 Privilege <31-00>: 0010C000
|
||
Remote ID: USER2 Privilege <63-32>: 00000000
|
||
Queue entry: Final status code: 10D380FC
|
||
Queue name:
|
||
Job name:
|
||
Final status text: %LOGIN-F-INVPWD, invalid password
|
||
|
||
Page faults: 234 Direct IO: 24
|
||
Page fault reads: 5 Buffered IO: 40
|
||
Peak working set: 287 Volumes mounted: 0
|
||
Peak page file: 1474 Images executed: 1
|
||
|
||
|
||
LOGIN FAILURE
|
||
-------------
|
||
Username: USER1 UIC: [SYSTEM]
|
||
Account: <login> Finish time: 3-AUG-1993 16:03:20.85
|
||
Process ID: 2080D878 Start time: 3-AUG-1993 16:03:11.77
|
||
Owner ID: Elapsed time: 0 00:00:09.08
|
||
Terminal name: VTA3959 Processor time: 0 00:00:00.21
|
||
Remote node addr: Priority 4
|
||
Remote node name: Privilege <31-00>: FFFFFFFF
|
||
Remote ID: Privilege <63-32>: FFFFFFFF
|
||
Queue entry: Final status code: 10D380FC
|
||
Queue name:
|
||
Job name:
|
||
Final status text: %LOGIN-F-INVPWD, invalid password
|
||
|
||
Page faults: 235 Direct IO: 18
|
||
Page fault reads: 5 Buffered IO: 41
|
||
Peak working set: 284 Volumes mounted: 0
|
||
Peak page file: 1474 Images executed: 1
|
||
|
||
|
||
The audit records show the following:
|
||
|
||
|
||
Security alarm (SECURITY) and security audit (SECURITY) on NODE1,
|
||
system id: 1072 / Remote interactive login failure
|
||
Event time: 3-AUG-1993 16:02:19.59
|
||
PID: 00000D33
|
||
Username: USER1
|
||
Terminal name: _RTA1:
|
||
Remote nodename: NODE2 Remote node id: 1184
|
||
Remote username: USER2
|
||
Status: %LOGIN-F-INVPWD, invalid password
|
||
|
||
|
||
Security alarm (SECURITY) and security audit (SECURITY) on NODE1,
|
||
system id: 1072 / Remote interactive login failure
|
||
Event time: 3-AUG-1993 16:03:11.77
|
||
PID: 00000CB4
|
||
Username: USER1
|
||
Terminal name: _TNA7:
|
||
Remote nodename: 127.0. Remote node id: 2130706433
|
||
Remote username: TELNET_7F000001
|
||
Status: %LOGIN-F-INVPWD, invalid password
|
||
|
||
|
||
Note that the remote nodename is always truncated to six
|
||
characters. The remote node id is a numerical
|
||
representation of the remote address.
|
||
|
||
Notice from the failed telnet login above that the
|
||
remote username is given as TELNET_7F000001. This
|
||
equates to the IP address 127.0.0.1 thus:
|
||
|
||
7 * 16 + F = 127
|
||
0 * 16 + 0 = 0
|
||
0 * 16 + 0 = 0
|
||
0 * 16 + 1 = 1
|
||
|
||
Hence if this attempt had come from the Network
|
||
Information Centre (nic.ddn.mil, Internet address
|
||
192.112.36.5), the remote username would have appeared
|
||
TELNET_C0702405.
|
||
|
||
|
||
|
||
|
||
5.2 Daily Activities
|
||
|
||
A batch file must be written in order to carry out
|
||
regular activities on a daily basis. Amongst these
|
||
activities should be various checks on log files. These
|
||
are listed below.
|
||
|
||
$ SEARCH/OUTPUT=BREAKIN_CHECK.TMP SYS$MANAGER:OPERATOR.LOG;-1 -
|
||
"Security alarm"/WINDOW=(3,8)
|
||
$ ANALYZE/AUDIT/BRIEF/SUMMARY/NOINTERACTIVE/OUTPUT=BREAKIN_CHECK.TMP -
|
||
SYS$MANAGER:SECURITY_AUDIT.AUDIT$JOURNAL;-1
|
||
$ ACCOUNT/LOG/SORT=(TYPE,STARTED)/OUTPUT=BREAKIN_CHECK.TMP ACCOUNTNG;-1
|
||
|
||
|
||
Any one of these can be used for obtaining information
|
||
about the life of the system. The amount and type of
|
||
information required should be used to determine which.
|
||
When any record from the output of these files reveals
|
||
an incident that appears unusual, then further checking
|
||
is required. The daily summary returned by any one of
|
||
the commands above should only be used to indicate that
|
||
this action is required - you should not rely on just
|
||
the summary information returned by these commands.
|
||
|
||
$ SHOW AUDIT/ALL/OUTPUT=AUDIT_CHECK.TMP
|
||
|
||
Check daily that the security auditing characteristics
|
||
you require are in place, and have not been changed.
|
||
|
||
$ ANALYZE/ERROR/SINCE="-1 0:0:0.0"/OUTPUT=ERROR_CHECK.TMP
|
||
|
||
Examine the error log daily as well. This will not
|
||
necessarily alert you to a security incident, but it
|
||
will draw your attention to any system problems that
|
||
could potentially hinder your efforts to recover from
|
||
disaster. (You could also put the "SHOW ERROR" command
|
||
in your LOGIN.COM file.)
|
||
|
||
$ MAIL/NOSELF/NOEDIT LOCAL$WRAP:INTERACTIVE.LOG -
|
||
"@SYS$SYSROOT:[SYSMGR.MAIL]DAILY_BATCH.DIS" -
|
||
/SUBJECT:"Logged interactive logins"
|
||
|
||
Wrappers were discussed in Section 4.1, Wrappers. As
|
||
part of your daily checking, you should mail to
|
||
yourself, and other relevant users, the output from
|
||
these wrappers on a daily basis. The example above
|
||
mentions only output from the interactive wrapper log -
|
||
the implication is that all logs should be checked.
|
||
|
||
|
||
|
||
|
||
5.3 Having a Live Console
|
||
|
||
Don't rely simply on on-line sinks (such as
|
||
OPERATOR.LOG) for your security oriented output. In the
|
||
event of a system compromise, it is quite likely that an
|
||
attacker will attempt to delete or modify information in
|
||
system files.
|
||
|
||
A good idea is to enable a security operator's terminal.
|
||
In addition to (or even instead of) the normal system
|
||
console (usually OPA0:), you should consider using a
|
||
security operator's terminal one that provides hardcopy
|
||
output and is located in a secure location.
|
||
|
||
(A word of caution: even an unsuccessful attack could
|
||
seriously disrupt your system if the hardcopy printer
|
||
runs out of paper.)
|
||
|
||
Using the example from the Guide to VMS System Security
|
||
manual, consider an example where such a terminal
|
||
(TTA3:) has been designated, and security messages are
|
||
to be disabled on the console. This can be achieved
|
||
thus:
|
||
|
||
$ DEFINE/USER SYS$COMMAND OPA0:
|
||
$ REPLY/DISABLE=SECURITY
|
||
$ DEFINE/USER SYS$COMMAND TTA3:
|
||
$ REPLY/ENABLE=SECURITY
|
||
|
||
You can, of course, enable other message classes to this
|
||
terminal as well.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Acknowledgements
|
||
|
||
|
||
|
||
Most of the undocumented material in this paper is a
|
||
mixture of my own work and other material that has been
|
||
passed on to me by various colleagues at The University
|
||
Of Queensland. The original idea for the wrapper was
|
||
inspired by Ron Tencati, and Wietse Venema's public
|
||
domain tcp_wrapper for UNIX systems.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
References
|
||
|
||
|
||
VAX/VMS Documentation manuals:
|
||
|
||
DEC TCP/IP Services for VMS System Management
|
||
Guide to VAX/VMS System Security
|
||
Access Control List Editor Utility
|
||
Accounting Utility
|
||
Audit Analysis Utility
|
||
Authorize Utility
|
||
Guide to Maintaining a VMS System
|
||
Network Control Program Manual
|
||
Networking Manual
|
||
|
||
|
||
|
||
Ron Tencati, Ken Coar and E Eugene Schultz
|
||
|
||
Managing Security in a Multi-Vendor Network, 1992
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Appendix 1
|
||
|
||
|
||
SERT Advisory SA-93.03, Suggested Login Banner
|
||
|
||
|
||
=============================================================================
|
||
SA-93:03A SERT Advisory
|
||
31-May-1993
|
||
Suggested Login Banner
|
||
-----------------------------------------------------------------------------
|
||
|
||
On 7-May-1993, the Security Emergency Response Team released Advisory
|
||
SA-93:03. Since then, it has been brought to our attention that the word
|
||
"permission" could be considered ambiguous as Unix file systems use
|
||
"permission" bits to specify if access is granted to a file or not.
|
||
|
||
Further advice from the Commonwealth Director of Public Prosecutions
|
||
indicates:
|
||
|
||
"'Permit' does seem to include a meaning of 'allow or let happen even by
|
||
accident or carelessness'."
|
||
|
||
"'Authority' or 'authorisation' suggest that someone has deliberately
|
||
turned their mind to an action and formally approved that action."
|
||
|
||
"In light of the fact that there does appear to be a difference in meaning
|
||
between words 'permit or permission' and 'authority or authorisation' and
|
||
the fact that computer scientists refer to 'permission' bits on Unix files,
|
||
it does appear desirable that the words 'authority' or 'authorisation' be
|
||
used instead of the word 'permission'."
|
||
|
||
Therefore, the Security Emergency Response Team has reissued SA-93:03 as
|
||
SA-93:03A taking into account the new recommendations. The new Advisory is
|
||
included below.
|
||
|
||
----------------------------------------------------------------------------
|
||
The SERT team wishes to thank Kate Lance at the University of Newcastle for
|
||
bringing this problem to our attention.
|
||
----------------------------------------------------------------------------
|
||
|
||
----------------------------------------------------------------------------
|
||
Body of SERT Advisory SA-93:03A
|
||
----------------------------------------------------------------------------
|
||
|
||
The Security Emergency Response Team has received information that a
|
||
successful prosecution of a computer cracker has taken place in New South
|
||
Wales. The prosecution was aided by the use of an appropriate login
|
||
banner. The following is an extract from a letter by the Australian
|
||
Federal Police:
|
||
|
||
"A major factor, commented upon by the magistrate, was the repeated warning
|
||
message displayed at logon to your system. Your agreement to implement this
|
||
feature has certainly started to pay dividends and demonstrates a certain
|
||
willingness to accept [that] tertiary institutions are not fair game."
|
||
|
||
A recommended login banner is:
|
||
|
||
----- Warning Message -----
|
||
|
||
***** This service is for authorised clients only *****
|
||
|
||
****************************************************************************
|
||
* WARNING: It is a criminal offence to: *
|
||
* i. Obtain access to data without authority *
|
||
* (Penalty 2 years imprisonment) *
|
||
* ii Damage, delete, alter or insert data without authority *
|
||
* (Penalty 10 years imprisonment) *
|
||
****************************************************************************
|
||
|
||
This example login banner was supplied to the Australian Federal Police by
|
||
the office of the Commonwealth Director of Public Prosecutions. Legal
|
||
opinion from the Commonwealth Director of Public Prosecutions indicates
|
||
that this warning will assist in prosecutions of computer crackers for two
|
||
reasons:
|
||
|
||
"The prosecution in a criminal case must show that the computer hacker's
|
||
actions are intentional. It would be extremely difficult for a hacker to
|
||
argue that his actions were by accident or inadvertent when he has to go
|
||
past such a warning on the system."
|
||
|
||
"A hacker may admit that his actions were intentional. However, upon his
|
||
sentence, he may argue that he was ignorant of the law or that he was
|
||
unaware that his actions were unauthorised, thereby inducing the court to
|
||
mitigate the penalty that it imposes. If the above warning is used, it
|
||
will be extremely difficult for a hacker to present such arguments."
|
||
|
||
SERT recommends the use of this, or similar banners on ALL systems and
|
||
access points into the network (such as a modem pool and ftp access). This
|
||
not only provides forewarning to any crackers that may intrude your system
|
||
that certain types of activity are illegal, but also advises any legitimate
|
||
users of their obligations relating to acceptable use of the computer
|
||
system.
|
||
|
||
The warning is deliberately general in nature as it has not yet been
|
||
established what type of (if any) crime has been committed. Subsequent
|
||
prosecution may be performed under Federal or State law, or handled by
|
||
local institution disciplinary procedures.
|
||
|
||
SERT recommends that any login banner or system initial message should not
|
||
imply consent to use the computer services (E.g., words such as "greeting"
|
||
or "welcome"), unless it is the express intention that any user is free to
|
||
use the system, whether they are authorised or not.
|
||
|
||
You may wish to include some identification information (such as the
|
||
hostname) so that genuine users know that they have connected to the
|
||
correct system. For example,
|
||
"You have connected to node FRED at The University of Wooloomooloo"
|
||
and follow this with an appropriate warning message.
|
||
|
||
Examples methods for login messages are:
|
||
|
||
VMS: Edit the file SYS$MANAGER:SYSTARTUP_V5.COM and include the line:
|
||
$DEFINE/SYSTEM SYS$ANNOUNCE "@SYS$MANAGER:ANNOUNCE.TXT"
|
||
then create the file SYS$MANAGER:ANNOUNCE.TXT with the text that you wish
|
||
displayed when a user connects to your system.
|
||
|
||
Note that this has implications for LAT as the default service
|
||
identification is the logical SYS$ANNOUNCE (which will translate to
|
||
@SYS$MANAGER:ANNOUNCE.TXT). In this case, you should edit the LAT startup
|
||
procedures to explicitly define a LAT service identification.
|
||
|
||
Unix: Edit the "message of the day" file, (e.g., /etc/motd) and include
|
||
the text that you wish displayed when a user logs in to your system.
|
||
|
||
This does not cover all ways to connect to a computer (e.g., rlogin,
|
||
telnet, SET HOST, ftp), but serves as one point of warning in a number of
|
||
cases. Warnings such as this are a positive step towards providing
|
||
adequate notice of the obligations and responsibilities relating to the use
|
||
of the computer equipment. If a person is known to have seen the warning,
|
||
they cannot subsequently claim ignorance of their responsibilities.
|
||
|
||
----------------------------------------------------------------------------
|
||
The SERT team wishes to thank The University of Sydney, the University of
|
||
South Australia, the Australian Federal Police, and the Commonwealth
|
||
Director of Public Prosecutions for their advice and cooperation in this
|
||
matter.
|
||
----------------------------------------------------------------------------
|
||
|
||
If you believe that your system has been compromised, contact SERT or your
|
||
representative in FIRST (Forum of Incident Response and Security Teams).
|
||
|
||
Internet Email: sert@sert.edu.au
|
||
Facsimile: (07) 365 4477
|
||
Telephone: (07) 365 4417
|
||
SERT personnel answer during business hours (AEST).
|
||
|
||
Security Emergency Response Team
|
||
Prentice Centre
|
||
The University Of Queensland
|
||
Qld. 4072.
|
||
|
||
|
||
|
||
|
||
|
||
Appendix 2
|
||
|
||
|
||
SERT Advisory SA-93.04, Guidelines For Developing A Sensible Password Policy
|
||
|
||
|
||
|
||
=============================================================================
|
||
SA-93:04 SERT Advisory
|
||
1-Jun-1993
|
||
Guidelines For Developing A Sensible Password Policy
|
||
-----------------------------------------------------------------------------
|
||
|
||
This advisory contains guidelines for developing a sensible password policy.
|
||
Please feel free to extract the contents of this advisory, modify to suit local
|
||
conditions, and then distribute to end users, as it is end users who are
|
||
responsible in the first instance for individual account security.
|
||
|
||
Without doubt, one of the most popular methods used by computer crackers to
|
||
compromise a system is password stealing.
|
||
|
||
By stealing your username and password an intruder can, with reduced
|
||
likelihood of detection, gain access to your system, modify it for his or
|
||
her own purposes and use that system as a launchpad for attacks on other
|
||
systems throughout the world - and all in your name. Password protection is
|
||
one of the most (if not the single most) important principles of system
|
||
security. It is uniformly important for ALL users, regardless of system
|
||
privileges or computer literacy. It is up to each and every individual to
|
||
ensure that their password is safe - a single unsafe password can (and
|
||
probably will) lead to a computer cracker violating YOUR system.
|
||
|
||
Your best line of defence against attack is a secure password. A password
|
||
is like a key, and any entry point that allows access by default is not
|
||
secure. A bad password is like leaving your front door unlocked.
|
||
|
||
Do not underestimate the ease with which your password can be stolen. There
|
||
are many techniques available to do this. A simple and amazingly successful
|
||
password theft technique for the cracker is password guessing (i.e. entering
|
||
your username, and simply guessing what your password might be). The aim of
|
||
this advisory is to thwart these attempts.
|
||
|
||
|
||
|
||
How To Select A Safe Password
|
||
-----------------------------
|
||
|
||
Some systems automatically (and autocratically) allocate passwords to
|
||
users. Many systems, however, give the user the option of selecting his
|
||
or her own password. The following guidelines should help in selecting a
|
||
password which will be sufficiently robust to prevent a cracker from
|
||
guessing your password in the majority of cases.
|
||
|
||
There are several principles involved in selecting a safe password. These
|
||
are covered below.
|
||
|
||
|
||
The DO-NOTs
|
||
|
||
DO NOT use simple passwords that are easy to remember and are typically
|
||
not safe. Examples of such passwords are:
|
||
|
||
- your userid (a common, but extremely dangerous practice);
|
||
|
||
- a word which can be associated with you. For example:
|
||
- your car make, model or registration number
|
||
- your child's name
|
||
- your street name, postcode or other address details
|
||
- your medicare number
|
||
- your tax file number
|
||
- any of your bank account numbers;
|
||
|
||
- a word which someone watching could easily spot (qwertyuiop);
|
||
|
||
- any dictionary word (which a cracker with a PC and an on-line
|
||
dictionary could discover by exhaustive trial);
|
||
|
||
- words from other guessable word sets such as famous names,
|
||
proper names, colloquial terms (in various spheres of
|
||
life) and so on.
|
||
|
||
It is not sufficient to include a single number in the word, or
|
||
change all O's to 0's and I's or L's to 1's in the word, or to spell
|
||
the word backwards.
|
||
|
||
|
||
DO NOT leave your account without a password.
|
||
|
||
DO NOT use your userid as your password.
|
||
|
||
DO NOT use any word from a dictionary (of any language) as most forms of
|
||
password attack use dictionaries as a basis for password guessing.
|
||
|
||
DO NOT use birthdays, car registration numbers, room numbers, department names,
|
||
machine names, locations, wife/husband's names, pet's names,
|
||
children's names and so on. These may be determined as most of this
|
||
information is not confidential.
|
||
|
||
DO NOT use keyboard patterns, or duplicating characters such as qwerty or
|
||
aabbccdd.
|
||
|
||
DO NOT use the same password on multiple accounts. If you have many accounts,
|
||
then do not use the same password on each account. If one is broken,
|
||
then all are broken. Also, do not just change one character in the
|
||
password as this may be easily spotted if one of the passwords is
|
||
compromised.
|
||
|
||
DO NOT allow anyone to watch while you type your password.
|
||
|
||
DO NOT record your password either on-line. DO NOT write down your
|
||
passwords.
|
||
|
||
DO NOT tell anyone what your password is. Do not share your password with
|
||
your partner, your children, your friends. Even telling your dog
|
||
should be considered risky! Do not tell a person verbally, by
|
||
electronic mail or by any other means.
|
||
|
||
Remember: if someone has your password, they can commit criminal acts using
|
||
your account!
|
||
|
||
SERT staff have been alerted to several security breaches at constituent
|
||
sites which have been attributed (in total or in part) to the sharing of
|
||
passwords between husband and wife, parent and child, and between friends.
|
||
|
||
|
||
|
||
The DOs
|
||
|
||
DO use a MINIMUM (not maximum!) of 8 or more characters (system permitting).
|
||
|
||
DO use mixed case wherever possible. DO NOT choose only the first letter as
|
||
uppercase. (e.g. Mich37bo is not as good as MicH37Bo.)
|
||
|
||
DO include at least two digits or punctuation characters. DO NOT simply replace
|
||
"o" and "O" with "0", and "I", "l" or "L" with 1. (e.g. fl0pp1mp is
|
||
not as good as fL0$p*Mp.)
|
||
|
||
DO change passwords frequently, and DO NOT reuse old passwords. Password
|
||
cracking algorithms have been around for quite a while now. By using
|
||
computationally intensive processes, a password can be broken in time.
|
||
|
||
Applying the techniques outlined above make the length of time required to
|
||
break a password prohibitively long. However, the time required to break a
|
||
password drops significantly as each letter is guessed, or other
|
||
information is known about a password. Passwords should be changed
|
||
regularly, so that even if a password is finally guessed, it will be long
|
||
out of date. A password should never be reused.
|
||
|
||
|
||
|
||
General techniques for generating safe passwords include:
|
||
|
||
- using two or three short words that are unrelated;
|
||
- always including some non-alphabetic, non-numeric (i.e. punctuation)
|
||
characters;
|
||
- deliberately misspelling;
|
||
- taking the first letter from each word of a phrase (a passphrase).
|
||
|
||
Note that different operating systems have different rules for the
|
||
characters that one is allowed to use in a password. Some operating systems
|
||
will allow any printable characters, whereas others only allow numeric and
|
||
alphabetic (i.e. non-punctuation) characters.
|
||
|
||
|
||
After reading all of that, you may ask "well, what is a good password? What
|
||
can I use?". One technique would be to use a two or three word phrase, and
|
||
replace the 1st character of the 1st word with a <shift>-1, the 2nd
|
||
character of the 2nd word with a <shift>-2, etc, and uppercase every second
|
||
character except punctuation. e.g. !Yc@rSm$lLs (my car smells).
|
||
|
||
Another alternative might be to use the first letter from each word in a
|
||
line from a song, have every third letter in upper case, and replace (aeiou)
|
||
with ({}:"?). For example, 'Tie A Yellow Ribbon Round That Old Oak Tree'
|
||
would convert into 't{YrrT""T'.
|
||
|
||
(Rationale:
|
||
'Tie A Yellow Ribbon Round That Old Oak Tree' => 'tayrrtoot'
|
||
Convert every third letter to upper case => 'taYrrTooT'
|
||
Replace lower case vowels => 't{YrrT""T')
|
||
|
||
Note that these examples should NOT be used as they are now published
|
||
widely!
|
||
|
||
You should be aware of what characters your system will accept in a
|
||
password, the length required for a password, and what time period is
|
||
allowed before the password will have to be changed again. You also need to
|
||
be aware of the commands used to change passwords.
|
||
|
||
|
||
|
||
|
||
|
||
What System Managers Can Do
|
||
---------------------------
|
||
|
||
Consider using the following techniques.
|
||
|
||
- Use Crack, a password cracking tool to audit existing passwords. You supply
|
||
a dictionary, and a list of massaging rules. Crack then tests the
|
||
encrypted password against the dictionary and rules list to see which
|
||
passwords it can guess. This is only available for UNIX systems.
|
||
|
||
- Consider also the use of password shadowing, which places the encrypted
|
||
passwords in a non-world-readable file, not /etc/passwd (which is
|
||
world-readable). Again, this is only applicable for UNIX systems.
|
||
|
||
- If your system has a facility to enforce rules on minimum password
|
||
content (e.g. "must include at least 1 upper case and at least 1
|
||
numeric"), then use this facility. For UNIX systems which don't
|
||
have this facility, npasswd or passwd+ are good alternatives.
|
||
|
||
- If your system has a facility to (a) enforce password ageing, and (b) keep
|
||
a history file of passwords and disallow previous passwords, then
|
||
use this facility also.
|
||
|
||
- Keep passwords for system accounts distributed amongst the smallest group
|
||
of people possible. Change these passwords more frequently than
|
||
passwords for non-privileged accounts.
|
||
|
||
- Take care with the use of facilities that are available for logins which
|
||
bypass the use of passwords. For instance, on VMS systems, don't
|
||
allow proxy logins for privileged accounts such as "SYSTEM". On UNIX
|
||
machines, remove any .rhosts files (or /etc/hosts.equiv) with "+"
|
||
signs in them.
|
||
|
||
|
||
Login programs (such as /bin/login on UNIX systems) are constructed to
|
||
behave in a certain way. One method used by crackers to obtain passwords is
|
||
to execute a program (a trojan horse) masquerading as the login program.
|
||
The trojan horse will accept your username and password, log it into a
|
||
secret file, and then inform you that the combination entered was
|
||
incorrect, before finally calling the real login program. The user,
|
||
thinking that this was merely a typographical error, will proceed as normal
|
||
unaware that his or her password has been logged for later use. This can be
|
||
avoided in some cases by typing <Return> a few times before entering your
|
||
username/password combination.
|
||
|
||
Finally, system managers should be aware that X display managers (such as
|
||
xdm) may bypass several login and system facilities such as message of
|
||
the day, password ageing etcetera. Depending upon the sensitivity of your
|
||
site, this may present some problems which will need resolution using more
|
||
lateral methods.
|
||
|
||
|
||
If you believe that your system has been compromised, contact SERT or your
|
||
representative in FIRST (Forum of Incident Response and Security Teams).
|
||
|
||
Internet Email: sert@sert.edu.au
|
||
Facsimile: (07) 365 4477
|
||
Telephone: (07) 365 4417
|
||
SERT personnel answer during business hours (AEST).
|
||
|
||
Security Emergency Response Team
|
||
Prentice Centre
|
||
The University Of Queensland
|
||
Qld 4072
|
||
AUSTRALIA.
|
||
|
||
|
||
|
||
|
||
|
||
Appendix 3
|
||
|
||
|
||
Wrapper Example
|
||
|
||
|
||
The following material is an example of a wrapper that
|
||
could conceivably used for protecting the FAL object, as
|
||
outlined in Section 4.1, Wrappers.
|
||
|
||
$ SET NOON
|
||
$ SET NOCONTROL_Y
|
||
$ SaveVerify = F$VERIFY(0)
|
||
$ SET NOVERIFY
|
||
$!
|
||
================================================================
|
||
$!
|
||
$! Example Wrapper
|
||
$!
|
||
$! *** NOTE: This file is UNTESTED! ***
|
||
$!
|
||
$! Author: Rob McMillan, 1992
|
||
$!
|
||
$! Example wrapper for the FAL object. This command file should
|
||
be
|
||
$! specified as the file to execute for the FAL object in the NCP
|
||
$! database. This file is for example purposes only!
|
||
$!
|
||
$! Create allow and deny lists in AllowFile and DenyFile. The
|
||
$! format of each file is "HOST::USERNAME.". Note the full stop.
|
||
$!
|
||
$! eg
|
||
$! NODE1::USER1.
|
||
$!
|
||
$! To have blanket values, use an asterisk *. For instance, to
|
||
$! have a blanket denial, but allow all people from NODE2::, and
|
||
$! allow NODE1::USER1, have the following configuration:
|
||
$!
|
||
$! DenyFile:
|
||
$! *::*.
|
||
$!
|
||
$! AllowFile:
|
||
$! NODE2::*.
|
||
$! NODE1::USER1.
|
||
$!
|
||
$! In the absence of enough information in the configuration
|
||
$! files, or a clash of information (eg denying and allowing
|
||
$! *::*), the default action is to deny a connection.
|
||
$!
|
||
$!================================================================
|
||
$!
|
||
$! -- What object is this wrapper for?
|
||
$!
|
||
$ Executable = "SYS$SYSTEM:FAL.EXE" ! Object executable to use
|
||
$!
|
||
$! -- Constants
|
||
$!
|
||
$ WAllowed == %x10000001
|
||
$ WDenied == %x10000002
|
||
$ WUnknown == %x10000003
|
||
$!
|
||
$! -- Get connection details
|
||
$!
|
||
$ LocalNodeName = F$GETSYI("NODENAME") + "::"
|
||
$ LocalTime = F$TIME()
|
||
$ LocalUser = F$GETJPI("","USERNAME")
|
||
$ LocalUser = F$EXTRACT(0,F$LOCATE(" ",LocalUser),LocalUser)
|
||
$ RemoteNodeName = F$TRNLNM("SYS$REM_NODE")
|
||
$ RemoteUser = F$TRNLNM("SYS$REM_ID")
|
||
$ WrapperLogInfo = -
|
||
"at ''LocalTime' from ''RemoteNodeName'::''RemoteUser' as ''LocalUser'"
|
||
$!
|
||
$! -- Check wrapper configuration
|
||
$!
|
||
$! At this point, we can use any of the following to check
|
||
$! whether we'll allow the connection:
|
||
$!
|
||
$! - LocalNode
|
||
$! - LocalTime
|
||
$! - LocalUser
|
||
$! - RemoteNodeName
|
||
$! - RemoteUser
|
||
$!
|
||
$ ConnectionOkay = WUnknown
|
||
$ CheckFALRules 'LocalNodeName' 'LocalTime' 'LocalUser' -
|
||
'RemoteNodeName' 'RemoteUser'
|
||
$ ConnectionOkay = $Status
|
||
$ IF (RemoteNodeName .EQS. LocalNodeName)
|
||
$ THEN
|
||
$ ConnectionOkay = WAllowed ! Failsafe
|
||
$ ENDIF
|
||
$!
|
||
$! -- Log the event and take action
|
||
$!
|
||
$ IF (ConnectionOkay .NE. WAllowed)
|
||
$ THEN
|
||
$ WRITE SYS$OUTPUT "Network connect request failed ''WrapperLogInfo'"
|
||
$ WriteFALLog "Network connect request failed ''WrapperLogInfo'"
|
||
$ LOGOUT
|
||
$ ELSE
|
||
$ WRITE SYS$OUTPUT "Network connect request succeeded ''WrapperLogInfo'"
|
||
$ WriteFALLog "Network connect request succeeded ''WrapperLogInfo'"
|
||
$ RUN 'Executable'
|
||
$ ENDIF
|
||
$!
|
||
$! -- Go home now
|
||
$!
|
||
$ SaveVerify = F$VERIFY(SaveVerify)
|
||
$ EXIT 'ConnectionOkay'
|
||
|
||
|
||
For interactive connections, the section in which
|
||
connection details are evaluated would be more
|
||
complicated. Different mechanisms would be required for
|
||
finding out these details based upon the type of
|
||
connection (eg local, DECnet, LAT, telnet). These are
|
||
mentioned in Section 4.1, Wrappers. These command files
|
||
should be world executable, but only readable and
|
||
writeable by system privileged users.
|
||
|
||
The two executables, CheckFALRules and WriteFALLog,
|
||
should be similarly protected (eg installed, protected
|
||
images). WriteFALLog is a very simple program which
|
||
writes the supplied parameters to the log file for this
|
||
object. CheckFALRules could look something like the
|
||
following example.
|
||
|
||
|
||
|
||
/*
|
||
* CheckFALRules.C
|
||
*
|
||
* Author: Rob McMillan, 1992
|
||
*
|
||
* Use current connection details to compare with local rules and
|
||
* return a value describing whether to allow the connection or
|
||
* not (Allow).
|
||
*
|
||
* The returned value (Allow) can return one of two values:
|
||
* WAllowed: allow the connection
|
||
* WDenied: refuse the connection
|
||
*
|
||
* This wrapper configuration tests only upon the basis of
|
||
* RemoteNodeName and RemoteUser. However, any of the details
|
||
* supplied below can be used, based upon paranoia levels. To
|
||
* do this, the following must be modified:
|
||
*
|
||
* - The CHECK_EXPLICIT_RULE subroutine
|
||
* - The calls in this subroutine to CHECK_EXPLICIT_RULE
|
||
* - The header comments at the top of this wrapper
|
||
* - The allow and deny files.
|
||
*
|
||
*/
|
||
|
||
|
||
#include <ssdef.h>
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
|
||
#include "CheckFALRules.H"
|
||
|
||
typedef unsigned int BOOLEAN;
|
||
#define FALSE 0
|
||
#define TRUE 1
|
||
|
||
|
||
/* -- Prototypes */
|
||
int CheckExplicitRule( char *, char *);
|
||
int ExitHandler(int, char *);
|
||
char * Salloc(unsigned int);
|
||
char * SnarfArgument(char *);
|
||
|
||
int
|
||
main (argc, argv)
|
||
int argc;
|
||
char * argv[];
|
||
{
|
||
char * localNodeName;
|
||
char * localTime;
|
||
char * localUser;
|
||
char * remoteNodeName;
|
||
char * remoteUser;
|
||
int status = WUnknown;
|
||
|
||
/* Get and display parameters */
|
||
|
||
localNodeName= SnarfArgument(argv[1]);
|
||
localTime = SnarfArgument(argv[2]);
|
||
localUser = SnarfArgument(argv[3]);
|
||
remoteNodeName = SnarfArgument(argv[4]);
|
||
remoteUser = SnarfArgument(argv[5]);
|
||
if ((localNodeName == (char *)0) ||
|
||
(localTime == (char *)0) ||
|
||
(localUser == (char *)0) ||
|
||
(remoteNodeName == (char *)0) ||
|
||
(remoteUser == (char *)0)
|
||
) {
|
||
fprintf( stderr, "Error snarfing check parameters!\n");
|
||
exit( ExitHandler( WDefault, "Error snarfing check
|
||
parameters!"));
|
||
}
|
||
|
||
/* Now evaluate whether to allow the connection */
|
||
|
||
/* -- We will only test based on source node and user.
|
||
* We can check other details if required at a later stage.
|
||
*
|
||
* Note that the order in which these rules are checked is
|
||
* important. Below, we check in the order of the most
|
||
* specific rule to the most general. Once a connection
|
||
* is found to be explicitly allowed or denied
|
||
* no further rules are checked.
|
||
*/
|
||
|
||
status = CheckExplicitRule( remoteNodeName, remoteUser);
|
||
if (status != WUnknown)
|
||
exit( ExitHandler( status, "On node::user combination"));
|
||
|
||
status = CheckExplicitRule( remoteNodeName, "*");
|
||
if (status != WUnknown)
|
||
exit( ExitHandler( status, "On node::* combination"));
|
||
|
||
status = CheckExplicitRule( "*", "*");
|
||
if (status != WUnknown)
|
||
exit( ExitHandler( status, "On *::* combination"));
|
||
|
||
/* No applicable rules were found, or there were a clash of
|
||
* rules, so use the default.
|
||
*/
|
||
fprintf(stderr, "Warning! Unable to evaluate connection status!\n");
|
||
exit ( ExitHandler( WDefault, "Default action taken"));
|
||
} /* end main */
|
||
|
||
/*
|
||
* CheckExplicitRule
|
||
*
|
||
* Use the remoteNodeName and remoteUser to return a value
|
||
* describing whether the proposed connection is explicitly allowed
|
||
* or denied. The returned value can be one of three values:
|
||
*
|
||
* WAllowed: explicitly allow the connection
|
||
* WDenied: explicitly deny the connection
|
||
* WUnknown: couldn't evaluate on supplied information
|
||
*
|
||
* Allowed configurations are set out in ALLOW_FILE.
|
||
* Disallowed configurations are set out in DENY_FILE.
|
||
*
|
||
* If the record is found in both files, or the record can't be
|
||
* found in either file, return WUnknown. Otherwise, return
|
||
* the result explicitly described by the files.
|
||
*
|
||
*/
|
||
int
|
||
CheckExplicitRule( remoteNodeName, remoteUser)
|
||
char * remoteNodeName;
|
||
char * remoteUser;
|
||
{
|
||
char inbuf[132]; /* Should be heaps */
|
||
char * searchKey;
|
||
BOOLEAN allow = WUnknown;
|
||
BOOLEAN foundAllow = FALSE;
|
||
BOOLEAN foundDeny = FALSE;
|
||
FILE * fp;
|
||
|
||
|
||
if ((searchKey = Salloc(strlen(remoteNodeName) + 3 +
|
||
strlen(remoteUser))) == (char *)0)
|
||
return( WUnknown);
|
||
searchKey = strcpy(searchKey, remoteNodeName);
|
||
searchKey = strcat(searchKey, "::");
|
||
searchKey = strcat(searchKey, remoteUser);
|
||
|
||
/* See if there is a matching record in the allow file */
|
||
if ((fp = fopen( ALLOW_FILE, "r")) == (FILE *)NULL) {
|
||
fprintf(stderr, "Error! Cannot open wrapper AllowFile! \n");
|
||
return( WUnknown);
|
||
}
|
||
else {
|
||
/* Search file for matching record */
|
||
while ((foundAllow == FALSE) && (fgets(inbuf, 132, fp) != (char *)NULL))
|
||
if (strncmp(searchKey, inbuf, strlen(searchKey)) == 0)
|
||
foundAllow = TRUE;
|
||
fclose(fp);
|
||
}
|
||
|
||
/* Now search deny file as well */
|
||
if ((fp = fopen( DENY_FILE, "r")) == (FILE *)NULL) {
|
||
fprintf(stderr, "Error! Cannot open wrapper DenyFile! \n");
|
||
return( WUnknown);
|
||
}
|
||
else {
|
||
/* Search file for matching record */
|
||
while ((foundDeny == FALSE) && (fgets(inbuf, 132, fp) != (char *)NULL))
|
||
if (strncmp(searchKey, inbuf, strlen(searchKey)) == 0)
|
||
foundDeny = TRUE;
|
||
fclose(fp);
|
||
}
|
||
|
||
/* If we get a strict decision, then return the result. If we
|
||
* get two FALSEs or two TRUEs, then there is no decision.
|
||
*/
|
||
if ((foundAllow == TRUE) && (foundDeny == FALSE))
|
||
allow = WAllowed;
|
||
if ((foundAllow == FALSE) && (foundDeny == TRUE))
|
||
allow = WDenied;
|
||
|
||
return( allow);
|
||
|
||
} /* end CheckExplicitRule */
|
||
|
||
/*
|
||
* ExitHandler
|
||
*
|
||
* Carry out any cleaning up required whilst exiting.
|
||
*
|
||
*/
|
||
int
|
||
ExitHandler( exitCode, diagnostic)
|
||
int exitCode;
|
||
char * diagnostic;
|
||
{
|
||
|
||
#ifdef DEBUG
|
||
switch (exitCode) {
|
||
case WAllowed:
|
||
fprintf( stdout, "\nConnection allowed: ");
|
||
fprintf( stdout, "%s.\n", diagnostic);
|
||
break;
|
||
case WDenied:
|
||
fprintf( stdout, "\nConnection denied: ");
|
||
fprintf( stdout, "%s.\n", diagnostic);
|
||
break;
|
||
case WUnknown:
|
||
fprintf( stdout, "\nCan't figure out to allow connection or not: ");
|
||
fprintf( stdout, "%s.\n", diagnostic);
|
||
break;
|
||
default:
|
||
fprintf( stdout, "\nError. Unknown exit code: ");
|
||
fprintf( stdout, "%s.\n", diagnostic);
|
||
break;
|
||
}
|
||
#endif
|
||
|
||
return( exitCode);
|
||
} /* end ExitHandler */
|
||
|
||
|
||
/*
|
||
* Salloc
|
||
*
|
||
* Safe malloc
|
||
*
|
||
* See P321 "C Programming in a UNIX Environment"
|
||
* by Judy Kay and Bob Kummerfeld,
|
||
* Addison-Wesley, 1989.
|
||
*
|
||
*/
|
||
char *
|
||
Salloc(size)
|
||
unsigned int size;
|
||
{
|
||
char * result;
|
||
if ((result = malloc(size)) == (char *)0)
|
||
fprintf(stderr, "Cannot malloc %d bytes.\n", size);
|
||
return result;
|
||
} /* end Salloc */
|
||
|
||
/*
|
||
* SnarfArgument
|
||
*
|
||
* Make a copy of arg string.
|
||
*
|
||
*/
|
||
char *
|
||
SnarfArgument( arg)
|
||
char * arg;
|
||
{
|
||
char * result;
|
||
|
||
if ((result = Salloc(strlen(arg)+1)) != (char *)0)
|
||
result = strcpy(result, arg);
|
||
return( result);
|
||
} /* end SnarfArgument */
|
||
|
||
|
||
The header file for this program would contain the following:
|
||
|
||
/*
|
||
* CheckFALRules.H
|
||
*
|
||
* Author: Rob McMillan, 1992
|
||
*
|
||
* See comments in CheckFALRules.C.
|
||
*
|
||
* THE CONTENTS OF THIS FILE MUST MATCH THOSE IN THE WRAPPER COMMAND FILE!
|
||
*
|
||
*/
|
||
|
||
/* -- Define file paths */
|
||
#define DEBUG
|
||
#ifdef DEBUG
|
||
#define ALLOW_FILE "{Allow File name here}"
|
||
#define DENY_FILE "{Deny File name here}"
|
||
#else
|
||
#define ALLOW_FILE "local$wrap:{Allow File name here}"
|
||
#define DENY_FILE "local$wrap:{Deny File name here}"
|
||
#endif
|
||
|
||
/* -- Define exit values */
|
||
#define WAllowed 0x10000001
|
||
#define WDenied 0x10000002
|
||
#define WUnknown 0x10000003
|
||
#define WDefault WDenied
|
||
|
||
|