Annotation of researchv10dc/vol2/auth/auth.ms, revision 1.1

1.1     ! root        1: .so ../ADM/mac
        !             2: .XX authmgr 531 "Authmgr \(em An Authentication Service for Datakit"
        !             3: .TL
        !             4: Authmgr \(em An Authentication Service for Datakit
        !             5: .AU
        !             6: David Cohrs
        !             7: .AI
        !             8: Computer Sciences Dept.
        !             9: .br
        !            10: University of Wisconsin \(em Madison*
        !            11: .AB
        !            12: .PP
        !            13: \fIAuthmgr\fP is a service available on Ninth Edition
        !            14: .UX
        !            15: systems for authenticating users.
        !            16: It can be used to authenticate users inside an organization, to
        !            17: authenticate a terminal or workstation, or to help protect the
        !            18: organization from network intrusions, while allowing legitimate
        !            19: outside users to access the organization's computers.
        !            20: \fIAuthmgr\fP receives calls from users, challenges them for a password
        !            21: or for some other response, such as the outcome of encrypting
        !            22: some challenge message.
        !            23: When the user is authenticated, \fIauthmgr\fP makes use of the redial
        !            24: mechanism provided by Datakit to redial the newly authenticated
        !            25: call to a new service, such as a remote login service.
        !            26: This paper describes the design and implementation of \fIauthmgr\fP,
        !            27: as well as the re-implementation of call redial in the research
        !            28: Datakit control computer, and the administrative options used
        !            29: to implement \fIauthmgr\fP's policy decisions.
        !            30: .AE
        !            31: .2C
        !            32: .FS
        !            33: * This work was performed while the author was a summer intern at
        !            34: .MH
        !            35: .FE
        !            36: .NH 1
        !            37: Introduction
        !            38: .PP
        !            39: \fIAuthmgr\fP allows users to authenticate themselves and to make authenticated
        !            40: calls within a trusted hardware environment, even if their call
        !            41: originated outside that trusted environment.
        !            42: To make authenticated calls, \fIauthmgr\fP makes use of a redial mechanism
        !            43: supported by the network interface.
        !            44: It was written to work in a Datakit environment, however,
        !            45: any virtual circuit network
        !            46: that supports the necessary redial mechanism could use \fIauthmgr\fP.
        !            47: \fIAuthmgr\fP itself runs on a
        !            48: .I "security computer" ,
        !            49: currently a 10th Edition
        !            50: .UX
        !            51: system.
        !            52: It interfaces with the Datakit network via the Datakit
        !            53: interface manager (also running on the
        !            54: security computer) and the
        !            55: control channel from the security computer to
        !            56: the Datakit node to which it is attached.
        !            57: .PP
        !            58: \fIAuthmgr\fP serves three basic purposes.
        !            59: First, it allows users from outside the trusted part of the network
        !            60: (the
        !            61: .I "untrusted domain" )
        !            62: to access the trusted part (the
        !            63: .I "trusted domain" ),
        !            64: without the use of ``in the clear'' passwords.
        !            65: This helps to protect legitimate users in the untrusted domain
        !            66: from other, less honorable, users also in the untrusted domain.
        !            67: .PP
        !            68: Second, all calls from outside the trusted domain can be shunted
        !            69: through to the authentication manager, rather than allowing them
        !            70: to be placed directly, as shown is Figure 1.
        !            71: This allows a security check on the untrusted user before allowing
        !            72: them to even attempt to access any service provided in the
        !            73: trusted domain.
        !            74: If the user fails the check, they have no way of accessing any of
        !            75: the services inside the trusted domain, even those unprotected
        !            76: services that are available to all users inside the trusted domain.
        !            77: This is useful in the environment at AT&T Bell Laboratories, where the
        !            78: trusted domain is made up of the various labs inside the company, and
        !            79: the untrusted domain is the experimental XUNET network, connecting
        !            80: the Murray Hill location to a number of universities around the
        !            81: country.
        !            82: .1C
        !            83: .KF
        !            84: .so fig1.x
        !            85: .DS C
        !            86: Figure 1.  Rerouted call from an untrusted trunk
        !            87: .DE
        !            88: .KE
        !            89: .2C
        !            90: .PP
        !            91: The third purpose of \fIauthmgr\fP is to allow users of
        !            92: Gnot terminals to authenticate themselves to the network (equivalent
        !            93: to logging into a host computer), and have
        !            94: that terminal remain authenticated throughout the duration of their
        !            95: session, as shown in Figure 2.
        !            96: The Gnot terminal|reference(locanthi gnot)
        !            97: is a small computer with a video display and a network
        !            98: interface, but no disk.
        !            99: When powered on or reset, the Gnot makes a network call to a file server
        !           100: and retrieves an operating system kernel that
        !           101: allows it to run window systems, editors, and make network connections
        !           102: to other computers.
        !           103: The session terminates when the user resets or powers down the Gnot.
        !           104: The file server needs to have an authenticated username associated
        !           105: with a session, in order that it may do privilege checking.
        !           106: That is
        !           107: .I authmgr 's
        !           108: job.
        !           109: .1C
        !           110: .KF
        !           111: .so fig2.x
        !           112: .DS C
        !           113: Figure 2.  Authenticating a Gnot
        !           114: .DE
        !           115: .KE
        !           116: .2C
        !           117: .........
        !           118: .NH 2
        !           119: The Software Architecture
        !           120: .PP
        !           121: Providing the three services described above required
        !           122: implementing the authentication manager
        !           123: itself, and also making changes to the software on the Datakit
        !           124: control computer.
        !           125: The control computer changes allow it to redial authenticated calls,
        !           126: to redirect calls coming in over untrusted trunks and
        !           127: to store the authentication information for the Gnots.
        !           128: The authentication manager handles all interactions with the
        !           129: user, obtaining a login name and a unique authenticator from the user.
        !           130: The controller software must be able to pass back the dialstring
        !           131: to the originating point of the call and either redial the call from
        !           132: that point, or
        !           133: store the authentication information if
        !           134: the caller was a Gnot.
        !           135: In addition, the trunk module software must be able to
        !           136: automatically redirect calls that come from an untrusted domain
        !           137: to the authentication manager.
        !           138: Implementing these functions required changes to both the trunk
        !           139: module processes and the host computer module processes.
        !           140: .PP
        !           141: An implementation of the redial mechanism had previously been
        !           142: done by Wetzel|reference(wetzel radian)
        !           143: for the generic Radian controller, which is slightly different from the
        !           144: Datakit controller used inside Murray Hill, so redial was
        !           145: reimplemented, with some improvements, for the research controller.
        !           146: Because of the direct application of redial we had in mind,
        !           147: the redial mechanism is currently supported only for hosts and
        !           148: on trunks (a Gnot looks like a host to the Datakit controller).
        !           149: If a user at a normal terminal attempts to call \fIauthmgr\fP
        !           150: and then redial their call, the redial will fail, because the necessary
        !           151: synchronization and redial code has not been added to
        !           152: the terminal module software.
        !           153: .PP
        !           154: The paper proceeds as follows.
        !           155: The second section describes the functions of
        !           156: the authentication manager and its implementation.
        !           157: The third section describes the redial mechanism implemented
        !           158: for the Datakit, and how it is
        !           159: used in conjunction with the authentication manager.
        !           160: The administrative hooks that were added to the system are also described
        !           161: in this section.
        !           162: Some final comments and conclusions constitute the fourth section.
        !           163: .NH 1
        !           164: The Authentication Manager
        !           165: .PP
        !           166: The purpose of the authentication manager is to determine
        !           167: whether a user is really who they claim to be.
        !           168: One common way of determining the authenticity of a user is
        !           169: by asking them to enter a password (once we know the username
        !           170: they claim to be).
        !           171: The problem with using this approach over a network is that
        !           172: the password
        !           173: is usually sent ``in the clear'', although it isn't echoed
        !           174: at the user's terminal.
        !           175: If someone manages to tap into the user's line or the network
        !           176: itself, the password will be compromised.
        !           177: Obviously, a simple password is not a good way to authenticate
        !           178: users over an untrusted network.
        !           179: .PP
        !           180: A simple solution is to ask the user for the appropriate response
        !           181: to some challenge, something that can be sent as normal,
        !           182: character data, but won't be easily compromised.
        !           183: This is the approach taken by \fIauthmgr\fP.
        !           184: Currently, the challenge that \fIauthmgr\fP transmits is a decimal
        !           185: number, up to 8 digits long.
        !           186: The user must obtain an encryption calculator from the system
        !           187: administrators to encrypt this number.
        !           188: \fIAuthmgr\fP was designed so that it could be quickly extended
        !           189: to support any manufacturer's encryption
        !           190: calculator, but at the current time, only one is supported.
        !           191: This box, an Atalla
        !           192: .I Confidante
        !           193: terminal (despite the designation ``terminal'', the calculator is a small,
        !           194: 2" \(mu 3" \(mu \(14" box), is programmed to encrypt
        !           195: data with a key, the key having been
        !           196: entered into the terminal by the system administrator at
        !           197: the time the terminal is assigned.
        !           198: The 
        !           199: .I Confidante
        !           200: box uses standard DES encryption to encrypt the
        !           201: numeric data with this key.
        !           202: The terminal also requires a password, which the user must enter
        !           203: before encrypting the challenge.
        !           204: When the user enters the challenge, the terminal displays an 8 hex
        !           205: digit number, which the user enters at their keyboard.
        !           206: Assuming this was the correct response, \fIauthmgr\fP can proceed.
        !           207: .PP
        !           208: \fIAuthmgr\fP also allows some users to enter the normal login and
        !           209: password sequence they are used to.
        !           210: This is useful inside the trusted organization, where the problem
        !           211: of compromising a password are much less, and
        !           212: carrying around a challenge box becomes a bother.
        !           213: This option can be specified on the basis of the source of the call,
        !           214: or on a per-user basis.
        !           215: .PP
        !           216: Another important choice in designing \fIauthmgr\fP was whether calls coming
        !           217: from outside the trusted domain should go first to the service the
        !           218: untrusted user requested (for example, the user could request to
        !           219: log into a trusted machine, and the call would go directly to the
        !           220: remote login service on that machine), and have that service call
        !           221: \fIauthmgr\fP for authentication purposes, or whether calls should automatically
        !           222: be rerouted to \fIauthmgr\fP.
        !           223: The former case would have required no changes to the network software,
        !           224: but is much too trusting.
        !           225: Many services in the trusted domain (AT&T Bell Labs, in this case)
        !           226: were written assuming that only the trusted domain existed.
        !           227: Allowing untrusted users to access these services could breach the
        !           228: security of the trusted domain, or give away information that the
        !           229: trusted domain is not allowed to give out (due to licensing or other
        !           230: similar restrictions).
        !           231: .PP
        !           232: In the interest of the security of all of the services in the trusted
        !           233: domain, \fIauthmgr\fP was designed assuming that calls from outside its
        !           234: domain would be rerouted to \fIauthmgr\fP first, before they could reach any
        !           235: unprotected services.
        !           236: This requires that the networking software reroute calls, and also
        !           237: requires that \fIauthmgr\fP be able to redial a call to a new destination
        !           238: once authentication is completed.
        !           239: The benefits of reducing the chances of information leaking out
        !           240: of the trusted domain far outweigh the added complexity to the
        !           241: networking software.
        !           242: In addition, none of the existing services need to change to benefit
        !           243: from the added authentication step.
        !           244: .NH 2
        !           245: Authmgr Operation
        !           246: .PP
        !           247: \fIAuthmgr\fP operates in three different modes, depending on the command
        !           248: line arguments and its environment at the time it is executed.
        !           249: In the first mode, \fIauthmgr\fP assumes it is interacting with a human
        !           250: user at a terminal.
        !           251: This mode is used when a user connects directly to \fIauthmgr\fP.
        !           252: The user is prompted for a login name (unless \fIauthmgr\fP can determine
        !           253: the user's login name from its environment), and then is challenged
        !           254: to encrypt a number or enter a password.
        !           255: The user encrypts the number using their encryption calculator and
        !           256: in any case, enters the response.
        !           257: \fIAuthmgr\fP tests this against the correct response, and, if it is correct,
        !           258: prompts the user for a new destination.
        !           259: The user enters a new destination, and \fIauthmgr\fP attempts to redial
        !           260: the call.
        !           261: Figure 3 shows an example of such a session.
        !           262: .1C
        !           263: .KF
        !           264: .sp .5v
        !           265: .DS B
        !           266: .CW
        !           267: coma(cohrs): con -l security.security
        !           268: Security Authentication check
        !           269: 
        !           270: login: cohrs
        !           271: Enter response code for 31746735: 41a46474
        !           272: 
        !           273: Number please: seki.whoami
        !           274: source=dk!nj/astro/security user=cohrs line=astro2.57.27.F
        !           275: Eof
        !           276: coma(cohrs):
        !           277: .R
        !           278: .DE
        !           279: .DS C
        !           280: Figure 3.  A simple, interactive Authentication Session
        !           281: .DE
        !           282: .KE
        !           283: .2C
        !           284: .PP
        !           285: The second form is also interactive, but is used when the user is
        !           286: using a Gnot terminal.
        !           287: In this mode, the Gnot, when it is powered up,
        !           288: automatically connects to \fIauthmgr\fP using
        !           289: a special service name.
        !           290: \fIAuthmgr\fP again prompts the user for a login name and a challenge.
        !           291: However, when the user correctly enters the response, \fIauthmgr\fP
        !           292: does not ask for another destination.
        !           293: Instead, it redials the call to a special destination that the
        !           294: network software understands as being an ``authentication only''
        !           295: message.
        !           296: When the source receives the redial message, it saves the authenticated
        !           297: name and location of the user in a safe place, and closes the connection
        !           298: to \fIauthmgr\fP.
        !           299: Until the Gnot is reset,
        !           300: all subsequent calls go out using this authenticated login name and
        !           301: security ID.
        !           302: .PP
        !           303: The third form is meant to be used in conjunction with the various
        !           304: remote login services available on the Datakit networks, especially
        !           305: the
        !           306: .CW dcon
        !           307: service (used by the
        !           308: .I con
        !           309: program),
        !           310: and the call rerouting option available at
        !           311: the trunk from an untrusted domain of the network to the trusted domain.
        !           312: Here, an untrusted user requests to connect to the remote login service of
        !           313: a computer in the trusted domain.
        !           314: When the call reaches the trunk to the trusted domain, the control
        !           315: process on the trunk reroutes the call to \fIauthmgr\fP (the details of
        !           316: this will be explained later).
        !           317: When \fIauthmgr\fP is executed to handle the call, one of the parameters in
        !           318: its environment is the original destination of the call, namely the
        !           319: login service of some host in the trusted domain.
        !           320: .PP
        !           321: \fIAuthmgr\fP sends out a special message understood by
        !           322: .I con .
        !           323: .I Con
        !           324: prompts the user for a login name, and sends this back to \fIauthmgr\fP.
        !           325: \fIAuthmgr\fP uses the login name to find the key (or password) for this
        !           326: user, and sends back the appropriate challenge.
        !           327: .I Con
        !           328: requests that the
        !           329: user encrypt the challenge or enter a password, if this is a connection
        !           330: inside the trusted domain.
        !           331: Once it receives the information,
        !           332: .I con
        !           333: sends a message back to \fIauthmgr\fP
        !           334: containing the response from the user.
        !           335: If this is the correct response, the remote login protocol continues
        !           336: as normal, otherwise, \fIauthmgr\fP again sends a challenge, and the cycle
        !           337: repeats.
        !           338: An example of this usage is shown in Figure 4.
        !           339: While the actual prompts are similar, it should be noted that con
        !           340: is prompting the user for the data in this example, not
        !           341: \fIauthmgr\fP; \fIauthmgr\fP communicates with con over the network connection.
        !           342: Pseudocode for \fIauthmgr\fP's side of the protocol with
        !           343: .I con
        !           344: is shown
        !           345: in Figure 5.
        !           346: .1C
        !           347: .KF
        !           348: .DS
        !           349: .CW
        !           350: fishonaplatter(cohrs): con seki
        !           351: login: cohrs
        !           352: Enter response for 55374202: 57406251
        !           353: seki(cohrs):
        !           354: .R
        !           355: .DE
        !           356: .DS C
        !           357: Figure 4.  A Rerouted Call to a Remote Login Service
        !           358: .DE
        !           359: .KE
        !           360: .2C
        !           361: .PP
        !           362: \fIAuthmgr\fP is executed once for each session that requires authentication.
        !           363: Upon startup, it reads some initial configuration information from
        !           364: its configuration file.
        !           365: This includes such things as the maximum number of tries a user gets
        !           366: before \fIauthmgr\fP closes the connection, and mappings between original
        !           367: source identifiers and new security identifiers.
        !           368: This configuration file is explained in detail in the accompanying
        !           369: manual page for \fIauthmgr\fP, found at the end of this paper.
        !           370: .PP
        !           371: The keys are also stored in a file on the security computer's disk.
        !           372: This file contains extremely sensitive information, because the
        !           373: keys are necessarily stored unencrypted, unlike the passwords in the
        !           374: .UX
        !           375: password file.
        !           376: For this reason, access to the security computer must be severely
        !           377: limited, not even allowing a remote login service.
        !           378: At the present time, the key file is stored in a protected place,
        !           379: but the file itself is not encrypted.
        !           380: In some future version on \fIauthmgr\fP, this file could be encrypted, but
        !           381: that would require human intervention to enter the encryption key
        !           382: when \fIauthmgr\fP starts up.
        !           383: For the purpose of simplicity, and to remove the need for human
        !           384: intervention, the
        !           385: current version relies on the physical security of the keys file.
        !           386: .PP
        !           387: The final aspect of \fIauthmgr\fP's operation is its use of the redial
        !           388: feature.
        !           389: \fIAuthmgr\fP redials the call through use of a new
        !           390: .I ipcredial
        !           391: library call in the Tenth Edition
        !           392: .UX
        !           393: IPC library.
        !           394: \fIAuthmgr\fP generates a message containing the authenticated name of
        !           395: the user, the new authenticated security identifier, and the
        !           396: new destination to redial.
        !           397: For security reasons, the ipcredial only works for the superuser.
        !           398: Once the call has been redialed, either successfully or
        !           399: unsuccessfully, the connection from \fIauthmgr\fP to the remote user
        !           400: is closed, and \fIauthmgr\fP exits.
        !           401: All in all, implementing \fIauthmgr\fP itself was straightforward,
        !           402: and the system support was easily adapted to the redial application.
        !           403: .1C
        !           404: .KF bottom
        !           405: .DS
        !           406: .CW
        !           407: int d;
        !           408: char user[];
        !           409: char response[];
        !           410: char challenge[];
        !           411: 
        !           412: con!"CH";\h'8n'/* the magic challenge protocol string */
        !           413: *[
        !           414: \h'8n':: con?user ->
        !           415: \h'16n'challenge = makechallenge(getkeyinfo(user));
        !           416: \h'16n'con!challenge;
        !           417: \h'16n'con?response;
        !           418: \h'16n'encrypt(getkeyinfo(user),challenge) == response ->
        !           419: \h'24n'redial();\h'8n'/* \fIauthmgr\fP exits */
        !           420: \h'16n'con!"CH";
        !           421: \h'8n':: con?EOF ->
        !           422: \h'16n'exit();
        !           423: ]
        !           424: .R
        !           425: .DE
        !           426: .DS C
        !           427: Figure 5.  The \fIAuthmgr\fP Remote Login Protocol
        !           428: .DE
        !           429: .KE
        !           430: .2C
        !           431: .NH 1
        !           432: The Datakit Redial Mechanism
        !           433: .PP
        !           434: The redial mechanism itself is supported in the network control
        !           435: software.
        !           436: In the case of the Datakit, where this work was done, this
        !           437: control software exists inside the network itself, in the
        !           438: Datakit nodes.
        !           439: Each Datakit node has an associated control computer; the
        !           440: research Datakit nodes use Digital PDP-11/23 style computers for
        !           441: the control computer, which directly controls the switch memory
        !           442: of the Datakit node.
        !           443: The redial mechanism is implemented as part of the software
        !           444: running on this control computer.
        !           445: .PP
        !           446: Each device that connects to the Datakit network connects to
        !           447: the Datakit node via a module, an interface card that lives
        !           448: on the Datakit backplane.
        !           449: A process inside the Datakit controller is in charge of
        !           450: controlling this module.
        !           451: In addition, if the module is multiplexed, there is a line
        !           452: process in the Datakit controller to control each line of
        !           453: the multiplexer (for our purposes, we can consider almost any
        !           454: module to be multiplexed, especially the host and trunk
        !           455: modules, in which a line is a single, logical channel on the module).
        !           456: .PP
        !           457: Datakit includes a standard signaling protocol, called VLP,
        !           458: which is used
        !           459: for setting up and taking down calls.
        !           460: VLP defines the interactions between
        !           461: the control processes for the source and destination modules
        !           462: in the Datakit controller.
        !           463: There are additional control messages between the line and
        !           464: control processes within the same module, but these are not
        !           465: defined as part of VLP.
        !           466: .PP
        !           467: Implementing the redial mechanism in the Datakit controller
        !           468: required changing VLP, and adding two new messages,
        !           469: CALLMOD and SIREQ.
        !           470: These messages are defined to occur only when a connection
        !           471: has been established; in most control processes, this is called
        !           472: the TALKING state.
        !           473: CALLMOD is a completely new message and is used for passing
        !           474: the new dialstring back to the point at which the call will
        !           475: be redialed.
        !           476: SIREQ already exists in the generic Datakit controller,
        !           477: and is used by the splice mechanism, but did not exist
        !           478: in the research controller.
        !           479: This message informs the originating point of the call (the
        !           480: end of the original connection that still exists in the
        !           481: new, redialed connection) that it needs to resynchronize its
        !           482: higher level protocols with its new peer.
        !           483: .PP
        !           484: Basically, a redial consists of two phases.
        !           485: The first phase uses CALLMOD messages to pass the new dialstring
        !           486: from the module that wants to redial the call to the module
        !           487: that will actually redial the call.
        !           488: At the same time, this portion of the original connection is
        !           489: closed down.
        !           490: When the CALLMOD message reaches the
        !           491: .I "redial point" ,
        !           492: the module
        !           493: that should actually redial the call, the line process for
        !           494: this connection at that module generates a CALL message to
        !           495: open up a new connection to the new dialstring.
        !           496: This is the second phase of the redial.
        !           497: The redial point eventually receives an ANSWER or a NAK message back from
        !           498: the new destination of the call.
        !           499: This part of the protocol works just as if this were a normal
        !           500: call.
        !           501: .PP
        !           502: When the ANSWER reaches the redial point, instead of
        !           503: propagating it back to the source, we instead send the source
        !           504: an SIREQ message, telling it to resynchronize its protocols,
        !           505: and the new connection is established.
        !           506: The sending of the SIREQ message here differs from Wetzel's
        !           507: redial implementation, which assumes that the higher level
        !           508: protocols are using URP, and puts an URP initialization request
        !           509: into the datastream.
        !           510: We considered this to be incorrect, and possibly harmful to
        !           511: correct communication, and opted for fully integrating redial
        !           512: into the VLP protocol instead, even to the point of reinitializing
        !           513: the source of the original call.
        !           514: .1C
        !           515: .KF
        !           516: .so fig6.x
        !           517: .DS C
        !           518: Figure 6.  Redialing a call on Datakit using VLP
        !           519: .DE
        !           520: .KE
        !           521: .2C
        !           522: .PP
        !           523: Figure 6 shows an example of these two phases of call redial.
        !           524: In this example, a user on the host
        !           525: .CW coma
        !           526: has connected to the host
        !           527: .CW security ,
        !           528: presumably to use \fIauthmgr\fP (this step is labeled 1 in the figure).
        !           529: After authentication, \fIauthmgr\fP redials the call from itself to
        !           530: the host named
        !           531: .CW west .
        !           532: This causes the connection from the node1 Datakit to the security
        !           533: host to close (this step is labeled 2, and is phase 1 of the redial).
        !           534: When the redial request reaches node1, the control process starts
        !           535: a new call to the host
        !           536: .CW west .
        !           537: This call completes in step 3, and now the user on
        !           538: .CW coma
        !           539: is connected to
        !           540: .CW west .
        !           541: .PP
        !           542: In the example, the redial took place on the originating Datakit
        !           543: node.
        !           544: This makes for the most optimal path from
        !           545: .CW coma
        !           546: to
        !           547: .CW west .
        !           548: If we had performed the redial at node2 instead of node1, all messages
        !           549: between
        !           550: .CW coma
        !           551: and
        !           552: .CW west
        !           553: would have had to go through 3 Datakit
        !           554: nodes, rather than 2, increasing the delay and increasing the
        !           555: load on node2 unnecessarily.
        !           556: However, in cases where the original call comes from an untrusted
        !           557: domain, we would want the redial message (phase 1) to be intercepted
        !           558: by the node at the edge of the trusted domain, and have the new
        !           559: call be placed from there.
        !           560: .PP
        !           561: This scenario is shown in Figure 7.
        !           562: Here,
        !           563: .CW pokey
        !           564: is a computer in the untrusted domain, and is connected
        !           565: to the Datakit node, nodex.
        !           566: Once again, the user on pokey calls the security host, and has their
        !           567: call redialed to
        !           568: .CW west
        !           569: (steps 1 and 2).
        !           570: However, node1 intercepts the redial message and performs phase 2
        !           571: of the redial itself, rather than forwarding it on to nodex, which
        !           572: it doesn't trust.
        !           573: After the call is redialed from node1, the connection is resynchronized,
        !           574: and
        !           575: .CW pokey
        !           576: is now connected to
        !           577: .CW west .
        !           578: .1C
        !           579: .KF top
        !           580: .so fig7.x
        !           581: .DS C
        !           582: Figure 7.  Intercepting a redialed call
        !           583: .DE
        !           584: .KE
        !           585: .2C
        !           586: .NH 2
        !           587: Message Flow to Implement Call Redial
        !           588: .PP
        !           589: The message flow to implement call redial is more involved than
        !           590: forwarding on the CALLMOD, CALL and SIREQ message, due to the
        !           591: software structure of the Datakit controller.
        !           592: All VLP messages travel out-of-band of the data, and messages
        !           593: between module pairs, such as the two sides of a trunk, must
        !           594: travel via the control channel between these two sides.
        !           595: This amounts to a 4 way communication to pass VLP information
        !           596: around in the network.
        !           597: I will first detail the messages necessary to implement
        !           598: phase 1 of the redial, both from the host to the Datakit, and
        !           599: between trunks, and terminating in the initiation of a new call.
        !           600: Next, I will explain the messages necessary to resynchronize
        !           601: the connection.
        !           602: You may want to compare this implementation with Wetzel's.
        !           603: .......
        !           604: .NH 3
        !           605: Phase 1 Host Control Module Messages
        !           606: .PP
        !           607: Initiating a redial from a host requires the use of two Datakit
        !           608: channels, the host's control channel, and the data channel
        !           609: that will be redialed.
        !           610: All changes on the host were done in user level servers, no
        !           611: kernel modifications were necessary, not even to the stream
        !           612: handlers.
        !           613: Because the host modifications were straightforward and were
        !           614: not made by me, I will not detail them here.
        !           615: .PP
        !           616: The message sequence is shown in Figure 8.
        !           617: When \fIauthmgr\fP redials its connection, it uses the
        !           618: .I ipcredial
        !           619: library call to pass the call back to the Datakit call
        !           620: manager
        !           621: .I dkmgr
        !           622: on the security host.
        !           623: The call manager passes a control message of type T_CHG over the
        !           624: Datakit control
        !           625: connection containing a D_REDIAL request and the line identifier
        !           626: for the data channel (step 1).
        !           627: The control process, unixcscp, notifies the line process, unixp, identified
        !           628: in the D_REDIAL message of the redial, with an EXTFUNC (for extended
        !           629: function) message, with subtype D_REDIAL (step 2).
        !           630: When it receives this message, the line process changes the switch
        !           631: setting in the Datakit so when the host sends data on the data channel,
        !           632: the line process will receive this data, rather than having the data
        !           633: sent to the originating end of the call.
        !           634: The line process notifies
        !           635: .I dkmgr
        !           636: that it is ready for the dialstring
        !           637: by sending an ``O'' character as a dialtone (step 3).
        !           638: The host responds with the dialstring, and closes its end of the
        !           639: data channel (step 4).
        !           640: The dialstring sent by the host is exactly the same as the dialstring
        !           641: used when placing new calls; no changes were made to the format.
        !           642: .1C
        !           643: .KF bottom
        !           644: .so fig8.x
        !           645: .DS C
        !           646: Figure 8.  Phase 1 Host Control Messages
        !           647: .DE
        !           648: .KE
        !           649: .2C
        !           650: .PP
        !           651: Unixp is not the process that should actually perform the redial,
        !           652: because it was the destination of the old call, so it must forward
        !           653: the new dialstring back along the path of the call to the process
        !           654: that originated the call, or a trunk process that will intercept
        !           655: the redial.
        !           656: It does this in step 5, by sending a CALLMOD message, which contains
        !           657: the new dialstring, to the module that originated the call.
        !           658: Unixp then hangs up its end of the old connection by sending a
        !           659: HANGUP message to unixcscp in step 6.
        !           660: This ends the host's involvement in phase 1 of the redial.
        !           661: .NH 3
        !           662: Phase 1 Trunk Control Module Messages
        !           663: .PP
        !           664: The redial in the trunk is even more complicated than that of the
        !           665: host, because the trunk must be able to both pass a redial through,
        !           666: if it is not the redial point, or intercept the redial message,
        !           667: if this trunk goes to an untrusted domain.
        !           668: Once again, there are four processes involved, the control processes
        !           669: on each side of the trunk, tdkp, and the line processes, tdktrkp,
        !           670: which control the data channel of this connection.
        !           671: .PP
        !           672: Figure 9 shows the control flow for a trunk that passes CALLMOD
        !           673: requests through, unchanged.
        !           674: First, the tdktrkp on the redialing side receives a CALLMOD from
        !           675: a unixp or another tdktrkp.
        !           676: It wants to pass this on through the trunk, but must use the
        !           677: control process, tdkp to do so, and sends tdkp an EXTFUNC/D_REDIAL
        !           678: message (step 2).
        !           679: Tdkp responds to this by sending a T_CHG/D_REDIAL message to
        !           680: its peer on the other side of the trunk, along with the line
        !           681: identifier for the data channel (step 3).
        !           682: The remote tdkp sends an EXTFUNC/D_REDIAL message down to
        !           683: the correct line process (step 4), which causes that tdktrkp
        !           684: to give a dialtone for the new dialstring (step 5).
        !           685: The redialing tdktrkp responds by sending the dialstring (step 6).
        !           686: It is now completed with this call, but waits for the remote
        !           687: tdktrkp to complete sending the dialstring on.
        !           688: .1C
        !           689: .KF
        !           690: .so fig9.x
        !           691: .DS C
        !           692: Figure 9.  Phase 1 Trunk Control Messages
        !           693: .DE
        !           694: .KE
        !           695: .2C
        !           696: .PP
        !           697: The remote tdktrkp once again packages up the dialstring in a
        !           698: CALLMOD message, which it sends on to its peer (presumably the
        !           699: line process for another trunk or a host) in step 7.
        !           700: The remote tdktrkp is also finished with this call
        !           701: and sends a CLOSE to its trkp (step 8).
        !           702: This causes the normal tear down to take place between the trunk
        !           703: processes, which eventually causes an ONHOOK message to be received
        !           704: by the other tdktrkp (step 9),
        !           705: which then finishes cleaning up this connection.
        !           706: In this way, the CALLMOD gets forwarded through the network,
        !           707: and the old portion of the call gets torn down at the same time.
        !           708: .NH 3
        !           709: Phase 2 Trunk Control Module Messages
        !           710: .PP
        !           711: Eventually, the CALLMOD reaches the originating host control
        !           712: process or a trunk to an untrusted domain, and phase 2 begins.
        !           713: Because phase 2 is more interesting in the intercept case,
        !           714: the trunk intercept case is described here
        !           715: The host redial case is similar, and somewhat simpler.
        !           716: .PP
        !           717: Figure 10 shows the messages involved in phase 2 of a trunk
        !           718: that intercepts the redial message.
        !           719: The trunk first receives the CALLMOD message from its peer, just
        !           720: like it would if it were forwarding the redial.
        !           721: However, when it checks its administrative database, it determines
        !           722: that it should intercept the redial.
        !           723: It sends out a new CALL message to the new destination (step 2)
        !           724: and waits for a response.
        !           725: In this example, the call succeeds, and the tdktrkp receives
        !           726: an ANSWER message from its new peer (step 3).
        !           727: .1C
        !           728: .KF
        !           729: .so fig10.x
        !           730: .DS C
        !           731: Figure 10.  Phase 2 Trunk Control Messages
        !           732: .DE
        !           733: .KE
        !           734: .2C
        !           735: .PP
        !           736: In Wetzel's redial implementation, phase two ends here.
        !           737: However, we really need to send back to the originating host,
        !           738: via the control channels, a resynchronization message.
        !           739: Wetzel's method of inserting control bytes into the data stream
        !           740: is unacceptable \- a trunk process cannot know the high level
        !           741: protocol the endpoints were using, and assuming that they use URP,
        !           742: while correct in the current state of the Datakit, may not work
        !           743: in the long run.
        !           744: In addition, this choice violates the abstraction presented by VLP.
        !           745: .PP
        !           746: Phase 2 continues by telling the originating host to resynchronize
        !           747: its high level protocols with the new peer.
        !           748: Tdktrkp, after it receives the ANSWER, notifies its tdkp about
        !           749: this with an SIREQ message (step 4).
        !           750: The tdkp then sends a T_CHG/D_XINIT message across the control channel
        !           751: to its peer on the other side of the trunk (step 5), along with
        !           752: the line identifier for the data channel that needs resynchronization.
        !           753: The remote tdkp notifies the correct tdktrkp line process with an
        !           754: SIREQ message as well (step 6).
        !           755: The receiving tdktrkp forwards the synchronization message along
        !           756: by sending an SIREQ message to its peer module (step 7).
        !           757: If step 1 were the receipt of an SIREQ rather than a CALLMOD, the
        !           758: sequence would be the same, without the CALL or ANSWER.
        !           759: .NH 3
        !           760: Phase 2 Host Control Module Messages at the Originating Host
        !           761: .PP
        !           762: When a line process on a host interface module receives an SIREQ
        !           763: message from its peer (either a trunk or another host module),
        !           764: it must notify the host itself of the synchronization request.
        !           765: This message sequence is shown in Figure 11.
        !           766: The unixp process receives the SIREQ (step 1), and sends an
        !           767: SIREQ to its controlling unixcscp (step 2).
        !           768: In the generic Datakit, the splice operation resynchronizes a host
        !           769: by sending it a T_SRV/D_XINIT message.
        !           770: Because this message does not depend on the splice operation at
        !           771: all, we use it here.
        !           772: Unixcscp sends the host a T_SRV/D_XINIT message over the control
        !           773: channel.
        !           774: A modification was necessary in the streams modules in the
        !           775: kernel to process this message.
        !           776: This message is intercepted by the streams modules,
        !           777: and causes the data channel to resynchronize (it resets sequence
        !           778: numbers and any other necessary end-to-end negotiations).
        !           779: At this point, the redial is completed.
        !           780: .1C
        !           781: .KF bottom
        !           782: .so fig11.x
        !           783: .DS C
        !           784: Figure 11.  Phase 2 Host Control Messages
        !           785: .DE
        !           786: .KE
        !           787: .2C
        !           788: .NH 2
        !           789: Administrative Changes to Implement Call Redial
        !           790: .PP
        !           791: The redial mechanism, by itself, is not enough to support \fIauthmgr\fP.
        !           792: Additional changes were necessary in the administrative and
        !           793: configuration portions of the Datakit control software.
        !           794: One of these changes, the redial intercept, has already been mentioned.
        !           795: This and other changes will be detailed in this section.
        !           796: .PP
        !           797: In order to restrict the use of the redial operation, a new option
        !           798: was added to the host module configuration description.
        !           799: This option is a simple boolean, which says whether the host is
        !           800: allowed to issue redial operations or not.
        !           801: There are two reasons for this.
        !           802: First, to support \fIauthmgr\fP, the redial dialstring from the host includes
        !           803: not only the name of the new destination, but an authenticated
        !           804: username and the authenticated security ID for \fIauthmgr\fP.
        !           805: Only the security host should be allowed to send out such messages.
        !           806: In general, only the Datakit is allowed to put the security ID into
        !           807: the dialstring.
        !           808: Furthermore, allowing anyone to perform a redial confuses the
        !           809: authentication system already in place.
        !           810: A redialed call from anyone but \fIauthmgr\fP would contain the username
        !           811: of the
        !           812: .I redialer ,
        !           813: not the username of the original caller (the other end of the connection),
        !           814: and the security ID of the redialed call would be that of the
        !           815: redialer as well.
        !           816: This would foil the authentication checks made by the recipient of
        !           817: the redialed call, making the redialed call appear as if it came from
        !           818: the host that redialed the call, rather than from the original caller.
        !           819: For this reason, redial is completely restricted to specific, secure
        !           820: hosts, and only the superuser (\fIauthmgr\fP runs as the superuser) can
        !           821: take full advantage of the redial feature.
        !           822: .PP
        !           823: Another boolean option was added to the host module configuration
        !           824: description to support the authentication of Gnots.
        !           825: In this case, we wish the entire module to retain the knowledge that
        !           826: this Gnot is currently authenticated.
        !           827: Therefore, on a module that is connected to a Gnot rather than a
        !           828: regular,
        !           829: .UX
        !           830: host, the Datakit administrator can set this option to retain the
        !           831: authentication information.
        !           832: When a CALLMOD request comes into a unixp line process on such a
        !           833: module, it stores the authenticated username and security ID in
        !           834: the control database.
        !           835: All further calls from the Gnot use these values for the username
        !           836: and security ID instead of anything the Gnot or the normal database
        !           837: entries contain.
        !           838: When the Gnot is reset, or its power is cycled, this information is
        !           839: erased, and the next user will have to be re-authenticated.
        !           840: .PP
        !           841: The previously mentioned redial intercept option was added to the
        !           842: trunk module configuration description.
        !           843: This is also a boolean, and, if set, marks the trunk as
        !           844: untrusted.
        !           845: If a CALLMOD arrives from another module on this side of the
        !           846: trunk, it will be intercepted, and the redial will take place
        !           847: at the trunk, rather than being forwarded.
        !           848: .PP
        !           849: Two more configuration options are available for the trunk.
        !           850: The first is necessary to guarantee the authenticity of \fIauthmgr\fP's
        !           851: security ID.
        !           852: The Datakit administrator can enter \fIauthmgr\fP's security ID into
        !           853: one of the fields in
        !           854: the configuration for an untrusted trunk.
        !           855: When a call comes in over the untrusted trunk, the security ID
        !           856: on the call is compared with the security ID of \fIauthmgr\fP.
        !           857: If it is the same, the security ID on the call is changed to
        !           858: be that of someone who is completely unknown and untrusted.
        !           859: This keeps unscrupulous people in the untrusted domain from
        !           860: making fake, ``authenticated'' calls through the trunk.
        !           861: .PP
        !           862: The other option protects the integrity of the trusted domain.
        !           863: Here, the Datakit administrator can define a destination through
        !           864: which all calls from the untrusted trunk should be
        !           865: .I rerouted .
        !           866: When this field is set (this is known as the Predefined Destination
        !           867: field) on a trunk, any call arriving from the trunk will be
        !           868: rerouted to this predefined destination.
        !           869: The name of the old destination, as specified in the dialstring,
        !           870: is also passed along.
        !           871: This is used, for example, to reroute all calls from an untrusted
        !           872: domain to \fIauthmgr\fP.
        !           873: In this way, no service in the trusted domain can be accessed from
        !           874: outside without authenticating the untrusted user
        !           875: first.
        !           876: .NH 2
        !           877: Experience
        !           878: .PP
        !           879: In implementing call redial, a good portion of the time was spent reading
        !           880: the existing code to implement other parts of VLP in the host and
        !           881: trunk control modules and also studying Wetzel's call redial implementation.
        !           882: Implementing the basic call redial itself was straightforward,
        !           883: especially given the references.
        !           884: Making the administrative modifications work and integrating
        !           885: them with the
        !           886: control processes themselves was the most challenging.
        !           887: .PP
        !           888: The worst part of the implementation
        !           889: was in saving the authentication information for the Gnots.
        !           890: The database inside the Datakit control computer is highly structured,
        !           891: and is not extendible.
        !           892: That is, it is impossible, without making major changes to the database
        !           893: code and structure, to add new data types and objects to the database.
        !           894: Therefore, the authenticated username and security ID were stored
        !           895: in two database objects that were otherwise unused for the database
        !           896: information on host interface modules.
        !           897: The actual purpose of these objects was meant to be somewhat
        !           898: different than the
        !           899: way they have been applied in this case.
        !           900: A better solution would have been to modify the database structure,
        !           901: but there was no time for such a major job this summer.
        !           902: .NH 1
        !           903: Conclusions
        !           904: .PP
        !           905: \fIAuthmgr\fP is, as far as I know, the first major application of call
        !           906: redial in Datakit.
        !           907: It allows a trusted domain to interact with a number of untrusted
        !           908: domains, while not compromising the trust implicit inside
        !           909: the trusted domain.
        !           910: The additional use of \fIauthmgr\fP in authenticating Gnots shows its
        !           911: versatility, and that it can centralize the authentication tasks
        !           912: inside the trusted domain as well.
        !           913: The re-implemented redial mechanism points out a problem with
        !           914: resynchronization in the generic datakit
        !           915: redial mechanism that should be addressed at some point.
        !           916: The ease with which \fIauthmgr\fP and call redial fit into the large
        !           917: body of existing networking and datakit control code was
        !           918: extremely encouraging, and the structure difficulties within
        !           919: the control database should be fixable in future versions of
        !           920: the datakit control software.
        !           921: .NH 1
        !           922: Acknowledgements
        !           923: .PP
        !           924: This work would have been impossible to complete in one summer
        !           925: without the direction of my mentor, David Presotto, and the
        !           926: help of Bill Marshall and Caryl Carr.
        !           927: I extend my thanks to them and to the various other members
        !           928: of 1127 that helped make this happen.
        !           929: .NH
        !           930: References
        !           931: .LP
        !           932: |reference_placement

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.