|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.