ima_audit.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /*
  2. * Copyright (C) 2008 IBM Corporation
  3. * Author: Mimi Zohar <zohar@us.ibm.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, version 2 of the License.
  8. *
  9. * File: integrity_audit.c
  10. * Audit calls for the integrity subsystem
  11. */
  12. #include <linux/fs.h>
  13. #include <linux/audit.h>
  14. #include "ima.h"
  15. static int ima_audit;
  16. #ifdef CONFIG_IMA_AUDIT
  17. /* ima_audit_setup - enable informational auditing messages */
  18. static int __init ima_audit_setup(char *str)
  19. {
  20. unsigned long audit;
  21. int rc;
  22. char *op;
  23. rc = strict_strtoul(str, 0, &audit);
  24. if (rc || audit > 1)
  25. printk(KERN_INFO "ima: invalid ima_audit value\n");
  26. else
  27. ima_audit = audit;
  28. op = ima_audit ? "ima_audit_enabled" : "ima_audit_not_enabled";
  29. integrity_audit_msg(AUDIT_INTEGRITY_STATUS, NULL, NULL, NULL, op, 0, 0);
  30. return 1;
  31. }
  32. __setup("ima_audit=", ima_audit_setup);
  33. #endif
  34. void integrity_audit_msg(int audit_msgno, struct inode *inode,
  35. const unsigned char *fname, const char *op,
  36. const char *cause, int result, int audit_info)
  37. {
  38. struct audit_buffer *ab;
  39. if (!ima_audit && audit_info == 1) /* Skip informational messages */
  40. return;
  41. ab = audit_log_start(current->audit_context, GFP_KERNEL, audit_msgno);
  42. audit_log_format(ab, "integrity: pid=%d uid=%u auid=%u",
  43. current->pid, current->cred->uid,
  44. audit_get_loginuid(current));
  45. audit_log_task_context(ab);
  46. switch (audit_msgno) {
  47. case AUDIT_INTEGRITY_DATA:
  48. case AUDIT_INTEGRITY_METADATA:
  49. case AUDIT_INTEGRITY_PCR:
  50. audit_log_format(ab, " op=%s cause=%s", op, cause);
  51. break;
  52. case AUDIT_INTEGRITY_HASH:
  53. audit_log_format(ab, " op=%s hash=%s", op, cause);
  54. break;
  55. case AUDIT_INTEGRITY_STATUS:
  56. default:
  57. audit_log_format(ab, " op=%s", op);
  58. }
  59. audit_log_format(ab, " comm=");
  60. audit_log_untrustedstring(ab, current->comm);
  61. if (fname) {
  62. audit_log_format(ab, " name=");
  63. audit_log_untrustedstring(ab, fname);
  64. }
  65. if (inode)
  66. audit_log_format(ab, " dev=%s ino=%lu",
  67. inode->i_sb->s_id, inode->i_ino);
  68. audit_log_format(ab, " res=%d", result);
  69. audit_log_end(ab);
  70. }