1. 23 Apr, 2013 4 commits
    • Trond Myklebust's avatar
      Merge branch 'rpcsec_gss-from_cel' into linux-next · bd1d421a
      Trond Myklebust authored
      * rpcsec_gss-from_cel: (21 commits)
        NFS: Retry SETCLIENTID with AUTH_SYS instead of AUTH_NONE
        NFSv4: Don't clear the machine cred when client establish returns EACCES
        NFSv4: Fix issues in nfs4_discover_server_trunking
        NFSv4: Fix the fallback to AUTH_NULL if krb5i is not available
        NFS: Use server-recommended security flavor by default (NFSv3)
        SUNRPC: Don't recognize RPC_AUTH_MAXFLAVOR
        NFS: Use "krb5i" to establish NFSv4 state whenever possible
        NFS: Try AUTH_UNIX when PUTROOTFH gets NFS4ERR_WRONGSEC
        NFS: Use static list of security flavors during root FH lookup recovery
        NFS: Avoid PUTROOTFH when managing leases
        NFS: Clean up nfs4_proc_get_rootfh
        NFS: Handle missing rpc.gssd when looking up root FH
        SUNRPC: Remove EXPORT_SYMBOL_GPL() from GSS mech switch
        SUNRPC: Make gss_mech_get() static
        SUNRPC: Refactor nfsd4_do_encode_secinfo()
        SUNRPC: Consider qop when looking up pseudoflavors
        SUNRPC: Load GSS kernel module by OID
        SUNRPC: Introduce rpcauth_get_pseudoflavor()
        SUNRPC: Define rpcsec_gss_info structure
        NFS: Remove unneeded forward declaration
        ...
      bd1d421a
    • Trond Myklebust's avatar
      NFSv4: Don't recheck permissions on open in case of recovery cached open · bdeca1b7
      Trond Myklebust authored
      If we already checked the user access permissions on the original open,
      then don't bother checking again on recovery. Doing so can cause a
      deadlock with NFSv4.1, since the may_open() operation is not privileged.
      Furthermore, we can't report an access permission failure here anyway.
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      bdeca1b7
    • Trond Myklebust's avatar
      NFSv4.1: Don't do a delegated open for NFS4_OPEN_CLAIM_DELEG_CUR_FH modes · cd4c9be2
      Trond Myklebust authored
      If we're in a delegation recall situation, we can't do a delegated open.
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      cd4c9be2
    • Trond Myklebust's avatar
      NFSv4.1: Use the more efficient open_noattr call for open-by-filehandle · 8188df17
      Trond Myklebust authored
      When we're doing open-by-filehandle in NFSv4.1, we shouldn't need to
      do the cache consistency revalidation on the directory. It is
      therefore more efficient to just use open_noattr, which returns the
      file attributes, but not the directory attributes.
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      8188df17
  2. 22 Apr, 2013 2 commits
    • Chuck Lever's avatar
      NFS: Retry SETCLIENTID with AUTH_SYS instead of AUTH_NONE · 79d852bf
      Chuck Lever authored
      Recently I changed the SETCLIENTID code to use AUTH_GSS(krb5i), and
      then retry with AUTH_NONE if that didn't work.  This was to enable
      Kerberos NFS mounts to work without forcing Linux NFS clients to
      have a keytab on hand.
      
      Rick Macklem reports that the FreeBSD server accepts AUTH_NONE only
      for NULL operations (thus certainly not for SETCLIENTID).  Falling
      back to AUTH_NONE means our proposed 3.10 NFS client will not
      interoperate with FreeBSD servers over NFSv4 unless Kerberos is
      fully configured on both ends.
      
      If the Linux client falls back to using AUTH_SYS instead for
      SETCLIENTID, all should work fine as long as the NFS server is
      configured to allow AUTH_SYS for SETCLIENTID.
      
      This may still prevent access to Kerberos-only FreeBSD servers by
      Linux clients with no keytab.  Rick is of the opinion that the
      security settings the server applies to its pseudo-fs should also
      apply to the SETCLIENTID operation.
      
      Linux and Solaris NFS servers do not place that limitation on
      SETCLIENTID.  The security settings for the server's pseudo-fs are
      determined automatically as the union of security flavors allowed on
      real exports, as recommended by RFC 3530bis; and the flavors allowed
      for SETCLIENTID are all flavors supported by the respective server
      implementation.
      Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      79d852bf
    • Trond Myklebust's avatar
      NFSv4: Ensure that we clear the NFS_OPEN_STATE flag when appropriate · fd068b20
      Trond Myklebust authored
      We should always clear it before initiating file recovery.
      Also ensure that we clear it after a CLOSE and/or after TEST_STATEID fails.
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      fd068b20
  3. 21 Apr, 2013 1 commit
  4. 20 Apr, 2013 2 commits
  5. 19 Apr, 2013 1 commit
  6. 16 Apr, 2013 1 commit
  7. 14 Apr, 2013 3 commits
  8. 12 Apr, 2013 1 commit
  9. 11 Apr, 2013 1 commit
  10. 10 Apr, 2013 1 commit
  11. 09 Apr, 2013 2 commits
  12. 08 Apr, 2013 1 commit
    • Trond Myklebust's avatar
      NFSv4: Handle timeouts correctly when probing for lease validity · bc7a05ca
      Trond Myklebust authored
      When we send a RENEW or SEQUENCE operation in order to probe if the
      lease is still valid, we want it to be able to time out since the
      lease we are probing is likely to time out too. Currently, because
      we use soft mount semantics for these RPC calls, the return value
      is EIO, which causes the state manager to exit with an "unhandled
      error" message.
      This patch changes the call semantics, so that the RPC layer returns
      ETIMEDOUT instead of EIO. We then have the state manager default to
      a simple retry instead of exiting.
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      bc7a05ca
  13. 05 Apr, 2013 13 commits
  14. 04 Apr, 2013 3 commits
    • Trond Myklebust's avatar
      NFSv4: Fix the fallback to AUTH_NULL if krb5i is not available · 23631227
      Trond Myklebust authored
      If the rpcsec_gss_krb5 module cannot be loaded, the attempt to create
      an rpc_client in nfs4_init_client will currently fail with an EINVAL.
      Fix is to retry with AUTH_NULL.
      
      Regression introduced by the commit "NFS: Use "krb5i" to establish NFSv4
      state whenever possible"
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      Cc: Chuck Lever <chuck.lever@oracle.com>
      Cc: Bryan Schumaker <bjschuma@netapp.com>
      23631227
    • Chuck Lever's avatar
      NFS: Use server-recommended security flavor by default (NFSv3) · 4580a92d
      Chuck Lever authored
      Since commit ec88f28d in 2009, checking if the user-specified flavor
      is in the server's flavor list has been the source of a few
      noticeable regressions (now fixed), but there is one that is still
      vexing.
      
      An NFS server can list AUTH_NULL in its flavor list, which suggests
      a client should try to mount the server with the flavor of the
      client's choice, but the server will squash all accesses.  In some
      cases, our client fails to mount a server because of this check,
      when the mount could have proceeded successfully.
      
      Skip this check if the user has specified "sec=" on the mount
      command line.  But do consult the server-provided flavor list to
      choose a security flavor if no sec= option is specified on the mount
      command.
      
      If a server lists Kerberos pseudoflavors before "sys" in its export
      options, our client now chooses Kerberos over AUTH_UNIX for mount
      points, when no security flavor is specified by the mount command.
      This could be surprising to some administrators or users, who would
      then need to have Kerberos credentials to access the export.
      
      Or, a client administrator may not have enabled rpc.gssd.  In this
      case, auth_rpcgss.ko might still be loadable, which is enough for
      the new logic to choose Kerberos over AUTH_UNIX.  But the mount
      would fail since no GSS context can be created without rpc.gssd
      running.
      
      To retain the use of AUTH_UNIX by default:
      
        o  The server administrator can ensure that "sys" is listed before
           Kerberos flavors in its export security options (see
           exports(5)),
      
        o  The client administrator can explicitly specify "sec=sys" on
           its mount command line (see nfs(5)),
      
        o  The client administrator can use "Sec=sys" in an appropriate
           section of /etc/nfsmount.conf (see nfsmount.conf(5)), or
      
        o  The client administrator can blacklist auth_rpcgss.ko.
      Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      4580a92d
    • Chuck Lever's avatar
      SUNRPC: Don't recognize RPC_AUTH_MAXFLAVOR · 1c74a244
      Chuck Lever authored
      RPC_AUTH_MAXFLAVOR is an invalid flavor, on purpose.  Don't allow
      any processing whatsoever if a caller passes it to rpcauth_create()
      or rpcauth_get_gssinfo().
      Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      1c74a244
  15. 29 Mar, 2013 4 commits
    • Chuck Lever's avatar
      NFS: Use "krb5i" to establish NFSv4 state whenever possible · 4edaa308
      Chuck Lever authored
      Currently our client uses AUTH_UNIX for state management on Kerberos
      NFS mounts in some cases.  For example, if the first mount of a
      server specifies "sec=sys," the SETCLIENTID operation is performed
      with AUTH_UNIX.  Subsequent mounts using stronger security flavors
      can not change the flavor used for lease establishment.  This might
      be less security than an administrator was expecting.
      
      Dave Noveck's migration issues draft recommends the use of an
      integrity-protecting security flavor for the SETCLIENTID operation.
      Let's ignore the mount's sec= setting and use krb5i as the default
      security flavor for SETCLIENTID.
      
      If our client can't establish a GSS context (eg. because it doesn't
      have a keytab or the server doesn't support Kerberos) we fall back
      to using AUTH_NULL.  For an operation that requires a
      machine credential (which never represents a particular user)
      AUTH_NULL is as secure as AUTH_UNIX.
      Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      4edaa308
    • Chuck Lever's avatar
      NFS: Try AUTH_UNIX when PUTROOTFH gets NFS4ERR_WRONGSEC · c4eafe11
      Chuck Lever authored
      Most NFSv4 servers implement AUTH_UNIX, and administrators will
      prefer this over AUTH_NULL.  It is harmless for our client to try
      this flavor in addition to the flavors mandated by RFC 3530/5661.
      Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      c4eafe11
    • Chuck Lever's avatar
      NFS: Use static list of security flavors during root FH lookup recovery · 9a744ba3
      Chuck Lever authored
      If the Linux NFS client receives an NFS4ERR_WRONGSEC error while
      trying to look up an NFS server's root file handle, it retries the
      lookup operation with various security flavors to see what flavor
      the NFS server will accept for pseudo-fs access.
      
      The list of flavors the client uses during retry consists only of
      flavors that are currently registered in the kernel RPC client.
      This list may not include any GSS pseudoflavors if auth_rpcgss.ko
      has not yet been loaded.
      
      Let's instead use a static list of security flavors that the NFS
      standard requires the server to implement (RFC 3530bis, section
      3.2.1).  The RPC client should now be able to load support for
      these dynamically; if not, they are skipped.
      
      Recovery behavior here is prescribed by RFC 3530bis, section
      15.33.5:
      
      > For LOOKUPP, PUTROOTFH and PUTPUBFH, the client will be unable to
      > use the SECINFO operation since SECINFO requires a current
      > filehandle and none exist for these two [sic] operations.  Therefore,
      > the client must iterate through the security triples available at
      > the client and reattempt the PUTROOTFH or PUTPUBFH operation.  In
      > the unfortunate event none of the MANDATORY security triples are
      > supported by the client and server, the client SHOULD try using
      > others that support integrity.  Failing that, the client can try
      > using AUTH_NONE, but because such forms lack integrity checks,
      > this puts the client at risk.
      Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
      Cc: Bryan Schumaker <bjschuma@netapp.com>
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      9a744ba3
    • Chuck Lever's avatar
      NFS: Avoid PUTROOTFH when managing leases · 83ca7f5a
      Chuck Lever authored
      Currently, the compound operation the Linux NFS client sends to the
      server to confirm a client ID looks like this:
      
      	{ SETCLIENTID_CONFIRM; PUTROOTFH; GETATTR(lease_time) }
      
      Once the lease is confirmed, it makes sense to know how long before
      the client will have to renew it.  And, performing these operations
      in the same compound saves a round trip.
      
      Unfortunately, this arrangement assumes that the security flavor
      used for establishing a client ID can also be used to access the
      server's pseudo-fs.
      
      If the server requires a different security flavor to access its
      pseudo-fs than it allowed for the client's SETCLIENTID operation,
      the PUTROOTFH in this compound fails with NFS4ERR_WRONGSEC.  Even
      though the SETCLIENTID_CONFIRM succeeded, our client's trunking
      detection logic interprets the failure of the compound as a failure
      by the server to confirm the client ID.
      
      As part of server trunking detection, the client then begins another
      SETCLIENTID pass with the same nfs4_client_id.  This fails with
      NFS4ERR_CLID_INUSE because the first SETCLIENTID/SETCLIENTID_CONFIRM
      already succeeded in confirming that client ID -- it was the
      PUTROOTFH operation that caused the SETCLIENTID_CONFIRM compound to
      fail.
      
      To address this issue, separate the "establish client ID" step from
      the "accessing the server's pseudo-fs root" step.  The first access
      of the server's pseudo-fs may require retrying the PUTROOTFH
      operation with different security flavors.  This access is done in
      nfs4_proc_get_rootfh().
      
      That leaves the matter of how to retrieve the server's lease time.
      nfs4_proc_fsinfo() already retrieves the lease time value, though
      none of its callers do anything with the retrieved value (nor do
      they mark the lease as "renewed").
      
      Note that NFSv4.1 state recovery invokes nfs4_proc_get_lease_time()
      using the lease management security flavor.  This may cause some
      heartburn if that security flavor isn't the same as the security
      flavor the server requires for accessing the pseudo-fs.
      Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
      Cc: Bryan Schumaker <bjschuma@netapp.com>
      Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
      83ca7f5a