Print this page
NEX-13644 File access audit logging
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-9808 SMB3 persistent handles
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-9808 SMB3 persistent handles
Reviewed by: Matt Barden <matt.barden@nexenta.com>
Reviewed by: Evan Layton <evan.layton@nexenta.com>
NEX-9497 SMB should bypass ACL traverse checking
Reviewed by: Evan Layton <evan.layton@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-3787 Sync. up SMB server with: Merge with illumos-gate 12380e1e
NEX-1440 Unable to take ownership, view permissions, or delete files...
Reviewed by: Alek Pinchuk <alek@nexenta.com>
SMB-56 extended security NTLMSSP, inbound

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/smbsrv/smb_cred.c
          +++ new/usr/src/uts/common/fs/smbsrv/smb_cred.c
↓ open down ↓ 12 lines elided ↑ open up ↑
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
  23      - * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
       23 + * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
  24   24   */
  25   25  
  26   26  /*
  27   27   * Authentication helpers for building credentials
  28   28   */
  29   29  
  30   30  #include <sys/types.h>
  31   31  #include <sys/sid.h>
  32   32  #include <sys/priv_names.h>
  33   33  #include <sys/socket.h>
↓ open down ↓ 8 lines elided ↑ open up ↑
  42   42  
  43   43  /*
  44   44   * Allocate a Solaris cred and initialize it based on the access token.
  45   45   *
  46   46   * If the user can be mapped to a non-ephemeral ID, the cred gid is set
  47   47   * to the Solaris user's primary group.
  48   48   *
  49   49   * If the mapped UID is ephemeral, or the primary group could not be
  50   50   * obtained, the cred gid is set to whatever Solaris group is mapped
  51   51   * to the token's primary group.
       52 + *
       53 + * Also add any privileges that should always be in effect for this user.
       54 + * Note that an SMB user object also gets a u_privcred which is used
       55 + * when the client opens an object with "backup/restore intent".
       56 + * That cred is setup later, in smb_user_setcred().
  52   57   */
  53   58  cred_t *
  54      -smb_cred_create(smb_token_t *token)
       59 +smb_cred_create(smb_token_t *token, smb_session_t *s)
  55   60  {
  56   61          ksid_t                  ksid;
  57   62          ksidlist_t              *ksidlist = NULL;
  58   63          smb_posix_grps_t        *posix_grps;
  59   64          cred_t                  *cr;
  60   65          gid_t                   gid;
       66 +        auditinfo_addr_t        *au;
  61   67  
  62   68          ASSERT(token);
  63   69          ASSERT(token->tkn_posix_grps);
  64   70          posix_grps = token->tkn_posix_grps;
  65   71  
  66   72          cr = crget();
  67   73          ASSERT(cr != NULL);
  68   74  
  69   75          if (!IDMAP_ID_IS_EPHEMERAL(token->tkn_user.i_id) &&
  70   76              (posix_grps->pg_ngrps != 0)) {
↓ open down ↓ 31 lines elided ↑ open up ↑
 102  108          if (smb_token_query_privilege(token, SE_TAKE_OWNERSHIP_LUID)) {
 103  109                  (void) crsetpriv(cr,
 104  110                      PRIV_FILE_CHOWN,
 105  111                      PRIV_FILE_DAC_READ,
 106  112                      PRIV_FILE_DAC_SEARCH,
 107  113                      PRIV_FILE_DAC_WRITE,
 108  114                      PRIV_FILE_OWNER,
 109  115                      NULL);
 110  116          }
 111  117  
      118 +        /*
      119 +         * See smb.4 bypass_traverse_checking
      120 +         *
      121 +         * For historical reasons, the Windows privilege is named
      122 +         * SeChangeNotifyPrivilege, though the description is
      123 +         * "Bypass traverse checking".
      124 +         */
      125 +        if (smb_token_query_privilege(token, SE_CHANGE_NOTIFY_LUID)) {
      126 +                (void) crsetpriv(cr, PRIV_FILE_DAC_SEARCH, NULL);
      127 +        }
      128 +
      129 +        au = crgetauinfo_modifiable(cr);
      130 +        if (au != NULL) {
      131 +                au->ai_auid = token->tkn_auid;
      132 +                au->ai_mask = token->tkn_amask;
      133 +                au->ai_asid = token->tkn_asid;
      134 +                au->ai_termid.at_port = s->s_local_port;
      135 +
      136 +                if (s->ipaddr.a_family == AF_INET) {
      137 +                        au->ai_termid.at_addr[0] = s->ipaddr.a_ipv4;
      138 +                        au->ai_termid.at_type = AU_IPv4;
      139 +                } else {
      140 +                        bcopy(&s->ipaddr.a_ip, au->ai_termid.at_addr,
      141 +                            sizeof (in6_addr_t));
      142 +                        au->ai_termid.at_type = AU_IPv6;
      143 +                }
      144 +        }
 112  145          return (cr);
 113  146  }
 114  147  
 115  148  /*
 116  149   * Initialize the ksid based on the given smb_id_t.
 117  150   */
 118  151  static void
 119  152  smb_cred_set_sid(smb_id_t *id, ksid_t *ksid)
 120  153  {
 121  154          char sidstr[SMB_SID_STRSZ];
↓ open down ↓ 25 lines elided ↑ open up ↑
 147  180          lp->ksl_nsid = token_grps->i_cnt;
 148  181          lp->ksl_neid = 0;
 149  182  
 150  183          for (i = 0; i < lp->ksl_nsid; i++) {
 151  184                  smb_cred_set_sid(&token_grps->i_ids[i], &lp->ksl_sids[i]);
 152  185                  if (lp->ksl_sids[i].ks_id > IDMAP_WK__MAX_GID)
 153  186                          lp->ksl_neid++;
 154  187          }
 155  188  
 156  189          return (lp);
      190 +}
      191 +
      192 +/*
      193 + * Special variant of smb_cred_create() used when we need an
      194 + * SMB kcred (i.e. DH import).  The returned cred must be
      195 + * from crget() so it can be passed to smb_user_setcred().
      196 + */
      197 +cred_t *
      198 +smb_kcred_create(void)
      199 +{
      200 +        cred_t  *cr;
      201 +
      202 +        cr = crget();
      203 +        ASSERT(cr != NULL);
      204 +
      205 +        return (cr);
 157  206  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX