home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / c-kermit / iksd.txt < prev    next >
Text File  |  2020-01-01  |  72KB  |  1,593 lines

  1.  
  2.                  IKSD - The Internet Kermit Service Daemon
  3.                                       
  4.                  IKSD SYSTEM ADMINISTRATOR'S GUIDE FOR UNIX
  5.                                       
  6.                              The Kermit Project
  7.                             Columbia University
  8.                      [1]http://www.columbia.edu/kermit/
  9.                                       
  10.    As of: C-Kermit 8.0, 12 Dec 2001
  11.    This page last updated: 12 Dec 2001
  12.    
  13.    The Internet Kermit Service Daemon (IKSD) is C-Kermit 7.0 or later,
  14.    started in a special way. At this writing, only the UNIX version of
  15.    C-Kermit can act as IKSD, but IKSD will also be available soon in the
  16.    Windows version, and can be added to the VMS, VOS, and other versions
  17.    if there is sufficient demand. The Internet Kermit Service is
  18.    specified in [2]RFC2839 and [3]RFC2840.
  19.    
  20.   CONTENTS
  21.   
  22.   1. [4]Why IKSD?
  23.   2. [5]System Configuration
  24.   3. [6]Compile-Time Configuration Options
  25.   4. [7]Runtime Configuration Options
  26.   4.1. [8]Command-Line Options
  27.   4.2. [9]System Logging
  28.   4.3. [10]The IKSD Log File
  29.   4.4. [11]IKSD Configuration File
  30.   4.5. [12]Initialization File
  31.   5. [13]Access to Services
  32.   5.1. [14]Automatic Settings
  33.   5.2. [15]Authentication
  34.   5.3. [16]The DISABLE Command
  35.   5.4. [17]Shell Access
  36.   5.5. [18]Anonymous Users
  37.   5.6. [19]Management Information
  38.   6. [20]Open Issues
  39.   6.1. [21]Connection Establishment
  40.   6.2. [22]Shell Access
  41.   6.3. [23]External and/or non-Kermit Protocols
  42.   6.4. [24]Additional Administrative Controls
  43.   6.5. [25]Known Bugs
  44.   7. [26]Monitoring
  45.   7.1. [27]Database Record Format
  46.   7.2. [28]The Display Module
  47.   7.3. [29]Database Management
  48.   8. [30]Testing
  49.      _________________________________________________________________
  50.    
  51.   1. Why IKSD?
  52.   
  53.    Why run an Internet Kermit Service Daemon when you are already running
  54.    an FTP server?
  55.    
  56.      * Like FTP, Kermit provides a service that can be accessed from many
  57.        different platforms with a consistent set of commands, but unlike
  58.        FTP, these commands include programming constructions such as
  59.        variables, arrays, looping and selection mechanisms, and local and
  60.        remote procedure calls, thus allowing file transfer and management
  61.        operations of arbitrary complexity to be easily automated.
  62.      * Like FTP, Kermit provides both text- and binary-mode data
  63.        transfer, as well as file management capabilities. But Kermit also
  64.        offers numerous features lacking from FTP, such as:
  65.           + [31]character-set translation;
  66.           + [32]flexible file selection mechanisms;
  67.           + [33]preservation of timestamps and permissions;
  68.           + [34]automatic per-file text/binary mode switching (important
  69.             in cross-platform transfers);
  70.           + [35]cross-platform directory-tree transfer; and:
  71.           + a selection of file collision options including "make backup
  72.             copy of existing file and accept incoming file", "reject
  73.             incoming file", "accept incoming file only if newer than
  74.             existing file", etc.
  75.      * Unlike FTP, Kermit supports [36]atomic file movement, in which the
  76.        source file can be deleted (or renamed, or moved) when and only
  77.        when it has been transferred successfully, as part of the transfer
  78.        operation itself.
  79.      * Unlike most FTP implementations, Kermit supports [37]recovery of
  80.        interrupted transfers from the point of failure. You can even use
  81.        it to recover interrupted FTP transfers when FTP itself does not
  82.        offer this option.
  83.      * Unlike standard FTP, Kermit can transfer data through firewalls or
  84.        proxies or NATs on a single well-known port (unless the TCP port
  85.        for the connection has been explicitly filtered).
  86.      * Unlike FTP, Kermit can transfer data across a combination of
  87.        transports (e.g. dial-up to a terminal server and thence to an
  88.        Internet host).
  89.      * Authentication and data transfer can take place over [38]secure
  90.        connections (mutually authenticated and encrypted) using
  91.        established Telnet authentication and encryption options.
  92.      * Unlike traditional Kermit use over Telnet, anonymous access is
  93.        possible, and the considerable overhead of the intervening Telnet
  94.        server and pseudoterminal service is eliminated.
  95.      * Unlike the FTP daemon (ftpd), the IKSD can be monitored in real
  96.        time by the system administrator (see [39]Section 7).
  97.        
  98.    A prototype IKSD is available for public access at:
  99.    
  100.   [40]kermit.columbia.edu port 1649
  101.  
  102.    This service is based in part on a new Telnet Kermit Option described
  103.    in a pair of Internet Drafts:
  104.    
  105.   [41]ftp://ftp.ietf.org/internet-drafts/draft-altman-telnet-kermit-server-03.t
  106. xt
  107.   [42]ftp://ftp.ietf.org/internet-drafts/draft-columbia-kermit-service-03.txt
  108.      _________________________________________________________________
  109.    
  110.   2. System Configuration
  111.   
  112.    WARNING: Do not attempt to install a pre-7.0 version of C-Kermit as an
  113.    IKSD. Earlier versions do not perform the necessary authentication and
  114.    security functions, and therefore will leave your system wide open to
  115.    anonymous root access. (Don't worry, the installation procedure
  116.    described here, if you follow it, and the interface to IKSD, prevent
  117.    you from starting an earlier version of C-Kermit as an IKSD, since it
  118.    lacks the needed command-line options and will halt with a usage
  119.    message if you try to use them.)
  120.    
  121.    Directory organization, file system, naming conventions, and other
  122.    administrative details vary from system to system and site to site, so
  123.    specific instructions can not be given here. In general, however, the
  124.    steps are:
  125.    
  126.     a. The C-Kermit executable should be copied to the directory that is
  127.        normally used for launching Internet services, and renamed to
  128.        "iksd". Normally the owner and group should be root and the
  129.        permission 0750.
  130.      The following entry should be added to the Internet services file,
  131.        normally /etc/services:
  132.  
  133.   kermit   1649/tcp
  134.     b. An entry must be made in the inetd configuration file, normally
  135.        /etc/inetd.conf. See your system-specific documentation for the
  136.        name, location, and format of this file, e.g. "man inetd" and "man
  137.        inetd.conf". Typical example:
  138.  
  139.   kermit  stream  tcp  nowait  root  iksd -A other-iksd-options
  140.        Or, with TCP wrappers:
  141.  
  142.   kermit  stream  tcp  nowait  root  tcpd iksd -A other-iksd-options
  143.        Include full pathnames for tcpd and iksd if required. See
  144.        [43]Section 4 for iksd-options. NOTE: Different platforms might
  145.        require different syntax, e.g.:
  146.  
  147.   kermit stream tcp nowait root /usr/sbin/iksd iksd -A other-iksd-options
  148.     c. When using TCP wrappers, make the appropriate entries in its
  149.        configuration file(s), such as /etc/hosts.allow and
  150.        /etc/hosts.deny. See the TCP wrappers documentation for further
  151.        info.
  152.     d. Make any required hard or soft links to the iksd executable.
  153.     e. If desired, create an IKSD configuration file (/etc/iksd.conf by
  154.        default).
  155.        
  156.    This setup allows multiple simultaneous IKSD sessions. A fresh IKSD
  157.    process is started for each session, and disappears when IKSD exits,
  158.    automatically closing the session and the connection.
  159.    
  160.    To kill a particular instance of IKSD, find its pid with "ps ax | grep
  161.    iksd" (or the equivalent command to list all processes) and then "kill
  162.    -9 pid" (as root).
  163.    
  164.    To update the IKSD program, simply replace the executable in the
  165.    "launch" directory ([44](a) above).
  166.    
  167.    To discontinue IKSD service quickly, delete the iksd executable, or
  168.    (to avoid unwanted console logging) replace it with (say) /bin/false.
  169.      _________________________________________________________________
  170.    
  171.   3. Compile-Time Configuration Options
  172.   
  173.    You can use any C-Kermit configuration as an IKSD, ranging from a
  174.    fully configured version, to a special IKSD-Only version, to any of
  175.    the various "stripped-down" versions, as described in the C-Kermit
  176.    Configuration Guide ([45]ckccfg.txt) and/or Installation Instructions
  177.    ([46]ckuins.txt).
  178.    
  179.    The following compile-time options are specific to or of special
  180.    relevance to the IKSD:
  181.    
  182.    TNCODE - Required for IKS.
  183.           Include Telnet protocol code, even if networking code is not
  184.           included. Defined by default if TCPSOCKET defined, otherwise
  185.           must be defined explicitly.
  186.           
  187.    IKS_OPTION - Required for IKS.
  188.           Include code for the new Internet Kermit Service Option.
  189.           Currently defined automatically if TNCODE is defined.
  190.           
  191.    CK_LOGIN - Required for IKS.
  192.           Include user authentication code. Defined automatically for
  193.           UNIX unless NOLOGIN defined.
  194.           
  195.    CK_PAM
  196.           The IKS is to be compiled to use PAM (Pluggable Authentication
  197.           Modules) to authenticate the user for interactive logins
  198.           instead of Unix password files. The default PAM service type
  199.           for IKSD is "kermit".
  200.           
  201.    PAM_SERVICE_TYPE
  202.           If CK_PAM is defined and you wish to use a service type other
  203.           than "kermit" you can define PAM_SERVICE_TYPE to equal the
  204.           string you wish to use.
  205.           
  206.    CK_SHADOW
  207.           If your host utilizes the shadow password system for storing
  208.           user passwords the IKS must be compiled with support for shadow
  209.           passwords. This might also require some additional libraries
  210.           added the LIBS clause, such as -lgen, for loading the
  211.           getspnam() routine.
  212.           
  213.    CKSYSLOG
  214.           Include code for making syslog entries. This symbol is defined
  215.           automatically if (a) CK_LOGIN is defined; (b) UNIX is defined;
  216.           and (c) NOSYSLOG is not defined.
  217.           
  218.    CKWTMP
  219.           Include code for making wtmp log entries. This symbol is
  220.           defined automatically if (a) CK_LOGIN is defined; (b) UNIX is
  221.           defined; and (c) NOWTMP is not defined.
  222.           
  223.    WTMPFILE
  224.           String containing pathname of the default wtmp logfile. If not
  225.           specified, a default is supplied, currently /var/log/wtmp on
  226.           Linux and /usr/adm/wtmp elsewhere. The wtmp file can also be
  227.           specified at runtime; see [47]next section.
  228.           
  229.    CK_CURSES
  230.           Need not be defined in an IKSD-only build, since curses is used
  231.           only in local mode, and the IKSD is always in remote mode, plus
  232.           the fact that curses initialization can cause spurious error
  233.           messages in IKSD since it might not have a terminal type (TERM
  234.           variable) in its environment.
  235.           
  236.    NOLOCAL
  237.           This may be defined to exclude all code relating to the making
  238.           of both serial and network connections from the C-Kermit/IKSD
  239.           executable. This code is presently not needed, and is never
  240.           used, in the IKSD. Compiling it out reduces the size of the
  241.           executable and eliminates any possibility that a loophole could
  242.           be exploited to use the IKSD as a relay.
  243.           
  244.    NOPUSH
  245.           This symbol may be defined to exclude all code that is used to
  246.           access local shell or system functions, such as the RUN (!)
  247.           command, the server end of the REMOTE HOST command,
  248.           file-transfer pipes and filters, etc. Note that such code is
  249.           disabled at runtime in the IKS anyway; compiling it out
  250.           completely reduces the size of the executable and the risk of
  251.           loopholes.
  252.           
  253.    NOICP
  254.           Disables the interactive command parser as well as long-form
  255.           command-line options ([48]Section 4.1). In this configuration,
  256.           the IKS runs only in Kermit Server mode, and the size of the
  257.           executable is reduced dramatically. WARNING: NOICP also
  258.           inhibits extended command-line options (the ones that start
  259.           with "--"), since these share the same parsing routines as the
  260.           interactive parser.
  261.           
  262.    NOSPL
  263.           Disables the script programming language (INPUT, OUTPUT, FOR,
  264.           WHILE, IF, SWITCH, macros, variables, etc) without disabling
  265.           the interactive command parser.
  266.           
  267.    NOGETUSERSHELL
  268.           Add this if the link steps fails because it can't resolve
  269.           getusershell() and/or endusershell(). Normally, IKSD will
  270.           refuse a login if the user's login shell is not one of those
  271.           returned by getusershell() (normally, getusershell() simply
  272.           lists the shells listed in /etc/shells, but we can't depend on
  273.           this). Thus if your site "invalidates" user IDs by setting
  274.           their login shell to something that is not really a shell (like
  275.           /etc/nologin), but does not have a getusershell() function,
  276.           IKSD will still let such users log in unless (a) you put them
  277.           in the forbidden users file (see [49]Section 4.1), or (b) add
  278.           some code to ckufio.c to check for whatever invalid or valid
  279.           shells might apply at your site.
  280.           
  281.    NOIKSD
  282.           This defines the symbols NOLOGIN, NOSYSLOG, NOWTMP,
  283.           NOPRINTFSUBST, which in turn prevent the definition of symbols
  284.           (CK_LOGIN, CKSYSLOG, etc) that cause IKSD-specific code to be
  285.           included.
  286.           
  287.    CK_SYSINI
  288.           
  289.    CK_DSYSINI
  290.           System-wide initialization file; see [50]Section 4.4.
  291.           
  292.    IKSD
  293.           Is defined automatically if NOIKSD is not defined.
  294.           
  295.    IKSDCONF
  296.           The name of the IKSD configuration file. In UNIX this is
  297.           "/etc/iksd.conf" by default; elsewhere "iksd.cfg".
  298.           
  299.    In an IKSD-only build, you should omit the termcap/termlib and
  300.    (n)curses libraries, and set up the link step to make sure the IKSD is
  301.    linked with the same user authorization libraries used by your local
  302.    login program. Here is a sample for SunOS 4.1.3 at a particular site:
  303.    
  304. sunos41giks:
  305.         @echo Making C-Kermit $(CKVER) for SunOS 4.1 with gcc for IKS...
  306.         $(MAKE) wermit "CC= gcc" "CC2= gcc" \
  307.         "CFLAGS= -O -DSUNOS41 -DNDGPWNAM \
  308.         -DTNCODE -DNOLOCAL -DNOPUSH $(KFLAGS)" \
  309.         "LIBS= -L/usr/local/lib -lpwent -lcrypt"
  310.  
  311.    in which:
  312.      * -DNOLOCAL excludes all code that is used to make connections.
  313.      * -DNOPUSH excludes all code that accesses local system shells and
  314.        commands.
  315.      * -DTNCODE includes Telnet protocol code even though -DNOLOCAL is
  316.        included.
  317.        
  318.    At sites that use shadow passwords, you'll need to add -DCK_SHADOW to
  319.    CFLAGS and perhaps -lgen to LIBS.
  320.    
  321.    Also note that the crypt() function, which is used for verifying
  322.    passwords, is normally found in libc, but on some platforms it has
  323.    been broken out into a separate library, such as -lcrypt, and in that
  324.    case must be included in the LIBS clause.
  325.    
  326.    For PAM installations, here's an example /etc/pam.d/kermit file that
  327.    uses EPS password files for user authentication and the standard unix
  328.    modules for account and session management:
  329.    
  330.   auth      required       /lib/security/pam_eps_auth.so
  331.   password  required       /lib/security/pam_eps_passwd.so
  332.   account   required       /lib/security/pam_unix_acct.so
  333.   session   required       /lib/security/pam_unix_session.so
  334.  
  335.    Kerberos IV, Kerberos V, SRP, and TLS can also be selected at build
  336.    time if you have the appropriate libraries and header files installed
  337.    on your system. See the [51]Kermit Security Reference for further
  338.    details.
  339.    
  340.    For a build that excludes all IKSD functions, it is normally
  341.    sufficient to add NOIKSD to the CFLAGS, e.g.:
  342.    
  343.   make aix41 KFLAGS=-DNOIKSD
  344.      _________________________________________________________________
  345.    
  346.   4. Runtime Configuration Options
  347.   
  348.    The IKSD can be configured at runtime with command-line options or by
  349.    an initialization file or other auxiliary file(s), in any
  350.    combination. The SHOW IKSD command lists the IKSD-relevant parameters
  351.    and their values.
  352.    
  353.   4.1. Command-Line Options
  354.   
  355.    To start C-Kermit as an Internet Kermit Service Daemon, include the
  356.    '-A' command-line option. This option not only configures C-Kermit as
  357.    an IKSD, but it also ensures that you are running a version of
  358.    C-Kermit that can do this, i.e. C-Kermit 7.0 or later built with all
  359.    the necessary compile-time options ([52]Section 3). If either of these
  360.    conditions does not apply, the '-A' option will be invalid and the
  361.    Kermit program will halt immediately.
  362.    
  363.    In addition to -A and the command-line options described in [53]Using
  364.    C-Kermit (2nd Edition), plus any other new ones described in the
  365.    [54]C-Kermit 7.0 Update Notes and [55]C-Kermit 8.0 Update Notes, a
  366.    selection of new long-form options apply specifically to the IKSD.
  367.    Long-form options work as follows:
  368.    
  369.     a. All long-form options must begin with "--" (two hyphens) or "-+".
  370.        If the option begins with "--" it is executed before or after the
  371.        C-Kermit initialization file, according to its internal keyword
  372.        flags. If it begins with "-+", it is executed before the init
  373.        file, regardless of the keyword flags. There is no way to force an
  374.        argument to be executed after the init file if it has the CM_PRE
  375.        bit set (see table below).
  376.     b. No spaces are allowed in the keyword.
  377.     c. If an operand contains spaces, it (or the entire option) must be
  378.        quoted according to the rules of the shell from which Kermit is
  379.        invoked.
  380.     d. Case doesn't matter in the option keyword (unlike with regular
  381.        single-letter options).
  382.     e. If an operand is required, it must be included. If no operand is
  383.        required, no operand must be included.
  384.     f. The operand follows the keyword, separated by a colon (:) or equal
  385.        sign (=). There are no spaces between the separator and the
  386.        keyword or operand.
  387.     g. Long-form option names may be abbreviated according to the same
  388.        rules as interactive keywords.
  389.     h. On/Off operands can be On, Off, Yes, No, True, False, 0, 1, or OK
  390.        (case of letters does not matter).
  391.     i. Long-form options are available only when the interactive command
  392.        parser is built-in (i.e. not NOICP).
  393.        
  394.    The new long-form options are:
  395.    
  396.   Option        Values    Default      CM_PRE   Effect                  
  397.  
  398.   --anonymous   on/off    on             yes    anonymous login allowed
  399.   --bannerfile  filename  (none)         no     greeting message
  400.   -+cdfile      filelist  (see below)    no     CD message filename
  401.   -+cdmessage   on/off    on             no     CD messages on/off
  402.   -+cdmsg       on/off    on             no     synonym for cdmessage
  403.   --help        (none)    (n/a/)         no     list available --options
  404.   --helpfile    filename  (none)         no     custom text for HELP command
  405.   --initfile    filename  /.kermrc       yes    Init file for anonymous users
  406.   --nointerrupt (none)    (see below)    yes    Disables SIGINT and SIGTSTP
  407.   --permissions octalnum  0040           yes    anonymous upload permissions
  408.   --perms       octalnum  0040           yes    synonym for permissions
  409.   --root        directory /pub/ftp       yes    root for anonymous users
  410.   --syslog      number    3              yes    level of syslogging
  411.   --timeout     number    300            yes    time limit for login
  412.   --userfile    filename  /etc/ftpusers  yes    forbidden local users list
  413.   --wtmplog     on/off    on             yes    wtmp logging on/off
  414.   --wtmpfile    filename  (see below)    yes    pathname of wtmp logfile
  415.   --xferlog     on/off    off            yes    use an ftpd-logfile
  416.   --xferfile    filename  (see below)    yes    pathname of ftpd-like logfile
  417.                                                                         
  418.  
  419.    Note: in all options that take a filename, except --cdfile, relative
  420.    filenames or filenames that start with ~ are expanded to full
  421.    pathnames.
  422.    
  423.    In more detail:
  424.    
  425.    --nointerrupts
  426.           Disables keyboard interrupts that are normally enabled. In
  427.           IKSD, when it is in interactive prompting state, commands can
  428.           normally be interrupted with Ctrl-C. Suspending (normally via
  429.           Ctrl-Z) is always disabled in IKSD.
  430.           
  431.    --help
  432.           Lists the extended command-line options that are available in
  433.           your version of C-Kermit. If any options seem to be missing,
  434.           that is because your copy of C-Kermit was built with
  435.           compile-time options to deselect them.
  436.           
  437.    --helpfile:filename
  438.           Specifies the name of a file to be displayed if the user types
  439.           HELP (not followed by a specific command or topic), in place of
  440.           the built-in top-level help text. The file need not fit on one
  441.           screen; more-prompting is used if the file is more than one
  442.           screen long if COMMAND MORE-PROMPTING is ON, as it is by
  443.           default.
  444.           
  445.    --anonymous:{on,off}
  446.           Whether anonymous logins are allowed. By default they are
  447.           allowed, so this option need be included only to disallow them
  448.           (or for clarity, to emphasize that they are allowed). Anonymous
  449.           login occurs when the username "anonymous" or "ftp" is given,
  450.           with any password (as with ftpd).
  451.           
  452.    --timeout:number
  453.           This sets a limit (in seconds) on the amount of time the client
  454.           has to log in once the connection is made. If successful login
  455.           does not occur within the given number of seconds, the
  456.           connection is closed. The default timeout is 300 seconds (5
  457.           minutes). A value of 0 or less indicates there is to be no
  458.           limit.
  459.           
  460.    --bannerfile:filename
  461.           The name of a file containing a message to be printed after the
  462.           user logs in, in place of the normal message (Copyright notice,
  463.           "Type HELP or ? for help", "Default transfer mode is...", etc).
  464.           
  465.    --permissions:octalnum
  466.           The permissions given to any file that is uploaded by an
  467.           anonymous user. 0040 is the default and recommended value. The
  468.           default permits only group-read access, and therefore prevents
  469.           anonymous users from uploading files (e.g. pirated software) to
  470.           be downloaded by other anonymous users. Synonym: --perms.
  471.           
  472.    --initfile:filename
  473.           The initialization file to be executed for anonymous logins. By
  474.           default it is /.kermrc, where "/" is the root of the chroot'd
  475.           file system. Any filename that you specify here must be
  476.           specified in the notation of the the chroot'd file system. This
  477.           option is independent of the '-y' option (alternative init
  478.           file), which applies only to real users.
  479.           
  480.    --cdmessage:{on,off,0,1,2}
  481.           For use in the Server-Side Server configuration; whenever the
  482.           client tells the server to change directory, the server sends
  483.           the contents of a "read me" file to the client's screen. This
  484.           feature is On by default, and operates only in client/server
  485.           mode when ON or 1. If set to 2 or higher, it also operates when
  486.           the CD command is given at the IKSD> prompt. Synonym: --cdmsg.
  487.           
  488.    --cdfile:filename (or list)
  489.           When cdmessage is on, this is the name of the "read me" file to
  490.           be sent. Normally you would specify a relative (not absolute)
  491.           name, since the file is opened using the literal name you
  492.           specified, after changing to the new directory. Example:
  493.           
  494.   --cdfile:READ.ME
  495.  
  496.           You can also give a list of up to 8 filenames by (a) enclosing
  497.           each filename in braces, and (b) enclosing the entire list in
  498.           braces. Example:
  499.           --cdfile:{{./.readme}{READ.ME}{aaareadme.txt}{README}{read-this
  500.           -first}} When a list is given, it is searched from left to
  501.           right and the first file found is displayed. The default list
  502.           for UNIX is:
  503.           
  504.   {{./.readme}{README.TXT}{READ.ME}}
  505.  
  506.    --database:{on,off}
  507.           Whether an active-sessions database should be kept. On by
  508.           default. If "on", but --dbfile is not specified,
  509.           /var/log/iksd.db is used.
  510.           
  511.    --dbfile:filename
  512.           Use this option to specify an iksd database file name. If you
  513.           include this option, it implies .
  514.           
  515.    --syslog:number or {on,off}
  516.           Whether and what level of syslog entries should be made. A
  517.           level of 0 (or "off" or "false" or "no") means no syslogging. A
  518.           level of "on" (or "yes" or "true") invokes the default
  519.           syslogging level. To choose a non-default level of syslogging,
  520.           specify a number (see [56]Section 4.2).
  521.           
  522.    --wtmplog:{on,off}
  523.           Whether wtmp log entries should be made. On by default. An
  524.           entry is made when the user logs in and when the session is
  525.           closed. The "tty name" field is given as "iks_xxxx", where xxxx
  526.           is the process ID (pid) of the IKSD. Thus IKSD session history
  527.           can be monitored via "last | grep iks_". Anonymous logins are
  528.           shown with a user ID of "ftp".
  529.           
  530.    --wtmpfile:filename
  531.           The default wtmp log file is /var/log/wtmp in Linux, and
  532.           /usr/adm/wtmp elsewhere. In case your system's wtmp log file
  533.           does not match the default, use this option to specify the
  534.           appropriate filename.
  535.           
  536.    --userfile:filename
  537.           This file contains a list of local usernames that are to be
  538.           denied access to Internet Kermit Service. The default is
  539.           /etc/ftpusers. This can be the same file that is used by
  540.           wuftpd, and the syntax is the same: one username per line;
  541.           lines starting with "#" are ignored. Use this option to specify
  542.           the name of a different forbidden-user file, or use
  543.           --userfile:/dev/null to disable this feature in case there is a
  544.           /etc/ftpusers file but you don't want to use it.
  545.           
  546.    --xferlog:{on,off}
  547.           Whether a wu-ftpd-like log should be kept. Off by default. If
  548.           "on", but --xferfile is not specified, /var/log/iksd.log is
  549.           used. This log is explained in [57]Section 4.3.
  550.           
  551.    --xferfile:filename
  552.           Use this option to specify an iksd log file name. If you
  553.           include this option, it implies --xferlog:on.
  554.           
  555.    --database:{on,off}
  556.           Whether an active-sessions database should be kept. On by
  557.           default. If "on", but --dbfile is not specified,
  558.           /var/log/iksd.db is used.
  559.           
  560.    --dbfile:filename
  561.           Use this option to specify an iksd database file name. If you
  562.           include this option, it implies --database:on.
  563.           
  564.    Some of the traditional options have special significance in the IKS,
  565.    e.g.:
  566.    
  567.    -x (server mode)
  568.           If this option is included on the IKSD command line, the Client
  569.           Side Server configuration is disabled, and the user will not
  570.           get a Username: or Password: prompt, and will not be able to
  571.           access the IKSD command prompt. A FINISH command sent to the
  572.           IKSD will log it out and close the connection, rather than
  573.           returning it to its prompt.
  574.           
  575.    -y filename
  576.           Execute "filename" rather than the normal initialization file
  577.           for real users; this option does not apply to anonymous users.
  578.           
  579.    -Y (no init file)
  580.           Do not execute an initialization file, even if a real user is
  581.           logging in.
  582.           
  583.    Examples:
  584.    
  585.    kermit -A
  586.           Starts the Internet Kermit Server with all defaults in effect.
  587.           
  588.    iksd
  589.           Equivalent to "kermit -A". If the binary is invoked as "iksd"
  590.           (e.g. through a symlink) rather than "kermit", the -A option is
  591.           not necessary.
  592.           
  593.    iksd --syslog:5
  594.           As above, but with the highest level of syslogging ([58]Section
  595.           4.2).
  596.           
  597.    iksd --anonymous:off --cdfile:READ.ME
  598.           Starts the IKSD with anonymous access forbidden and changes the
  599.           name of CD message file from the default list to READ.ME.
  600.           
  601.    iksd -x --anonym:no --cdf:READ.ME
  602.           As above, but forces the IKSD to operate only in Kermit server
  603.           mode, thus preventing user access to the IKSD command prompt.
  604.           Also illustrates abbreviation of long-form option keywords and
  605.           use of "no" as a synonym for "off".
  606.           
  607.    Bad syntax in an extended command-line option causes immediate
  608.    termination with the message "Extended option error", and an exit
  609.    status code of 1.
  610.    
  611.    Brief help about command line options may be obtained at the C-Kermit
  612.    prompt with "help options", and for extended options with "help
  613.    extended-options".
  614.    
  615.    You can prototype the IKSD command line by including any desired
  616.    extended options, but omitting the -A option, and then when you get
  617.    the C-Kermit> prompt, use "show extended-options" to check the parsing
  618.    of the options you have included. Example:
  619.    
  620.   $ kermit --anonymous:ok --root:/tmp --userfile:/etc/badusers
  621.   (/users/olga/) C-Kermit>show extended-options
  622.    --bannerfile=(null)
  623.    --cdfile:./.readme
  624.    --cdmessage:0
  625.    --syslog:3
  626.    --wtmplog:1
  627.    --wtmpfile=(null)
  628.    --anonymous:1
  629.    --permission:0040
  630.    --initfile:(null)
  631.    --userfile:/etc/badusers
  632.    --root:/tmp
  633.    --xferlog=0
  634.    --xferfile=(null)
  635.    --timeout:300
  636.   (/users/olga) C-Kermit>
  637.  
  638.    Note that this only shows the values that were given as arguments to
  639.    the extended options, or their default values, if they have any, but
  640.    it does not show values that will be computed dynamically at runtime
  641.    in the absence of a command-line value. For example, --wtmplog:1 and
  642.    --wtmpfile:(null) mean that an appropriate default will be supplied
  643.    for the wtmp logfile name at runtime.
  644.    
  645.    Also note that SHOW EXTENDED-OPTIONS does not show the IKSD-specific
  646.    options when this command given at the IKSD prompt by the user. Thus
  647.    this command is useful only as a prototyping tool. (And as noted
  648.    elsewhere, the IKSD command-line argument vector is also inaccessible
  649.    to the IKSD user via other methods such as the \&@[] array.)
  650.    
  651.   4.2. System Logging
  652.   
  653.    System logging in UNIX is via the standard syslog() facility ("man
  654.    syslog" and/or "man syslogd" for further info).
  655.    
  656.    All IKSD entries (except debugging, see below) appear in the daemon
  657.    log, as defined in the syslog.conf file with a tag of "iksd" and the
  658.    process ID (pid) of the IKSD process, and therefore can be extracted
  659.    by grepping for "iksd".
  660.    
  661.    The system logging levels are:
  662.    
  663.   0 = no logging
  664.   1 = Login/out, failed login attempts, failed Kerberos (etc) authentication
  665.   2 = Dialing out (does not apply to IKSD)
  666.   3 = Making any kinds of connections (does not apply to IKSD)
  667.   4 = Creating / receiving / deleting / renaming / copying files
  668.   5 = Sending / typing / reading / transmitting files
  669.   6 = All top-level commands and all server commands sent to iksd
  670.   7 = Commands executed from macros and command files
  671.   8 = Debug
  672.  
  673.    Each level includes all the levels beneath it (except 0 is not
  674.    included if the logging level is greater than 0).
  675.    
  676.    The default logging level is 5, and is used if the --syslog: option is
  677.    not included on the command line, or if is given with an affirmative
  678.    keyword (yes, true, on, ok) rather than a number. If you specify a
  679.    number higher than the the maximum, it is the same as specifying the
  680.    maximum.
  681.    
  682.    Syslog entries are at LOG_INFO priority, except for refused logins,
  683.    which are at LOG_NOTICE priority, and failed Telnet-level
  684.    authentication (such as Kerberos), which are at LOG_ERR priority.
  685.    
  686.    Note that if C-Kermit is built with -DSYSLOGLEVEL=n (where n is a
  687.    number) on the cc command line, this turns on syslogging and hardwires
  688.    it to the given level for all users. See
  689.    [59]ftp://kermit.columbia.edu/kermit/f/ckuins.txt for further info.
  690.    
  691.    WARNING
  692.           Debug level produces VOLUMINOUS amounts of information -- it is
  693.           equivalent to (in fact, it is) C-Kermit's debug log.
  694.           Furthermore, there is a good possibility it will contain
  695.           sensitive information such as clear-text passwords. Debug
  696.           records are written to the syslog DEBUG facility, as defined
  697.           (or not defined) in syslog.conf. If you use this level of
  698.           logging, make sure that the logfile defined for "daemon.debug"
  699.           is secured from the public, and that there is plenty of space
  700.           for it.
  701.           
  702.    ANOTHER WARNING
  703.           In some UNIX systems, syslogging does not work once a chroot()
  704.           has occurred, which is done by iksd just as it is by ftpd for
  705.           anonymous users, to restrict them to the /pub/ftp (or other
  706.           desired) directory tree. At present, SunOS and Linux are known
  707.           to have this deficiency and there probably are many others.
  708.           THERE IS NO SYSLOGGING FOR ANONYMOUS USERS on these systems.
  709.           The only way to log the activities of anonymous users on such
  710.           systems is to specify a transfer iksd log on the command line
  711.           ([60]Sections 4.1 and [61]4.3).
  712.           
  713.   4.3. The Transfer Log File
  714.   
  715.    The transfer log is disabled by default; it must be enabled on the
  716.    command line ([62]Section 4.1).
  717.    
  718.    The transfer log has the same format as the wu-ftpd log, and so all
  719.    the same scripts can be used to process it, collect statistics, etc.
  720.    In fact, you can even have ftpd and iksd share the same log, in which
  721.    case records will be intermixed.
  722.    
  723.    The Transfer log can also be used in regular user-mode C-Kermit
  724.    sessions.
  725.    
  726.    The first field is fixed-length and contains spaces; subsequent fields
  727.    are variable length, contain no spaces, and are separated by one or
  728.    more spaces. The fields are:
  729.    
  730.    Timestamp
  731.           This is an asctime-style timestamp, example: "Wed Sep 16
  732.           20:19:05 1998" It is always exactly 24 characters long, and the
  733.           subfields are always in fixed positions.
  734.           
  735.    Elapsed time
  736.           The whole number of seconds required to transfer the file, as a
  737.           string of decimal digits, e.g. "24".
  738.           
  739.    Connection
  740.           In IKSD, the IP hostname or address of the client. For
  741.           user-mode C-Kermit transfers, The name of the network host to
  742.           which C-Kermit is connected, or the name of the serial device
  743.           through which it has dialed (or has a direct connection), or
  744.           "/dev/tty" for transfers in remote mode.
  745.           
  746.    Bytes transferred
  747.           The number of bytes transferred, decimal digits, e.g.
  748.           "1537904".
  749.           
  750.    Filename
  751.           The full pathname of the file that was transferred, e.g.
  752.           "/pub/ftp/kermit/a/README.TXT". If the filename contains any
  753.           spaces or control characters, each such character is replaced
  754.           by an underscore ('_') character.
  755.           
  756.    Mode
  757.           The letter 'b' if the file was transferred in binary mode, or
  758.           'a' if it was transferred in text (ASCII) mode.
  759.           
  760.    Options
  761.           For compatibility with the wuftpd log. This field always
  762.           contains an underscore ('_') character.
  763.           
  764.    Direction
  765.           The letter 'o' if the file was transferred Out, and 'i' if the
  766.           file was transferred In.
  767.           
  768.    User class
  769.           The letter 'r' for real users, or 'a' for anonymous users.
  770.           
  771.    User identification
  772.           The user ID of a real user, or the password given by an
  773.           anonymous user.
  774.           
  775.    Server identification
  776.           The string "iks" (Internet Kermit Server), or if C-Kermit is
  777.           running in user mode, "kermit". This distinguishes a Kermit
  778.           transfer log record from a WU-FTPD record, which contains "ftp"
  779.           in this field.
  780.           
  781.    Authentication class
  782.           The digit '1' if we know the user's ID on the client system,
  783.           otherwise '0'. Currently, always '0'.
  784.           
  785.    Authenticated user
  786.           If the authentication class is '1', this is the user's ID on
  787.           the client system. Otherwise it is an asterisk ('*'). Currently
  788.           it is always an asterisk.
  789.           
  790.   4.4. The IKSD Configuration File
  791.   
  792.    The IKSD configuration file is a place to put commands that should
  793.    always be executed for every client, real or anonymous.
  794.    
  795.    When C-Kermit is started as IKSD, it always begins by reading the IKSD
  796.    configuration file, if any. By default this is /etc/iksd.conf (you may
  797.    change the definition at compile time by adding
  798.    -DIKSDCONF=\"filename\" to CFLAGS). This file contains ordinary
  799.    C-Kermit commands. Normally these would be SET or DISABLE commands. In
  800.    case any commands in this file write to standard output, remember that
  801.    IKSD's standard output is the connection to the client. For more ideas
  802.    about what can go in the iksd.conf file, read the next section -- the
  803.    difference is that when you put commands in the iksd.conf file, they
  804.    apply not only to anonymous users, but to real users too. So, for
  805.    example, if you want to disable uploads for all users, you could put
  806.    DISABLE SEND in the iksd.conf file, whereas if you wanted to disable
  807.    them only for anonymous users, you would put this command in the
  808.    anonymous-user initialization file.
  809.    
  810.    The IKSD configuration file is executed before the user logs in (or is
  811.    otherwise authenticated), before the C-Kermit initialization file, and
  812.    before any extended-format command line options that start with "--",
  813.    but after any that are marked CM_PRE in the table in [63]Section 4.1,
  814.    or that start with "-+". Since execution occurs before login, the
  815.    \v(user) variable is meaningless here.
  816.    
  817.   4.5. The Initialization File
  818.   
  819.    When a real user logs in to the IKSD, the C-Kermit initialization file
  820.    is executed in the normal manner, depending on the compile-time
  821.    configuration of the IKSD. Normally, the user's own .kermrc file is
  822.    executed, and this, in turn, executes the user's customization file,
  823.    .mykermrc. If the IKSD was built with the CK_SYSINI or CK_DSYSINI
  824.    compile-time options (described in [64]ckccfg.txt), a single, shared
  825.    system-wide initialization file is executed instead; this may, in
  826.    turn, execute a customization file out of the user's home directory.
  827.    You may override C-Kermit's automatic selection of initialization with
  828.    the regular C-Kermit -y or -Y options on the IKSD command line,
  829.    described in the C-Kermit manual.
  830.    
  831.    For anonymous users, the default initialization file, if any, is
  832.    .kermrc in the chroot'd file system. This default may be overridden
  833.    with the --initfile:xxx command-line option. The system administrator
  834.    may include commands in this file to disable selected services for
  835.    anonymous users, e.g.:
  836.    
  837.   disable delete  ; Don't let anonymous users delete files
  838.   disable send    ; Don't let anonymous users send files
  839.  
  840.    Of course, any Kermit commands at all may be included: settings, macro
  841.    definitions, etc. (Also see [65]Section 5.5.)
  842.    
  843.    When the sysadmin specifies the initialization file, this allows a
  844.    high degree of fine-grained control over who is allowed access to what
  845.    commands and resources, using standard C-Kermit commands, functions,
  846.    and variables. The following are particularly useful:
  847.    
  848.    \v(date), \v(ndate)
  849.           The current date, in case you want to restrict access by date.
  850.           (Also read about the new date-related functions in [66]Section
  851.           1.6 of the [67]C-Kermit 7.0 Supplement.)
  852.           
  853.    \v(day), \v(nday)
  854.           The day of the week, in case you want to restrict access to
  855.           certain days of the week.
  856.           
  857.    \v(home)
  858.           The user's home directory.
  859.           
  860.    \v(host)
  861.           The hostname of the IKS.
  862.           
  863.    \v(ipaddress)
  864.           The IP address of the IKS. This and/or \v(host) may be used
  865.           when you are running an IKS on multiple hosts and want to have
  866.           different setups on each, but still have a common
  867.           initialization file.
  868.           
  869.    \v(line)
  870.           The IP host name or address of the client's host.
  871.           
  872.    \v(time), \v(ntime)
  873.           The current time of day, in case you wish to restrict access to
  874.           certain times of day.
  875.           
  876.    \v(userid)
  877.           The ID with which the user logged in to the IKS. For anonymous
  878.           logins, this is "ftp".
  879.           
  880.    So, for example, if the sysadmin wishes to prevent user "olga" from
  881.    using the IKS on Mondays, the initialization file could contain a
  882.    command like:
  883.    
  884.   if equal \v(user) olga -
  885.     if equal \v(nday) 1 -
  886.        exit 1 Sorry Olga - please come back another day
  887.  
  888.    Or suppose it is desirable to block access from all xyzcorp.com hosts
  889.    between 9:00am and noon:
  890.    
  891.   if match \v(line) *.xyzcorp.com -
  892.     if lgt \v(time) 09:00:00 -
  893.       if llt \v(time) 12:00:00 -
  894.          exit 1 Sorry - Please come back after noon
  895.  
  896.    Or suppose a certain user is to be allowed to GET files from the
  897.    server, but not SEND, PRINT, or MAIL them:
  898.    
  899.   xif equal \v(user) ivan {
  900.       disable send
  901.       disable print
  902.       disable mail
  903.       disable enable
  904.   }
  905.      _________________________________________________________________
  906.    
  907.   5. Access to Services
  908.   
  909.    The IKSD behaves at runtime just like the regular C-Kermit program,
  910.    with any restrictions resulting from compile-time options, and with
  911.    the differences noted in this section and in [68]Section 4.
  912.    
  913.   5.1. Automatic Settings
  914.   
  915.    When C-Kermit is started as an Internet Kermit Service, the following
  916.    settings occur automatically:
  917.    
  918.     a. Login (authentication) is required.
  919.     b. Shell access is disabled.
  920.     c. Server-side Telnet negotiation is enabled.
  921.     d. SET RELIABLE ON (see the [69]C-Kermit 7.0 Supplement).
  922.     e. FAST file-transfer settings, including "cautious" unprefixing.
  923.     f. No flow control, no parity.
  924.        
  925.    Items d-f can be overridden with command-line options and/or in the
  926.    initialization file.
  927.    
  928.   5.2. Authentication
  929.   
  930.    The IKSD command prompt will not appear, and no commands may be given,
  931.    before the user is authenticated.
  932.    
  933.    When the IKSD has been started without the '-x' command-line option,
  934.    it issues a Username: prompt. The user may type a username at the
  935.    prompt, in which case a Password: prompt is issued, and the user must
  936.    enter a password. Three login attempts are allowed, with a pause
  937.    enforced between each one. If all three fail, the connection is
  938.    closed.
  939.    
  940.    The user may also authenticate from the client by sending a [ REMOTE ]
  941.    LOGIN command (again, only 3 tries are allowed), or by Telnet
  942.    Authentication negotiations. Prior to authentication, the IKSD
  943.    responds to only the following client commands:
  944.    
  945.   [ REMOTE ] LOGIN
  946.   [ REMOTE ] LOGOUT
  947.   REMOTE HELP (or RHELP)
  948.   REMOTE EXIT (or REXIT)
  949.   BYE
  950.  
  951.    Once authenticated, the user may not re-authenticate or change
  952.    identities.
  953.    
  954.    The connection persists until it is broken in any of the following
  955.    ways:
  956.    
  957.     a. Client sends BYE or REMOTE EXIT (REXIT) or [ REMOTE ] LOGOUT to
  958.        IKSD.
  959.     b. Client sends FINISH to IKSD that has been started with "-x".
  960.     c. User gives HANGUP or CLOSE command to the client.
  961.     d. User gives EXIT, QUIT, or LOGOUT command at IKSD prompt.
  962.        
  963.    The connection is also closed if the user exits from the client, but
  964.    only if it was an end-to-end Telnet connection. There can be no
  965.    guarantee that exiting from a serial communication program will close
  966.    and hang up the serial connection.
  967.    
  968.   5.3. The DISABLE Command
  969.   
  970.    In the IKSD, the DISABLE command applies not only to client/server
  971.    functions, but also to the corresponding commands when given at the
  972.    prompt. For example, DISABLE DELETE disables not only REMOTE DELETE
  973.    commands given from the client, but also DELETE commands given at the
  974.    IKSD's command prompt, as well as implicit forms of file deletion,
  975.    such as when the target of a COPY command is an existing file.
  976.    
  977.    The DISABLE ENABLE command is irreversible; once this command is
  978.    given, the ENABLE command can not be re-enabled, and therefore no
  979.    other disabled commands can be enabled either. ENABLE is DISABLEd
  980.    automatically for anonymous users, so any DISABLE commands in the
  981.    anonymous-user initialization file ([70]Section 4.4) are also
  982.    irreversible.
  983.    
  984.   5.4. Shell Access
  985.   
  986.    All forms of system and shell access are disabled in the IKS. Thus the
  987.    user can not execute REMOTE HOST commands from the client, nor access
  988.    the shell from the IKS command prompt via shell escapes (!), the RUN
  989.    or PUSH command, or by specifying pipes or filters in file-transfer
  990.    commands, or by pipe specifications in REMOTE commands, or in any
  991.    other way. This is true even if the executable was built without the
  992.    NOPUSH compile-time option.
  993.    
  994.   5.5. Anonymous Users
  995.   
  996.    Anonymous users are allowed by default, but can be denied with
  997.    --anonymous:no on the command line ([71]Section 4.1).
  998.    
  999.    Anonymous users are handled in about the same way as they are by ftpd.
  1000.    Their effective user ID is set to "ftp" and their file-system access
  1001.    is restricted to the tree rooted at the home directory of the "ftp"
  1002.    user, normally /pub/ftp, via chroot. If /pub/ftp does not exist, login
  1003.    fails. In that case (or for any other desired reason), the anonymous
  1004.    root directory can be changed with the --root: option, e.g.
  1005.    --root:/tmp. Note that, unlike ftpd, iksd does not necessarily require
  1006.    any particular binaries (such as ls) to be in the chroot'd tree. DLLs
  1007.    might be another story, but so far these have not been needed, even
  1008.    with dynamically linked Kermit binaries (at least in Linux and
  1009.    Solaris). Should DLLs be a problem, use a statically linked Kermit
  1010.    binary (if possible), or install the needed DLLs in the anonymous
  1011.    root.
  1012.    
  1013.    File access is according to user "ftp" and the directory and file
  1014.    permissions of the /pub/ftp tree. If anonymous uploads are to be
  1015.    allowed, then usually only specific directories (often with a name
  1016.    like "incoming") are given write permission, and any files that are
  1017.    created in such a directory have owner "ftp", with the group set to
  1018.    the group of the directory. As noted in [72]Section 4.1, the
  1019.    permission for all files created by anonymous users is 0040
  1020.    (group-read only), or whatever else the sysadmin has specified in the
  1021.    --permissions: command-line option.
  1022.    
  1023.    Thus, if you already have a public ftp server, most likely everything
  1024.    is set up appropriately already">up appropriately already. If
  1025.    anonymous ftp is allowed (by the presence of a valid user "ftp" in
  1026.    your system's password file), it will be allowed also for IKSD unless
  1027.    explicitly disallowed on the IKSD command-line (or if /pub/ftp doesn't
  1028.    exist and you did not supply a --root: option on the command line).
  1029.    
  1030.    In addition to the FTP-like restrictions, certain Kermit services are
  1031.    always denied to anonymous users. These include:
  1032.    
  1033.      * PRINT (at IKSD prompt) and REMOTE PRINT (from client)
  1034.      * MAIL (or SEND /MAIL) at IKSD prompt and from client.
  1035.      * Creation of any logs (transaction, debug, packet, etc).
  1036.      * No file may be deleted, including implicitly, e.g. by the COPY
  1037.        command.
  1038.      * FILE COLLISION is set to RENAME and may not be changed.
  1039.        
  1040.    The latter three provisions mean that anonymous users can not delete,
  1041.    overwrite, rename, or alter any existing files in any way, whether by
  1042.    file transfer or with the DELETE or RENAME command.
  1043.    
  1044.    Note that IKSD, like FTPD, does not allow directory creation by
  1045.    anonymous users, even when file/directory permissions would otherwise
  1046.    allow it. To change this, add:
  1047.    
  1048.   enable mkdir    ; Enable directory creation
  1049.  
  1050.    to /pub/ftp/.kermrc (or whatever other initialization file you have
  1051.    designated for anonymous users with --initfile). Similarly for
  1052.    directory removal:
  1053.    
  1054.   enable rmdir    ; Enable directory removal
  1055.  
  1056.    Of course directories can be removed only if (a) they are empty, and
  1057.    (b) their permissions allow it.
  1058.    
  1059.   5.6. Management Information
  1060.   
  1061.    The command-line argument vector, normally accessible in the \&@[]
  1062.    array, the top-level \%0..9 variables, or by other means, is
  1063.    inaccessible to IKSD users. Thus IKSD clients can not discover the
  1064.    IKSD startup path or options, the logfile pathnames or directories,
  1065.    logging level, etc.
  1066.      _________________________________________________________________
  1067.    
  1068.   6. Open Issues
  1069.   
  1070.    Several services that are normally provided by C-Kermit are not
  1071.    available when it is an Internet Kermit Service Daemon.
  1072.    
  1073.   6.1. Connection Establishment
  1074.   
  1075.    If the user has access to the IKSD command prompt, why not allow her
  1076.    to "set host" or "set line" from there to another place? Obviously
  1077.    this would be a security risk if allowed for anonymous users. For
  1078.    authenticated users, it should be OK, but is not currently possible
  1079.    for Telnet connections since the IKSD is already a Telnet server on
  1080.    the incoming connection, and is not designed to conduct two separate
  1081.    Telnet sessions simultaneously. It might be possible to allow the user
  1082.    to make a dialout connection, but some coding and testing would be
  1083.    needed should this prove desirable.
  1084.    
  1085.   6.2. Shell Access
  1086.   
  1087.    Shell access is forbidden to anonymous users for obvious reasons. From
  1088.    a security standpoint, it could be allowed for authenticated users,
  1089.    but there remains a technical obstacle: the absence of a terminal
  1090.    driver for the connection.
  1091.    
  1092.   6.3. External and/or non-Kermit Protocols
  1093.   
  1094.    External protocols such as Zmodem can not be expected to perform any
  1095.    of the logging or security functions that are done by C-Kermit itself
  1096.    within its protocol and file modules. Thus external protocols are
  1097.    disabled in the IKSD. Plus the fact that such protocols are likely to
  1098.    be incompatible with Telnet connections in the first place. In more
  1099.    detail:
  1100.    
  1101.      * When the user is 'anonymous' the file system is chroot'd, which
  1102.        means that any external executables must exist in the chroot'd
  1103.        file system. This leaves open the possibility that executables
  1104.        might be replaced by a different file of the same name that has
  1105.        been uploaded either on top of the existing file or just into the
  1106.        same directory. If "." is in the PATH for the process anything the
  1107.        user uploads with the name 'rz' or 'sz' might be executed in its
  1108.        place. Therefore, the IKSD does not use any external commands of
  1109.        any kind. Not 'ls', not 'cp', not 'df', not anything. To allow the
  1110.        execution of external programs is a major security hole in this
  1111.        setting.
  1112.      * Most implementations of 'sz' and 'rz' are designed for remote use
  1113.        over a terminal connection. They expect to be run underneath a
  1114.        pseudoterminal (PTY). When IKSD is running there is no PTY. In
  1115.        fact, when IKSD is running there is only a raw socket; the IKSD
  1116.        handles all necessary Telnet protocol translations including
  1117.        Telnet Network Virtual Terminal (NVT) rules regarding quoting of
  1118.        Carriage Return and 0xFF depending upon the state of the BINARY
  1119.        Telnet option in each direction. 'sz' and 'rz' are completely
  1120.        incapable of performing these translations in either direction and
  1121.        any attempt to transfer a file with them will result in a transfer
  1122.        failure and the corruption of the data stream.
  1123.      * IKSD supports encrypted sessions, in which case it handles the
  1124.        encryption and decryption itself; an external protocol module
  1125.        would not do this, and so could not be used on encrypted channels
  1126.        in any case.
  1127.        
  1128.   6.4. Additional Administrative Controls
  1129.   
  1130.    Certain options available in wu-ftpd are not implemented in iksd:
  1131.    
  1132.      * Ability to select IKSD logging for real vs anonymous users.
  1133.      * Ability to select IKSD logging for inbound vs outbound files.
  1134.           + Currently all transfers are logged or not logged.
  1135.      * Ability to allow/restrict chmod/delete/overwrite for anonymous
  1136.        users.
  1137.           + Currently there is no command for changing file permissions.
  1138.           + Guests may not delete files, period.
  1139.           + FILE COLLISION is set to RENAME for guests and may not be
  1140.             changed since all the other options allow existing files to
  1141.             be altered.
  1142.           + There is no way to grant these capabilities to guests.
  1143.      * Ability to allow directory creation by anonymous users.
  1144.           + Anonymous users may not create or remove directories.
  1145.      * Ability to allow/specify CD messages on a per-directory basis.
  1146.      * RFC931 authentication of remote (client) user (but wu-ftpd doesn't
  1147.        either).
  1148.        
  1149.    These or other controls can be added if there is sufficient reason or
  1150.    demand.
  1151.    
  1152.   6.5. Known Bugs
  1153.   
  1154.      * When commands are logged in syslog, the EXIT command appears
  1155.        twice.
  1156.      * wtmp entries show pids in hex due to length restrictions, so
  1157.        you'll need to convert them to decimal before using them with ps,
  1158.        kill, etc.
  1159.      _________________________________________________________________
  1160.    
  1161.   7. Monitoring
  1162.   
  1163.    Unless you disable it, all IKSDs keep current session information in a
  1164.    shared database. The IKSD instances can be within one computer or
  1165.    running on any number of different computers that share the same file
  1166.    system on the same network. The database can be monitored by the
  1167.    sysadmin with a simple "systat"-like display program, which shows who
  1168.    is logged in, from where, and what they're doing. (The idea is easily
  1169.    adapted to other servers, such as FTP.) For maximum portability and
  1170.    reliability, the database is an ordinary file on disk.
  1171.    
  1172.    The IKSD database file should reside in its own directory (to avoid
  1173.    conflicts with other servers that might use the same filename
  1174.    conventions), and this directory and its files should be visible to
  1175.    the sysadmin without privileges (e.g. by group access) but hidden from
  1176.    the public for privacy reasons if other such logs (e.g. the ftpd log,
  1177.    syslog, etc) also are.
  1178.    
  1179.    The database is a random-access file indexed by "slot number", which
  1180.    is self-assigned during a quick search at startup. Once a slot is
  1181.    claimed, there is no more searching; each IKSD updates its own slot in
  1182.    place and does not touch the others. Slots never move.
  1183.    
  1184.    When an IKSD instance starts, it must obtain a "slot allocation lock"
  1185.    before it can claim its slot. Otherwise there could be a race
  1186.    condition when another IKSD instance starts at the same time, in which
  1187.    the two could wind up with the same slot.
  1188.    
  1189.    Since exclusive access is a nonportable concept, we obtain the lock in
  1190.    a crude but portable manner, without recourse to kernel locks,
  1191.    interprocess communication, semaphores, memory-mapped files, or other
  1192.    platform-specific mechanisms:
  1193.    
  1194.     a. Create a temp file in the database directory called ip.pid,, where
  1195.        ip is the local IP address as 8 hex digits and pid is my own
  1196.        process ID (PID) in hex (no leading zeros). This is guaranteed to
  1197.        be a unique name (and if by chance a file of this name already
  1198.        exists, it can't possibly be valid, so it it's ok to overwrite
  1199.        it).
  1200.     b. Write my own ID string into the file. The ID string is ip:pid,
  1201.        where ip is (again) my IP address as 8 hex digits, and pid is my
  1202.        PID in decimal (not hex). (The reason for decimal here is
  1203.        readability, so sysadmins can easily enter it into other tools or
  1204.        commands; it has to be hex in the temp filename for compactness in
  1205.        case of 14-character filename limitations.)
  1206.     c. Try to open iksd.lck, which is the real lockfile. If this
  1207.        succeeds, read its contents (an ip:pid string). If the ip not the
  1208.        same as mine, consider the file locked. If it is the same, extract
  1209.        the PID and check its validity. If it is not valid, delete the
  1210.        lockfile. (Currently this step is skipped by K95 since it can't
  1211.        check PIDs.)
  1212.     d. At this point the iksd.lck file might or might not exist. Try to
  1213.        rename the temp file to iksd.lck. This will fail if the lockfile
  1214.        exists, in which case we sleep, loop, and try again, up to a
  1215.        certain number of times -- say 16 tries spaced 1 second apart. If
  1216.        we fail to get a lock, we let the user on anyway, in the spirit of
  1217.        service over management. If the rename succeeds, on the other
  1218.        hand, we have a lock.
  1219.        
  1220.    When and if we have obtained a lock, we open the database file itself
  1221.    and search the whole database (sequentially) for:
  1222.    
  1223.     a. Free slots (In-Use flag is 0), or:
  1224.     b. Stale slots(*), or:
  1225.     c. Any slot with our own IP and PID (a special kind of stale slot).
  1226.        
  1227.    (*) In-Use flag is 1 and IP address is ours, but PID is invalid.
  1228.    
  1229.    In C-Kermit only (not K-95) we also perform some housekeeping duties
  1230.    while searching (the Windows APIs include no provisions for this):
  1231.    
  1232.     a. Whenever a stale slot is found, we free it (set its In-Use flag to
  1233.        0).
  1234.     b. We remove all free slots after the last in-use slot by truncating
  1235.        the database file (this keeps the database file from constantly
  1236.        growing as new highwater marks are reached).
  1237.        
  1238.    Then we claim the first one of these that was found. If no slot was
  1239.    claimed, we add a new slot at the end and claim it. If the database
  1240.    file did not exist, we create it and claim the first slot. (In
  1241.    Windows, the IKSD listener simply deletes the existing database, if
  1242.    any, on initial startup.)
  1243.    
  1244.    To claim a slot:
  1245.    
  1246.     a. We set the In-Use flag to 1, fill in the Server PID and IP address
  1247.        fields with our own PID and IP address, fill in the session-start
  1248.        and update time fields, and clear the other fields.
  1249.     b. Then we release the lock.
  1250.        
  1251.    From this point, we can write freely into our slot regardless of
  1252.    locks.
  1253.    
  1254.    Notes:
  1255.    
  1256.     a. Since all IKSDs follow the same procedure, only one can have a
  1257.        lock a at a time.
  1258.     b. The lockfile is readable text; it can be typed (cat'd). The
  1259.        contents are the same format on every platform, regardless of byte
  1260.        order or word size.
  1261.     c. This scheme allows (but does not require) multiple computers that
  1262.        share a common file system to have a single IKSD database, which
  1263.        in turn allows the site manager to monitor all IKSDs on all
  1264.        computers at once. This works if each computer has a unique IP
  1265.        address (which it must if they are on the same network sharing a
  1266.        common file system; nevertheless, care must be taken regarding IP
  1267.        address pools, etc). It also depends on the file- sharing
  1268.        mechanism (such as NFS) to propagate updates promptly and in
  1269.        sequence.
  1270.     d. While one IKSD is allocating its slot, nothing prevents other IKSD
  1271.        instances that already have their own slots from updating them,
  1272.        since that does not interfere with slot allocation.
  1273.     e. The tempfile name format is UNIXish and will need modification for
  1274.        file systems with restrictive names, such as FAT, 14-char UNIXes,
  1275.        etc. In such cases we could (a) omit the IP address if we're not
  1276.        concerned about multiple computers sharing a single database, or
  1277.        (b) encode the IP address in Base 64 to make it shorter. But
  1278.        probably none of this will ever come up.
  1279.     f. The design accommodates 64-bit IPv6 addresses, but for now the
  1280.        software uses only 32 bits.
  1281.        
  1282.   7.1. Database Record Format
  1283.   
  1284.    A slot is 4K (4096 octets), divided into 4 1K chunks. The first chunk
  1285.    is further subdivided into shorter fields. Numeric fields are coded in
  1286.    hexadecimal, right-adjusted, and left-padded with 0's. Text fields are
  1287.    left-adjusted and right-padded with blanks. Date-time fields are
  1288.    right-adjusted within a field of 18 with the leading blank reserved
  1289.    for Y10K. Date-time format is:
  1290.    
  1291.   yyyymmdd hh:mm:ss
  1292.  
  1293.    where yyyymmdd are the numeric year, month, and day, and hh:mm:ss are
  1294.    the hour (24-hour clock), minute, and second. Months and days are
  1295.    1-based, leading 0's are supplied where needed.
  1296.    
  1297.    The layout of each slot is as follows (fields and byte positions are
  1298.    numbered from 0):
  1299.  
  1300.    0. FLAGS (Slot/Session Flags)
  1301.       Start:     0
  1302.       Length:    4
  1303.       Type:   Bit Mask
  1304.       Format: Hex digits.
  1305.       Bit Values:
  1306.        1: 1 = Slot in use, 0 = Slot is free.
  1307.        2: 1 = Real user, 0 = Anonymous user.
  1308.        4: 1 = Logged in, 0 = Not logged in.
  1309.  
  1310.    1. AUTHTYPE (Authorization Type)
  1311.       Start:     4
  1312.       Length:    4
  1313.       Type:   Number
  1314.       Format: Hex digits.
  1315.       Values:
  1316.        0: None          8: (reserved)
  1317.        1: Kerberos IV   9: (reserved)
  1318.        2: Kerberos V   10: LOKI
  1319.        3: SPX          11: SSA
  1320.        4: MINK         12: KEA_SJ
  1321.        5: SRP          13: KEA_INTEG
  1322.        6: RSA          14: DSS
  1323.        7: SSL          15: NTLM
  1324.  
  1325.    2. AUTHMODE (Authorization Type)
  1326.       Start:     8
  1327.       Length:    4
  1328.       Type:   Number
  1329.       Format: Hex digits.
  1330.       Values:
  1331.        0: Rejected
  1332.        1: Unknown
  1333.        2: Other
  1334.        3: User
  1335.        4: Valid
  1336.  
  1337.    3. STATE (IKSD State)
  1338.       Start:    12
  1339.       Length:    4
  1340.       Type:   Bit Mask
  1341.       Format: Hex digits.
  1342.       Bit Values:
  1343.        1: Initializing
  1344.        2: Sending a file
  1345.        4: Receiving a file
  1346.        8: Executing a REMOTE command
  1347.       32: At command prompt
  1348.  
  1349.    4. PID (IKSD's Process ID)
  1350.       Start:    16
  1351.       Length:   16
  1352.       Type:   Number
  1353.       Format: Hex digits.
  1354.  
  1355.    5. SERVER IP (IKSD's IP Address)
  1356.       Start:    32
  1357.       Length:   16
  1358.       Type:   IP address as a series of numeric octets in network byte order
  1359.       Format: Hex digits
  1360.  
  1361.    6. CLIENT IP (Client's IP Address)
  1362.       Start:    48
  1363.       Length:   16
  1364.       Type:   IP address as a series of numeric octets in network byte order
  1365.       Format: Hex digits
  1366.  
  1367.    7. SESSION START (Date and Time session started)
  1368.       Start:    64
  1369.       Length:   18
  1370.       Type:   Date-time
  1371.       Format: Date-time string
  1372.  
  1373.    8. LAST UPDATE (Date and Time this record was last updated)
  1374.       Start:    82
  1375.       Length:   18
  1376.       Type:   Date-time
  1377.       Format: Date-time string
  1378.  
  1379.    9. ULENGTH (Username length)
  1380.       Start:   100
  1381.       Length:    4
  1382.       Type:   Number
  1383.       Format: Hex digits, right adjusted
  1384.  
  1385.   10. DLENGTH (Length of current directory)
  1386.       Start:   104
  1387.       Length:    4
  1388.       Type:   Number
  1389.       Format: Hex digits, right adjusted
  1390.  
  1391.   11. ILENGTH (Length of state-specific information)
  1392.       Start:   108
  1393.       Length:    4
  1394.       Type:   Number
  1395.       Format: Hex digits, right adjusted
  1396.  
  1397.   12. RESERVED
  1398.       Start:   112
  1399.       Length:  912
  1400.       Type:   None
  1401.       Format: Filled with blanks
  1402.  
  1403.   13. USERNAME (Username; if anonymous "anonymous:password")
  1404.       Start:  1024
  1405.       Length: 1024
  1406.       Type:   None
  1407.       Format: Text, ULENGTH significant chars, right-filled with blanks
  1408.  
  1409.   14. DIRECTORY (Current directory)
  1410.       Start:  2048
  1411.       Length: 1024
  1412.       Type:   None
  1413.       Format: Text, DLENGTH significant chars, right-filled with blanks
  1414.  
  1415.   15. INFO (State-specific information)
  1416.       Start:  3072
  1417.       Length: 1024
  1418.       Type:   None
  1419.       Format: Text, ILENGTH significant chars, right-filled with blanks
  1420.  
  1421.    The state-specific information tells you whether IKSD is at its
  1422.    command prompt or in server command wait, if it is sending or
  1423.    receiving a file (in which case the filename is shown), it is
  1424.    executing a REMOTE command (in which case the command is shown), or
  1425.    how it was terminated (BYE, REMOTE EXIT, disconnect, etc)
  1426.    
  1427.    Notes:
  1428.    
  1429.     a. There are no control characters (CR, LF, NUL, etc) or 8-bit
  1430.        characters; only ASCII graphic characters are used in the
  1431.        database. Fields are left- or right-padded with Space or '0' as
  1432.        indicated.
  1433.     b. Since the USERNAME, DIRECTORY, and INFO fields are right-padded
  1434.        with spaces, it would be laborious to isolate their actual values
  1435.        by trimming spaces from the right (since we must allow for
  1436.        internal spaces); hence the ULENGTH, DLENGTH, and ILENGTH fields.
  1437.     c. The USERNAME, DIRECTORY, and INFO fields are 1K each since 1K is
  1438.        the maximum pathname length found on common UNIX platforms (even
  1439.        though many platforms have smaller maximums). Thus, for example,
  1440.        the current directory string might be exactly 1K long. This is why
  1441.        its length is kept outside the block. Also the division of the
  1442.        record into four 1K blocks tends to make for more efficient i/o.
  1443.     d. The IKSD database does not provide a permanent record or give
  1444.        complete information. That's what the syslog entries and the IKSD
  1445.        log are for.
  1446.        
  1447.   7.2 The Display Module
  1448.   
  1449.    The straightforward data definitions and formats allow a display
  1450.    module to be written easily in the language of your choice, including
  1451.    scripting languages such as Kermit's own. A sample display module,
  1452.    iksdpy, is provided as a "Kerbang" script, providing a running display
  1453.    of the active IKSD sessions from the database. In its startup mode, it
  1454.    lists each session in the database, refreshing every 4 seconds.
  1455.    Various keystroke commands are available for help, quitting, etc, and
  1456.    to enter the detail screen for a specific session. The detail screen,
  1457.    too, refreshes itself every 4 seconds. Here you have keys to return to
  1458.    the main screen, to pick another session, to cycle through sessions,
  1459.    and so on.
  1460.    
  1461.    When a slot is freed, its information is left intact so you can still
  1462.    see who was using it, when, and from where, and the last thing they
  1463.    did before logging out. The old info persists until the slot is
  1464.    removed or reclaimed, which will happen when the next new IKSD session
  1465.    starts.
  1466.    
  1467.    The iksdpy script is short, simple, and easily extensible. For
  1468.    example, while watching a detail screen and you see somebody doing
  1469.    something bad, you might like to have a "K" key to kill the session
  1470.    (the script already knows the pid, so it need simply form a "!kill -9"
  1471.    command, including the pid).
  1472.    
  1473.   7.3. Database Management
  1474.   
  1475.    The following command-line options let you disable/enable the database
  1476.    and specify its location:
  1477.    
  1478.    --database:{on,off}
  1479.           Whether an active-sessions database should be kept. On by
  1480.           default. If "on", but --dbfile is not specified,
  1481.           /var/log/iksd.db is used.
  1482.           
  1483.    --dbfile:filename
  1484.           Use this option to specify an iksd database file name. If you
  1485.           include this option, it implies --database:on.
  1486.           
  1487.    In UNIX, the system startup procedure can delete the database file
  1488.    before starting inetd, since nothing in it is valid; however, this is
  1489.    not necessary since normal cleanup procedures will do the job too. In
  1490.    Windows, the IKSD listener takes care of it.
  1491.    
  1492.    To capture a snapshot of IKSD usage, simply copy the database file.
  1493.      _________________________________________________________________
  1494.    
  1495.   8. TESTING
  1496.   
  1497.    In case you want to test IKSD on a port other than 1649, be aware that
  1498.    IKS-aware Kermit clients (such as C-Kermit 7.0 and K95 1.1.18 and
  1499.    later) will not initiate Telnet negotiations with it, since it is not
  1500.    on a Telnet port (i.e. 23 or 1649). To get correct operation you'll
  1501.    need to force the client to negotiate, e.g.:
  1502.    
  1503.   telnet hostname 3000
  1504.   set host hostname 3000 /telnet
  1505.  
  1506.    [[73]Top] [[74]C-Kermit Home] [[75]7.0 Update Notes] [[76]8.0 Update
  1507.    Notes] [[77]Kermit Home]
  1508.      _________________________________________________________________
  1509.    
  1510.    
  1511.     C-Kermit IKSD Administration / Columbia University /
  1512.     kermit@columbia.edu / 12 Dec 2001
  1513.  
  1514. References
  1515.  
  1516.    1. http://www.columbia.edu/kermit/
  1517.    2. ftp://ftp.isi.edu/in-notes/rfc2839.txt
  1518.    3. ftp://ftp.isi.edu/in-notes/rfc2840.txt
  1519.    4. http://www.columbia.edu/kermit/iksd.html#x1
  1520.    5. http://www.columbia.edu/kermit/iksd.html#x2
  1521.    6. http://www.columbia.edu/kermit/iksd.html#x3
  1522.    7. http://www.columbia.edu/kermit/iksd.html#x4
  1523.    8. http://www.columbia.edu/kermit/iksd.html#x4.1
  1524.    9. http://www.columbia.edu/kermit/iksd.html#x4.2
  1525.   10. http://www.columbia.edu/kermit/iksd.html#x4.3
  1526.   11. http://www.columbia.edu/kermit/iksd.html#x4.4
  1527.   12. http://www.columbia.edu/kermit/iksd.html#x4.5
  1528.   13. http://www.columbia.edu/kermit/iksd.html#x5
  1529.   14. http://www.columbia.edu/kermit/iksd.html#x5.1
  1530.   15. http://www.columbia.edu/kermit/iksd.html#x5.2
  1531.   16. http://www.columbia.edu/kermit/iksd.html#x5.3
  1532.   17. http://www.columbia.edu/kermit/iksd.html#x5.4
  1533.   18. http://www.columbia.edu/kermit/iksd.html#x5.5
  1534.   19. http://www.columbia.edu/kermit/iksd.html#x5.6
  1535.   20. http://www.columbia.edu/kermit/iksd.html#x6
  1536.   21. http://www.columbia.edu/kermit/iksd.html#x6.1
  1537.   22. http://www.columbia.edu/kermit/iksd.html#x6.2
  1538.   23. http://www.columbia.edu/kermit/iksd.html#x6.3
  1539.   24. http://www.columbia.edu/kermit/iksd.html#x6.4
  1540.   25. http://www.columbia.edu/kermit/iksd.html#x6.5
  1541.   26. http://www.columbia.edu/kermit/iksd.html#x7
  1542.   27. http://www.columbia.edu/kermit/iksd.html#x7.1
  1543.   28. http://www.columbia.edu/kermit/iksd.html#x7.2
  1544.   29. http://www.columbia.edu/kermit/iksd.html#x7.3
  1545.   30. http://www.columbia.edu/kermit/iksd.html#x8
  1546.   31. http://www.columbia.edu/kermit/case14.html
  1547.   32. http://www.columbia.edu/kermit/case15.html
  1548.   33. http://www.columbia.edu/kermit/case18.html
  1549.   34. http://www.columbia.edu/kermit/case04.html
  1550.   35. http://www.columbia.edu/kermit/case05.html
  1551.   36. http://www.columbia.edu/kermit/case10.html
  1552.   37. http://www.columbia.edu/kermit/newsn6.html#recover
  1553.   38. http://www.columbia.edu/kermit/security.html
  1554.   39. http://www.columbia.edu/kermit/iksd.html#x7
  1555.   40. telnet:kermit.columbia.edu:1649
  1556.   41. ftp://ftp.ietf.org/internet-drafts/draft-altman-telnet-kermit-server-03.txt
  1557.   42. ftp://ftp.ietf.org/internet-drafts/draft-columbia-kermit-service-03.txt
  1558.   43. http://www.columbia.edu/kermit/iksd.html#x4
  1559.   44. http://www.columbia.edu/kermit/iksd.html#itema
  1560.   45. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt
  1561.   46. ftp://kermit.columbia.edu/kermit/f/ckuins.txt
  1562.   47. http://www.columbia.edu/kermit/iksd.html#x4
  1563.   48. http://www.columbia.edu/kermit/iksd.html#x4.1
  1564.   49. http://www.columbia.edu/kermit/iksd.html#x4.1
  1565.   50. http://www.columbia.edu/kermit/iksd.html#x4.4
  1566.   51. http://www.columbia.edu/kermit/security80.html
  1567.   52. http://www.columbia.edu/kermit/iksd.html#x3
  1568.   53. http://www.columbia.edu/kermit/ck60manual.html
  1569.   54. http://www.columbia.edu/kermit/ckermit70.html
  1570.   55. http://www.columbia.edu/kermit/ckermit80.html
  1571.   56. http://www.columbia.edu/kermit/iksd.html#x4.2
  1572.   57. http://www.columbia.edu/kermit/iksd.html#x4.3
  1573.   58. http://www.columbia.edu/kermit/iksd.html#x4.2
  1574.   59. ftp://kermit.columbia.edu/kermit/f/ckuins.txt
  1575.   60. http://www.columbia.edu/kermit/iksd.html#x4.1
  1576.   61. http://www.columbia.edu/kermit/iksd.html#x4.3
  1577.   62. http://www.columbia.edu/kermit/iksd.html#x4.1
  1578.   63. http://www.columbia.edu/kermit/iksd.html#x4.1
  1579.   64. ftp://kermit.columbia.edu/kermit/f/ckccfg.txt
  1580.   65. http://www.columbia.edu/kermit/iksd.html#x5.5
  1581.   66. http://www.columbia.edu/kermit/ckermit70.html#x1.6
  1582.   67. http://www.columbia.edu/kermit/ckermit70.html
  1583.   68. http://www.columbia.edu/kermit/iksd.html#x4
  1584.   69. http://www.columbia.edu/kermit/ckermit70.html
  1585.   70. http://www.columbia.edu/kermit/iksd.html#x4.4
  1586.   71. http://www.columbia.edu/kermit/iksd.html#x4.1
  1587.   72. http://www.columbia.edu/kermit/iksd.html#x4.1
  1588.   73. http://www.columbia.edu/kermit/iksd.html#top
  1589.   74. http://www.columbia.edu/kermit/ckermit.html
  1590.   75. http://www.columbia.edu/kermit/ckermit70.html
  1591.   76. http://www.columbia.edu/kermit/ckermit80.html
  1592.   77. http://www.columbia.edu/kermit/index.html
  1593.