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>

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/praudit/format.c
          +++ new/usr/src/cmd/praudit/format.c
↓ open down ↓ 13 lines elided ↑ open up ↑
  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 2009 Sun Microsystems, Inc.  All rights reserved.
  23   23   * Use is subject to license terms.
       24 + *
       25 + * Copyright 2018 Nexenta Systems, Inc.  All rights reserved.
  24   26   */
  25   27  
  26   28  
  27   29  #define _REENTRANT
  28   30  
  29   31  #include <ctype.h>
  30   32  #include <errno.h>
  31   33  #include <grp.h>
  32   34  #include <libintl.h>
  33   35  #include <netdb.h>
↓ open down ↓ 8 lines elided ↑ open up ↑
  42   44  
  43   45  #include <bsm/audit.h>
  44   46  #include <bsm/audit_record.h>
  45   47  #include <bsm/libbsm.h>
  46   48  #include <security/pam_appl.h>
  47   49  
  48   50  #include <sys/inttypes.h>
  49   51  #include <sys/mkdev.h>
  50   52  #include <sys/types.h>
  51   53  #include <aclutils.h>
       54 +#include <smbsrv/libsmb.h>
  52   55  
  53   56  #include "praudit.h"
  54   57  #include "toktable.h"
  55   58  #include "adt_xlate.h"
  56   59  
  57   60  static void     convertascii(char *p, char *c, int size);
  58   61  static int      convertbinary(char *p, char *c, int size);
  59   62  static void     eventmodifier2string(au_emod_t emodifier, char *modstring,
  60   63      size_t modlen);
  61   64  static int      do_mtime32(pr_context_t *context, int status, int flag,
↓ open down ↓ 3045 lines elided ↑ open up ↑
3107 3110                  s = newstr;
3108 3111                  *alloc = needed;
3109 3112                  *str = s;
3110 3113          }
3111 3114          (void) strlcat(s, what, *alloc);
3112 3115  
3113 3116          return (0);
3114 3117  }
3115 3118  
3116 3119  static int
3117      -pa_ace_access_mask(pr_context_t *context, ace_t *ace, int status, int flag)
     3120 +pa_ace_access_mask(pr_context_t *context, uint32_t mask, int status, int flag)
3118 3121  {
3119 3122          int     returnstat, i;
3120 3123          uval_t  uval;
3121 3124          char    *permstr = NULL;
3122 3125          size_t  permstr_alloc = 0;
3123 3126  
3124 3127          if (status < 0)
3125 3128                  return (status);
3126 3129  
3127 3130          /*
3128 3131           * TRANSLATION_NOTE
3129      -         * ace->a_access_mask refers to access mask of ZFS/NFSv4 ACL entry.
     3132 +         * mask refers to access mask of ZFS/NFSv4 ACL entry.
3130 3133           */
3131 3134          if ((returnstat = open_tag(context, TAG_ACEMASK)) != 0)
3132 3135                  return (returnstat);
3133 3136          if (context->format & PRF_SHORTM &&
3134 3137              ((permstr = malloc(15)) != NULL)) {
3135 3138                  for (i = 0; i < 14; i++)
3136 3139                          permstr[i] = '-';
3137 3140  
3138      -                if (ace->a_access_mask & ACE_READ_DATA)
     3141 +                if (mask & ACE_READ_DATA)
3139 3142                          permstr[0] = 'r';
3140      -                if (ace->a_access_mask & ACE_WRITE_DATA)
     3143 +                if (mask & ACE_WRITE_DATA)
3141 3144                          permstr[1] = 'w';
3142      -                if (ace->a_access_mask & ACE_EXECUTE)
     3145 +                if (mask & ACE_EXECUTE)
3143 3146                          permstr[2] = 'x';
3144      -                if (ace->a_access_mask & ACE_APPEND_DATA)
     3147 +                if (mask & ACE_APPEND_DATA)
3145 3148                          permstr[3] = 'p';
3146      -                if (ace->a_access_mask & ACE_DELETE)
     3149 +                if (mask & ACE_DELETE)
3147 3150                          permstr[4] = 'd';
3148      -                if (ace->a_access_mask & ACE_DELETE_CHILD)
     3151 +                if (mask & ACE_DELETE_CHILD)
3149 3152                          permstr[5] = 'D';
3150      -                if (ace->a_access_mask & ACE_READ_ATTRIBUTES)
     3153 +                if (mask & ACE_READ_ATTRIBUTES)
3151 3154                          permstr[6] = 'a';
3152      -                if (ace->a_access_mask & ACE_WRITE_ATTRIBUTES)
     3155 +                if (mask & ACE_WRITE_ATTRIBUTES)
3153 3156                          permstr[7] = 'A';
3154      -                if (ace->a_access_mask & ACE_READ_NAMED_ATTRS)
     3157 +                if (mask & ACE_READ_NAMED_ATTRS)
3155 3158                          permstr[8] = 'R';
3156      -                if (ace->a_access_mask & ACE_WRITE_NAMED_ATTRS)
     3159 +                if (mask & ACE_WRITE_NAMED_ATTRS)
3157 3160                          permstr[9] = 'W';
3158      -                if (ace->a_access_mask & ACE_READ_ACL)
     3161 +                if (mask & ACE_READ_ACL)
3159 3162                          permstr[10] = 'c';
3160      -                if (ace->a_access_mask & ACE_WRITE_ACL)
     3163 +                if (mask & ACE_WRITE_ACL)
3161 3164                          permstr[11] = 'C';
3162      -                if (ace->a_access_mask & ACE_WRITE_OWNER)
     3165 +                if (mask & ACE_WRITE_OWNER)
3163 3166                          permstr[12] = 'o';
3164      -                if (ace->a_access_mask & ACE_SYNCHRONIZE)
     3167 +                if (mask & ACE_SYNCHRONIZE)
3165 3168                          permstr[13] = 's';
3166 3169                  permstr[14] = '\0';
3167 3170                  uval.uvaltype = PRA_STRING;
3168 3171                  uval.string_val = permstr;
3169 3172          } else if (!(context->format & PRF_RAWM)) {
3170 3173  
3171 3174                  /*
3172 3175                   * Note this differs from acltext.c:ace_perm_txt()
3173 3176                   * because we don't know if the acl belongs to a file
3174 3177                   * or directory. ace mask value are the same
3175 3178                   * nonetheless, see sys/acl.h
3176 3179                   */
3177      -                if (ace->a_access_mask & ACE_LIST_DIRECTORY) {
     3180 +                if (mask & ACE_LIST_DIRECTORY) {
3178 3181                          returnstat = strappend(&permstr, gettext(READ_DIR_TXT),
3179 3182                              &permstr_alloc);
3180 3183                  }
3181      -                if (ace->a_access_mask & ACE_ADD_FILE) {
     3184 +                if (mask & ACE_ADD_FILE) {
3182 3185                          returnstat = strappend(&permstr, gettext(ADD_FILE_TXT),
3183 3186                              &permstr_alloc);
3184 3187                  }
3185      -                if (ace->a_access_mask & ACE_ADD_SUBDIRECTORY) {
     3188 +                if (mask & ACE_ADD_SUBDIRECTORY) {
3186 3189                          returnstat = strappend(&permstr, gettext(ADD_DIR_TXT),
3187 3190                              &permstr_alloc);
3188 3191                  }
3189      -                if (ace->a_access_mask & ACE_READ_NAMED_ATTRS) {
     3192 +                if (mask & ACE_READ_NAMED_ATTRS) {
3190 3193                          returnstat = strappend(&permstr,
3191 3194                              gettext(READ_XATTR_TXT), &permstr_alloc);
3192 3195                  }
3193      -                if (ace->a_access_mask & ACE_WRITE_NAMED_ATTRS) {
     3196 +                if (mask & ACE_WRITE_NAMED_ATTRS) {
3194 3197                          returnstat = strappend(&permstr,
3195 3198                              gettext(WRITE_XATTR_TXT), &permstr_alloc);
3196 3199                  }
3197      -                if (ace->a_access_mask & ACE_EXECUTE) {
     3200 +                if (mask & ACE_EXECUTE) {
3198 3201                          returnstat = strappend(&permstr,
3199 3202                              gettext(EXECUTE_TXT), &permstr_alloc);
3200 3203                  }
3201      -                if (ace->a_access_mask & ACE_DELETE_CHILD) {
     3204 +                if (mask & ACE_DELETE_CHILD) {
3202 3205                          returnstat = strappend(&permstr,
3203 3206                              gettext(DELETE_CHILD_TXT), &permstr_alloc);
3204 3207                  }
3205      -                if (ace->a_access_mask & ACE_READ_ATTRIBUTES) {
     3208 +                if (mask & ACE_READ_ATTRIBUTES) {
3206 3209                          returnstat = strappend(&permstr,
3207 3210                              gettext(READ_ATTRIBUTES_TXT), &permstr_alloc);
3208 3211                  }
3209      -                if (ace->a_access_mask & ACE_WRITE_ATTRIBUTES) {
     3212 +                if (mask & ACE_WRITE_ATTRIBUTES) {
3210 3213                          returnstat = strappend(&permstr,
3211 3214                              gettext(WRITE_ATTRIBUTES_TXT), &permstr_alloc);
3212 3215                  }
3213      -                if (ace->a_access_mask & ACE_DELETE) {
     3216 +                if (mask & ACE_DELETE) {
3214 3217                          returnstat = strappend(&permstr, gettext(DELETE_TXT),
3215 3218                              &permstr_alloc);
3216 3219                  }
3217      -                if (ace->a_access_mask & ACE_READ_ACL) {
     3220 +                if (mask & ACE_READ_ACL) {
3218 3221                          returnstat = strappend(&permstr, gettext(READ_ACL_TXT),
3219 3222                              &permstr_alloc);
3220 3223                  }
3221      -                if (ace->a_access_mask & ACE_WRITE_ACL) {
     3224 +                if (mask & ACE_WRITE_ACL) {
3222 3225                          returnstat = strappend(&permstr, gettext(WRITE_ACL_TXT),
3223 3226                              &permstr_alloc);
3224 3227                  }
3225      -                if (ace->a_access_mask & ACE_WRITE_OWNER) {
     3228 +                if (mask & ACE_WRITE_OWNER) {
3226 3229                          returnstat = strappend(&permstr,
3227 3230                              gettext(WRITE_OWNER_TXT), &permstr_alloc);
3228 3231                  }
3229      -                if (ace->a_access_mask & ACE_SYNCHRONIZE) {
     3232 +                if (mask & ACE_SYNCHRONIZE) {
3230 3233                          returnstat = strappend(&permstr,
3231 3234                              gettext(SYNCHRONIZE_TXT), &permstr_alloc);
3232 3235                  }
3233 3236                  if (permstr[strlen(permstr) - 1] == '/')
3234 3237                          permstr[strlen(permstr) - 1] = '\0';
3235 3238                  uval.uvaltype = PRA_STRING;
3236 3239                  uval.string_val = permstr;
3237 3240          }
3238 3241          if ((permstr == NULL) || (returnstat != 0) ||
3239 3242              (context->format & PRF_RAWM)) {
3240      -                uval.uvaltype = PRA_UINT32;
3241      -                uval.uint32_val = ace->a_access_mask;
     3243 +                uval.uvaltype = PRA_HEX32;
     3244 +                uval.int32_val = mask;
3242 3245          }
3243 3246          returnstat = pa_print(context, &uval, flag);
3244 3247  
3245 3248          if (permstr != NULL)
3246 3249                  free(permstr);
3247 3250          if (returnstat != 0)
3248 3251                  return (returnstat);
3249 3252          return (close_tag(context, TAG_ACEMASK));
3250 3253  }
3251 3254  
↓ open down ↓ 55 lines elided ↑ open up ↑
3307 3310          if ((returnstat = pr_adr_u_short(context, &ace.a_flags, 1)) != 0)
3308 3311                  return (returnstat);
3309 3312          if ((returnstat = pr_adr_u_short(context, &ace.a_type, 1)) != 0)
3310 3313                  return (returnstat);
3311 3314  
3312 3315          if ((returnstat = pa_ace_flags(context, &ace, returnstat, 0)) != 0)
3313 3316                  return (returnstat);
3314 3317          /* pa_ace_who can returns 1 if uid/gid is not found */
3315 3318          if ((returnstat = pa_ace_who(context, &ace, returnstat, 0)) < 0)
3316 3319                  return (returnstat);
3317      -        if ((returnstat = pa_ace_access_mask(context, &ace,
     3320 +        if ((returnstat = pa_ace_access_mask(context, ace.a_access_mask,
3318 3321              returnstat, 0)) != 0)
3319 3322                  return (returnstat);
3320 3323          return (pa_ace_type(context, &ace, returnstat, flag));
     3324 +}
     3325 +
     3326 +int
     3327 +pa_access_mask(pr_context_t *context, int status, int flag)
     3328 +{
     3329 +        int returnstat;
     3330 +        uint32_t mask;
     3331 +
     3332 +        if (status < 0)
     3333 +                return (status);
     3334 +
     3335 +        returnstat = pr_adr_u_int32(context, &mask, 1);
     3336 +        return (pa_ace_access_mask(context, mask, returnstat, flag));
     3337 +}
     3338 +
     3339 +int
     3340 +pa_wsid(pr_context_t *context, int status, int flag)
     3341 +{
     3342 +        int returnstat;
     3343 +        short length;
     3344 +        char *sid;
     3345 +        uval_t uval;
     3346 +        char *name = NULL;
     3347 +
     3348 +        if (status < 0)
     3349 +                return (status);
     3350 +        if ((returnstat = open_tag(context, TAG_WSID)) != 0)
     3351 +                return (returnstat);
     3352 +
     3353 +        if ((returnstat = pr_adr_short(context, &length, 1)) != 0)
     3354 +                return (returnstat);
     3355 +        if ((sid = (char *)malloc(length + 1)) == NULL)
     3356 +                return (-1);
     3357 +        if ((returnstat = pr_adr_char(context, sid, length)) != 0) {
     3358 +                free(sid);
     3359 +                return (returnstat);
     3360 +        }
     3361 +
     3362 +        uval.uvaltype = PRA_STRING;
     3363 +        uval.string_val = sid;
     3364 +        if ((context->format & PRF_RAWM) == 0) {
     3365 +                int rc;
     3366 +                int flag = IDMAP_REQ_FLG_USE_CACHE;
     3367 +                rc = idmap_getwinnamebysid(sid, flag, &name);
     3368 +                if (rc == IDMAP_SUCCESS)
     3369 +                        uval.string_val = name;
     3370 +                else
     3371 +                        (void) fprintf(stderr,
     3372 +                            gettext("praudit: failed to map sid to name "
     3373 +                            "rc=%d\n"), rc);
     3374 +        }
     3375 +        returnstat = pa_print(context, &uval, flag);
     3376 +        free(sid);
     3377 +        if (name != NULL)
     3378 +                free(name);
     3379 +        if (returnstat == 0)
     3380 +                returnstat = close_tag(context, TAG_WSID);
     3381 +        return (returnstat);
3321 3382  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX