auditlog.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. /** BEGIN COPYRIGHT BLOCK
  2. * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
  3. * Copyright (C) 2005 Red Hat, Inc.
  4. * All rights reserved.
  5. *
  6. * License: GPL (version 3 or any later version).
  7. * See LICENSE for details.
  8. * END COPYRIGHT BLOCK **/
  9. #ifdef HAVE_CONFIG_H
  10. # include <config.h>
  11. #endif
  12. #include "slap.h"
  13. /*
  14. * JCM - The audit log might be better implemented as a post-op plugin.
  15. */
  16. #define ATTR_CHANGETYPE "changetype"
  17. #define ATTR_NEWRDN "newrdn"
  18. #define ATTR_DELETEOLDRDN "deleteoldrdn"
  19. #define ATTR_MODIFIERSNAME "modifiersname"
  20. char *attr_changetype = ATTR_CHANGETYPE;
  21. char *attr_newrdn = ATTR_NEWRDN;
  22. char *attr_deleteoldrdn = ATTR_DELETEOLDRDN;
  23. char *attr_modifiersname = ATTR_MODIFIERSNAME;
  24. static int audit_hide_unhashed_pw = 1;
  25. static int auditfail_hide_unhashed_pw = 1;
  26. /* Forward Declarations */
  27. static void write_audit_file(int logtype, int optype, const char *dn, void *change, int flag, time_t curtime, int rc );
  28. void
  29. write_audit_log_entry( Slapi_PBlock *pb )
  30. {
  31. time_t curtime;
  32. Slapi_DN *sdn;
  33. const char *dn;
  34. void *change;
  35. int flag = 0;
  36. Operation *op;
  37. /* if the audit log is not enabled, just skip all of
  38. this stuff */
  39. if (!config_get_auditlog_logging_enabled()) {
  40. return;
  41. }
  42. slapi_pblock_get( pb, SLAPI_OPERATION, &op );
  43. slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn );
  44. switch ( operation_get_type(op) )
  45. {
  46. case SLAPI_OPERATION_MODIFY:
  47. slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &change );
  48. break;
  49. case SLAPI_OPERATION_ADD:
  50. slapi_pblock_get( pb, SLAPI_ADD_ENTRY, &change );
  51. break;
  52. case SLAPI_OPERATION_DELETE:
  53. {
  54. char * deleterDN = NULL;
  55. slapi_pblock_get(pb, SLAPI_REQUESTOR_DN, &deleterDN);
  56. change = deleterDN;
  57. }
  58. break;
  59. case SLAPI_OPERATION_MODDN:
  60. /* newrdn: change is just for logging -- case does not matter. */
  61. slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &change );
  62. slapi_pblock_get( pb, SLAPI_MODRDN_DELOLDRDN, &flag );
  63. break;
  64. default:
  65. return; /* Unsupported operation type. */
  66. }
  67. curtime = current_time();
  68. /* log the raw, unnormalized DN */
  69. dn = slapi_sdn_get_udn(sdn);
  70. write_audit_file(SLAPD_AUDIT_LOG, operation_get_type(op), dn, change, flag, curtime, LDAP_SUCCESS);
  71. }
  72. void
  73. write_auditfail_log_entry( Slapi_PBlock *pb )
  74. {
  75. time_t curtime;
  76. Slapi_DN *sdn;
  77. const char *dn;
  78. void *change;
  79. int flag = 0;
  80. Operation *op;
  81. int pbrc = 0;
  82. char *auditfail_config = NULL;
  83. /* if the audit log is not enabled, just skip all of
  84. this stuff */
  85. if (!config_get_auditfaillog_logging_enabled()) {
  86. return;
  87. }
  88. slapi_pblock_get( pb, SLAPI_OPERATION, &op );
  89. slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn );
  90. slapi_pblock_get( pb, SLAPI_RESULT_CODE, &pbrc );
  91. switch ( operation_get_type(op) )
  92. {
  93. case SLAPI_OPERATION_MODIFY:
  94. slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &change );
  95. break;
  96. case SLAPI_OPERATION_ADD:
  97. slapi_pblock_get( pb, SLAPI_ADD_ENTRY, &change );
  98. break;
  99. case SLAPI_OPERATION_DELETE:
  100. {
  101. char * deleterDN = NULL;
  102. slapi_pblock_get(pb, SLAPI_REQUESTOR_DN, &deleterDN);
  103. change = deleterDN;
  104. }
  105. break;
  106. case SLAPI_OPERATION_MODDN:
  107. /* newrdn: change is just for logging -- case does not matter. */
  108. slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &change );
  109. slapi_pblock_get( pb, SLAPI_MODRDN_DELOLDRDN, &flag );
  110. break;
  111. default:
  112. return; /* Unsupported operation type. */
  113. }
  114. curtime = current_time();
  115. /* log the raw, unnormalized DN */
  116. dn = slapi_sdn_get_udn(sdn);
  117. auditfail_config = config_get_auditfaillog();
  118. if (auditfail_config == NULL || strlen(auditfail_config) == 0) {
  119. /* If no auditfail log write to audit log */
  120. write_audit_file(SLAPD_AUDIT_LOG, operation_get_type(op), dn, change, flag, curtime, pbrc);
  121. } else {
  122. /* If we have our own auditfail log path */
  123. write_audit_file(SLAPD_AUDITFAIL_LOG, operation_get_type(op), dn, change, flag, curtime, pbrc);
  124. }
  125. slapi_ch_free_string(&auditfail_config);
  126. }
  127. /*
  128. * Function: write_audit_file
  129. * Arguments:
  130. * optype - type of LDAP operation being logged
  131. * dn - distinguished name of entry being changed
  132. * change - pointer to the actual change operation
  133. * For a delete operation, may contain the modifier's DN.
  134. * flag - only used by modrdn operations - value of deleteoldrdn flag
  135. * curtime - the current time
  136. * rc - The ldap result code. Used in conjunction with auditfail
  137. * Returns: nothing
  138. */
  139. static void
  140. write_audit_file(
  141. int logtype,
  142. int optype,
  143. const char *dn,
  144. void *change,
  145. int flag,
  146. time_t curtime,
  147. int rc
  148. )
  149. {
  150. LDAPMod **mods;
  151. Slapi_Entry *e;
  152. char *newrdn, *tmp, *tmpsave;
  153. int len, i, j;
  154. char *timestr;
  155. char *rcstr;
  156. lenstr *l;
  157. l = lenstr_new();
  158. addlenstr( l, "time: " );
  159. timestr = format_localTime( curtime );
  160. addlenstr( l, timestr );
  161. slapi_ch_free_string(&timestr);
  162. addlenstr( l, "\n" );
  163. addlenstr( l, "dn: " );
  164. addlenstr( l, dn );
  165. addlenstr( l, "\n" );
  166. addlenstr( l, "result: " );
  167. rcstr = slapi_ch_smprintf("%d", rc);
  168. addlenstr( l, rcstr );
  169. slapi_ch_free_string(&rcstr);
  170. addlenstr( l, "\n" );
  171. switch ( optype )
  172. {
  173. case SLAPI_OPERATION_MODIFY:
  174. addlenstr( l, attr_changetype );
  175. addlenstr( l, ": modify\n" );
  176. mods = change;
  177. for ( j = 0; (mods != NULL) && (mods[j] != NULL); j++ )
  178. {
  179. int operationtype= mods[j]->mod_op & ~LDAP_MOD_BVALUES;
  180. if(strcmp(mods[j]->mod_type, PSEUDO_ATTR_UNHASHEDUSERPASSWORD) == 0){
  181. switch (logtype)
  182. {
  183. case SLAPD_AUDIT_LOG:
  184. if (audit_hide_unhashed_pw != 0) {
  185. continue;
  186. }
  187. break;
  188. case SLAPD_AUDITFAIL_LOG:
  189. if (auditfail_hide_unhashed_pw != 0) {
  190. continue;
  191. }
  192. break;
  193. }
  194. }
  195. switch ( operationtype )
  196. {
  197. case LDAP_MOD_ADD:
  198. addlenstr( l, "add: " );
  199. addlenstr( l, mods[j]->mod_type );
  200. addlenstr( l, "\n" );
  201. break;
  202. case LDAP_MOD_DELETE:
  203. addlenstr( l, "delete: " );
  204. addlenstr( l, mods[j]->mod_type );
  205. addlenstr( l, "\n" );
  206. break;
  207. case LDAP_MOD_REPLACE:
  208. addlenstr( l, "replace: " );
  209. addlenstr( l, mods[j]->mod_type );
  210. addlenstr( l, "\n" );
  211. break;
  212. default:
  213. operationtype= LDAP_MOD_IGNORE;
  214. break;
  215. }
  216. if(operationtype!=LDAP_MOD_IGNORE)
  217. {
  218. for ( i = 0; mods[j]->mod_bvalues != NULL && mods[j]->mod_bvalues[i] != NULL; i++ )
  219. {
  220. char *buf, *bufp;
  221. len = strlen( mods[j]->mod_type );
  222. len = LDIF_SIZE_NEEDED( len, mods[j]->mod_bvalues[i]->bv_len ) + 1;
  223. buf = slapi_ch_malloc( len );
  224. bufp = buf;
  225. slapi_ldif_put_type_and_value_with_options( &bufp, mods[j]->mod_type,
  226. mods[j]->mod_bvalues[i]->bv_val,
  227. mods[j]->mod_bvalues[i]->bv_len, 0 );
  228. *bufp = '\0';
  229. addlenstr( l, buf );
  230. slapi_ch_free( (void**)&buf );
  231. }
  232. }
  233. addlenstr( l, "-\n" );
  234. }
  235. break;
  236. case SLAPI_OPERATION_ADD:
  237. e = change;
  238. addlenstr( l, attr_changetype );
  239. addlenstr( l, ": add\n" );
  240. tmp = slapi_entry2str( e, &len );
  241. tmpsave = tmp;
  242. while (( tmp = strchr( tmp, '\n' )) != NULL )
  243. {
  244. tmp++;
  245. if ( !ldap_utf8isspace( tmp ))
  246. {
  247. break;
  248. }
  249. }
  250. addlenstr( l, tmp );
  251. slapi_ch_free((void**)&tmpsave );
  252. break;
  253. case SLAPI_OPERATION_DELETE:
  254. tmp = change;
  255. addlenstr( l, attr_changetype );
  256. addlenstr( l, ": delete\n" );
  257. if (tmp && tmp[0]) {
  258. addlenstr( l, attr_modifiersname );
  259. addlenstr( l, ": ");
  260. addlenstr( l, tmp);
  261. addlenstr( l, "\n");
  262. }
  263. break;
  264. case SLAPI_OPERATION_MODDN:
  265. newrdn = change;
  266. addlenstr( l, attr_changetype );
  267. addlenstr( l, ": modrdn\n" );
  268. addlenstr( l, attr_newrdn );
  269. addlenstr( l, ": " );
  270. addlenstr( l, newrdn );
  271. addlenstr( l, "\n" );
  272. addlenstr( l, attr_deleteoldrdn );
  273. addlenstr( l, ": " );
  274. addlenstr( l, flag ? "1" : "0" );
  275. addlenstr( l, "\n" );
  276. }
  277. addlenstr( l, "\n" );
  278. switch (logtype)
  279. {
  280. case SLAPD_AUDIT_LOG:
  281. slapd_log_audit (l->ls_buf, l->ls_len);
  282. break;
  283. case SLAPD_AUDITFAIL_LOG:
  284. slapd_log_auditfail (l->ls_buf, l->ls_len);
  285. break;
  286. default:
  287. /* Unsupported log type, we should make some noise */
  288. LDAPDebug1Arg(LDAP_DEBUG_ANY, "write_audit_log: Invalid log type specified. logtype %d\n", logtype);
  289. break;
  290. }
  291. lenstr_free( &l );
  292. }
  293. void
  294. auditlog_hide_unhashed_pw()
  295. {
  296. audit_hide_unhashed_pw = 1;
  297. }
  298. void
  299. auditlog_expose_unhashed_pw()
  300. {
  301. audit_hide_unhashed_pw = 0;
  302. }
  303. void
  304. auditfaillog_hide_unhashed_pw()
  305. {
  306. auditfail_hide_unhashed_pw = 1;
  307. }
  308. void
  309. auditfaillog_expose_unhashed_pw()
  310. {
  311. auditfail_hide_unhashed_pw = 0;
  312. }