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
        
*** 18,28 ****
   *
   * CDDL HEADER END
   */
  /*
   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
   */
  
  /*
   * Authentication helpers for building credentials
   */
--- 18,28 ----
   *
   * CDDL HEADER END
   */
  /*
   * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
!  * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
   */
  
  /*
   * Authentication helpers for building credentials
   */
*** 47,65 ****
   * to the Solaris user's primary group.
   *
   * If the mapped UID is ephemeral, or the primary group could not be
   * obtained, the cred gid is set to whatever Solaris group is mapped
   * to the token's primary group.
   */
  cred_t *
! smb_cred_create(smb_token_t *token)
  {
          ksid_t                  ksid;
          ksidlist_t              *ksidlist = NULL;
          smb_posix_grps_t        *posix_grps;
          cred_t                  *cr;
          gid_t                   gid;
  
          ASSERT(token);
          ASSERT(token->tkn_posix_grps);
          posix_grps = token->tkn_posix_grps;
  
--- 47,71 ----
   * to the Solaris user's primary group.
   *
   * If the mapped UID is ephemeral, or the primary group could not be
   * obtained, the cred gid is set to whatever Solaris group is mapped
   * to the token's primary group.
+  *
+  * Also add any privileges that should always be in effect for this user.
+  * Note that an SMB user object also gets a u_privcred which is used
+  * when the client opens an object with "backup/restore intent".
+  * That cred is setup later, in smb_user_setcred().
   */
  cred_t *
! smb_cred_create(smb_token_t *token, smb_session_t *s)
  {
          ksid_t                  ksid;
          ksidlist_t              *ksidlist = NULL;
          smb_posix_grps_t        *posix_grps;
          cred_t                  *cr;
          gid_t                   gid;
+         auditinfo_addr_t        *au;
  
          ASSERT(token);
          ASSERT(token->tkn_posix_grps);
          posix_grps = token->tkn_posix_grps;
  
*** 107,116 ****
--- 113,149 ----
                      PRIV_FILE_DAC_WRITE,
                      PRIV_FILE_OWNER,
                      NULL);
          }
  
+         /*
+          * See smb.4 bypass_traverse_checking
+          *
+          * For historical reasons, the Windows privilege is named
+          * SeChangeNotifyPrivilege, though the description is
+          * "Bypass traverse checking".
+          */
+         if (smb_token_query_privilege(token, SE_CHANGE_NOTIFY_LUID)) {
+                 (void) crsetpriv(cr, PRIV_FILE_DAC_SEARCH, NULL);
+         }
+ 
+         au = crgetauinfo_modifiable(cr);
+         if (au != NULL) {
+                 au->ai_auid = token->tkn_auid;
+                 au->ai_mask = token->tkn_amask;
+                 au->ai_asid = token->tkn_asid;
+                 au->ai_termid.at_port = s->s_local_port;
+ 
+                 if (s->ipaddr.a_family == AF_INET) {
+                         au->ai_termid.at_addr[0] = s->ipaddr.a_ipv4;
+                         au->ai_termid.at_type = AU_IPv4;
+                 } else {
+                         bcopy(&s->ipaddr.a_ip, au->ai_termid.at_addr,
+                             sizeof (in6_addr_t));
+                         au->ai_termid.at_type = AU_IPv6;
+                 }
+         }
          return (cr);
  }
  
  /*
   * Initialize the ksid based on the given smb_id_t.
*** 152,157 ****
--- 185,206 ----
                  if (lp->ksl_sids[i].ks_id > IDMAP_WK__MAX_GID)
                          lp->ksl_neid++;
          }
  
          return (lp);
+ }
+ 
+ /*
+  * Special variant of smb_cred_create() used when we need an
+  * SMB kcred (i.e. DH import).  The returned cred must be
+  * from crget() so it can be passed to smb_user_setcred().
+  */
+ cred_t *
+ smb_kcred_create(void)
+ {
+         cred_t  *cr;
+ 
+         cr = crget();
+         ASSERT(cr != NULL);
+ 
+         return (cr);
  }