diff options
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/design | 365 | 
1 files changed, 365 insertions, 0 deletions
diff --git a/docs/design b/docs/design new file mode 100644 index 0000000..dc4d05c --- /dev/null +++ b/docs/design @@ -0,0 +1,365 @@ +                           Wallet System Design + +Introduction + +    The wallet system provides a mechanism for storing and retrieving +    security-sensitive data such as system credentials and private keys +    from a secure host, applying ACLs to that data, and supporting +    automatic creation of certain types of security data on demand (such +    as Kerberos keytabs). + +    The initial implementation of the wallet is targetted at Kerberos +    keytab distribution and the replacement of Stanford University's +    legacy Kerberos-v4-based sysctl system for distributing srvtabs and +    keytabs.  After that initial implementation, additional data types +    will be added.  SSL certificates, ssh private keys, and database +    passwords are likely early candidates.  The implementation of keytabs +    is described in detail below, and similar detailed designs for other +    data types will be added as part of the later phases of the design. + +    This design document is not entirely complete in the area of exact +    protocol commands, supported arguments, and the details of the ACL +    manipulation protocol.  These areas of the design are still being +    developed. + +Assumptions + +    For the rest of this document, the term "object" will be used for a +    piece of security-sensitive data stored in the wallet.  The object +    "metadata" is the authorization and history information around that +    object.  Be aware that an object "stored" in the wallet may not be +    physically present on the wallet server; instead, the object may be a +    type of object that can be dynamically generated on demand by the +    wallet server or retrieved from elsewhere.  For example, most Kerberos +    keytabs stored in the wallet will exist in the wallet only in the form +    of metadata and will be generated dynamically on demand when +    requested. + +    Wallet uses remctl for its network protocol, which provides Kerberos +    v5 GSS-API authentication and encryption of all data.  The rest of +    this design document will assume the connection from a wallet client +    to the wallet server is handled via the remctl protocol, that the +    wallet server therefore knows the authenticated Kerberos principal of +    the client, and that data passed between the server and the client is +    encrypted.  For more information about the remctl protocol, see: + +        <http://www.eyrie.org/~eagle/software/remctl/protocol.html> + +    remctl requires Kerberos v5 authentication, and therefore all clients +    using the wallet to retrieve data will use Kerberos v5 authentication. + +    We assume the wallet server is itself a secure host.  Compromise of +    this host will compromise all stored data it has and will allow an +    attacker to perform any operation possible via the wallet.  In order +    to limit the effectiveness of such an attack, certain keys may be +    excluded from the wallet's management purview (via kadm5.acl rules on +    the KDCs, for example) and require management by Kerberos +    administrators with kadmin.  However, compromise of the wallet system +    would have a significant security impact and the system should be +    managed with the sort of security precautions as one would apply to a +    Kerberos KDC. + +Server Design + +  Protocol Operations + +    The wallet server supports the following protocol operations on an +    object: + +        create          Create a new wallet entry for an object +        delete          Delete the wallet entry for a given object +        owner           Set the owner of an object +        acl             Set the ACL on an object +        flag            Set or clear flags on an object +        show            Show the metainformation about the object + +        get             Retrieve the named object from the wallet +        store           Store the named object in the wallet + +        group-add       Add a principal to an ACL group +        group-remove    Remove a principal from an ACL group +        group-list      List the members of an ACL group + +    The first six operations manipulate or display the metadata of the +    object.  The next two operations store or retrieve the object itself. +    The last three operations allow manipulation of krb5-group ACLs (see +    below). + +    The owner and acl operations are only available to wallet +    administrators.  Even if one is the listed owner of an object, one may +    not change the owner or ACL on that object.  (This may be reconsidered +    later to permit the owner to set the ACLs on an object.  This design +    mirrors the existing Stanford University srvtab distribution system +    and is maximally conservative.) + +    Objects are created with a store command, a get command on a object +    type that supports data generation, or a create command (which creates +    the metadata without storing any data).  New objects will be created +    owned by the user running get, store, or create, no special ACLs, and +    no flags.  Each backend can decide at its discretion whether a user +    can get, store, or create an object that doesn't already exist.  The +    default behavior in the absence of backend-specific configuration is +    to only allow wallet administrators to do so. + +  ACLs + +    Each ACL consists of zero or more lines, each of which has a scheme +    and an identifier.  Initially, three schemes will be supported: krb5, +    krb5-group, and netdb. + +    An ACL line of scheme krb5 will have a single fully-qualified +    principal name as an identifier; only that principal will be +    authorized by that ACL line. + +    An ACL line of scheme krb5-group will have a group name as an +    identifier.  That group will have an owner and a list of Kerberos +    principals.  Any Kerberos principals on the list (not including the +    separate owner) will be authorized by that ACL line.  The owner is +    itself a reference to another ACL, which may include the group for a +    self-owning ACL.  Anyone on the ACL referenced by the owner attribute +    may list the principals in that group and add or remove a principal +    from that group. + +    An ACL line of scheme netdb will have an identifier naming a specific +    machine.  The user will be authorized if that user has a role of +    "admin" or "team" for that machine.  See netdb-role-api for the +    specific remctl API for performing that query. + +    For all ACLs, each ACL line is tried against the user principal.  If +    any ACL line authorizes the user, that user is authorized.  If no ACL +    line authorizes the user, permission to perform the operation is +    refused. + +    For more details and other ACL types that will be supported in the +    future, see design-acl. + +    There will be one general system ACL that identifies wallet +    administrators, who are permitted to perform any operation. + +  Metadata + +    Each object stored in the wallet has the following metadata associated +    with it (with examples for a keytab for +    host/windlord.stanford.edu@stanford.edu that should be retrievable by +    the Kerberos principal rra/root@stanford.edu): + +    * The type and name of the object.  The name must be unique within +      that type.  For example, the type would be "keytab" and the name +      would be "host/windlord.stanford.edu@stanford.edu". + +    * The owner of the object.  The owner by default has get, store, and +      show permissions on the object in the lack of more specific ACLs. +      An owner is a reference to an ACL.  In this case, this would be a +      reference to an ACL of one line, that line having scheme "krb5" and +      identifier "rra/root@stanford.edu". + +    * Optional ACLs for get, store, show, delete, and flag operations. +      If there is an ACL for get, store, or show, that overrides the +      normal permissions of the owner.  In the absence of an ACL for +      delete or flag, only wallet administrators can delete an object or +      set flags on that object.  This entry would need no special ACLs. + +    * Trace fields storing the user, remote host, and timestamp for when +      this object was last created, stored, and downloaded. + +  Keytab-Specific Metadata + +    Objects of type keytab have one additional piece of metadata: an +    optional list of enctypes for which keys should be generated for that +    principal.  This list can be used to restrict the Kerberos enctypes +    for a particular keytab to only those supported by that application. +    In the absence of a list associated with a keytab, the default enctype +    list in the KDC will be used. + +  Flags + +    Each object can have flags set on it.  Currently, the only defined +    flags are: + +        locked          Nothing permitted regardless of ACL except show +        unchanging      Use existing data, don't regenerate + +    The unchanging flag will only have meaning for those types where the +    backend can support either generating new data or using the existing +    stored data. + +  History + +    The wallet server will keep a history log of every operation performed +    against an object, keyed by object type and name (for object changes). +    A remctl interface will be provided so that wallet administrators can +    query this log and see the history of a given object. + +    In addition, the wallet server will log to syslog every operation +    performed, not only on objects but on ACLs, Kerberos principal groups, +    keytab enctype metadata, and so forth. + +Keytab Server Backend + +  Basic Operation + +    The keytab backend will not support the store operation, only the get +    operation.  Normally, a get will result in the generation of a new +    keytab (possibly constrained by the list of enctypes for that keytab) +    and hence the invalidation of any existing keytabs for that principal. + +    The wallet server will only have kadmin ACLs to manage a specific set +    of principals to prevent the wallet from being used to change core +    Kerberos keys or to change user accounts. + +  NetDB Default ACLs + +    If a user attempts to get a keytab for which no entry had previously +    been created with create and that keytab is one of a specific set of +    host-bound principals as configured by the local wallet server +    deployment (generally things like host/*), we will check the principal +    against an ACL of scheme netdb and identifier equal to the host name +    for the principal (after chasing CNAMEs).  If that ACL authorizes the +    user, we will automatically create a wallet entry for this host, owned +    by an ACL of scheme netdb and identifier equal to the fully qualified +    name of the system.  This will allow anyone with NetDB ownership of +    the system to manage the keytabs. + +    Note that this does leave the system open to a potential attack via +    DNS by spoofing a CNAME return and hence fooling the wallet into +    thinking that a particular host is an alias for a host that the user +    has NetDB roles to manage when it actually isn't.  This attack can +    only allow the user to create a keytab that doesn't already exist, +    however, so the impact seems slight given the difficulty of the +    attack. + +  Retrieving Existing Keytabs + +    The flag unchanging can be set on keytabs to indicate that, rather +    than generating a new key on a get operation on that keytab object, +    the existing key should be extracted from the KDC and returned.  This +    removes some protection around abuse of the wallet system since it +    allows one to get access to an existing key without invalidating the +    system key and then forge authentication to that service. +    Accordingly, this flag may only be set by wallet administrators unless +    a flag ACL is created on that object, and as a matter of policy it +    should only be granted when there's a compelling reason for it. + +    When a keytab with the unchanging flag set is retrieved with get, +    rather than generating a new keytab, the wallet server requests the +    current keys in keytab form from the KDC via a separate interface. +    The KDC will return only keys for principals matching a set +    specifically configured on the KDC.  All strongly privileged keytabs +    should be excluded from this (and ideally, only those keytabs known to +    require caching should be listed here).  The keys will be extracted +    from the KDC using kadmin.local with the -norandkey option, added with +    a Stanford-local patch (but expected to be in MIT Kerberos 1.7). + +Client Design + +  Basic Operation + +    The client will use the remctl libraries for all communication with +    the wallet server.  The wallet server name will be determined by a +    compile-time default, overridden by configuration in krb5.conf or by a +    command-line option.  It should support the get, store, and show +    operations (although we will skip store for the initial implementation +    since it's not required for keytabs).  Other wallet protocol +    operations can be done via direct remctl calls or through later +    additions to the client. + +    When retrieving a keytab, the client should support either creating a +    new keytab file or adding the keys from the downloaded keytab to an +    existing keytab so that multiple keys can be merged into the same +    keytab.  This is useful for services that expect all their keys to be +    in krb5.keytab, or for adding keys for all a host's aliases to its +    krb5.keytab. + +  Srvtab Generation + +    For backward compatibility with a Kerberos v4 realm, the wallet +    client, when downloading a keytab, should also be able to optionally +    create a srvtab with the DES key extracted from that keytab (if any). +    In order to get the Kerberos v4 kvno for the key (which may differ +    from the Kerberos v5 kvno), it will obtain a Kerberos v4 service +    ticket for that principal and extract the kvno from that service +    ticket. + +Security Considerations + +  System Compromise + +    By its nature, the wallet is an obvious attack target target.  It has +    access to generate arbitrary keytabs for many different service +    principals, it will eventually store a variety of high-value +    privileged data, and it has to be accessible over the wallet protocol +    to clients. + +    This risk can be reduced by running minimal accessible services on +    this system, co-located this service only with other high-security +    applications if anything, and closely monitored for security issues. +    In addition, the wallet should only have access on the KDC to those +    principal classes that are managed by the wallet, specifically not +    including any core Kerberos administrative principals, any user +    accounts, and any administrator accounts. + +    The system should use iptables and similar firewall mechanisms to +    limit all access only to those ports providing known public services, +    and there to as few IP addresses as possible. + +    The wallet database should be stored locally on the system running the +    wallet server and not be accessible from any other system. + +    Administration of the wallet should be done over protocol.  Logging on +    to the wallet system should be done only in the case of emergency, +    upgrade, or system maintenance and should not be done for any routine +    task. + +  Protocol Compromise + +    The security of the wallet is dependent on the security of the +    underlying remctl protocol.  The remctl code has been carefully +    audited for security issues and is already in widespread use and +    should be treated as a core security component. + +    Most communications between the wallet and the KDC are done over the +    kadmin protocol, which is Kerberos-authenticated and encrypts the +    network communications.  The other communication with the KDC is done +    via remctl.  Extracting existing keys from the KDC can only be done on +    the KDC using kadmin.local and access can therefore be tightly +    controlled by the KDC remctl interface. + +  Retrieving Existing Keytabs + +    One key security concern is the wallet's ability to retrieve existing +    keytabs.  The normal Kerberos key management system has some built-in +    defense against an attacker obtaining a keytab for a service +    principal: since that invalidates the existing keytab, the attacker +    will still not be able to authenticate to a service that uses that +    service principal, and any authentication done by the service +    principal will start failing.  Compromise attacks are therefore often +    converted to denial of service attacks, and it's very difficult to +    launch a silent attack. + +    This changes when access is granted to existing keys.  An attacker who +    obtains the existing keys can silently forge authentication to a +    service protected by that service principal, or can silently +    impersonate that service principal to other services without +    interfering with normal operations. + +    The unchanging flag should therefore only be set when there is a clear +    need, and the backend on the KDC that allows the wallet system to +    retrieve existing keys should be as restrictive as possible about +    which keys can be retrieved.  Using this system is, however, better +    from a security standpoint than saving a copy of a keytab and +    installing it as part of a build process or copying it between +    multiple systems since the wallet at least maintains an audit trail of +    downloads and doesn't keep a local copy of the keytab, only the means +    for retrieving it.  So, for example, a compromise that makes available +    only the backup image of the wallet server and not its credentials +    cannot obtain existing keytabs since they're not stored on its disk. + +  Auditing + +    The wallet server audits operations in three ways.  First, an +    authenticated principal, hostname, and timestamp is kept up to date +    for each object for the last creation, modification, and retrieval +    date for that object.  Second, an audit trail is kept for all +    operations on an object to allow retrieval of the complete history of +    an object.  Third, all wallet operations are logged to syslog and +    therefore suitable for archiving, analysis, and forensics.  | 
