Internet DRAFT - draft-deason-afs3-oob
draft-deason-afs3-oob
N/A A. Deason
Internet-Draft SNA
Intended status: Informational April 20, 2012
Expires: October 22, 2012
Data Transmission Over Out-of-Band Alternative Tranports for AFS-3
draft-deason-afs3-oob-00
Abstract
This document describes an extension to AFS-3 which allows data
transfer over arbitrary alternative transports to the traditional Rx
RPC over UDP, and describes a method of using TCP as one such
alternative transport. This document describes new wire structures
and Rx RPCs for the 'afsint' protocol in AFS-3.
Internet Draft Comments
Comments regarding this draft are solicited. Please include the
AFS-3 protocol standardization mailing list
(afs3-standardization@openafs.org) as a recipient of any comments.
Status of this Memo
This Internet-Draft is submitted in full conformance with the
provisions of BCP 78 and BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet-
Drafts is at http://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
This Internet-Draft will expire on October 22, 2012.
Copyright Notice
Copyright (c) 2012 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of
Deason Expires October 22, 2012 [Page 1]
Internet-Draft AFS-3 Out of Band Transport April 2012
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document.
Table of Contents
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Conventions Used in this Document . . . . . . . . . . . . . . 3
3. Extant RPC Interface . . . . . . . . . . . . . . . . . . . . . 4
4. RPC Interface . . . . . . . . . . . . . . . . . . . . . . . . 4
4.1. FetchDataOOB . . . . . . . . . . . . . . . . . . . . . . . 4
4.2. StoreDataOOB . . . . . . . . . . . . . . . . . . . . . . . 4
5. Rx and OOB stream interaction . . . . . . . . . . . . . . . . 5
5.1. Rx split stream contents . . . . . . . . . . . . . . . . . 5
5.2. XDR over TCP format . . . . . . . . . . . . . . . . . . . 6
5.3. TCP stream negotiation . . . . . . . . . . . . . . . . . . 6
5.4. rxkad challenge response . . . . . . . . . . . . . . . . . 8
5.5. TCP stream payload . . . . . . . . . . . . . . . . . . . . 9
5.6. TCP Connection Caching . . . . . . . . . . . . . . . . . . 10
6. Security Considerations . . . . . . . . . . . . . . . . . . . 11
7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 12
8. AFS-3 Registry Considerations . . . . . . . . . . . . . . . . 12
9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 12
9.1. Normative References . . . . . . . . . . . . . . . . . . . 12
9.2. Informative References . . . . . . . . . . . . . . . . . . 12
Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . 13
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 13
Deason Expires October 22, 2012 [Page 2]
Internet-Draft AFS-3 Out of Band Transport April 2012
1. Introduction
AFS-3 is a global distributed network file system. Currently, most
transfers between clients and servers in AFS-3 occur over an RPC-like
protocol called Rx [RX] [AFS3-RX], which operates on top of UDP. For
transferring bulk file data, usually the specific RPCs FetchData64
and StoreData64 are used, which allow a client to receive or send
data using a stream over Rx.
Rx currently suffers from a number of performance limitations. Some
of these are due to the Rx protocol design, some are due to
implementation limitations in the only known implementations, and
some exist simply because modern networking equipment often provide
hardware acceleration or other benefits for TCP or other protocols,
but provide none for UDP or Rx. Due to the widespread adoption of
TCP, the comparatively less common use of UDP, and the common lack of
awareness that Rx even exists, it seems unlikely that performance of
Rx over UDP will ever approach that of raw TCP, except in a small
amount of environments.
To improve this situation as well as other problems with the RxUDP
protocol, a new protocol implementing Rx over TCP could be designed.
However, designing such a protocol that covers the entire Rx protocol
is a very complex task, and there are numerous obstacles that must be
overcome. Some of these are caused by the difference in resources
consumed by an RxUDP connection (lightweight) vs a TCP connection
(relatively heavyweight), and some are simply due to the complexity
of the Rx protocol, and RPC-like protocols in general.
Since high-throughput client<->server transfers in AFS-3 generally
only occur via two RPCs (FetchData64 and StoreData64), we can just
improve throughput for those RPCs, and the complexity of designing Rx
itself to work on top of TCP or other transports can be avoided.
This document describes the use of two new RxUDP RPCs called
FetchDataOOB and StoreDataOOB, which act as replacements for the
existing FetchData64 and StoreData64 RPCs, and transfer the relevant
file data outside of Rx. This can be thought of as analagous to the
"control connection" and "data conection" used by FTP [RFC0959].
2. Conventions Used in this Document
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in [RFC2119].
Deason Expires October 22, 2012 [Page 3]
Internet-Draft AFS-3 Out of Band Transport April 2012
3. Extant RPC Interface
This document references the existing RPCs FetchData64 and
StoreData64. The definition for the FetchData and StoreData RPCs can
be found in [AFS3-FSCM]. FetchData64 and StoreData64 behave
identically to FetchData and StoreData, except that some of the
arguments are expanded to be 64-bits wide instead of just 32-bits.
4. RPC Interface
4.1. FetchDataOOB
FetchDataOOB behaves very similarly to the extant RPC FetchData64.
The RPC-L definition is:
FetchDataOOB(IN AFSFid *Fid, afs_uint64 Pos, afs_uint64 Length,
OUT AFSFetchStatus *Status, AFSCallBack *CallBack,
AFSVolSync *Sync) split = XXX;
All of the arguments are identical to those of FetchData64. This is
a split call, just like FetchData64, but the data in the split call
stream is not the requested file data. Instead, the contents of the
split call stream are used to negotiate the OOB connection, and are
described in detail in Section 5. The FetchDataOOB call remains open
during the transfer of the OOB file data. When the transfer of the
file data is finished (whether successfully, or unsuccessfully), the
FetchDataOOB call is terminated.
The abort codes are identical to those yielded by FetchData64.
4.2. StoreDataOOB
StoreDataOOB behaves very similarly to the extant RPC StoreData64.
The RPC-L definition is:
StoreDataOOB(IN AFSFid *Fid, AFSStoreStatus *InStatus,
afs_uint64 Pos, afs_uint64 Length,
afs_uint64 FileLength,
OUT AFSFetchStatus *OutStatus, AFSVolSync *Sync)
split = XXX;
All of the arguments are identical to those of StoreData64. This is
a split call, just like StoreData64, but the data in the split call
stream is not the relevant file data. Instead, the contents of the
split call stream are used to negotiate the OOB connection, and are
described in detail in Section 5. The StoreDataOOB call remains open
during the transfer of the OOB file data. When the transfer of the
Deason Expires October 22, 2012 [Page 4]
Internet-Draft AFS-3 Out of Band Transport April 2012
file data is finished (whether successfully, or unsuccessfully), the
StoreDataOOB call is terminated.
The abort codes are identical to those yielded by StoreData64.
5. Rx and OOB stream interaction
This section desribes the contents of the Rx split call stream for
FetchDataOOB and StoreDataOOB. Note that the data over the stream is
marshalled using XDR [RFC4506], but it is not encapsulated using the
Record Marking Standard in [RFC5531] section 11, or anything else.
It is just a single structure encoded in raw XDR by itself.
Note that this section only describes the use of a TCP-based protocol
for the out-of-band data transport. Other transports may be defined
by creating a new "version" of the AFSOOB_Challenge structure.
5.1. Rx split stream contents
The contents of the Rx split stream for both FetchDataOOB and
StoreDataOOB are identical. The only data that appears on the split
stream is a single AFSOOB_Challenge union, encoded in XDR, which is
sent from the server to the client. This structure is specified as
thus in RPC-L:
const AFSTCP_IPMAX = 128;
const AFSOOB_v1 = 1;
struct AFSTCP_IPv4 {
afs_uint32 host;
afs_uint16 port;
};
struct AFSOOB_v1_challenge {
struct AFSTCP_IPv4 addrs<AFSTCP_IPMAX>;
};
union AFSOOB_Challenge switch (afs_uint32 type) {
case AFSOOB_v1:
struct AFSOOB_v1_challenge challenge;
};
AFSOOB_Challenge is a union, where the discriminant just dictates a
logical "version" of the out-of-band challenge structure. Future
revisions of this AFS-3 extension may involve more data in the
challenge, which may be specified at a future date. Currently, only
data for the AFSOOB_v1 challenge is defined, which is defined in the
Deason Expires October 22, 2012 [Page 5]
Internet-Draft AFS-3 Out of Band Transport April 2012
AFSOOB_v1_challenge struct as follows:
addrs
This is an array containing pairs of IPv4 addresses and TCP
ports that the client may attempt to connect to in order to
initiate a TCP transfer. Several addresses MAY be specified,
which SHOULD be attempted in order by the client. The "host"
field indicates the IPv4 address to connect to. The server
MAY specify an IPv4 address of 0.0.0.0, which indicates that
the client MUST attempt to connect to the same IPv4 address
that it is using for the associated RxUDP connection. The
"port" field specifies the TCP port number to connect to.
5.2. XDR over TCP format
A few XDR-encoded structures are sent over the relevant TCP stream
during a FetchDataTCP or StoreDataTCP call. Since the TCP stream is
shared by both XDR-marshalled data and raw file data, in order to
simplify processing, every logical block of XDR is prefixed by a
length value. This "length" is a 32-bit unsigned integer, and is
sent in network byte order over the TCP stream. Immediately
following it is "length" number of octets representing the XDR
stream. Anywhere in this document that refers to an XDR stream being
transmitted over a TCP connection, this format MUST be used. Note
that we do not use the Record Marking Standard from [RFC5531] section
11 for encapsulating XDR over TCP.
5.3. TCP stream negotiation
Once a client has received the challenge described in Section 5.1
over the relevant Rx split stream, the client opens a TCP connection
to the fileserver (or the client MAY reuse an extant TCP connection,
see Section 5.6). If the client succeeds in creating a connection,
the client sends a response to the given challenge immediately on the
TCP stream. The response consists of a single AFSTCP_Response union
sent from the client to the server. The AFSTCP_Response union is
defined as thus in RPC-L:
Deason Expires October 22, 2012 [Page 6]
Internet-Draft AFS-3 Out of Band Transport April 2012
const AFSTCP_RXNULL = 0;
const AFSTCP_RXKAD = 2;
struct AFSTCP_v1_uniq {
afs_uint32 host;
afs_uint32 portAndServiceId;
afs_uint32 epoch;
afs_uint32 cid;
afs_uint32 callNumber;
};
union AFSTCP_v1_private switch (afs_uint32 securityIndex) {
case AFSTCP_RXNULL:
void;
case AFSTCP_RXKAD:
struct AFSTCP_v1_rxkad encrypted;
};
struct AFSTCP_v1_response {
struct AFSTCP_v1_uniq uniq;
union AFSTCP_v1_private private;
};
union AFSTCP_Response switch (afs_uint32 type) {
case AFSOOB_v1:
struct AFSTCP_v1_response response;
};
AFSTCP_Response is a union, where the discriminant just dictates a
logical "version" of the OOB out of band response structure. Future
revisions of this AFS-3 extension may involve more data in the
response, which may be specified at a future date. Currently, only
data for the AFSOOB_v1 response is defined, which is defined in the
AFSTCP_v1_response struct as follows:
uniq
The contents of this structure are defined immediately below.
private
This contains data specific to the security index used in the
Rx connection of the associated Rx call. The discriminant is
that security index, and it MUST match the security index of
the Rx connection for the associated call. For
unauthenticated connections (rxnull), this is an empty
structure. For connections authenticated with rxkad, this is
an AFSTCP_v1_rxkad structure, which is defined in
Deason Expires October 22, 2012 [Page 7]
Internet-Draft AFS-3 Out of Band Transport April 2012
Section 5.4.
The AFSTCP_v1_uniq structure is used to identify which Rx call this
connection is to be associated with. It is defined as follows:
host
The fileserver IPv4 address the client is using to connect to
the relevant fileserver.
portAndServiceId
The least-significant 16 bits of this integer are the TCP
port the client is using to connect to the relevant
fileserver. The most-significant 16 bits are the service Id
used in the relevant Rx call.
epoch
The Rx connection epoch for the associated connection.
cid
The connection Id for the associated Rx call channel and
connection.
callNumber
The call number of the associated Rx call.
The client MUST fill this structure with the values matching the
values in the corresponding Rx call. The server MUST verify that the
values of the structure do correspond to an existing FetchDataTCP or
StoreDataTCP Rx call, and that the given host and port are valid for
the fileserver.
5.4. rxkad challenge response
The rxkad-specific portion of the challenge response structure
transmitted over the TCP connection is described here. The entire
structure is encrypted via fcrypt in ECB mode with the session key
schedule and initialization vector of the Rx connection of the
associated Rx call, and must be decrypted before its contents can be
interpreted. The structure is defined in RPC-L as thus:
struct AFSTCP_v1_rxkad {
struct AFSTCP_v1_uniq uniq;
afs_uint32 seclevel;
Deason Expires October 22, 2012 [Page 8]
Internet-Draft AFS-3 Out of Band Transport April 2012
};
After being decrypted, the structure contents are defined as follows:
uniq
This MUST be identical to the uniquifier specified in the
encompassing AFSTCP_v1_response structure, as defined in
Section 5.3.
seclevel
This corresponds to the "security level" that exists in
rxkad. Currently, this field must always be 0 (rxkad_clear),
and any other value MUST immediately cause an error to be
raised. In the future, it may be possible to specify other
security levels here which indicate that the file data should
be encrypted according to the analogous rxkad security level,
assuming the rxkad security index is specified.
If the uniquifier in this structure does not exactly match the
uniquifier in the parent AFSTCP_v1_response structure, the TCP
connection MUST be immediately closed and considered invalid. The
invalid TCP connection SHOULD just be ignored, and thus the
associated Rx call SHOULD NOT be aborted or terminated, and the
server SHOULD continue to listen for TCP connections until a timeout
is reached or the client aborts the Rx call. This is so
unauthenticated attackers do not cause the Rx call to be aborted
unnecessarily.
5.5. TCP stream payload
After the challenge response specified in Section 5.3 has been sent,
the file data for the transfer will be transmitted. The file data is
encoded as follows. The endpoint that is sending file data first
sends a single XDR-encoded AFSTCP_FileData union (encoded according
to Section 5.2), which is then followed by the raw file data itself.
The AFSTCP_FileData union is defined as thus in RPC-L:
union AFSTCP_FileData switch (afs_uint32 type) {
case AFSOOB_v1:
afs_uint64 length;
};
AFSTCP_FileData is a union, where the discriminant just dictates a
logical "version" of the TCP out of band file data structure. Future
revisions of this AFS-3 extension may involve more data being sent
before the raw file data, which may be specified at a future date.
Deason Expires October 22, 2012 [Page 9]
Internet-Draft AFS-3 Out of Band Transport April 2012
Currently, only data for the AFSOOB_v1 file data information is
defined, which consists of a single field called "length". This
field just dictates how many octets of raw file data will immediately
follow the AFSTCP_FileData structure.
For a FetchDataTCP request, the server will immediately send the
AFSTCP_FileData union across the TCP stream as soon as it has
verified that the given challenge response is valid. For a
StoreDataTCP request, the client will immediately send the
AFSTCP_FileData union across the TCP stream without waiting for any
response.
After the AFSTCP_FileData union has been sent, the raw file data
immediately follows. Once all of the file data has been transmitted,
the peer terminates the associated RXAFS call. The TCP connection
MAY be terminated by the client, server, or both, after a successful
transfer (see Section 5.6).
In the event of an error, there is no error code information
transmitted over the TCP stream. If an error should occur, the peer
that recognizes an error MUST immediately close the TCP stream, and
send an Rx abort for the associated RXAFS call (unless otherwise
specified, as in Section 5.4). The client may detect such an error
by noticing that the TCP has been closed prematurely, and it receives
the error code for the error from Rx abort codes from the associated
Rx call. If the server notices a premature termination of the TCP
connection, it MUST send an abort on the associated Rx call and stop
processing.
5.6. TCP Connection Caching
Once a transfer has completed successfully, the TCP connection used
does not need to be closed. The client and server MAY keep the
connection open for use with a future transfer if they support the
functionality in this section. A fileserver that supports this will,
after a transfer is complete, treat the TCP connection as if it were
a newly-accepted TCP connection. That is, the server will then wait
for the connection to receive an AFSTCP_Response structure, or will
time out the connection after an implementation-defined amount of
time.
If the client wishes to make use of connection caching, it may also
keep its end of the connection open, and may use that connection for
a future transfer. All of the negotiation steps are the same as
normal, with the sole exception that the client reuses the TCP
connection instead of making a new one. Since all authentication
negotiation occurs again, the cached TCP connections may be used for
any user with any authentication credentials. However, the client
Deason Expires October 22, 2012 [Page 10]
Internet-Draft AFS-3 Out of Band Transport April 2012
MUST ensure that the TCP is connected to an address that is valid
according to the AFSTCP_Challenge received from the fileserver.
The caching of TCP connections is strictly OPTIONAL for both client
and server. If either client or server does not support this, they
may simply close the TCP connection after a successful transfer. If
a client closes such a connection when the server supports caching,
the server will take notice when listening for an AFSTCP_Response
structure, and will just close its end of the connection. If the
server closes such a connection when the client supports caching, the
client will notice when it tries to reuse the connection; in which
case, the client SHOULD simply discard the cached connection and
create a new one.
6. Security Considerations
During negotiation of the TCP connection, the TCP stream is
authenticated via fcrypt to prove that the connection is from the
same user as the associated Rx call. It should be noted that fcrypt
encryption is considered weak by modern cryptographic standards, and
that this only authenticates the TCP stream itself. The contents of
the TCP stream may be intercepted and read by an attacker, and the
contents may even be modified by an attacker if they can successfully
execute a TCP sequence number prediction attack.
These limitations may be addressed in the future by allowing
different rxkad security levels or different Rx security indices to
be specified by the client.
Clients that send an invalid AFSTCP_Response structure do not receive
much useful feedback from the server in terms of error information or
error codes. The Rx call MUST NOT be terminated due to TCP errors
until the TCP stream is authenticated, or we risk a trivial DoS
attack for the relevant Rx call. What happens is that the server
just terminates the invalid TCP stream prematurely (which the client
can notice), but it keeps the Rx call open until it times out,
effectively waiting for the valid TCP connection.
It should also be noted that a sort of hijacking attack may be
performed on anonymous transfers without needing to hijack any of the
intermediate connections. An attacker that can eavesdrop on the
relevant connections may detect the various Rx call and connection
fields it needs to populate an AFSTCP_v1_uniq, and an attacker can
then create its own TCP connection with the proper response, from any
machine. This is not considered a problem, since data that may be
accessed anonymously is generally not sensitive (to some extent, it
is not sensitive by definition). While it is possible that such data
Deason Expires October 22, 2012 [Page 11]
Internet-Draft AFS-3 Out of Band Transport April 2012
may be protected by IP-based ACLs in AFS, such instances should be
rare, and are already recommended against for other reasons. The
server MAY alleviate this issue somewhat by restricting access based
on the source IP address of the out-of-band TCP connection (for
example, it may enforce that the source address of the TCP connection
match the address of the Rx connection of the associated Rx call).
7. IANA Considerations
This document makes no request of the IANA.
8. AFS-3 Registry Considerations
This document requires the registration of two RPC code points in the
RXAFS Rx package for the FetchDataTCP and StoreDataTCP RPCs detailed
above in Section 4.
9. References
9.1. Normative References
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997.
[RFC4506] Eisler, M., "XDR: External Data Representation Standard",
STD 67, RFC 4506, May 2006.
9.2. Informative References
[AFS3-FSCM]
Zayas, E., "AFS-3 Programmer's Reference: File Server/
Cache Manager Interface", Transarc Corp. Tech. Rep. FS-00-
D162, August 1991.
[AFS3-RX] Zayas, E., "AFS-3 Programmer's Reference: Specification
for the Rx Remote Procedure Call Facility", Transarc Corp.
Tech. Rep. FS-00-D164, August 1991.
[RFC0959] Postel, J. and J. Reynolds, "File Transfer Protocol",
STD 9, RFC 959, October 1985.
[RFC5531] Thurlow, R., "RPC: Remote Procedure Call Protocol
Specification Version 2", RFC 5531, May 2009.
[RX] Zeldovich, N., "RX protocol specification".
Deason Expires October 22, 2012 [Page 12]
Internet-Draft AFS-3 Out of Band Transport April 2012
Appendix A. Acknowledgements
The author thanks Tom Keiser, Mike Meffie, and Mark Vitale for their
discussion of the original AFS-3 OOB protocol design, on which the
protocol described in this document is based.
Author's Address
Andrew Deason
Sine Nomine Associates
43596 Blacksmith Square
Ashburn, Virginia 20147-4606
USA
Phone: +1 703 723 6673
Email: adeason@sinenomine.net
Deason Expires October 22, 2012 [Page 13]