Path: blob/main/crypto/krb5/src/plugins/audit/simple/au_simple_main.c
34914 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */1/* plugins/audit/au_simple_main.c - Sample Audit plugin implementation */2/*3* Copyright (C) 2013 by the Massachusetts Institute of Technology.4* All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9*10* * Redistributions of source code must retain the above copyright11* notice, this list of conditions and the following disclaimer.12*13* * Redistributions in binary form must reproduce the above copyright14* notice, this list of conditions and the following disclaimer in15* the documentation and/or other materials provided with the16* distribution.17*18* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS19* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT20* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS21* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE22* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,23* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES24* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR25* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)26* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,27* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)28* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED29* OF THE POSSIBILITY OF SUCH DAMAGE.30*/3132/*33* This is a demo implementation of Audit JSON-based module.34* It utilizes MIT Kerberos <kdc_j_encode.h> routines for JSON processing and35* the Fedora/Debian libaudit library for audit logs.36*/3738#include <k5-int.h>39#include <krb5/audit_plugin.h>40#include <libaudit.h>41#include <kdc_j_encode.h>4243krb5_error_code44audit_simple_initvt(krb5_context context, int maj_ver, int min_ver,45krb5_plugin_vtable vtable);4647struct krb5_audit_moddata_st {48int fd;49};5051/* Open connection to the audit system. Returns 0 on success. */52static krb5_error_code53open_au(krb5_audit_moddata *auctx_out)54{55krb5_error_code ret;56int fd = 0;57krb5_audit_moddata auctx;5859auctx = k5calloc(1, sizeof(*auctx), &ret);60if (ret)61return ENOMEM;62fd = audit_open();63if (fd < 0)64return KRB5_PLUGIN_NO_HANDLE; /* audit module is unavailable */6566auctx->fd = fd;67*auctx_out = auctx;6869return 0;70}7172/* Close connection to the audit system. Returns 0 on success. */73static krb5_error_code74close_au(krb5_audit_moddata auctx)75{76int fd = auctx->fd;7778audit_close(fd);79return 0;80}8182/* Log KDC-start event. Returns 0 on success. */83static krb5_error_code84j_kdc_start(krb5_audit_moddata auctx, krb5_boolean ev_success)85{86krb5_error_code ret = 0;87int local_type = AUDIT_USER_START;88int fd = auctx->fd;89char *jout = NULL;9091if (fd < 0)92return KRB5_PLUGIN_NO_HANDLE; /* audit module is unavailable */9394ret = kau_j_kdc_start(ev_success, &jout);95if (ret)96return ret;97if (audit_log_user_message(fd, local_type, jout,98NULL, NULL, NULL, ev_success) <= 0)99ret = EIO;100free(jout);101return ret;102}103104/* Log KDC-stop event. Returns 0 on success. */105static krb5_error_code106j_kdc_stop(krb5_audit_moddata auctx, krb5_boolean ev_success)107{108krb5_error_code ret = 0;109int local_type = AUDIT_USER_END;110int fd = auctx->fd;111char *jout = NULL;112113if (fd < 0)114return KRB5_PLUGIN_NO_HANDLE; /* audit module is unavailable */115116ret = kau_j_kdc_stop(ev_success, &jout);117if (ret)118return ret;119if (audit_log_user_message(fd, local_type, jout,120NULL, NULL, NULL, ev_success) <= 0)121ret = EIO;122free(jout);123return ret;124}125126/* Log AS_REQ event. Returns 0 on success */127static krb5_error_code128j_as_req(krb5_audit_moddata auctx, krb5_boolean ev_success,129krb5_audit_state *state)130{131krb5_error_code ret = 0;132int local_type = AUDIT_USER_AUTH;133int fd = auctx->fd;134char *jout = NULL;135136if (fd < 0)137return KRB5_PLUGIN_NO_HANDLE; /* audit module is unavailable */138139ret = kau_j_as_req(ev_success, state, &jout);140if (ret)141return ret;142if (audit_log_user_message(fd, local_type, jout,143NULL, NULL, NULL, ev_success) <= 0)144ret = EIO;145free(jout);146return ret;147}148149/* Log TGS_REQ event. Returns 0 on success */150static krb5_error_code151j_tgs_req(krb5_audit_moddata auctx, krb5_boolean ev_success,152krb5_audit_state *state)153{154krb5_error_code ret = 0;155int local_type = AUDIT_USER_AUTH;156int fd = auctx->fd;157char *jout = NULL;158159if (fd < 0)160return KRB5_PLUGIN_NO_HANDLE; /* audit module is unavailable */161162ret = kau_j_tgs_req(ev_success, state, &jout);163if (ret)164return ret;165if (audit_log_user_message(fd, local_type, jout,166NULL, NULL, NULL, ev_success) <= 0)167ret = EIO;168free(jout);169return ret;170}171172/* Log S4U2SELF event. Returns 0 on success */173static krb5_error_code174j_tgs_s4u2self(krb5_audit_moddata auctx, krb5_boolean ev_success,175krb5_audit_state *state)176{177krb5_error_code ret = 0;178int local_type = AUDIT_USER_AUTH;179int fd = auctx->fd;180char *jout = NULL;181182if (fd < 0)183return KRB5_PLUGIN_NO_HANDLE; /* audit module is unavailable */184185ret = kau_j_tgs_s4u2self(ev_success, state, &jout);186if (ret)187return ret;188if (audit_log_user_message(fd, local_type, jout,189NULL, NULL, NULL, ev_success) <= 0)190ret = EIO;191free(jout);192return ret;193}194195/* Log S4U2PROXY event. Returns 0 on success */196static krb5_error_code197j_tgs_s4u2proxy(krb5_audit_moddata auctx, krb5_boolean ev_success,198krb5_audit_state *state)199{200krb5_error_code ret = 0;201int local_type = AUDIT_USER_AUTH;202int fd = auctx->fd;203char *jout = NULL;204205if (fd < 0)206return KRB5_PLUGIN_NO_HANDLE; /* audit module is unavailable */207208ret = kau_j_tgs_s4u2proxy(ev_success, state, &jout);209if (ret)210return ret;211if (audit_log_user_message(fd, local_type, jout,212NULL, NULL, NULL, ev_success) <= 0)213ret = EIO;214free(jout);215return ret;216}217218/* Log user-to-user event. Returns 0 on success */219static krb5_error_code220j_tgs_u2u(krb5_audit_moddata auctx, krb5_boolean ev_success,221krb5_audit_state *state)222{223krb5_error_code ret = 0;224int local_type = AUDIT_USER_AUTH;225int fd = auctx->fd;226char *jout = NULL;227228if (fd < 0)229return KRB5_PLUGIN_NO_HANDLE; /* audit module is unavailable */230231ret = kau_j_tgs_u2u(ev_success, state, &jout);232if (ret)233return ret;234if (audit_log_user_message(fd, local_type, jout,235NULL, NULL, NULL, ev_success) <= 0)236ret = EIO;237free(jout);238return ret;239}240241krb5_error_code242audit_simple_initvt(krb5_context context, int maj_ver,243int min_ver, krb5_plugin_vtable vtable)244{245krb5_audit_vtable vt;246247if (maj_ver != 1)248return KRB5_PLUGIN_VER_NOTSUPP;249250vt = (krb5_audit_vtable)vtable;251vt->name = "simple";252vt->open = open_au;253vt->close = close_au;254vt->kdc_start = j_kdc_start;255vt->kdc_stop = j_kdc_stop;256vt->as_req = j_as_req;257vt->tgs_req = j_tgs_req;258vt->tgs_s4u2self = j_tgs_s4u2self;259vt->tgs_s4u2proxy = j_tgs_s4u2proxy;260vt->tgs_u2u = j_tgs_u2u;261return 0;262}263264265