<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://k5wiki.test.kerberos.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tsitkova</id>
		<title>K5Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://k5wiki.test.kerberos.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tsitkova"/>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki/Special:Contributions/Tsitkova"/>
		<updated>2026-05-14T17:45:08Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Revocation&amp;diff=5360</id>
		<title>Projects/Revocation</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Revocation&amp;diff=5360"/>
				<updated>2014-08-02T02:00:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Introduce a Revocation functionality into Kerberos eco-system. &lt;br /&gt;
&lt;br /&gt;
== Possible scenarios and approaches ==&lt;br /&gt;
&lt;br /&gt;
# “Black list” on KDC:  KDC stores information about jeopardized clients together with the timestamp when the accident was recorded (e. g. Client lost mobile phone with some active security-sensitive applications and informed KDC about it).  The Application Server accesses this information (perhaps, through a special channel/protocol)  and acts accordingly;&lt;br /&gt;
# Application server observes some malicious activity (e.g.from audit log analysis) and reports it to KDC. KDC acts accordingly.  Ideally, the Client (person or service) is also informed that his/her credentials are jeopardized; &lt;br /&gt;
# KDC learns that client is jeopardized and dispatches warnings to all services that may be potentially affected by the accident. The warning is sent only if the ticket for the particular service was issued and it is still valid.&lt;br /&gt;
# Forensics:  Application server observes the malicious action. It informs KDC about the accident, but continues to  serve the hacker to allow time to track down the originator of the attack. &lt;br /&gt;
&lt;br /&gt;
===Lightweight approach under CAMMAC umbrella ===&lt;br /&gt;
&lt;br /&gt;
KDC learns that client is jeopardized or his/her credentials are changed or revoked, and  incorporates the revocation information into AD-CAMMAC container for every NEWLY issued ticket.   Once ticket receiver processes AD-CAMMAC, it can “locally” revoke/filter all existing tickets for that particular user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# http://nvlpubs.nist.gov/nistpubs/ir/2012/NIST.IR.7817.pdf&lt;br /&gt;
# http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-07&lt;br /&gt;
# http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf (Class FAU_ARP)&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Revocation&amp;diff=5351</id>
		<title>Projects/Revocation</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Revocation&amp;diff=5351"/>
				<updated>2014-07-30T18:53:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Introduce a Revocation functionality into Kerberos eco-system. &lt;br /&gt;
&lt;br /&gt;
== Possible scenarios and approaches ==&lt;br /&gt;
&lt;br /&gt;
# Support “Black list” on KDC:  KDC stores information about jeopardized clients together with the timestamp when the accident was recorded (e. g. Client lost mobile phone with some active security-sensitive applications and informed KDC about it).  If desired, the Application Server may get an access to this information (perhaps, through a special channel/protocol)  and acts accordingly;&lt;br /&gt;
# Application server observes some malicious activity (e.g. through audit log analysis) and reports it to KDC. KDC acts accordingly.  Ideally, the Client (person or service) is also informed (via email or some other communication channel) that his/her credentials are jeopardized; &lt;br /&gt;
# KDC learns that client is jeopardized or his/her credentials are changed or revoked, and dispatches warnings to all services that expressed interest in this functionality and  may be potentially affected by the accident. The warning is sent only if the ticket for the particular service exists and is still valid.&lt;br /&gt;
# Forensics:  Application server observes the malicious action. It informs KDC about the accident, but continues to  serve the intruder to allow some time to track down the originator of the attack. &lt;br /&gt;
&lt;br /&gt;
===Lightweight approach under CAMMAC umbrella ===&lt;br /&gt;
&lt;br /&gt;
KDC learns that client is jeopardized or his/her credentials are changed or revoked, and  incorporates the revocation information into AD-CAMMAC container for every newly issued ticket.  &lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# http://nvlpubs.nist.gov/nistpubs/ir/2012/NIST.IR.7817.pdf&lt;br /&gt;
# http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-07&lt;br /&gt;
# http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf (Class FAU_ARP)&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Revocation&amp;diff=5349</id>
		<title>Projects/Revocation</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Revocation&amp;diff=5349"/>
				<updated>2014-07-23T15:57:46Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Introduce a Revocation functionality into Kerberos eco-system. &lt;br /&gt;
&lt;br /&gt;
== Possible scenarios and approaches ==&lt;br /&gt;
&lt;br /&gt;
# Support “Black list” on KDC:  KDC stores information about jeopardized clients together with the timestamp when the accident was recorded (e. g. Client lost mobile phone with some active security-sensitive applications and informed KDC about it).  If desired, the Application Server may get an access to this information (perhaps, through a special channel/protocol)  and acts accordingly;&lt;br /&gt;
# Application server observes some malicious activity (e.g. through audit log analysis) and reports it to KDC. KDC acts accordingly.  Ideally, the Client (person or service) is also informed (via email or some other communication channel) that his/her credentials are jeopardized; &lt;br /&gt;
# KDC learns that client is jeopardized or his/her credentials are changed or revoked, and dispatches warnings to all services that expressed interest in this functionality and  may be potentially affected by the accident. The warning is sent only if the ticket for the particular service exists and is still valid.&lt;br /&gt;
# Forensics:  Application server observes the malicious action. It informs KDC about the accident, but continues to  serve the intruder to allow some time to track down the originator of the attack. &lt;br /&gt;
&lt;br /&gt;
===Lightweight approach under CAMMAC umbrella ===&lt;br /&gt;
&lt;br /&gt;
KDC learns that client is jeopardized or his/her credentials are changed or revoked, and  incorporates the revocation information into AD-CAMMAC container for every newly issued ticket.  &lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# http://nvlpubs.nist.gov/nistpubs/ir/2012/NIST.IR.7817.pdf&lt;br /&gt;
# http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-07&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Revocation&amp;diff=5348</id>
		<title>Projects/Revocation</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Revocation&amp;diff=5348"/>
				<updated>2014-07-23T15:55:42Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Initial statement of purpose and possible solutions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Introduce a Revocation functionality into Kerberos eco-system. &lt;br /&gt;
&lt;br /&gt;
== Possible scenarios and approaches ==&lt;br /&gt;
&lt;br /&gt;
# Support “Black list” on KDC:  KDC stores information about jeopardized clients together with the timestamp when the accident was recorded (e. g. Client lost mobile phone with some active security-sensitive applications and informed KDC about it).  If desired, the Application Server may get an access to this information (perhaps, through a special channel/protocol)  and acts accordingly;&lt;br /&gt;
# Application server observes some malicious activity (e.g. through audit log analysis) and reports it to KDC. KDC acts accordingly.  Ideally, the Client (person or service) is also informed (via email or some other communication channel) that his/her credentials are jeopardized; &lt;br /&gt;
# KDC learns that client is jeopardized or his/her credentials are changed or revoked, and dispatches warnings to all services that expressed interest in this functionality and  may be potentially affected by the accident. The warning is sent only if the ticket for the particular service exists and is still valid.&lt;br /&gt;
# Forensics:  Application server observes the malicious action. It informs KDC about the accident, but continues to  serve the intruder to allow some time to track down the originator of the attack. &lt;br /&gt;
&lt;br /&gt;
===Lightweight approach under CAMMAC umbrella ===&lt;br /&gt;
&lt;br /&gt;
KDC learns that client is jeopardized or his/her credentials are changed or revoked, and  incorporates the revocation information into AD-CAMMAC container for every newly issued ticket.  &lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# http://nvlpubs.nist.gov/nistpubs/ir/2012/NIST.IR.7817.pdf&lt;br /&gt;
# http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-07&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5247</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5247"/>
				<updated>2013-10-29T17:01:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-rel|1.12}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
This project creates a pluggable audit interface to allow the monitoring of security-related events on the KDC.&lt;br /&gt;
&lt;br /&gt;
The interface is considered &amp;quot;experimental&amp;quot;, in that API stability is not guaranteed to future major releases.&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
We consider events under the categorization of the Common Criteria Class FIA.&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. The bulk of the audit information will be produced while processing AS and TGS requests.  Though KDC request processing can be grouped into several logical phases, we generate (usually) only two events, one at the initial receipt of a request, and a second, final, one before sending a reply.  All events relating to the same request can be linked together in the audit log by a 32-character alphanumeric string (about 190 bits of uniqueness) which is randomly generated at the start of processing.  If the request is a S4U2Self or S4U2Proxy request, an additional audit event will be generated with information particular to the S4U request.  The following table lists the logical stages of KDC processing, and which components are logged in the AS and TGS cases:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following information will be made available to audit plugins:&lt;br /&gt;
&lt;br /&gt;
: a unique [[#Request ID| request ID ]] &lt;br /&gt;
: the complete KDC request structure&lt;br /&gt;
: the KDC reply structure (possibly only partially populated)&lt;br /&gt;
: the client's IP address and port number&lt;br /&gt;
: the stage of KDC processing at which the audit event was triggered&lt;br /&gt;
: the KDC status string (as appears in kdc.log)&lt;br /&gt;
: [[#Ticket ID|ticket IDs]]  (checksums) for any supplied tickets or ticket to be returned&lt;br /&gt;
: the remote client's realm (for referrals)&lt;br /&gt;
: the impersonated user for an S4U2Self request&lt;br /&gt;
: the &amp;quot;type of violation&amp;quot; which caused the request to fail, if applicable&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Further details about policy viloations&lt;br /&gt;
:Event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term key creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID is a randomly generated alpha-numeric string. Using this ID an administrator can easily correlate multiple audit events related to a single request. It should be informative both in cases when the request is sent to multiple KDCs, or to the same KDC multiple times. &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* additional information string */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| event_success	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| event was success or failure&lt;br /&gt;
|-&lt;br /&gt;
| event_name	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| name of the event (KDC_START, AS_REQ etc)&lt;br /&gt;
|-&lt;br /&gt;
| stage	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| stage in the KDC exchange processing&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| req_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| request ID&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	Additional information string&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || client's address&lt;br /&gt;
|-&lt;br /&gt;
| fromport	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM || client's port&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
A testable audit module, k5audit_test, will be built, and enabled for a python test program which is added.  This test module uses the internal libauditjenc library to generate a JSON encoding of the audit event, and writes that encoded string to a flat file, which is parsed by the python test program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms;&lt;br /&gt;
# Expand Kerberos Audit facility to the application servers and kadmin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Commits ==&lt;br /&gt;
&lt;br /&gt;
    e63b2c9b0ed3b19f6aa1ac90222240690a1bc55b KDC Audit infrastructure and plugin implementation&lt;br /&gt;
    1003f0173f266a6428ccf2c89976f0029d3ee831 KDC Audit infrastructure and plugin implementation (merged)&lt;br /&gt;
    5036f91e7b61a73a1ec2d39ce1cc6bbf60dd82ab Fix audit test module initialization&lt;br /&gt;
&lt;br /&gt;
Completed in {{bug|7712}} and {{bug|7713}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
&lt;br /&gt;
Administrator experience:&lt;br /&gt;
&lt;br /&gt;
* Add an experimental pluggable interface for auditing KDC processing.  This interface may change in a backwards-incompatible way in a future release.&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5246</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5246"/>
				<updated>2013-10-29T16:57:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-rel|1.12}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
This project creates a pluggable audit interface to allow the monitoring of security-related events on the KDC.&lt;br /&gt;
&lt;br /&gt;
The interface is considered &amp;quot;experimental&amp;quot;, in that API stability is not guaranteed to future major releases.&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
We consider events under the categorization of the Common Criteria Class FIA.&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. The bulk of the audit information will be produced while processing AS and TGS requests.  Though KDC request processing can be grouped into several logical phases, we generate (usually) only two events, one at the initial receipt of a request, and a second, final, one before sending a reply.  All events relating to the same request can be linked together in the audit log by a 32-character alphanumeric string (about 190 bits of uniqueness) which is randomly generated at the start of processing.  If the request is a S4U2Self or S4U2Proxy request, an additional audit event will be generated with information particular to the S4U request.  The following table lists the logical stages of KDC processing, and which components are logged in the AS and TGS cases:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following information will be made available to audit plugins:&lt;br /&gt;
&lt;br /&gt;
: a unique request ID&lt;br /&gt;
: the complete KDC request structure&lt;br /&gt;
: the KDC reply structure (possibly only partially populated)&lt;br /&gt;
: the client's IP address and port number&lt;br /&gt;
: the stage of KDC processing at which the audit event was triggered&lt;br /&gt;
: the KDC status string (as appears in kdc.log)&lt;br /&gt;
: ticket IDs (checksums) for any supplied tickets or ticket to be returned&lt;br /&gt;
: the remote client's realm (for referrals)&lt;br /&gt;
: the impersonated user for an S4U2Self request&lt;br /&gt;
: the &amp;quot;type of violation&amp;quot; which caused the request to fail, if applicable&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Further details about policy viloations&lt;br /&gt;
:Event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term key creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID is a randomly generated alpha-numeric string. Using this ID an administrator can easily correlate multiple audit events related to a single request. It should be informative both in cases when the request is sent to multiple KDCs, or to the same KDC multiple times. &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* additional information string */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| event_success	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| event was success or failure&lt;br /&gt;
|-&lt;br /&gt;
| event_name	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| name of the event (KDC_START, AS_REQ etc)&lt;br /&gt;
|-&lt;br /&gt;
| stage	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| stage in the KDC exchange processing&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| req_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| request ID&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	Additional information string&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || client's address&lt;br /&gt;
|-&lt;br /&gt;
| fromport	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM || client's port&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
A testable audit module, k5audit_test, will be built, and enabled for a python test program which is added.  This test module uses the internal libauditjenc library to generate a JSON encoding of the audit event, and writes that encoded string to a flat file, which is parsed by the python test program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms;&lt;br /&gt;
# Expand Kerberos Audit facility to the application servers and kadmin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Commits ==&lt;br /&gt;
&lt;br /&gt;
    e63b2c9b0ed3b19f6aa1ac90222240690a1bc55b KDC Audit infrastructure and plugin implementation&lt;br /&gt;
    1003f0173f266a6428ccf2c89976f0029d3ee831 KDC Audit infrastructure and plugin implementation (merged)&lt;br /&gt;
    5036f91e7b61a73a1ec2d39ce1cc6bbf60dd82ab Fix audit test module initialization&lt;br /&gt;
&lt;br /&gt;
Completed in {{bug|7712}} and {{bug|7713}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
&lt;br /&gt;
Administrator experience:&lt;br /&gt;
&lt;br /&gt;
* Add an experimental pluggable interface for auditing KDC processing.  This interface may change in a backwards-incompatible way in a future release.&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Kerberos_Documentation&amp;diff=5245</id>
		<title>Projects/Kerberos Documentation</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Kerberos_Documentation&amp;diff=5245"/>
				<updated>2013-10-29T15:21:00Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-rel|1.11}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The goal of the project is to create an infrastructure  and process for the future development of the extensive Kerberos documentation.&lt;br /&gt;
The documentation should be useful and correct; it must be detailed, but optimized -- do not be too verbose.&lt;br /&gt;
&lt;br /&gt;
'''The documentation will be built incrementally. We will analyze what works and what doesn't and correct the course of action as needed.'''&lt;br /&gt;
Part of the criteria for &amp;quot;what works&amp;quot; is that the documentation should be easy to maintain.&lt;br /&gt;
&lt;br /&gt;
The actualized  documentation will be useful for developers and administrators, both for experienced ones and newcomers. It will address the following topics:&lt;br /&gt;
&lt;br /&gt;
* Complete reference - API, internal functions, data types, macros &lt;br /&gt;
* Tutorial for application developers - description on various tasks such as working with credentials, topics on how to write plugins, etc&lt;br /&gt;
* Cookbook for administrators  - Installation, configuration, troubleshooting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Documentation for application developers ==&lt;br /&gt;
&lt;br /&gt;
Generally any topic in the Kerberos documentation can cross-reference with function documentation and each other.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Details of source documentation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Documenting functions ===&lt;br /&gt;
&lt;br /&gt;
The following fields ''must'' be included in the function documentation and should reside in the source code  :&lt;br /&gt;
&lt;br /&gt;
# Function signature&lt;br /&gt;
# Brief function description&lt;br /&gt;
# Arguments - [in/out] with description&lt;br /&gt;
# Return value description&lt;br /&gt;
# Detailed description (optional)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/** Some brief description&lt;br /&gt;
 * &lt;br /&gt;
 * Optional  detailed description &lt;br /&gt;
 * &lt;br /&gt;
 * @param[in]  arg1  Description of arg1&lt;br /&gt;
 *&lt;br /&gt;
 * @return Something useful&lt;br /&gt;
 */&lt;br /&gt;
char * KRB5_CALLCONV &lt;br /&gt;
krb5_X(type arg1) &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ''optional'' fields may include:&lt;br /&gt;
&lt;br /&gt;
# ''See also'' section to refer to the related functions, &lt;br /&gt;
# ''Note'' section to highlight the specifics of the behaivor&lt;br /&gt;
# Examples of the usage&lt;br /&gt;
# Snap-shot of the real code involving this function&lt;br /&gt;
# Links to KRB5 Wiki Project page, krbdev discussion, RFC document or its section etc&lt;br /&gt;
# Version of Kerberos when fuction was introduced or became obsolete&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Workflow ====&lt;br /&gt;
&lt;br /&gt;
# Configure Doxygen to generate output both in xml and html formats. Run Doxygen.&lt;br /&gt;
# For each function and data type generate document in ReST format. For the function ''krb5_X()'' lets call it ''krb5_X_p1''.&lt;br /&gt;
# File  ''krb5_X.rst''  can be used as input for Sphinx &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Documenting data types and macros===&lt;br /&gt;
&lt;br /&gt;
Similar to documenting functions. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
# The core team - the administrator - posts the initial list of the tasks (such as API, admin tasks, &amp;quot;How to&amp;quot;-s etc) and further supports it. See [[Projects/Documentation Tasks]] for more detailed information.&lt;br /&gt;
# Community can suggest new tasks &lt;br /&gt;
# The core team provides templates that, if helpful, may be used by the documentation writers. The most desirable format for the contributed documents is ReST as the easiest to integrate with the mainstream documentation.&lt;br /&gt;
# Community can provide the feedback on the documented tasks.&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* Doxygen 1.7.2 &amp;lt;http://www.stack.nl/~dimitri/doxygen/index.html&amp;gt;&lt;br /&gt;
* Sphinx 1.0.4  &amp;lt;http://sphinx.pocoo.org&amp;gt;&lt;br /&gt;
* Python 2.5+ (with lxml extension)&lt;br /&gt;
* Cheetah 2.4.4 &amp;lt;http://www.cheetahtemplate.org&amp;gt;&lt;br /&gt;
* Restructured Text markup &amp;lt;http://docutils.sourceforge.net/docs/user/rst/quickstart.html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5244</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5244"/>
				<updated>2013-10-28T16:38:45Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-rel|1.12}}&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
&lt;br /&gt;
This project creates a pluggable audit interface to allow the monitoring of security-related events on the KDC.&lt;br /&gt;
&lt;br /&gt;
The interface is considered &amp;quot;experimental&amp;quot;, in that API stability is not guaranteed to future major releases.&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
We consider events under the categorization of the Common Criteria Class FIA.&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. The bulk of the audit information will be produced while processing AS and TGS requests.  Though KDC request processing can be grouped into several logical phases, we generate (usually) only two events, one at the initial receipt of a request, and a second, final, one before sending a reply.  All events relating to the same request can be linked together in the audit log by a 32-character alphanumeric string (about 190 bits of uniqueness) which is randomly generated at the start of processing.  If the request is a S4U2Self or S4U2Proxy request, an additional audit event will be generated with information particular to the S4U request.  The following table lists the logical stages of KDC processing, and which components are logged in the AS and TGS cases:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The following information will be made available to audit plugins:&lt;br /&gt;
&lt;br /&gt;
: a unique request ID&lt;br /&gt;
: the complete KDC request structure&lt;br /&gt;
: the KDC reply structure (possibly only partially populated)&lt;br /&gt;
: the client's IP address and port number&lt;br /&gt;
: the stage of KDC processing at which the audit event was triggered&lt;br /&gt;
: the KDC status string (as appears in kdc.log)&lt;br /&gt;
: ticket IDs (checksums) for any supplied tickets or ticket to be returned&lt;br /&gt;
: the remote client's realm (for referrals)&lt;br /&gt;
: the impersonated user for an S4U2Self request&lt;br /&gt;
: the &amp;quot;type of violation&amp;quot; which caused the request to fail, if applicable&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Further details about policy viloations&lt;br /&gt;
:Event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term key creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID is a randomly generated alpha-numeric string. Using this ID an administrator can easily correlate multiple audit events related to a single request. It should be informative both in cases when the request is sent to multiple KDCs, or to the same KDC multiple times. &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* additional information string */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| event_success	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| event was success or failure&lt;br /&gt;
|-&lt;br /&gt;
| event_name	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| name of the event (KDC_START, AS_REQ etc)&lt;br /&gt;
|-&lt;br /&gt;
| stage	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| stage in the KDC exchange processing&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| req_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| request ID&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	Additional information string&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || client's address&lt;br /&gt;
|-&lt;br /&gt;
| fromport	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM || client's port&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
A testable audit module, k5audit_test, will be built, and enabled for a python test program which is added.  This test module uses the internal libauditjenc library to generate a JSON encoding of the audit event, and writes that encoded string to a flat file, which is parsed by the python test program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Commits ==&lt;br /&gt;
&lt;br /&gt;
    e63b2c9b0ed3b19f6aa1ac90222240690a1bc55b KDC Audit infrastructure and plugin implementation&lt;br /&gt;
    1003f0173f266a6428ccf2c89976f0029d3ee831 KDC Audit infrastructure and plugin implementation (merged)&lt;br /&gt;
    5036f91e7b61a73a1ec2d39ce1cc6bbf60dd82ab Fix audit test module initialization&lt;br /&gt;
&lt;br /&gt;
Completed in {{bug|7712}} and {{bug|7713}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
&lt;br /&gt;
Administrator experience:&lt;br /&gt;
&lt;br /&gt;
* Add an experimental pluggable interface for auditing KDC processing.  This interface may change in a backwards-incompatible way in a future release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms;&lt;br /&gt;
# Expand Kerberos Audit facility to the application servers and kadmin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5216</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5216"/>
				<updated>2013-09-19T20:26:49Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Request ID clarification&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. AS_REQ and TGS_REQ:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The implementors of audit plugin  will be able to extract the following auditable information:&lt;br /&gt;
&lt;br /&gt;
KDC request: &lt;br /&gt;
: requested service principal;&lt;br /&gt;
: client’s principal;&lt;br /&gt;
: KDC options;&lt;br /&gt;
: requested ticket start, end and renew_till times;&lt;br /&gt;
: list of requested addresses;&lt;br /&gt;
: requested enctypes;&lt;br /&gt;
: preauth types&lt;br /&gt;
&lt;br /&gt;
KDC reply:&lt;br /&gt;
: preauth types;&lt;br /&gt;
: TGT, referral TGT or service ticket with the following level of details:&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Policy&lt;br /&gt;
:Policies violation - event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID is a randomly generated alpha-numeric string. Using this ID an administrator can easily correlate multiple audit events related to a single request. It should be informative both in cases when the request is sent to multiple KDCs, or to the same KDC multiple times. &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* additional information string */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| event_success	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| event was success or failure&lt;br /&gt;
|-&lt;br /&gt;
| event_name	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| name of the event (KDC_START, AS_REQ etc)&lt;br /&gt;
|-&lt;br /&gt;
| stage	||  style=&amp;quot;padding-left: 2em &amp;quot;| INT	|| stage in the KDC exchange processing&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| req_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| request ID&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	Additional information string&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || client's address&lt;br /&gt;
|-&lt;br /&gt;
| fromport	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM || client's port&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
Python test system will become aware of the existence of  &amp;quot;simple&amp;quot; json-based  audit plugin module. Running &amp;quot;make check&amp;quot; will result in storing audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Geolocation_Policy&amp;diff=5170</id>
		<title>Projects/Geolocation Policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Geolocation_Policy&amp;diff=5170"/>
				<updated>2013-08-01T18:12:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Use Case ==&lt;br /&gt;
&lt;br /&gt;
# Person travels abroad.  When authenticating to his corporate Kerberos-enabled system, he uses some location-related measurement Device together with the other authentication means.  The geolocation claim is passed to the KDC with the initial request.   There it is evaluated by a designated service and, based on the result of the evaluation and local policies, KDC proceeds with issuing, or not, the ticket.&lt;br /&gt;
# The client's geolocation maybe used for Audit purposes.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Define a new Geolocation policy and create an infrastructure to allow KDC to deal with the geolocation information.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Client contacts Location Information Service (LIS) with the geolocation claim.   LIS evaluates the claim (geographical and network attachment) and issues certificate confirming correctness of the claim.  Client sends this certificate to KDC.  KDC uses its PKINIT facilities to process the certificate.  &lt;br /&gt;
&lt;br /&gt;
(An alternative to improve geo confidence... Does the satellite-based signing authority exist?  It would be great if it could sign the KDC token related to clients geo-location claim.   )&lt;br /&gt;
&lt;br /&gt;
==Related references==&lt;br /&gt;
&lt;br /&gt;
# [http://datatracker.ietf.org/doc/draft-ietf-geopriv-held-measurements/ draft-ietf-geopriv-held-measurements]&lt;br /&gt;
# [http://datatracker.ietf.org/wg/geopriv/  IETF geopriv charter]&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Geolocation_Policy&amp;diff=5169</id>
		<title>Projects/Geolocation Policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Geolocation_Policy&amp;diff=5169"/>
				<updated>2013-08-01T17:52:01Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Added Design section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Use Case ==&lt;br /&gt;
&lt;br /&gt;
# Person travels abroad.  When authenticating to his corporate Kerberos-enabled system, he uses some location-related measurement Device together with the other authentication means.  The geolocation claim is passed to the KDC with the initial request.   There it is evaluated by a designated service and, based on the result of the evaluation and local policies, KDC proceeds with issuing, or not, the ticket.&lt;br /&gt;
# The client's geolocation maybe used for Audit purposes.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Define a new Geolocation policy and create an infrastructure to allow KDC to deal with the geolocation information.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Client contacts Location Information Service (LIS) with the geolocation claim.   LIS evaluates the claim (geographical and network attachment) and issues certificate confirming correctness of the claim.  Client sends this certificate to KDC.  KDC uses its PKINIT facilities to process the certificate.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Related references==&lt;br /&gt;
&lt;br /&gt;
# [http://datatracker.ietf.org/doc/draft-ietf-geopriv-held-measurements/ draft-ietf-geopriv-held-measurements]&lt;br /&gt;
# [http://datatracker.ietf.org/wg/geopriv/  IETF geopriv charter]&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5168</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5168"/>
				<updated>2013-07-31T14:23:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. AS_REQ and TGS_REQ:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The implementors of audit plugin  will be able to extract the following auditable information:&lt;br /&gt;
&lt;br /&gt;
KDC request: &lt;br /&gt;
: requested service principal;&lt;br /&gt;
: client’s principal;&lt;br /&gt;
: KDC options;&lt;br /&gt;
: requested ticket start, end and renew_till times;&lt;br /&gt;
: list of requested addresses;&lt;br /&gt;
: requested enctypes;&lt;br /&gt;
: preauth types&lt;br /&gt;
&lt;br /&gt;
KDC reply:&lt;br /&gt;
: preauth types;&lt;br /&gt;
: TGT, referral TGT or service ticket with the following level of details:&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Policy&lt;br /&gt;
:Policies violation - event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID - hash of the request is recorded as part of audit messages. Using this piece of information an administrator can easily correlate multiple audit events related to a single request.&lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* additional information string */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	Additional information string&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
Python test system will become aware of the existence of  &amp;quot;simple&amp;quot; json-based  audit plugin module. Running &amp;quot;make check&amp;quot; will result in storing audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5167</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5167"/>
				<updated>2013-07-31T13:52:20Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. AS_REQ and TGS_REQ:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| Additional info(KDC status,policy details,etc)|| &amp;amp;#10004; ||&amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The implementors of audit plugin  will be able to extract the following auditable information:&lt;br /&gt;
&lt;br /&gt;
KDC request: &lt;br /&gt;
: requested service principal;&lt;br /&gt;
: client’s principal;&lt;br /&gt;
: KDC options;&lt;br /&gt;
: requested ticket start, end and renew_till times;&lt;br /&gt;
: list of requested addresses;&lt;br /&gt;
: requested enctypes;&lt;br /&gt;
: preauth types&lt;br /&gt;
&lt;br /&gt;
KDC reply:&lt;br /&gt;
: preauth types;&lt;br /&gt;
: TGT, referral TGT or service ticket with the following level of details:&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Policy&lt;br /&gt;
:Policies violation - event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID - hash of the request is recorded as part of audit messages. Using this piece of information an administrator can easily correlate multiple audit events related to a single request.&lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* KDC status message */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
Python test system will become aware of the existence of  &amp;quot;simple&amp;quot; json-based  audit plugin module. Running &amp;quot;make check&amp;quot; will result in storing audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5166</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5166"/>
				<updated>2013-07-29T17:10:44Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. AS_REQ and TGS_REQ:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| KDC status || on error ||on error and &amp;quot;ISSUE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The implementors of audit plugin  will be able to extract the following auditable information:&lt;br /&gt;
&lt;br /&gt;
KDC request: &lt;br /&gt;
: requested service principal;&lt;br /&gt;
: client’s principal;&lt;br /&gt;
: KDC options;&lt;br /&gt;
: requested ticket start, end and renew_till times;&lt;br /&gt;
: list of requested addresses;&lt;br /&gt;
: requested enctypes;&lt;br /&gt;
: preauth types&lt;br /&gt;
&lt;br /&gt;
KDC reply:&lt;br /&gt;
: preauth types;&lt;br /&gt;
: TGT, referral TGT or service ticket with the following level of details:&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Policy&lt;br /&gt;
:Policies violation - event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID - hash of the request is recorded as part of audit messages. Using this piece of information an administrator can easily correlate multiple audit events related to a single request.&lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* KDC status message */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== JSON based audit module ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, SuSe for the first round.  The new JSON utility library will be built to parse Kerberos specific structures.  The &amp;quot;simple&amp;quot; audit module will be statically linked to this library.&lt;br /&gt;
&lt;br /&gt;
The following is a  proposed ''Dictionary '' - the basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added: &lt;br /&gt;
&lt;br /&gt;
 --with-audit-plugin&lt;br /&gt;
&lt;br /&gt;
For example,'' --with-audit-plugin=simple'', where ''simple'' is the name of the audit plugin module&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test ==&lt;br /&gt;
&lt;br /&gt;
Python test system will become aware of the existence of  &amp;quot;simple&amp;quot; json-based  audit plugin module. Running &amp;quot;make check&amp;quot; will result in storing audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a ''Ticket ID'';&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5165</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5165"/>
				<updated>2013-07-29T15:26:26Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. AS_REQ and TGS_REQ:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=1|All phases&lt;br /&gt;
| KDC status || on error ||on error and &amp;quot;ISSUE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The implementors of audit plugin  will be able to extract the following auditable information:&lt;br /&gt;
&lt;br /&gt;
KDC request: &lt;br /&gt;
: requested service principal;&lt;br /&gt;
: client’s principal;&lt;br /&gt;
: KDC options;&lt;br /&gt;
: requested ticket start, end and renew_till times;&lt;br /&gt;
: list of requested addresses;&lt;br /&gt;
: requested enctypes;&lt;br /&gt;
: preauth types&lt;br /&gt;
&lt;br /&gt;
KDC reply:&lt;br /&gt;
: preauth types;&lt;br /&gt;
: TGT, referral TGT or service ticket with the following level of details:&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
&lt;br /&gt;
3. Policy&lt;br /&gt;
:Policies violation - event description, reason and how to fix it;&lt;br /&gt;
4. Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID - hash of the request is recorded as part of audit messages. Using this piece of information an administrator can easily correlate multiple audit events related to a single request.&lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_start(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_kdc_stop(krb5_context context, const int event_id, const int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_asreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgsreq(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2self(krb5_context context, const int event_id, const int status,  audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_s4u2proxy(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_u2u(krb5_context context, const int event_id, const int status, audit_state *state);&lt;br /&gt;
 /* utilities */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_init_kdc_req(krb5_context context, krb5_kdc_req *request,  const krb5_fulladdr *from, audit_state **au_state);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(krb5_context context, const krb5_ticket *ticket, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_req_id(krb5_context context, const krb5_kdc_req *request, char **out);&lt;br /&gt;
&lt;br /&gt;
where ''event_id'' references to the ''Phase'' (left column of [[#Events| events]] table), and ''audit_state'' structure holds the following information:&lt;br /&gt;
&lt;br /&gt;
 typedef struct _audit_state {&lt;br /&gt;
    krb5_kdc_req *req_in;   /* request in the original form */&lt;br /&gt;
    krb5_kdc_req *req_mod;  /* modified (per protocol) request */&lt;br /&gt;
    krb5_kdc_rep  *reply;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    const char    *status; /* KDC status message */&lt;br /&gt;
    char *tkt_in_id;       /* primary (TGT) ticket ID */&lt;br /&gt;
    char *tkt_out_id;      /* derived (service or referral TGT) ticket ID */&lt;br /&gt;
    char *evid_tkt_id;     /* for s4u2proxy - user's evidence ticket ID, for u2u - TGT ticket ID */&lt;br /&gt;
    char *req_in_id;       /* original-request ID */&lt;br /&gt;
    char *req_mod_id;      /* modified-request ID */&lt;br /&gt;
    krb5_int32 sess_etype; /* session key enctype */&lt;br /&gt;
    krb5_int32 srv_etype;  /* enctype of the long-term key of service */&lt;br /&gt;
    krb5_int32 rep_etype;  /* reply-encrypting key enctype */&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean tkt_validated;&lt;br /&gt;
    /* referrals */&lt;br /&gt;
    krb5_data *cl_realm;   /* remote client's realm */&lt;br /&gt;
    /* s4u and u2u */&lt;br /&gt;
    krb5_principal s4u2self_user;  /* impersonated user */&lt;br /&gt;
    krb5_principal s4u2proxy_user; /* delegated user */&lt;br /&gt;
    krb5_principal u2u_user;       /* client for the second ticket */&lt;br /&gt;
    char *violation;               /* local or protocol policy problem */&lt;br /&gt;
 } audit_state;&lt;br /&gt;
&lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char                 *name;&lt;br /&gt;
    int                   conf_options;&lt;br /&gt;
    kau_open_fn           open;&lt;br /&gt;
    kau_close_fn          close;&lt;br /&gt;
    kau_kdc_start_fn      kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn       kdc_stop;&lt;br /&gt;
    kau_as_req_fn         as_req;&lt;br /&gt;
    kau_tgs_req_fn        tgs_req;&lt;br /&gt;
    kau_s4u2self_fn       tgs_s4u2self;&lt;br /&gt;
    kau_s4u2proxy_fn      tgs_s4u2proxy;&lt;br /&gt;
    kau_u2u_fn            tgs_u2u;;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_req_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2self_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_s4u2proxy_fn)(kau_ctx au_ctx, const int event_id, int status,  audit_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_u2u_fn)(kau_ctx au_ctx, const int event_id, int status, audit_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dictionary==&lt;br /&gt;
&lt;br /&gt;
The following are proposed basic field names for JSON parsing:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a Ticket_ID;&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ;&lt;br /&gt;
# Sanitize ''KDC request'' and ''KDC reply'' before passing them to the concrete audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop Audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5164</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5164"/>
				<updated>2013-07-25T22:50:50Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Abandoning &amp;quot;hybrid&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple and flexible, so it could be easily replaced with the OS specific and third-parties implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated data. &lt;br /&gt;
&lt;br /&gt;
1. Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
2. AS_REQ and TGS_REQ:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Phase&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Data to be logged&lt;br /&gt;
! AS_REQ&lt;br /&gt;
! TGS_REQ&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Authenticate request content and client&lt;br /&gt;
| client’s address and port	|| &amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| original KDC request and [[#Request ID| request ID ]] 	|| &amp;amp;#10004;  || &amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
| primary [[#Ticket ID|ticket ID]] || &amp;amp;#10007; ||(S4U:front-end server's) TGT &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=3|Determine service principal &lt;br /&gt;
| modified KDC request and  [[#Request ID|request ID]] ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| cross-realm referral || &amp;amp;#10007; || service principal, TGS &lt;br /&gt;
|-&lt;br /&gt;
|  user-to-user: client in the 2nd ticket || &amp;amp;#10007; ||&amp;amp;#10004; &lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Validate  policies&lt;br /&gt;
| local policy violation ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| protocol constraints  ||&amp;amp;#10007; || S4U2Proxy, S4U2Self&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=5|Issue ticket &lt;br /&gt;
| ticket renewed  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| ticket validated  ||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| session key enctype (short-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| enctype of the service's long-term key||&amp;amp;#10007; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| derived [[#Ticket ID|ticket ID]]|| TGT || service or referral TGT&lt;br /&gt;
|-&lt;br /&gt;
|rowspan=2|Encrypt reply&lt;br /&gt;
| KDC reply ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
| Reply-encrypting key enctype  (long-term)  ||&amp;amp;#10004; || &amp;amp;#10004;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note, that audit plugin implementors will be able to extract the following auditable information:&lt;br /&gt;
&lt;br /&gt;
KDC request: &lt;br /&gt;
: requested service principal;&lt;br /&gt;
: client’s principal;&lt;br /&gt;
: KDC options;&lt;br /&gt;
: requested ticket start, end and renew_till times;&lt;br /&gt;
: list of requested addresses;&lt;br /&gt;
: requested enctypes;&lt;br /&gt;
: preauth types&lt;br /&gt;
&lt;br /&gt;
KDC reply:&lt;br /&gt;
: preauth types;&lt;br /&gt;
: TGT, referral TGT or service ticket with the following level of details:&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other events to consider for the future development:&lt;br /&gt;
:Policy&lt;br /&gt;
::Policies violation - what went wrong and how to prevent it;&lt;br /&gt;
:Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
::long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:  &lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID - hash of the request is recorded as part of audit messages. Using this piece of information an administrator can easily correlate multiple audit events related to a single request.&lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dictionary==&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| TR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a Ticket_ID;&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ etc;&lt;br /&gt;
# Define and make configurable the DETAILED and BASIC levels of the events;&lt;br /&gt;
# Sanitize KDC request and reply before passing them to audit implementation: security sensitive information should not leave KDC boundaries;&lt;br /&gt;
# Develop Audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5147</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5147"/>
				<updated>2013-06-22T02:33:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
===Audit module loaded/unloaded===&lt;br /&gt;
:: Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===KDC started/stopped===&lt;br /&gt;
:: Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
We anticipate that in some cases the multiple levels of details of the audit output will be needed. We suggest having two levels: Detailed and its subset, Basic.&lt;br /&gt;
&lt;br /&gt;
====AS exchange==== &lt;br /&gt;
=====Basic level=====&lt;br /&gt;
: TGT [[#Ticket ID|ticket ID]] (on success);&lt;br /&gt;
: [[#Request ID|request ID]]; &lt;br /&gt;
: client’s address and port;&lt;br /&gt;
: enctype of session key;&lt;br /&gt;
: enctype of reply-encrypting key - client principal's key;&lt;br /&gt;
: KDC request: &lt;br /&gt;
:: requested service principal;&lt;br /&gt;
:: client’s principal;&lt;br /&gt;
=====Detailed level=====&lt;br /&gt;
: KDC status message (on failure);&lt;br /&gt;
: KDC request: &lt;br /&gt;
:: KDC options;&lt;br /&gt;
:: requested ticket start, end and renew_till times;&lt;br /&gt;
:: list of requested addresses;&lt;br /&gt;
:: requested enctypes;&lt;br /&gt;
:: preauth types (on failure);&lt;br /&gt;
: KDC reply:&lt;br /&gt;
:: TGT [[#Ticket details|ticket]] (on success);&lt;br /&gt;
:: preauth types (on failure).&lt;br /&gt;
&lt;br /&gt;
====TGS exchange==== &lt;br /&gt;
=====Basic level=====&lt;br /&gt;
: TGT [[#Ticket ID|ticket ID]] - primary ticket ID;&lt;br /&gt;
: service or referral TGT [[#Ticket ID|ticket ID]] (on success) - derived ticket ID;&lt;br /&gt;
: [[#Request ID|request ID]]; &lt;br /&gt;
: client’s address and port;&lt;br /&gt;
: enctype of session key;&lt;br /&gt;
: enctype of long-term key of the service; &lt;br /&gt;
: enctype of reply-encrypting key; &lt;br /&gt;
: was ticket renewed;&lt;br /&gt;
: was ticket validated;&lt;br /&gt;
: KDC request: &lt;br /&gt;
:: requested service principal;&lt;br /&gt;
:: client’s principal;&lt;br /&gt;
: KDC reply:&lt;br /&gt;
:: service [[#Ticket details|ticket]]  (on success);;&lt;br /&gt;
=====Detailed level=====&lt;br /&gt;
: KDC status message (on failure);&lt;br /&gt;
: KDC request: &lt;br /&gt;
:: KDC options;&lt;br /&gt;
:: requested ticket start, end and renew_till times;&lt;br /&gt;
:: list of requested addresses;&lt;br /&gt;
:: requested enctypes;&lt;br /&gt;
: KDC reply:&lt;br /&gt;
:: preauth types (on failure);&lt;br /&gt;
:: referral TGT [[#Ticket details|ticket]] (on success).&lt;br /&gt;
&lt;br /&gt;
====TGS Extensions====&lt;br /&gt;
=====S4U2self=====&lt;br /&gt;
: entry-point-server's TGT [[#Ticket ID|ticket ID]] - primary ticket ID;&lt;br /&gt;
: [[#Request ID|request ID]]; &lt;br /&gt;
:On error:&lt;br /&gt;
::user's pre-authentication data: name and realm or x509 certificate; &lt;br /&gt;
::local or protocol policy problem (TBD: level of details);&lt;br /&gt;
::KDC status message;&lt;br /&gt;
:On success:&lt;br /&gt;
::end-service or referral TGT [[#Ticket ID|ticket ID]].&lt;br /&gt;
=====S4U2proxy=====&lt;br /&gt;
: entry-point-server's TGT [[#Ticket ID|ticket ID]] - primary ticket ID;&lt;br /&gt;
: [[#Request ID|request ID]]; &lt;br /&gt;
: user's evidence [[#Ticket details|ticket]] - additional ticket in the request;&lt;br /&gt;
:On error:&lt;br /&gt;
::local or protocol policy problem (TBD: level of details);&lt;br /&gt;
::KDC status message;&lt;br /&gt;
:On success:&lt;br /&gt;
::end-service or referral TGT [[#Ticket ID|ticket ID]].&lt;br /&gt;
&lt;br /&gt;
====Other events====&lt;br /&gt;
(future development)&lt;br /&gt;
:Policy&lt;br /&gt;
:: Policies violation when processing requests (AS, TGS, S4U etc);  &lt;br /&gt;
:Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
::long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
====Ticket details====&lt;br /&gt;
:client and server principals;&lt;br /&gt;
:flags;&lt;br /&gt;
:start, end and renew_till times;&lt;br /&gt;
:authtime;&lt;br /&gt;
:authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:  &lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID - hash of the request is recorded as part of audit messages. Using this piece of information an administrator can easily correlate multiple audit events related to a single request.&lt;br /&gt;
&lt;br /&gt;
====Hybrid====&lt;br /&gt;
The proposal is a hybrid of variadic key-type-value triplet (KTV) and one-API-per-event approaches.&lt;br /&gt;
&lt;br /&gt;
On the KDC side call audit event-specific functions, whose input consists of the event-id, event-status and event-specific structure. If event-specific callback is implemented by the audit plugin, strip the event-specific structure from the security sensitive information and then pass the pointer to the event-specific structure to the plugin. Otherwise, fallback to the generic function with variadic KTV arguments. In the latter case all non-string values should be converted into the strings and the key-types serve as a hint to the plugin implementor about the &amp;quot;original&amp;quot; type of the key-value.   &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin event-specific callback is implemented, call it */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req) {&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, try the generic one. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.generic)&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* All values with TYPE_NUM type-hint are string representations of &lt;br /&gt;
     * their numeric conterparts in 'state' structure.&lt;br /&gt;
     */&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, tkt_id,              // state-&amp;gt;tkt_id &lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;req.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;req.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;req.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;req.start&amp;quot;,       TYPE_NUM, req_from,  // state-&amp;gt;req_from&lt;br /&gt;
                   &amp;quot;req.end&amp;quot;,         TYPE_NUM, req_end,   // state-&amp;gt;req_end&lt;br /&gt;
                   &amp;quot;req.renew_till&amp;quot;,  TYPE_NUM, req_time,  // state-&amp;gt;req_rtime &lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;rep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;rep.tkt.flags&amp;quot;,   TYPE_NUM, rep_tkt_flags,    // state-&amp;gt;rep_tkt_flags&lt;br /&gt;
                   &amp;quot;rep.tkt.start&amp;quot;,   TYPE_NUM, rep_tarttime,     // state-&amp;gt;rep_tarttime&lt;br /&gt;
                   &amp;quot;rep.tkt.end&amp;quot;,     TYPE_NUM, rep_endtime,      // pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.renew_till&amp;quot;,  TYPE_NUM, rep_renew_till,      // state-&amp;gt;rep_renew_till&lt;br /&gt;
                   &amp;quot;rep.tkt.authtime&amp;quot;,    TYPE_NUM, rep_authtime,        // state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.key_etype&amp;quot;,  TYPE_NUM, rep_session_enctype, // state-&amp;gt;rep_session_enctype&lt;br /&gt;
    );&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dictionary==&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_in	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| primary (TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id_out	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| derived (service or referral TGT) ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| TR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s address&lt;br /&gt;
|-&lt;br /&gt;
|fromport ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	client’s port&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|sess_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of session key&lt;br /&gt;
|-&lt;br /&gt;
|rep_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of reply-encrypting key&lt;br /&gt;
|-&lt;br /&gt;
|srv_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| enctype of long-term key of the service key&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a Ticket_ID;&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ etc;&lt;br /&gt;
# Define and make configurable the DETAILED and BASIC levels of the events;&lt;br /&gt;
# Develop Audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5146</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5146"/>
				<updated>2013-06-20T19:45:10Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
===Audit module loaded/unloaded===&lt;br /&gt;
:: Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===KDC started/stopped===&lt;br /&gt;
:: Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
We anticipate that in some cases the multiple levels of details of the audit output will be needed. We suggest having two levels: Detailed and its subset, Basic.&lt;br /&gt;
&lt;br /&gt;
====AS exchange==== &lt;br /&gt;
=====Basic level=====&lt;br /&gt;
: TGT [[#Ticket ID|ticket ID]] (on success);&lt;br /&gt;
: [[#Request ID|request ID]]; &lt;br /&gt;
: client’s address and port;&lt;br /&gt;
: chosen by KDC session key enctype;&lt;br /&gt;
: server key enctype;&lt;br /&gt;
: KDC request: &lt;br /&gt;
:: requested service principal;&lt;br /&gt;
:: client’s principal;&lt;br /&gt;
=====Detailed level=====&lt;br /&gt;
: KDC status message (on failure);&lt;br /&gt;
: KDC request: &lt;br /&gt;
:: KDC options;&lt;br /&gt;
:: requested ticket start, end and renew_till times;&lt;br /&gt;
:: list of requested addresses;&lt;br /&gt;
:: requested enctypes;&lt;br /&gt;
:: preauth types (on failure);&lt;br /&gt;
: KDC reply:&lt;br /&gt;
:: TGT [[#Ticket details|ticket]] (on success);&lt;br /&gt;
:: preauth types (on failure).&lt;br /&gt;
&lt;br /&gt;
====TGS exchange==== &lt;br /&gt;
=====Basic level=====&lt;br /&gt;
: TGT [[#Ticket ID|ticket ID]] - primary ticket ID;&lt;br /&gt;
: service or referral TGT [[#Ticket ID|ticket ID]] (on success) - derived ticket ID;&lt;br /&gt;
: [[#Request ID|request ID]]; &lt;br /&gt;
: client’s address and port;&lt;br /&gt;
: chosen by KDC session key enctype;&lt;br /&gt;
: server key enctype;&lt;br /&gt;
: was ticket renewed;&lt;br /&gt;
: was ticket validated;&lt;br /&gt;
: KDC request: &lt;br /&gt;
:: requested service principal;&lt;br /&gt;
:: client’s principal;&lt;br /&gt;
: KDC reply:&lt;br /&gt;
:: service [[#Ticket details|ticket]]  (on success);;&lt;br /&gt;
=====Detailed level=====&lt;br /&gt;
: KDC status message (on failure);&lt;br /&gt;
: KDC request: &lt;br /&gt;
:: KDC options;&lt;br /&gt;
:: requested ticket start, end and renew_till times;&lt;br /&gt;
:: list of requested addresses;&lt;br /&gt;
:: requested enctypes;&lt;br /&gt;
: KDC reply:&lt;br /&gt;
:: preauth types (on failure);&lt;br /&gt;
:: referral TGT [[#Ticket details|ticket]] (on success).&lt;br /&gt;
&lt;br /&gt;
====TGS Extensions====&lt;br /&gt;
=====S4U2self=====&lt;br /&gt;
: entry-point-server's TGT [[#Ticket ID|ticket ID]] - primary ticket ID;&lt;br /&gt;
: [[#Request ID|request ID]]; &lt;br /&gt;
:On error:&lt;br /&gt;
::user's pre-authentication data: name and realm or x509 certificate; &lt;br /&gt;
::local or protocol policy problem (TBD: level of details);&lt;br /&gt;
::KDC status message;&lt;br /&gt;
:On success:&lt;br /&gt;
::end-service or referral TGT [[#Ticket ID|ticket ID]].&lt;br /&gt;
=====S4U2proxy=====&lt;br /&gt;
: entry-point-server's TGT [[#Ticket ID|ticket ID]] - primary ticket ID;&lt;br /&gt;
: [[#Request ID|request ID]]; &lt;br /&gt;
: user's evidence [[#Ticket details|ticket]] - additional ticket in the request;&lt;br /&gt;
:On error:&lt;br /&gt;
::local or protocol policy problem (TBD: level of details);&lt;br /&gt;
::KDC status message;&lt;br /&gt;
:On success:&lt;br /&gt;
::end-service or referral TGT [[#Ticket ID|ticket ID]].&lt;br /&gt;
&lt;br /&gt;
====Other events====&lt;br /&gt;
(future development)&lt;br /&gt;
:Policy&lt;br /&gt;
:: Policies violation when processing requests (AS, TGS, S4U etc);  &lt;br /&gt;
:Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
::long- and short-term keys creation, manipulation, cleaning.&lt;br /&gt;
&lt;br /&gt;
====Ticket details====&lt;br /&gt;
:client and server principals;&lt;br /&gt;
:flags;&lt;br /&gt;
:start, end and renew_till times;&lt;br /&gt;
:authtime;&lt;br /&gt;
:authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
:ticket key type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:  &lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID - hash of the request is recorded as part of audit messages. Using this piece of information an administrator can easily correlate multiple audit events related to a single request.&lt;br /&gt;
&lt;br /&gt;
====Hybrid====&lt;br /&gt;
The proposal is a hybrid of variadic key-type-value triplet (KTV) and one-API-per-event approaches.&lt;br /&gt;
&lt;br /&gt;
On the KDC side call audit event-specific functions, whose input consists of the event-id, event-status and event-specific structure. If event-specific callback is implemented by the audit plugin, strip the event-specific structure from the security sensitive information and then pass the pointer to the event-specific structure to the plugin. Otherwise, fallback to the generic function with variadic KTV arguments. In the latter case all non-string values should be converted into the strings and the key-types serve as a hint to the plugin implementor about the &amp;quot;original&amp;quot; type of the key-value.   &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin event-specific callback is implemented, call it */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req) {&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, try the generic one. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.generic)&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* All values with TYPE_NUM type-hint are string representations of &lt;br /&gt;
     * their numeric conterparts in 'state' structure.&lt;br /&gt;
     */&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, tkt_id,              // state-&amp;gt;tkt_id &lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;req.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;req.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;req.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;req.start&amp;quot;,       TYPE_NUM, req_from,  // state-&amp;gt;req_from&lt;br /&gt;
                   &amp;quot;req.end&amp;quot;,         TYPE_NUM, req_end,   // state-&amp;gt;req_end&lt;br /&gt;
                   &amp;quot;req.renew_till&amp;quot;,  TYPE_NUM, req_time,  // state-&amp;gt;req_rtime &lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;rep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;rep.tkt.flags&amp;quot;,   TYPE_NUM, rep_tkt_flags,    // state-&amp;gt;rep_tkt_flags&lt;br /&gt;
                   &amp;quot;rep.tkt.start&amp;quot;,   TYPE_NUM, rep_tarttime,     // state-&amp;gt;rep_tarttime&lt;br /&gt;
                   &amp;quot;rep.tkt.end&amp;quot;,     TYPE_NUM, rep_endtime,      // pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.renew_till&amp;quot;,  TYPE_NUM, rep_renew_till,      // state-&amp;gt;rep_renew_till&lt;br /&gt;
                   &amp;quot;rep.tkt.authtime&amp;quot;,    TYPE_NUM, rep_authtime,        // state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.key_etype&amp;quot;,  TYPE_NUM, rep_session_enctype, // state-&amp;gt;rep_session_enctype&lt;br /&gt;
    );&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dictionary==&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| 	ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| TR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s address&lt;br /&gt;
|-&lt;br /&gt;
|fromport ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	client’s port&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|key_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| chosen by KDC encryption types (session key, etc) &lt;br /&gt;
|-&lt;br /&gt;
|xrealm|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	referral realm name&lt;br /&gt;
|-&lt;br /&gt;
|altc_princ|| style=&amp;quot;padding-left: 2em &amp;quot;| 	STR	||	alternate client principal (U2U, S4U)&lt;br /&gt;
|-&lt;br /&gt;
|alts_princ	|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	alternate server principal (referral or alternate TGT)&lt;br /&gt;
|-&lt;br /&gt;
|server2 || style=&amp;quot;padding-left: 2em &amp;quot;| STR ||	u2u requested server principal&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_etype	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket key type&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_etype||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a Ticket_ID;&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ etc;&lt;br /&gt;
# Define and make configurable the DETAILED and BASIC levels of the events;&lt;br /&gt;
# Develop Audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5145</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5145"/>
				<updated>2013-06-20T17:02:03Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: s4u changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
===Audit module loaded/unloaded===&lt;br /&gt;
:: Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===KDC started/stopped===&lt;br /&gt;
:: Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
We anticipate that multiple levels of details of the auditable events will be needed. We suggest having to levels: Detailed and its subset, Basic.&lt;br /&gt;
&lt;br /&gt;
====AS exchange==== &lt;br /&gt;
=====Basic level=====&lt;br /&gt;
:: TGT [[#Ticket ID|ticket ID]] (on success);&lt;br /&gt;
:: [[#Request ID|request ID]] &lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC session key enctype;&lt;br /&gt;
:: server key enctype;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: requested service principal;&lt;br /&gt;
::: client’s principal;&lt;br /&gt;
=====Detailed level=====&lt;br /&gt;
:: KDC status message (on failure);&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: kdc options;&lt;br /&gt;
::: requested ticket start, end and renew_till times;&lt;br /&gt;
::: requested enctypes;&lt;br /&gt;
::: preauth types (on failure);&lt;br /&gt;
::: list of requested addresses;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: TGT [[#Ticket details|ticket]] (on success);&lt;br /&gt;
::: preauth types (on failure) .&lt;br /&gt;
&lt;br /&gt;
====TGS exchange==== &lt;br /&gt;
=====Basic level=====&lt;br /&gt;
:: TGT [[#Ticket ID|ticket ID]];&lt;br /&gt;
:: service or referral TGT [[#Ticket ID|ticket ID]] (on success)&lt;br /&gt;
:: [[#Request ID|request ID]] &lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC session key enctype;&lt;br /&gt;
:: server key enctype;&lt;br /&gt;
:: was ticket renewed;&lt;br /&gt;
:: was ticket validated;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: requested service principal;&lt;br /&gt;
::: client’s principal;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: service [[#Ticket details|ticket]]  (on success).&lt;br /&gt;
=====Detailed level=====&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: addresses;&lt;br /&gt;
::: requested enctypes;&lt;br /&gt;
::: KDC options;&lt;br /&gt;
::: requested ticket start, end and renew_till times;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: client principal (on failure);&lt;br /&gt;
::: preauth types (on failure);&lt;br /&gt;
:::referral TGT [[#Ticket details|ticket]] (on success).&lt;br /&gt;
&lt;br /&gt;
====TGS Extensions====&lt;br /&gt;
=====S4U2self=====&lt;br /&gt;
:: entry-point-server's TGT [[#Ticket ID|ticket ID]];&lt;br /&gt;
:: [[#Request ID|request ID]] &lt;br /&gt;
::On error:&lt;br /&gt;
:::user's pre-authentication data: name and realm or x509 certificate; &lt;br /&gt;
:::kdc_status&lt;br /&gt;
:::local or protocol policy problem (with details?)&lt;br /&gt;
::On Success&lt;br /&gt;
:: end-service or referral TGT [[#Ticket ID|ticket ID]] &lt;br /&gt;
=====S4U2proxy=====&lt;br /&gt;
:: entry-point-server's TGT [[#Ticket ID|ticket ID]];&lt;br /&gt;
:: [[#Request ID|request ID]] &lt;br /&gt;
:: user's evidence [[#Ticket details|ticket]];&lt;br /&gt;
::On error:&lt;br /&gt;
:::kdc_status&lt;br /&gt;
:::local or protocol policy problem (with details?)&lt;br /&gt;
::On Success&lt;br /&gt;
:: end-service or referral TGT [[#Ticket ID|ticket ID]] &lt;br /&gt;
&lt;br /&gt;
====Other events====&lt;br /&gt;
(possible future work)&lt;br /&gt;
:Policy&lt;br /&gt;
:: Policies violation when processing requests;  &lt;br /&gt;
::AS request; &lt;br /&gt;
::TGS request; &lt;br /&gt;
::S4U2PROXY request.&lt;br /&gt;
:Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
::long- and short-term keys creation, manipulation and cleaning.&lt;br /&gt;
&lt;br /&gt;
====Ticket details====&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::authentication path - encoded list of transited realms for service ticket or referral TGT (for TGS only);&lt;br /&gt;
::ticket key type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:  &lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
(For example, a successful AS_REQ results into tkt_ID_1. When it is used in TGS_REQ, tkt_ID_1 is logged together with the hash of the newly created ticket, say tkt_ID_2.   If tkt_ID_2 is renewed, and a newly created ticket hash is tkt_ID_3, both tkt_ID_2 and tkt_ID_3 are logged.) &lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID (hash of the request) is recorded as part of audit messages. Using this piece of information an administrator can easily correlate multiple audit events related to a single request.&lt;br /&gt;
&lt;br /&gt;
====Hybrid====&lt;br /&gt;
The proposal is a hybrid of variadic key-type-value triplet (KTV) and one-API-per-event approaches.&lt;br /&gt;
&lt;br /&gt;
On the KDC side call audit event-specific functions, whose input consists of the event-id, event-status and event-specific structure. If event-specific callback is implemented by the audit plugin, strip the event-specific structure from the security sensitive information and then pass the pointer to the event-specific structure to the plugin. Otherwise, fallback to the generic function with variadic KTV arguments. In the latter case all non-string values should be converted into the strings and the key-types serve as a hint to the plugin implementor about the &amp;quot;original&amp;quot; type of the key-value.   &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin event-specific callback is implemented, call it */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req) {&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, try the generic one. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.generic)&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* All values with TYPE_NUM type-hint are string representations of &lt;br /&gt;
     * their numeric conterparts in 'state' structure.&lt;br /&gt;
     */&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, tkt_id,              // state-&amp;gt;tkt_id &lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;req.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;req.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;req.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;req.start&amp;quot;,       TYPE_NUM, req_from,  // state-&amp;gt;req_from&lt;br /&gt;
                   &amp;quot;req.end&amp;quot;,         TYPE_NUM, req_end,   // state-&amp;gt;req_end&lt;br /&gt;
                   &amp;quot;req.renew_till&amp;quot;,  TYPE_NUM, req_time,  // state-&amp;gt;req_rtime &lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;rep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;rep.tkt.flags&amp;quot;,   TYPE_NUM, rep_tkt_flags,    // state-&amp;gt;rep_tkt_flags&lt;br /&gt;
                   &amp;quot;rep.tkt.start&amp;quot;,   TYPE_NUM, rep_tarttime,     // state-&amp;gt;rep_tarttime&lt;br /&gt;
                   &amp;quot;rep.tkt.end&amp;quot;,     TYPE_NUM, rep_endtime,      // pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.renew_till&amp;quot;,  TYPE_NUM, rep_renew_till,      // state-&amp;gt;rep_renew_till&lt;br /&gt;
                   &amp;quot;rep.tkt.authtime&amp;quot;,    TYPE_NUM, rep_authtime,        // state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.key_etype&amp;quot;,  TYPE_NUM, rep_session_enctype, // state-&amp;gt;rep_session_enctype&lt;br /&gt;
    );&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dictionary==&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| 	ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| TR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s address&lt;br /&gt;
|-&lt;br /&gt;
|fromport ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	client’s port&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|key_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| chosen by KDC encryption types (session key, etc) &lt;br /&gt;
|-&lt;br /&gt;
|xrealm|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	referral realm name&lt;br /&gt;
|-&lt;br /&gt;
|altc_princ|| style=&amp;quot;padding-left: 2em &amp;quot;| 	STR	||	alternate client principal (U2U, S4U)&lt;br /&gt;
|-&lt;br /&gt;
|alts_princ	|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	alternate server principal (referral or alternate TGT)&lt;br /&gt;
|-&lt;br /&gt;
|server2 || style=&amp;quot;padding-left: 2em &amp;quot;| STR ||	u2u requested server principal&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_etype	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket key type&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_etype||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a Ticket_ID;&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ etc;&lt;br /&gt;
# Define and make configurable the DETAILED and BASIC levels of the events;&lt;br /&gt;
# Develop Audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5138</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5138"/>
				<updated>2013-06-13T19:23:21Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Added &amp;quot;Request ID&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
===Audit module loaded/unloaded===&lt;br /&gt;
:: Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===KDC started/stopped===&lt;br /&gt;
:: Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
We anticipate that multiple levels of details of the auditable events will be needed. We suggest having to levels: Detailed and its subset, Basic.&lt;br /&gt;
&lt;br /&gt;
====AS exchange==== &lt;br /&gt;
=====Basic level=====&lt;br /&gt;
:: [[#Ticket ID|ticket ID]] (on success);&lt;br /&gt;
:: [[#Request ID|request ID]] &lt;br /&gt;
:: client’s principal;&lt;br /&gt;
:: requested service principal;&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC session key enctype;&lt;br /&gt;
=====Detailed level=====&lt;br /&gt;
:: KDC status message (on failure);&lt;br /&gt;
:: chosen by KDC enctypes (session key, etc);&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: kdc options;&lt;br /&gt;
::: requested ticket start, end and renew_till times;&lt;br /&gt;
::: requested enctypes;&lt;br /&gt;
::: preauth types (on failure);&lt;br /&gt;
::: addresses;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: [[#Ticket details|ticket]];&lt;br /&gt;
::: client principal (on failure);&lt;br /&gt;
::: preauth types (on failure) .&lt;br /&gt;
&lt;br /&gt;
====TGS exchange==== &lt;br /&gt;
=====Basic level=====&lt;br /&gt;
:: primary [[#Ticket ID|ticket ID]] (for example, TGT ticket ID)&lt;br /&gt;
:: derived [[#Ticket ID|ticket ID]] (on success, ticket ID of the newly created ticket)&lt;br /&gt;
:: [[#Request ID|request ID]] &lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC session key enctype;&lt;br /&gt;
:: was ticket renewed;&lt;br /&gt;
:: was ticket validated;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: requested service principal;&lt;br /&gt;
::: client’s principal;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: [[#Ticket details|ticket]] (on success).&lt;br /&gt;
=====Detailed level=====&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: addresses;&lt;br /&gt;
::: requested enctypes;&lt;br /&gt;
::: KDC options;&lt;br /&gt;
::: requested ticket start, end and renew_till times;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: client principal (on failure);&lt;br /&gt;
::: preauth types (on failure);&lt;br /&gt;
&lt;br /&gt;
=====U2U and S4U=====&lt;br /&gt;
::primary [[#Ticket ID|ticket ID]]&lt;br /&gt;
:: derived [[#Ticket ID|ticket ID]] (on success, ticket ID of the newly created ticket)&lt;br /&gt;
:: [[#Request ID|request ID]] &lt;br /&gt;
:: alternate client principal;&lt;br /&gt;
:: alternate server principal;&lt;br /&gt;
:: u2u requested server principal;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: second [[#Ticket details|ticket]];&lt;br /&gt;
&lt;br /&gt;
=====Referrals=====&lt;br /&gt;
::primary [[#Ticket ID|ticket ID]]&lt;br /&gt;
:: derived [[#Ticket ID|ticket ID]] (on success, ticket ID of the newly created ticket)&lt;br /&gt;
:: [[#Request ID|request ID]] &lt;br /&gt;
:: alternate server principal;&lt;br /&gt;
:: referral realm name;&lt;br /&gt;
&lt;br /&gt;
====Other events====&lt;br /&gt;
::Policy&lt;br /&gt;
::: Policies violation when processing requests;  &lt;br /&gt;
:::AS request; &lt;br /&gt;
:::TGS request; &lt;br /&gt;
:::S4U2PROXY request.&lt;br /&gt;
::Secrets (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:::long- and short-term keys creation, manipulation and cleaning.&lt;br /&gt;
&lt;br /&gt;
====Ticket details====&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start, end and renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::transited encoding contents (for TGS only);&lt;br /&gt;
::ticket key type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:  &lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
(For example, a successful AS_REQ results into tkt_ID_1. When it is used in TGS_REQ, tkt_ID_1 is logged together with the hash of the newly created ticket, say tkt_ID_2.   If tkt_ID_2 is renewed, and a newly created ticket hash is tkt_ID_3, both tkt_ID_2 and tkt_ID_3 are logged.) &lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Request ID====&lt;br /&gt;
Request ID (hash of the request) is recorded as part of audit messages. Using this piece of information an administrator can easily correlate multiple audit events related to a single request.&lt;br /&gt;
&lt;br /&gt;
====Hybrid====&lt;br /&gt;
The proposal is a hybrid of variadic key-type-value triplet (KTV) and one-API-per-event approaches.&lt;br /&gt;
&lt;br /&gt;
On the KDC side call audit event-specific functions, whose input consists of the event-id, event-status and event-specific structure. If event-specific callback is implemented by the audit plugin, strip the event-specific structure from the security sensitive information and then pass the pointer to the event-specific structure to the plugin. Otherwise, fallback to the generic function with variadic KTV arguments. In the latter case all non-string values should be converted into the strings and the key-types serve as a hint to the plugin implementor about the &amp;quot;original&amp;quot; type of the key-value.   &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin event-specific callback is implemented, call it */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req) {&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, try the generic one. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.generic)&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* All values with TYPE_NUM type-hint are string representations of &lt;br /&gt;
     * their numeric conterparts in 'state' structure.&lt;br /&gt;
     */&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, tkt_id,              // state-&amp;gt;tkt_id &lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;req.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;req.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;req.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;req.start&amp;quot;,       TYPE_NUM, req_from,  // state-&amp;gt;req_from&lt;br /&gt;
                   &amp;quot;req.end&amp;quot;,         TYPE_NUM, req_end,   // state-&amp;gt;req_end&lt;br /&gt;
                   &amp;quot;req.renew_till&amp;quot;,  TYPE_NUM, req_time,  // state-&amp;gt;req_rtime &lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;rep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;rep.tkt.flags&amp;quot;,   TYPE_NUM, rep_tkt_flags,    // state-&amp;gt;rep_tkt_flags&lt;br /&gt;
                   &amp;quot;rep.tkt.start&amp;quot;,   TYPE_NUM, rep_tarttime,     // state-&amp;gt;rep_tarttime&lt;br /&gt;
                   &amp;quot;rep.tkt.end&amp;quot;,     TYPE_NUM, rep_endtime,      // pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.renew_till&amp;quot;,  TYPE_NUM, rep_renew_till,      // state-&amp;gt;rep_renew_till&lt;br /&gt;
                   &amp;quot;rep.tkt.authtime&amp;quot;,    TYPE_NUM, rep_authtime,        // state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.key_etype&amp;quot;,  TYPE_NUM, rep_session_enctype, // state-&amp;gt;rep_session_enctype&lt;br /&gt;
    );&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dictionary==&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| 	ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| TR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s address&lt;br /&gt;
|-&lt;br /&gt;
|fromport ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	client’s port&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|key_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| chosen by KDC encryption types (session key, etc) &lt;br /&gt;
|-&lt;br /&gt;
|xrealm|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	referral realm name&lt;br /&gt;
|-&lt;br /&gt;
|altc_princ|| style=&amp;quot;padding-left: 2em &amp;quot;| 	STR	||	alternate client principal (U2U, S4U)&lt;br /&gt;
|-&lt;br /&gt;
|alts_princ	|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	alternate server principal (referral or alternate TGT)&lt;br /&gt;
|-&lt;br /&gt;
|server2 || style=&amp;quot;padding-left: 2em &amp;quot;| STR ||	u2u requested server principal&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_etype	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket key type&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_etype||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a Ticket_ID;&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ etc;&lt;br /&gt;
# Define and make configurable the DETAILED and BASIC levels of the events;&lt;br /&gt;
# Develop Audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Geolocation_Policy&amp;diff=5137</id>
		<title>Projects/Geolocation Policy</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Geolocation_Policy&amp;diff=5137"/>
				<updated>2013-06-07T23:11:51Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Initial purpose statement&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Use Case ==&lt;br /&gt;
&lt;br /&gt;
# Person travels abroad.  When authenticating to his corporate Kerberos-enabled system, he uses some location-related measurement Device together with other authentication means.  The information from the Device - such as geographical and/or DNS location - is encrypted and passed to the KDC with the initial request.  There it is evaluated by a designated service and, based on the result of the evaluation, KDC proceeds with issuing, or not, the ticket.&lt;br /&gt;
# Use geolocation for Audit.&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Define a new Geolocation policy and create an infrastructure to allow KDC to deal with the geolocation information.&lt;br /&gt;
&lt;br /&gt;
==Related references==&lt;br /&gt;
&lt;br /&gt;
# [http://http://www.ietf.org/id/draft-ietf-geopriv-held-measurements-07.txt draft-ietf-geopriv-held-measurements-07]&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5135</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5135"/>
				<updated>2013-06-05T21:16:29Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Introduce Basic and Detailed levels&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
===Audit module loaded/unloaded===&lt;br /&gt;
:: Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===KDC started/stopped===&lt;br /&gt;
:: Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
We anticipate that multiple levels of details of the auditable events will be needed. We suggest having to levels: Detailed and its subset, Basic.&lt;br /&gt;
&lt;br /&gt;
====AS exchange==== &lt;br /&gt;
=====Basic level=====&lt;br /&gt;
:: [[#Ticket ID|ticket ID]] (on success);&lt;br /&gt;
:: client’s principal;&lt;br /&gt;
:: requested service principal;&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC enctypes (session key, etc);&lt;br /&gt;
=====Detailed level=====&lt;br /&gt;
:: KDC status message (on failure);&lt;br /&gt;
:: chosen by KDC enctypes (session key, etc);&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: kdc options;&lt;br /&gt;
::: requested ticket start/end/renew_till times;&lt;br /&gt;
::: requested enctypes;&lt;br /&gt;
::: preauth types (on failure);&lt;br /&gt;
::: addresses;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: [[#Ticket details|ticket]];&lt;br /&gt;
::: client principal (on failure);&lt;br /&gt;
::: preauth types (on failure) .&lt;br /&gt;
&lt;br /&gt;
====TGS exchange==== &lt;br /&gt;
=====Basic level=====&lt;br /&gt;
:: primary [[#Ticket ID|ticket ID]] (for example, TGT ticket ID)&lt;br /&gt;
:: derived [[#Ticket ID|ticket ID]] (on success, ticket ID of the newly created ticket)&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC enctypes;&lt;br /&gt;
:: was ticket renewed;&lt;br /&gt;
:: was ticket validated;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: requested service principal;&lt;br /&gt;
::: client’s principal;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: [[#Ticket details|ticket]] (on success).&lt;br /&gt;
=====Detailed level=====&lt;br /&gt;
:: was ticket renewed;&lt;br /&gt;
:: was ticket validated;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: addresses;&lt;br /&gt;
::: requested/available enctypes;&lt;br /&gt;
::: KDC options;&lt;br /&gt;
::: requested ticket start/end/renew_till times;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: client principal (on failure);&lt;br /&gt;
::: preauth types (on failure);&lt;br /&gt;
&lt;br /&gt;
=====U2U and S4U=====&lt;br /&gt;
::primary [[#Ticket ID|ticket ID]]&lt;br /&gt;
:: alternate client principal;&lt;br /&gt;
:: alternate server principal );&lt;br /&gt;
:: u2u requested server principal;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: second [[#Ticket details|ticket]];&lt;br /&gt;
&lt;br /&gt;
=====Referrals=====&lt;br /&gt;
::primary [[#Ticket ID|ticket ID]]&lt;br /&gt;
:: alternate server principal;&lt;br /&gt;
:: referral realm name;&lt;br /&gt;
&lt;br /&gt;
====Policy====&lt;br /&gt;
:: Policies violation when processing requests;  &lt;br /&gt;
::AS request; &lt;br /&gt;
::TGS request; &lt;br /&gt;
::S4U2PROXY request.&lt;br /&gt;
&lt;br /&gt;
====Ticket details====&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start/end/renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::transited encoding contents (for TGS only);&lt;br /&gt;
::ticket key type.&lt;br /&gt;
&lt;br /&gt;
====Secrets====&lt;br /&gt;
:: long-/short-term keys creation/manipulation/cleaning (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:  &lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
(For example, a successful AS_REQ results into tkt_ID_1. When it is used in TGS_REQ, tkt_ID_1 is logged together with the hash of the newly created ticket, say tkt_ID_2.   If tkt_ID_2 is renewed, and a newly created ticket hash is tkt_ID_3, both tkt_ID_2 and tkt_ID_3 are logged.) &lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Hybrid====&lt;br /&gt;
The proposal is a hybrid of variadic key-type-value triplet (KTV) and one-API-per-event approaches.&lt;br /&gt;
&lt;br /&gt;
On the KDC side call audit event-specific functions, whose input consists of the event-id, event-status and event-specific structure. If event-specific callback is implemented by the audit plugin, strip the event-specific structure from the security sensitive information and then pass the pointer to the event-specific structure to the plugin. Otherwise, fallback to the generic function with variadic KTV arguments. In the latter case all non-string values should be converted into the strings and the key-types serve as a hint to the plugin implementor about the &amp;quot;original&amp;quot; type of the key-value.   &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin event-specific callback is implemented, call it */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req) {&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, try the generic one. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.generic)&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* All values with TYPE_NUM type-hint are string representations of &lt;br /&gt;
     * their numeric conterparts in 'state' structure.&lt;br /&gt;
     */&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, tkt_id,              // state-&amp;gt;tkt_id &lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;req.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;req.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;req.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;req.start&amp;quot;,       TYPE_NUM, req_from,  // state-&amp;gt;req_from&lt;br /&gt;
                   &amp;quot;req.end&amp;quot;,         TYPE_NUM, req_end,   // state-&amp;gt;req_end&lt;br /&gt;
                   &amp;quot;req.renew_till&amp;quot;,  TYPE_NUM, req_time,  // state-&amp;gt;req_rtime &lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;rep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;rep.tkt.flags&amp;quot;,   TYPE_NUM, rep_tkt_flags,    // state-&amp;gt;rep_tkt_flags&lt;br /&gt;
                   &amp;quot;rep.tkt.start&amp;quot;,   TYPE_NUM, rep_tarttime,     // state-&amp;gt;rep_tarttime&lt;br /&gt;
                   &amp;quot;rep.tkt.end&amp;quot;,     TYPE_NUM, rep_endtime,      // pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.renew_till&amp;quot;,  TYPE_NUM, rep_renew_till,      // state-&amp;gt;rep_renew_till&lt;br /&gt;
                   &amp;quot;rep.tkt.authtime&amp;quot;,    TYPE_NUM, rep_authtime,        // state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.key_etype&amp;quot;,  TYPE_NUM, rep_session_enctype, // state-&amp;gt;rep_session_enctype&lt;br /&gt;
    );&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dictionary==&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| 	ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| TR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s address&lt;br /&gt;
|-&lt;br /&gt;
|fromport ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	client’s port&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|key_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| chosen by KDC encryption types (session key, etc) &lt;br /&gt;
|-&lt;br /&gt;
|xrealm|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	referral realm name&lt;br /&gt;
|-&lt;br /&gt;
|altc_princ|| style=&amp;quot;padding-left: 2em &amp;quot;| 	STR	||	alternate client principal (U2U, S4U)&lt;br /&gt;
|-&lt;br /&gt;
|alts_princ	|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	alternate server principal (referral or alternate TGT)&lt;br /&gt;
|-&lt;br /&gt;
|server2 || style=&amp;quot;padding-left: 2em &amp;quot;| STR ||	u2u requested server principal&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_etype	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket key type&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_etype||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a Ticket_ID;&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ etc;&lt;br /&gt;
# Define and make configurable the DETAILED and BASIC levels of the events;&lt;br /&gt;
# Develop Audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5134</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5134"/>
				<updated>2013-06-05T17:21:35Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
===Audit module loaded/unloaded===&lt;br /&gt;
:: Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===KDC started/stopped===&lt;br /&gt;
:: Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
====AS exchange==== &lt;br /&gt;
:: [[#Ticket ID|ticket ID]] (if available);&lt;br /&gt;
:: client’s principal;&lt;br /&gt;
:: requested service principal;&lt;br /&gt;
:: KDC status message (“ISSUE” on success);&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC enctypes (session key, etc);&lt;br /&gt;
:: long-/short-term keys creation/manipulation/cleaning (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: kdc options;&lt;br /&gt;
::: requested ticket start/end/renew_till times;&lt;br /&gt;
::: requested/available enctypes;&lt;br /&gt;
::: preauth types (on failure);&lt;br /&gt;
::: addresses;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: [[#Ticket details|ticket]];&lt;br /&gt;
::: client principal (on failure);&lt;br /&gt;
::: preauth types (on failure) .&lt;br /&gt;
&lt;br /&gt;
====TGS exchange==== &lt;br /&gt;
:: [[#Ticket ID|ticket ID]] (if available);&lt;br /&gt;
:: KDC status message (“ISSUE” on success);&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC enctype;&lt;br /&gt;
:: long-/short-term keys creation/manipulation/cleaning (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: referral realm name;&lt;br /&gt;
:: alternate client principal (s4u, u2u);&lt;br /&gt;
:: alternate server principal (referral or alternate TGT);&lt;br /&gt;
:: u2u requested server principal;&lt;br /&gt;
:: was ticket renewed;&lt;br /&gt;
:: was ticket validated;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: requested service principal;&lt;br /&gt;
::: client’s principal;&lt;br /&gt;
::: addresses;&lt;br /&gt;
::: requested/available enctypes;&lt;br /&gt;
::: KDC options;&lt;br /&gt;
::: second [[#Ticket details|ticket]];&lt;br /&gt;
::: requested ticket start/end/renew_till times;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: client principal (on failure);&lt;br /&gt;
::: preauth types (on failure);&lt;br /&gt;
::: [[#Ticket details|ticket]] (on success).&lt;br /&gt;
&lt;br /&gt;
====Policy====&lt;br /&gt;
:: Policies violation when processing requests;  &lt;br /&gt;
::AS request; &lt;br /&gt;
::TGS request; &lt;br /&gt;
::S4U2PROXY request.&lt;br /&gt;
&lt;br /&gt;
====Ticket details====&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start/end/renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::transited encoding contents (for TGS only);&lt;br /&gt;
::ticket key type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:  &lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange.&lt;br /&gt;
&lt;br /&gt;
For the purpose of this project we will create a  private to KDC ticket ID: each successfully created ticket will be hashed and recorded into audit log.  The administrators will correlate the primary and derived ticket IDs after the fact.&lt;br /&gt;
&lt;br /&gt;
(For example, a successful AS_REQ results into tkt_ID_1. When it is used in TGS_REQ, tkt_ID_1 is logged together with the hash of the newly created ticket, say tkt_ID_2.   If tkt_ID_2 is renewed, and a newly created ticket hash is tkt_ID_3, both tkt_ID_2 and tkt_ID_3 are logged.) &lt;br /&gt;
&lt;br /&gt;
For the future, however, we need a more complex system that would allow to tie the tickets from a successful AS_REQ all the way to the application server.  It is marked as an action item in the [[#Future work|this]] section.&lt;br /&gt;
&lt;br /&gt;
====Hybrid====&lt;br /&gt;
The proposal is a hybrid of variadic key-type-value triplet (KTV) and one-API-per-event approaches.&lt;br /&gt;
&lt;br /&gt;
On the KDC side call audit event-specific functions, whose input consists of the event-id, event-status and event-specific structure. If event-specific callback is implemented by the audit plugin, strip the event-specific structure from the security sensitive information and then pass the pointer to the event-specific structure to the plugin. Otherwise, fallback to the generic function with variadic KTV arguments. In the latter case all non-string values should be converted into the strings and the key-types serve as a hint to the plugin implementor about the &amp;quot;original&amp;quot; type of the key-value.   &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin event-specific callback is implemented, call it */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req) {&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, try the generic one. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.generic)&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* All values with TYPE_NUM type-hint are string representations of &lt;br /&gt;
     * their numeric conterparts in 'state' structure.&lt;br /&gt;
     */&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, tkt_id,              // state-&amp;gt;tkt_id &lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;req.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;req.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;req.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;req.start&amp;quot;,       TYPE_NUM, req_from,  // state-&amp;gt;req_from&lt;br /&gt;
                   &amp;quot;req.end&amp;quot;,         TYPE_NUM, req_end,   // state-&amp;gt;req_end&lt;br /&gt;
                   &amp;quot;req.renew_till&amp;quot;,  TYPE_NUM, req_time,  // state-&amp;gt;req_rtime &lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;rep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;rep.tkt.flags&amp;quot;,   TYPE_NUM, rep_tkt_flags,    // state-&amp;gt;rep_tkt_flags&lt;br /&gt;
                   &amp;quot;rep.tkt.start&amp;quot;,   TYPE_NUM, rep_tarttime,     // state-&amp;gt;rep_tarttime&lt;br /&gt;
                   &amp;quot;rep.tkt.end&amp;quot;,     TYPE_NUM, rep_endtime,      // pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.renew_till&amp;quot;,  TYPE_NUM, rep_renew_till,      // state-&amp;gt;rep_renew_till&lt;br /&gt;
                   &amp;quot;rep.tkt.authtime&amp;quot;,    TYPE_NUM, rep_authtime,        // state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.key_etype&amp;quot;,  TYPE_NUM, rep_session_enctype, // state-&amp;gt;rep_session_enctype&lt;br /&gt;
    );&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dictionary==&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| 	ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| TR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s address&lt;br /&gt;
|-&lt;br /&gt;
|fromport ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	client’s port&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|key_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| chosen by KDC encryption types (session key, etc) &lt;br /&gt;
|-&lt;br /&gt;
|xrealm|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	referral realm name&lt;br /&gt;
|-&lt;br /&gt;
|altc_princ|| style=&amp;quot;padding-left: 2em &amp;quot;| 	STR	||	alternate client principal (U2U, S4U)&lt;br /&gt;
|-&lt;br /&gt;
|alts_princ	|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	alternate server principal (referral or alternate TGT)&lt;br /&gt;
|-&lt;br /&gt;
|server2 || style=&amp;quot;padding-left: 2em &amp;quot;| STR ||	u2u requested server principal&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_etype	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket key type&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_cname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || client principal in the second ticket  (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_sname|| style=&amp;quot;padding-left: 2em &amp;quot;| STR || service principal in the second ticket &lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_flags|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_start|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket  start time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_end|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_authtime|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| req.sectkt_etype|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM || second ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_etype||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket key type&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Future work==&lt;br /&gt;
&lt;br /&gt;
# Standardize a Ticket_ID;&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ etc;&lt;br /&gt;
# Define and make configurable the DETAILED and BASIC levels of the events;&lt;br /&gt;
# Develop Audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=5133</id>
		<title>Projects/Documentation Tasks</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=5133"/>
				<updated>2013-06-05T14:28:23Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: /* Administration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To keep track of the various tasks that need to be documented such as function documentation, administration, troubleshooting etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application development ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Designing a new protocol, or extending existing one, to use GSS-API || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing security API|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; GSS-API vs SASL vs KRB5 &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to the similarities and differences between Heimdal and MIT Kerberos API &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| GSS-API || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A basic introduction to GSS-API, making use of the sample client and server, with special attention paid to Kerberos-related GSS-API issues&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to tell the GSS-API library on the client side where the existing Kerberos ticket cache is &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to write mechanism-independent GSS-API code&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to GSS-API naming as compared to Kerberos principal naming&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Using IAKERB&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Delegating credentials&amp;lt;/ul&amp;gt;|| GH ||2012-10-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Available extensions&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating the flags set on the connection  to ensure things like mutual authentication, confidentiality, integrity, replay protection, and sequence protection&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Krb5 library guide|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Kerberos prompter behavior&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  An introduction to ticket caches and keytabs and their corresponding APIs &amp;lt;/ul&amp;gt;|| KR || || || under review&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the pre-auth mechanisms, FAST&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the principal manipulation and parsing&amp;lt;/ul&amp;gt;|| TY || TBD || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Password change including the automatic internal support for password change on expired passwords if a prompter is provided&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  krb5_appdefault_* functions and their alternatives &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Completed task&lt;br /&gt;
! Author&lt;br /&gt;
! Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Choosing security API|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Acceptor naming - How to get servers to use any key in a keytab&amp;lt;/ul&amp;gt;|| GH||2012-03-01|| || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Anonymous credentials&amp;lt;/ul&amp;gt; || GH || 2012-10-01 || || &lt;br /&gt;
|-&lt;br /&gt;
| Developing plugins|| GH ||2012-03-08||  || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to developing plugins &amp;lt;/ul&amp;gt;|| || || || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Overview of existing pluggable interfaces   &amp;lt;/ul&amp;gt;|| ||  ||ZT reviewed profile plugin || &lt;br /&gt;
|-&lt;br /&gt;
| A more advanced introduction to using the Kerberos libraries for initial authentication, focusing on the authentication steps, validating initial credential|| TY || 2012-04-27 || ||&lt;br /&gt;
|-&lt;br /&gt;
| MIT Kerberos features : quick facts || ZT || ongoing || || &lt;br /&gt;
|-&lt;br /&gt;
| How to build Kerberos from source || ZT || || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Introduction to Kerberos system || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Man page &amp;lt;/ul&amp;gt;|| TH || 2012-08-15|| || in progress&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;General overview&amp;lt;/ul&amp;gt;|| TH ||2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Intro for admins&amp;lt;/ul&amp;gt;|| TH ||2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Technical overview&amp;lt;/ul&amp;gt;|| TH ||2012-07-15 || ||in progress&lt;br /&gt;
|-&lt;br /&gt;
|Setting a new realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Choosing backend: LDAP vs DB2&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; DNS configuration and SRV records - how they are used, in what order&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing encryption types for principals|| TY|| 2012-12-14|| ||under review&lt;br /&gt;
|-&lt;br /&gt;
| Upgrading a Kerberos infrastructure (order, backward compatibility) || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Integration Kerberos with Login System|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Difference between real Kerberos authentication, Kerberos password verification on the server side, and &amp;quot;LDAP authentication&amp;quot; in a Kerberos environment&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating Kerberos tickets&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Clear text password over HTTPS &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuring with pam_krb5 module&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Storing/locating keytab&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Cross-realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;cross-realm interaction with AD &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Transitive trust&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Referrals&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Performance|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tuning tips&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tradeoffs&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin interface|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Keying workstation/ host key setting&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Using Smartcard with PKINIT|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Kerberized ssh|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuration&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Cross-realm and ssh&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| A guide to principal naming basics and structure|| ZT ||2013-03-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| Troubleshooting|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Troubleshooting  errors&amp;lt;/ul&amp;gt; || ZT || ongoing|| ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Realm renaming &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Forgot Kerberos Master Key|| GH || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Basic concepts (passwd policy, ticket ) || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Approaches to authorization -- centralized vs distributed, etc. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Completed task&lt;br /&gt;
! Author&lt;br /&gt;
! Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Replication || ZT|| || || &lt;br /&gt;
|-&lt;br /&gt;
| Reverse DNS|| TY|| 2012-12-12|| || &lt;br /&gt;
|-&lt;br /&gt;
| Selecting and configuring plugins|| GH ||2012-03-15|| || &lt;br /&gt;
|-&lt;br /&gt;
| Anonymity support|| GH ||2012-10-01 || || &lt;br /&gt;
|-&lt;br /&gt;
| Trace logging ||GH ||2012-03-22|| ||&lt;br /&gt;
|-&lt;br /&gt;
| Using LDAP server for Kerberos backend|| ZT || || || Ubuntu 10.4 (lucid) &lt;br /&gt;
|-&lt;br /&gt;
| Acceptable date and time formats || ZT || 2012-07-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
| kadm5.acl man page  || ZT || 2012-08-15 || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Why Kerberos system is suitable for the internet, not only for the enterprise || TY || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Impact RC4 vulnerabilities on Kerberos || TY || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API documentation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most commonly used API functions (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tier 1 - Highest priority&lt;br /&gt;
|-&lt;br /&gt;
! Completed API&lt;br /&gt;
!  Author&lt;br /&gt;
! Reviewer&lt;br /&gt;
!  Date&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|krb5_build_principal_alloc_va [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_alloc_va.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal_ext [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_close.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default_name.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_destroy [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_destroy.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_dup [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_cc_dup.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_get_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_get_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_get_type [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_type.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_initialize [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_initialize.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_new_unique [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_new_unique.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_resolve [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_resolve.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_change_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_change_password.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_context.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_error_message.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_fwd_tgt_cred  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_fwd_tgt_cred.html]|| ZT || GH|| || Needs example&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_default_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_error_message.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_host_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_credentials  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_credentials.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_fallback_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_fallback_host_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_keytab  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_keytab.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_alloc  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_alloc.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_free  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_free.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_get_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_get_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_init  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_init.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_address_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_address_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_anonymous  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_anonymous.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_canonicalize  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_canonicalize.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_change_password_prompt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_change_password_prompt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_etype_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_etype_list.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_expire_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_expire_callback.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache_name   [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_forwardable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_forwardable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_out_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_out_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_pa  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_pa.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_preauth_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_preauth_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_proxiable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_proxiable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_renew_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_renew_life.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_salt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_salt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_tkt_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_tkt_life.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_profile  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_profile.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_prompt_types  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_prompt_types.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_renewed_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_renewed_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_validated_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_validated_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_context.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_secure_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_secure_context.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_config_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_config_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_thread_safe  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_thread_safe.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_close.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_type  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_type.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_resolve  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_resolve.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kuserok  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kuserok.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name_flags.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_principal_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_any_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_any_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_prompter_posix  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_prompter_posix.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_realm_compare  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_realm_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth.html]||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth_version  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth_version.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_default_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_set_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_password_using_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password_using_ccache.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_principal_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_principal_realm.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_callback.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_filename  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_filename.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_sname_to_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_sname_to_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_unparse_name_flags.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_flags_ext.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_us_timeofday  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_us_timeofday.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_verify_authdata_kdc_issued  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_verify_authdata_kdc_issued.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
We may want to have more examples for some of the common API functions.&lt;br /&gt;
&lt;br /&gt;
== Manpage proofreading ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! manpage&lt;br /&gt;
! original&lt;br /&gt;
! reviewer&lt;br /&gt;
! comments&lt;br /&gt;
|-&lt;br /&gt;
| k5identity.5 || src/gen-manpages/k5identity.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5login.5 || src/gen-manpages/k5login.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5srvutil.1 || src/kadmin/cli/k5srvutil.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin.1 || src/kadmin/cli/kadmin.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmind.8 || src/kadmin/server/kadmind.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_ldap_util.8 || src/plugins/kdb/ldap/ldap_util/kdb5_ldap_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_util.8 || src/kadmin/dbutil/kdb5_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdc.conf.5 || src/config-files/kdc.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdestroy.1 || src/clients/kdestroy/kdestroy.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kinit.1 || src/clients/kinit/kinit.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpasswd.1 || src/clients/kpasswd/kpasswd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kprop.8 || src/slave/kprop.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpropd.8 || src/slave/kpropd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kproplog.8 || src/slave/kproplog.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5-send-pr.1 || src/util/send-pr/send-pr.1 || || copyright issues. Removed from the documentation&lt;br /&gt;
|-&lt;br /&gt;
| krb5.conf.5 || src/config-files/krb5.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5kdc.8 || src/kdc/krb5kdc.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| ksu.1 || src/clients/ksu/ksu.M || GH || needs rewrite&lt;br /&gt;
|-&lt;br /&gt;
| kswitch.1 || src/clients/kswitch/kswitch.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kvno.1 || src/clients/kvno/kvno.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sclient.1 || src/appl/sample/sclient/sclient.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sserver.8 || src/appl/sample/sserver/sserver.M || GH ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abbreviations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! abbreviation&lt;br /&gt;
! full names?&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| GH || Greg Hudson&lt;br /&gt;
|-&lt;br /&gt;
| KR || Ken Raeburn&lt;br /&gt;
|-&lt;br /&gt;
| MIT || MITKC group&lt;br /&gt;
|-&lt;br /&gt;
| NW ||  Nico Williams&lt;br /&gt;
|-&lt;br /&gt;
| TH || Thomas  Hardjono&lt;br /&gt;
|-&lt;br /&gt;
| TY || Tom Yu&lt;br /&gt;
|-&lt;br /&gt;
| ZT || Zhanna Tsitkov&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5132</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5132"/>
				<updated>2013-05-31T20:47:52Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Updated Future Work section and other minor changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
===Audit module loaded/unloaded===&lt;br /&gt;
:: Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===KDC started/stopped===&lt;br /&gt;
:: Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
====AS exchange==== &lt;br /&gt;
:: [[#Ticket ID|ticket ID]] (if available);&lt;br /&gt;
:: client’s principal;&lt;br /&gt;
:: requested service principal;&lt;br /&gt;
:: KDC status message (“ISSUE” on success);&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: preauth error;&lt;br /&gt;
:: chosen by KDC enctype;&lt;br /&gt;
:: long-/short-term keys cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: kdc options;&lt;br /&gt;
::: requested ticket start/end/renew_till times;&lt;br /&gt;
::: requested/available enctypes;&lt;br /&gt;
::: 2nd [[#Ticket details|ticket]];&lt;br /&gt;
::: authdata types;&lt;br /&gt;
::: preauth types;&lt;br /&gt;
::: addresses;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: [[#Ticket details|ticket]];&lt;br /&gt;
::: client principal;&lt;br /&gt;
::: preauth types.&lt;br /&gt;
&lt;br /&gt;
====TGS exchange==== &lt;br /&gt;
:: [[#Ticket ID|ticket ID]] (if available);&lt;br /&gt;
:: KDC status message (“ISSUE” on success);&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC enctype;&lt;br /&gt;
:: long-/short-term keys cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: cross realm name;&lt;br /&gt;
:: alternate client principal;&lt;br /&gt;
:: alternate server principal;&lt;br /&gt;
:: u2u requested server principal;&lt;br /&gt;
:: was ticket renewed;&lt;br /&gt;
:: was ticket validated;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: requested service principal;&lt;br /&gt;
::: client’s principal;&lt;br /&gt;
::: addresses;&lt;br /&gt;
::: requested/available enctypes;&lt;br /&gt;
::: KDC options;&lt;br /&gt;
::: number of second [[#Ticket details|tickets]];&lt;br /&gt;
::: requested ticket start/end/renew_till times;&lt;br /&gt;
::: authdata types;&lt;br /&gt;
::: preauth types;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: client principal;&lt;br /&gt;
::: preauth types;&lt;br /&gt;
::: [[#Ticket details|ticket]].&lt;br /&gt;
&lt;br /&gt;
====Policy====&lt;br /&gt;
:: Policies violation when processing requests;  &lt;br /&gt;
::AS request; &lt;br /&gt;
::TGS request; &lt;br /&gt;
::S4U2PROXY request.&lt;br /&gt;
&lt;br /&gt;
====Ticket details====&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start/end/renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::transited encoding type and contents;&lt;br /&gt;
::key type;&lt;br /&gt;
::addresses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:  &lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
: Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
: Ticket ID is created as a  hash of AS session key or client principal name plus timestamp or some other way;&lt;br /&gt;
&lt;br /&gt;
====Hybrid====&lt;br /&gt;
The proposal is a hybrid of variadic key-type-value triplet (KTV) and one-API-per-event approaches.&lt;br /&gt;
&lt;br /&gt;
On the KDC side call audit event-specific functions, whose input consists of the event-id, event-status and event-specific structure. If event-specific callback is implemented by the audit plugin, strip the event-specific structure from the security sensitive information and then pass the pointer to the event-specific structure to the plugin. Otherwise, fallback to the generic function with variadic KTV arguments. In the latter case all non-string values should be converted into the strings and the key-types serve as a hint to the plugin implementor about the &amp;quot;original&amp;quot; type of the key-value.   &lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin event-specific callback is implemented, call it */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req) {&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, try the generic one. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.generic)&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* All values with TYPE_NUM type-hint are string representations of &lt;br /&gt;
     * their numeric conterparts in 'state' structure.&lt;br /&gt;
     */&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, tkt_id,              // state-&amp;gt;tkt_id &lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   &amp;quot;skey_etype&amp;quot;,         TYPE_NUM, session_key_enctype, //  state-&amp;gt;session_key_enctype&lt;br /&gt;
                   &amp;quot;pa_error&amp;quot;,           TYPE_NUM, preauth_err,         //  state-&amp;gt;preauth_err&lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;req.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;req.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;req.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;req.start&amp;quot;,       TYPE_NUM, req_from,  // state-&amp;gt;req_from&lt;br /&gt;
                   &amp;quot;req.end&amp;quot;,         TYPE_NUM, req_end,   // state-&amp;gt;req_end&lt;br /&gt;
                   &amp;quot;req.renew_till&amp;quot;,  TYPE_NUM, req_time,  // state-&amp;gt;req_rtime &lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;rep.client&amp;quot;,      TYPE_STR, state-&amp;gt;rep_client,&lt;br /&gt;
                   &amp;quot;rep.server&amp;quot;,      TYPE_STR, state-&amp;gt;rep_server,&lt;br /&gt;
                   &amp;quot;rep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;rep.tkt.flags&amp;quot;,   TYPE_NUM, rep_tkt_flags,    // state-&amp;gt;rep_tkt_flags&lt;br /&gt;
                   &amp;quot;rep.tkt.start&amp;quot;,   TYPE_NUM, rep_tarttime,     // state-&amp;gt;rep_tarttime&lt;br /&gt;
                   &amp;quot;rep.tkt.end&amp;quot;,     TYPE_NUM, rep_endtime,      // pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.renew_till&amp;quot;,  TYPE_NUM, rep_renew_till,      // state-&amp;gt;rep_renew_till&lt;br /&gt;
                   &amp;quot;rep.tkt.authtime&amp;quot;,    TYPE_NUM, rep_authtime,        // state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.tr_type&amp;quot;,     TYPE_NUM, rep_transited_type   // state-&amp;gt;rep_transited_type&lt;br /&gt;
                   &amp;quot;rep.tkt.skey_etype&amp;quot;,  TYPE_NUM, rep_session_enctype, // state-&amp;gt;rep_session_enctype&lt;br /&gt;
                   &amp;quot;rep.tkt.caddrs&amp;quot;,      TYPE_STR, state-&amp;gt;rep_caddrs&lt;br /&gt;
    );&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dictionary==&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| 	ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| TR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s address&lt;br /&gt;
|-&lt;br /&gt;
|fromport ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	client’s port&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR || Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| pa_err	||  style=&amp;quot;padding-left: 2em &amp;quot;|  NUM	 ||	preauth error&lt;br /&gt;
|-&lt;br /&gt;
|skey_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| chosen by KDC session key enc type&lt;br /&gt;
|-&lt;br /&gt;
|skey_cleared ||  style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	|| was session key cleared&lt;br /&gt;
|-&lt;br /&gt;
|xrealm|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	cross realm name&lt;br /&gt;
|-&lt;br /&gt;
|altc_princ|| style=&amp;quot;padding-left: 2em &amp;quot;| 	STR	||	alternate client principal&lt;br /&gt;
|-&lt;br /&gt;
|alts_princ	|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	alternate server principal&lt;br /&gt;
|-&lt;br /&gt;
|server2 || style=&amp;quot;padding-left: 2em &amp;quot;| STR ||	u2u requested server principal&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|tkt_validated|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket validated&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	preauth types&lt;br /&gt;
|-&lt;br /&gt;
|req.ad_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	authdata types&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
| req.num_secondtkt|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM ||	 	number of second tickets (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply preauth types&lt;br /&gt;
|-&lt;br /&gt;
| rep.caddrs	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	addresses in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.ad_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	ticket authdata types&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_type|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| ticket transited type&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Future work ==&lt;br /&gt;
&lt;br /&gt;
# Standardize a Ticket_ID;&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ etc;&lt;br /&gt;
# Define and make configurable the DETAILED and BASIC levels of the events;&lt;br /&gt;
# Develop Audit system for Preauth and Authdata mechanisms.&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5129</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5129"/>
				<updated>2013-05-29T18:26:29Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Extended Dictionary section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
===Audit module loaded/unloaded===&lt;br /&gt;
:: Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===KDC started/stopped===&lt;br /&gt;
:: Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
====AS exchange==== &lt;br /&gt;
:: [[#Ticket ID|ticket ID]] (if available);&lt;br /&gt;
:: KDC time;&lt;br /&gt;
:: client’s principal;&lt;br /&gt;
:: requested service principal;&lt;br /&gt;
:: KDC status message (“ISSUE” on success);&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: PA error;&lt;br /&gt;
:: chosen by KDC enctype;&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: kdc options;&lt;br /&gt;
::: requested ticket start/end/renew_till times;&lt;br /&gt;
::: requested/available enctypes;&lt;br /&gt;
::: 2nd [[#Ticket details|ticket]];&lt;br /&gt;
::: AD type;&lt;br /&gt;
::: PA type;&lt;br /&gt;
::: addresses;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: [[#Ticket details|ticket]];&lt;br /&gt;
::: client principal;&lt;br /&gt;
::: PA type.&lt;br /&gt;
&lt;br /&gt;
====TGS exchange==== &lt;br /&gt;
:: [[#Ticket ID|ticket ID]] (if available);&lt;br /&gt;
:: KDC time;&lt;br /&gt;
:: KDC status message (“ISSUE” on success);&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC enctype;&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: client’s flags;&lt;br /&gt;
:: cross realm name;&lt;br /&gt;
:: alternate client principal;&lt;br /&gt;
:: alternate server principal;&lt;br /&gt;
:: u2u requested server principal;&lt;br /&gt;
:: is it referral request;&lt;br /&gt;
:: was ticket renewed;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: requested service principal;&lt;br /&gt;
::: client’s principal;&lt;br /&gt;
::: addresses;&lt;br /&gt;
::: requested/available enctypes;&lt;br /&gt;
::: KDC options;&lt;br /&gt;
::: number of second [[#Ticket details|tickets]];&lt;br /&gt;
::: requested ticket start/end/renew_till times;&lt;br /&gt;
::: AD type;&lt;br /&gt;
::: PA type;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: client principal;&lt;br /&gt;
::: PA type;&lt;br /&gt;
::: [[#Ticket details|ticket]].&lt;br /&gt;
&lt;br /&gt;
====Policy====&lt;br /&gt;
:: Policies violation when processing requests;  &lt;br /&gt;
::AS request; &lt;br /&gt;
::TGS request; &lt;br /&gt;
::S4U2PROXY request.&lt;br /&gt;
&lt;br /&gt;
====Ticket details====&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags;&lt;br /&gt;
::start/end/renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::transited encoding type and contents;&lt;br /&gt;
::key type;&lt;br /&gt;
::addresses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:  &lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
: Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
: Ticket ID is created as a  hash of AS session key or client principal name plus timestamp or some other way;&lt;br /&gt;
: TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
====Hybrid====&lt;br /&gt;
The proposal is a hybrid of variadic key-type-value triplet (KTV) and one-API-per-event approaches.&lt;br /&gt;
&lt;br /&gt;
On the KDC side call audit event-specific functions, whose input consists of the event-id, event-status and event-specific structure. If event-specific callback is implemented by the audit plugin, strip the event-specific structure from the security sensitive information and then pass the pointer to the event-specific structure to the plugin. Otherwise, fallback to the generic function with variadic KTV arguments. In the latter case all non-string values should be converted into the strings and the key-types serve as a hint to the plugin implementor about the &amp;quot;original&amp;quot; type of the key-value.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin event-specific callback is implemented, call it */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req) {&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, try the generic one. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.generic)&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* All values with TYPE_NUM type-hint are string representations of &lt;br /&gt;
     * their numeric conterparts in 'state' structure.&lt;br /&gt;
     */&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, tkt_id,              // state-&amp;gt;tkt_id &lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   &amp;quot;skey_etype&amp;quot;,         TYPE_NUM, session_key_enctype, //  state-&amp;gt;session_key_enctype&lt;br /&gt;
                   &amp;quot;pa_error&amp;quot;,           TYPE_NUM, preauth_err,         //  state-&amp;gt;preauth_err&lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;req.msg_type&amp;quot;,    TYPE_STR, state-&amp;gt;req_msg_type,&lt;br /&gt;
                   &amp;quot;req.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;req.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;req.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;req.start&amp;quot;,       TYPE_NUM, req_from,  // state-&amp;gt;req_from&lt;br /&gt;
                   &amp;quot;req.end&amp;quot;,         TYPE_NUM, req_end,   // state-&amp;gt;req_end&lt;br /&gt;
                   &amp;quot;req.renew_till&amp;quot;,  TYPE_NUM, req_time,  // state-&amp;gt;req_rtime &lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;rep.msg_type&amp;quot;,    TYPE_STR,state-&amp;gt;rep_msg_type,&lt;br /&gt;
                   &amp;quot;rep.client&amp;quot;,      TYPE_STR, state-&amp;gt;rep_client,&lt;br /&gt;
                   &amp;quot;rep.server&amp;quot;,      TYPE_STR, state-&amp;gt;rep_server,&lt;br /&gt;
                   &amp;quot;rep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;rep.tkt.flags&amp;quot;,   TYPE_NUM, rep_tkt_flags,    // state-&amp;gt;rep_tkt_flags&lt;br /&gt;
                   &amp;quot;rep.tkt.start&amp;quot;,   TYPE_NUM, rep_tarttime,     // state-&amp;gt;rep_tarttime&lt;br /&gt;
                   &amp;quot;rep.tkt.end&amp;quot;,     TYPE_NUM, rep_endtime,      // pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.renew_till&amp;quot;,  TYPE_NUM, rep_renew_till,      // state-&amp;gt;rep_renew_till&lt;br /&gt;
                   &amp;quot;rep.tkt.authtime&amp;quot;,    TYPE_NUM, rep_authtime,        // state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;rep.tkt.tr_type&amp;quot;,     TYPE_NUM, rep_transited_type   // state-&amp;gt;rep_transited_type&lt;br /&gt;
                   &amp;quot;rep.tkt.skey_etype&amp;quot;,  TYPE_NUM, rep_session_enctype, // state-&amp;gt;rep_session_enctype&lt;br /&gt;
                   &amp;quot;rep.tkt.caddrs&amp;quot;,      TYPE_STR, state-&amp;gt;rep_caddrs&lt;br /&gt;
    );&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dictionary==&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border: 3px solid #59121e&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Key&lt;br /&gt;
! style=&amp;quot;padding-left: 2em; padding-right: 2em;&amp;quot; | Type&lt;br /&gt;
! Comments&lt;br /&gt;
|-&lt;br /&gt;
| tkt_id	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	|| 	ticket ID&lt;br /&gt;
|-&lt;br /&gt;
| kdc_time	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC time&lt;br /&gt;
|-&lt;br /&gt;
| client	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s principal&lt;br /&gt;
|-&lt;br /&gt;
| service	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| kdc_status	||  style=&amp;quot;padding-left: 2em &amp;quot;| TR||	KDC status (“ISSUE” on success)&lt;br /&gt;
|-&lt;br /&gt;
| fromaddr	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	client’s address&lt;br /&gt;
|-&lt;br /&gt;
|fromport ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	client’s port&lt;br /&gt;
|-&lt;br /&gt;
| full_address	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	 Alternative to  &amp;quot;fromport&amp;quot;/&amp;quot;fromaddr&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| pa_err	||  style=&amp;quot;padding-left: 2em &amp;quot;|  NUM	 ||	PA error&lt;br /&gt;
|-&lt;br /&gt;
|skey_etype ||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| chosen by KDC session key enc type&lt;br /&gt;
|-&lt;br /&gt;
|skey_cleared ||  style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	|| was session key cleared&lt;br /&gt;
|-&lt;br /&gt;
|xrealm|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	cross realm name&lt;br /&gt;
|-&lt;br /&gt;
|altc_princ|| style=&amp;quot;padding-left: 2em &amp;quot;| 	STR	||	alternate client principal&lt;br /&gt;
|-&lt;br /&gt;
|alts_princ	|| style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	alternate server principal&lt;br /&gt;
|-&lt;br /&gt;
|server2 || style=&amp;quot;padding-left: 2em &amp;quot;| STR ||	u2u requested server principal&lt;br /&gt;
|-&lt;br /&gt;
|is_referral|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	is it referral request&lt;br /&gt;
|-&lt;br /&gt;
|tkt_renewed|| style=&amp;quot;padding-left: 2em &amp;quot;| BOOL	 ||	was ticket renewed&lt;br /&gt;
|-&lt;br /&gt;
|req.addresses	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	requested addresses&lt;br /&gt;
|-&lt;br /&gt;
|req.avail_etypes ||  style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested/available enc types&lt;br /&gt;
|-&lt;br /&gt;
|req.kdc_options	||  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	KDC options (forwardable, allow_postdate etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.pa_type	||  style=&amp;quot;padding-left: 2em &amp;quot;| STR||	PA type&lt;br /&gt;
|-&lt;br /&gt;
|req.ad_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	AD type&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket start time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_end	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket end time&lt;br /&gt;
|-&lt;br /&gt;
|req.tkt_renew_till	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	requested ticket renew-till time&lt;br /&gt;
|-&lt;br /&gt;
| req.num_secondtkt|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM ||	 	number of second tickets (U2U etc)&lt;br /&gt;
|-&lt;br /&gt;
|req.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	requested service principal&lt;br /&gt;
|-&lt;br /&gt;
| req.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client's principal&lt;br /&gt;
|-&lt;br /&gt;
|rep.sname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	service principal in ticket&lt;br /&gt;
|- &lt;br /&gt;
| rep.cname	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	||	client principal in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.pa_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	reply PA type&lt;br /&gt;
|-&lt;br /&gt;
| rep.caddrs	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	addresses in ticket&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_flags	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket flags&lt;br /&gt;
|-&lt;br /&gt;
| rep.ad_type	||   style=&amp;quot;padding-left: 2em &amp;quot;| STR	 ||	ticket AD type&lt;br /&gt;
|-&lt;br /&gt;
| rep.rep_authtime	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket authtime&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_start	||   style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 || ticket start time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_end ||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket end time&lt;br /&gt;
|-&lt;br /&gt;
| rep.tkt_renew_till||	  style=&amp;quot;padding-left: 2em &amp;quot;| NUM	 ||	ticket renewed-till time&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_type|| style=&amp;quot;padding-left: 2em &amp;quot;| NUM	|| ticket transited type&lt;br /&gt;
|-&lt;br /&gt;
|rep.tr_contents|| style=&amp;quot;padding-left: 2em &amp;quot;| STR||	ticket transited-realms list&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Future work ==&lt;br /&gt;
&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ etc;&lt;br /&gt;
# Define and make configurable the DETAILED and BASIC levels of the events.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5128</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5128"/>
				<updated>2013-05-28T16:12:27Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Add &amp;quot;Future work&amp;quot;  and more details on events&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
===Audit module loaded/unloaded===&lt;br /&gt;
:: Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===KDC started/stopped===&lt;br /&gt;
:: Startup and shutdown of the KDC must be recorded by audit system;&lt;br /&gt;
&lt;br /&gt;
===Authentication===&lt;br /&gt;
(Common Criteria Class FIA) &lt;br /&gt;
&lt;br /&gt;
====AS exchange==== &lt;br /&gt;
:: [[#Ticket ID|ticket ID]] (if available);&lt;br /&gt;
:: KDC time;&lt;br /&gt;
:: client’s principal;&lt;br /&gt;
:: requested service principal;&lt;br /&gt;
:: KDC status message (“ISSUE” on success);&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: PA error;&lt;br /&gt;
:: chosen by KDC enctype;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: kdc options;&lt;br /&gt;
::: requested ticket start/end/renew_till times;&lt;br /&gt;
::: requested/available enctypes;&lt;br /&gt;
::: 2nd [[#Ticket details||ticket]];&lt;br /&gt;
::: AD type;&lt;br /&gt;
::: PA type;&lt;br /&gt;
::: addresses;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: [[#Ticket details||ticket]];&lt;br /&gt;
::: client principal;&lt;br /&gt;
::: PA type.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====TGS exchange==== &lt;br /&gt;
:: [[#Ticket ID|ticket ID]] (if available);&lt;br /&gt;
:: KDC time;&lt;br /&gt;
:: KDC status message (“ISSUE” on success);&lt;br /&gt;
:: client’s address and port;&lt;br /&gt;
:: chosen by KDC enctype;&lt;br /&gt;
:: client’s flags;&lt;br /&gt;
:: cross realm name;&lt;br /&gt;
:: alternate client principal;&lt;br /&gt;
:: alternate server principal;&lt;br /&gt;
:: u2u requested server principal;&lt;br /&gt;
:: is it referral request;&lt;br /&gt;
:: was ticket renewed;&lt;br /&gt;
:: kdc request: &lt;br /&gt;
::: requested service principal;&lt;br /&gt;
::: client’s principal;&lt;br /&gt;
::: addresses;&lt;br /&gt;
::: requested/available enctypes;&lt;br /&gt;
::: KDC options;&lt;br /&gt;
::: number of second tickets;&lt;br /&gt;
::: requested ticket start/end/renew_till times;&lt;br /&gt;
::: AD type;&lt;br /&gt;
::: PA type;&lt;br /&gt;
:: kdc reply:&lt;br /&gt;
::: client principal;&lt;br /&gt;
::: PA type;&lt;br /&gt;
::: [[#Ticket details||ticket]].&lt;br /&gt;
&lt;br /&gt;
====Policy====&lt;br /&gt;
:: Policies violation when processing requests;  &lt;br /&gt;
::AS request; &lt;br /&gt;
::TGS request; &lt;br /&gt;
::S4U2PROXY request.&lt;br /&gt;
&lt;br /&gt;
====Ticket details====&lt;br /&gt;
::client and server principals;&lt;br /&gt;
::flags&lt;br /&gt;
::start/end/renew_till times;&lt;br /&gt;
::authtime;&lt;br /&gt;
::transited encoding type and contents;&lt;br /&gt;
::key type;&lt;br /&gt;
::addresses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:  &lt;br /&gt;
&lt;br /&gt;
====Ticket ID====&lt;br /&gt;
: Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
: Ticket ID is created as a  hash of AS session key or client principal name plus timestamp or some other way;&lt;br /&gt;
: TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
====Hybrid====&lt;br /&gt;
The proposal is a hybrid of variadic key-type-value triplet (KTV) and one-API-per-event approaches.&lt;br /&gt;
&lt;br /&gt;
On the KDC side call audit event-specific functions, whose input consists of the event-id, event-status and event-specific structure. If event-specific callback is implemented by the audit plugin, strip the event-specific structure from the security sensitive information and then pass the pointer to the event-specific structure to the plugin. Otherwise, fallback to the generic function with variadic KTV arguments. In the latter case all non-string values should be converted into the strings and the key-types serve as a hint to the plugin implementor about the &amp;quot;original&amp;quot; type of the key-value.   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== KDC facing API  ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
=== Pluggable interface ===&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin event-specific callback is implemented, call it */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req) {&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, try the generic one. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.generic)&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* All values with TYPE_NUM type-hint are string representations of &lt;br /&gt;
     * their numeric conterparts in 'state' structure.&lt;br /&gt;
     */&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, tkt_id,              // state-&amp;gt;tkt_id &lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   &amp;quot;skey_etype&amp;quot;,         TYPE_NUM, session_key_enctype, //  state-&amp;gt;session_key_enctype&lt;br /&gt;
                   &amp;quot;pa_error&amp;quot;,           TYPE_NUM, preauth_err,         //  state-&amp;gt;preauth_err&lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;kdcreq.msg_type&amp;quot;,    TYPE_STR, state-&amp;gt;req_msg_type,&lt;br /&gt;
                   &amp;quot;kdcreq.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;kdcreq.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;kdcreq.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;kdcreq.start&amp;quot;,       TYPE_NUM, req_from,  // state-&amp;gt;req_from&lt;br /&gt;
                   &amp;quot;kdcreq.end&amp;quot;,         TYPE_NUM, req_end,   // state-&amp;gt;req_end&lt;br /&gt;
                   &amp;quot;kdcreq.renew_till&amp;quot;,  TYPE_NUM, req_time,  // state-&amp;gt;req_rtime &lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;kdcrep.msg_type&amp;quot;,    TYPE_STR,state-&amp;gt;rep_msg_type,&lt;br /&gt;
                   &amp;quot;kdcrep.client&amp;quot;,      TYPE_STR, state-&amp;gt;rep_client,&lt;br /&gt;
                   &amp;quot;kdcrep.server&amp;quot;,      TYPE_STR, state-&amp;gt;rep_server,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.flags&amp;quot;,   TYPE_NUM, rep_tkt_flags,    // state-&amp;gt;rep_tkt_flags&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.start&amp;quot;,   TYPE_NUM, rep_tarttime,     // state-&amp;gt;rep_tarttime&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.end&amp;quot;,     TYPE_NUM, rep_endtime,      // pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.renew_till&amp;quot;,  TYPE_NUM, rep_renew_till,      // state-&amp;gt;rep_renew_till&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.authtime&amp;quot;,    TYPE_NUM, rep_authtime,        // state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.tr_type&amp;quot;,     TYPE_NUM, rep_transited_type   // state-&amp;gt;rep_transited_type&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.skey_etype&amp;quot;,  TYPE_NUM, rep_session_enctype, // state-&amp;gt;rep_session_enctype&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.caddrs&amp;quot;,      TYPE_STR, state-&amp;gt;rep_caddrs&lt;br /&gt;
    );&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Dictionary of the field names ===&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
* &amp;quot;event_id&amp;quot; for audit event ID&lt;br /&gt;
* &amp;quot;event_status&amp;quot;  to indicate if the event is reported on success or failure. &lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and service principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
== Future work ==&lt;br /&gt;
&lt;br /&gt;
# Make reporting auditable events configurable. For example, one can choose to report TGS_REQ, but not AS_REQ etc;&lt;br /&gt;
# Define and make configurable the DETAILED and BASIC levels of the events.&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Reputation&amp;diff=5126</id>
		<title>Projects/Reputation</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Reputation&amp;diff=5126"/>
				<updated>2013-05-22T17:25:18Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: initial version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Use Case ==&lt;br /&gt;
&lt;br /&gt;
Client requests an anonymous ticket.  The client is known to KDC, but he wants to stay anonymous with the application server.  KDC calculates the client's &amp;quot;reputation&amp;quot; score and issues the ticket that contains this score (together with all other useful information).  The factors that can contribute to the score are, for example, the client's history, various behavioral/network patterns, privileges etc.  Based on this knowledge the receiver of the anonymous ticket may decide on the timing or content of the service, etc.&lt;br /&gt;
&lt;br /&gt;
The other use cases are feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Purpose==&lt;br /&gt;
&lt;br /&gt;
Create a pluggable Client Reputation infrastructure that would allow to associate a &amp;quot;trustworthy&amp;quot; score with a  client. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Score and weights ==&lt;br /&gt;
&lt;br /&gt;
The contributing factors into the score calculation  and their weights should be configurable and may consist of:&lt;br /&gt;
&lt;br /&gt;
#. When the user account was created;&lt;br /&gt;
#. How active is the user;&lt;br /&gt;
#. user's privileges;&lt;br /&gt;
#. DNS/network topology history;&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5110</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5110"/>
				<updated>2013-03-28T17:14:16Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Upon further  discussion, the preferrence was given to Design-3.  So, removing JSON based and one-API-per-event designs from the project page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
The proposal is a hybrid of variadic key-value-pair (KVP) and one-API-per-event approaches.  &lt;br /&gt;
&lt;br /&gt;
The following are highlights of this new feature:&lt;br /&gt;
;Flow: On the KDC side call audit event-specific functions, whose input consists of the event-id, event-status (success or failure) and event-specific structure. If event-specific callback is implemented by the audit plugin, pass the pointer to the event-specific structure to the plugin. Otherwise, fallback to the generic function with variadic KVP arguments;  &lt;br /&gt;
;Ticket ID:&lt;br /&gt;
: Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
: Ticket ID is created as a  hash of AS session key or client principal name plus timestamp or some other way;&lt;br /&gt;
: TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
;Dictionary: Define the dictionary of the key names to be used in KVP to describe the events in the unified way. See below for details;&lt;br /&gt;
;Sanitizing: Strip the event-specific structure from the security sensitive information before passing it to the plugin;&lt;br /&gt;
;Variadic KVP: KVP is a triplet consisting  of key-name, key-value and a hint about the type of the value. All key-values should be converted into the strings. The plugin implementor is hinted at the &amp;quot;original&amp;quot; type of the key-value. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, struct server_handle shdl, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_generic_fn    generic;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_req_fn    tgs_req;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_generic_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san *state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin event-specific callback is implemented, call it */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req) {&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, try the generic one. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.generic)&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* All values with TYPE_NUM type-hint are string representations of &lt;br /&gt;
     * their numeric conterparts in 'state' structure.&lt;br /&gt;
     */&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, tkt_id,              // state-&amp;gt;tkt_id &lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   &amp;quot;skey_etype&amp;quot;,         TYPE_NUM, session_key_enctype, //  state-&amp;gt;session_key_enctype&lt;br /&gt;
                   &amp;quot;pa_error&amp;quot;,           TYPE_NUM, preauth_err,         //  state-&amp;gt;preauth_err&lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;kdcreq.msg_type&amp;quot;,    TYPE_STR, state-&amp;gt;req_msg_type,&lt;br /&gt;
                   &amp;quot;kdcreq.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;kdcreq.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;kdcreq.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;kdcreq.start&amp;quot;,       TYPE_NUM, req_from,  // state-&amp;gt;req_from&lt;br /&gt;
                   &amp;quot;kdcreq.end&amp;quot;,         TYPE_NUM, req_end,   // state-&amp;gt;req_end&lt;br /&gt;
                   &amp;quot;kdcreq.renew_till&amp;quot;,  TYPE_NUM, req_time,  // state-&amp;gt;req_rtime &lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;kdcrep.msg_type&amp;quot;,    TYPE_STR,state-&amp;gt;rep_msg_type,&lt;br /&gt;
                   &amp;quot;kdcrep.client&amp;quot;,      TYPE_STR, state-&amp;gt;rep_client,&lt;br /&gt;
                   &amp;quot;kdcrep.server&amp;quot;,      TYPE_STR, state-&amp;gt;rep_server,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.flags&amp;quot;,   TYPE_NUM, rep_tkt_flags,    // state-&amp;gt;rep_tkt_flags&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.start&amp;quot;,   TYPE_NUM, rep_tarttime,     // state-&amp;gt;rep_tarttime&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.end&amp;quot;,     TYPE_NUM, rep_endtime,      // pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.renew_till&amp;quot;,  TYPE_NUM, rep_renew_till,      // state-&amp;gt;rep_renew_till&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.authtime&amp;quot;,    TYPE_NUM, rep_authtime,        // state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.tr_type&amp;quot;,     TYPE_NUM, rep_transited_type   // state-&amp;gt;rep_transited_type&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.skey_etype&amp;quot;,  TYPE_NUM, rep_session_enctype, // state-&amp;gt;rep_session_enctype&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.caddrs&amp;quot;,      TYPE_STR, state-&amp;gt;rep_caddrs&lt;br /&gt;
    );&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
* &amp;quot;event_id&amp;quot; for audit event ID&lt;br /&gt;
* &amp;quot;event_status&amp;quot;  to indicate if the event is reported on success or failure. &lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and service principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5108</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5108"/>
				<updated>2013-03-26T16:59:59Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC. However, any modification in the list of the auditable events will cause the API to be changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE: 'event_id' is an assigned ID of the auditable event and 'status' indicates whether the event succeeded (status = 1) or failed (status = 0). &lt;br /&gt;
 &lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto, const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id, const char *cname, const char *sname, const int from_port,&lt;br /&gt;
                  krb5_enctype sesskey_etype, krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id, krb5_timestamp authtime,  const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,  const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-based) ===&lt;br /&gt;
&lt;br /&gt;
Design-2 is based on JSON serialization of the KDC auditable events. (See CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html#cls-encodings )&lt;br /&gt;
&lt;br /&gt;
This approach is simple and extremely flexible as auditable events and attributes can be added and modified without changing API.  The drawback here is that some performance overhead due to the encoding operations will occur (of course, only if audit plugin is loaded/enabled).&lt;br /&gt;
&lt;br /&gt;
Note: The encoding operations can be performed using the MIT Kerberos libkrb5support.so library. For the decoding and further processing of the audit output one can use the variety of tools (Sky is the limit!) including native MIT Kerberos json decoders. See subsection &amp;quot;Output&amp;quot; for the details.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event. */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
 &lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_req_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
The plugin implementor can use wide variety of tools to process JSON event record.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the KDC audit record:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;C8A7D0C7A86E373E&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362867131,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&amp;quot;end&amp;quot;:1362867131,&amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362780731,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1,&amp;quot;skey_etype&amp;quot;:18&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&amp;quot;port&amp;quot;:37652,&amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}},&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
* &amp;quot;event_id&amp;quot; for audit event ID&lt;br /&gt;
* &amp;quot;event_status&amp;quot;  to indicate if the event is reported on success or failure. &lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and service principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic) ===&lt;br /&gt;
&lt;br /&gt;
Design-3 is a hybrid of variadic key-value-pair and one-API-per-event approaches.&lt;br /&gt;
Use C variadic function to pass key-value pairs, if desired.  Alternatively, if general purpose interface is not implemented, pass the event-specific C structure to a plugable interface.  &lt;br /&gt;
&lt;br /&gt;
When compared to Design-2,  this approach reduces the amount of code needed to process audit-related information on the KDC side. The only additional code that would be necessary to write would be in creating sanitized surrogates of the event-specific structures to guarantee that security sensitive information does not leave KDC. &lt;br /&gt;
&lt;br /&gt;
When compared to Design-1,  this approach provides flexibility of adding new audit *attributes* without changing the audit API.  Note, that in both cases (Design-1 and Design-3) the audit API would need to be changed if new audit *events* were introduced.&lt;br /&gt;
&lt;br /&gt;
The drawback of Design-3 is a type-safety concern due to the nature of C variadic functions.  Also, the plugin implementors would need to do some heavy-lifting in C, as the expected input to their functions would be either the set of variadic parameters or event-specific C structures.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san*state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin generic record function is implemented, call it. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.record) {&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, call into event-specific function */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req)&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, state-&amp;gt;tkt_id,&lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   &amp;quot;skey_etype&amp;quot;,         TYPE_NUM, state-&amp;gt;session_key_enctype,&lt;br /&gt;
                   &amp;quot;pa_error&amp;quot;,           TYPE_NUM, preauth_err,&lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;kdcreq.msg_type&amp;quot;,    TYPE_STR, state-&amp;gt;req_msg_type,&lt;br /&gt;
                   &amp;quot;kdcreq.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;kdcreq.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;kdcreq.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;kdcreq.start&amp;quot;,       TYPE_NUM, state-&amp;gt;req_from,&lt;br /&gt;
                   &amp;quot;kdcreq.end&amp;quot;,         TYPE_NUM, state-&amp;gt;req_end,&lt;br /&gt;
                   &amp;quot;kdcreq.renew_till&amp;quot;,  TYPE_NUM, state-&amp;gt;req_rtime,&lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;kdcrep.msg_type&amp;quot;,    TYPE_STR,state-&amp;gt;rep_msg_type,&lt;br /&gt;
                   &amp;quot;kdcrep.client&amp;quot;,      TYPE_STR, state-&amp;gt;rep_client,&lt;br /&gt;
                   &amp;quot;kdcrep.server&amp;quot;,      TYPE_STR, state-&amp;gt;rep_server,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.flags&amp;quot;,   TYPE_NUM, state-&amp;gt;rep_tkt_flags,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.start&amp;quot;,   TYPE_NUM, state-&amp;gt;rep_tarttime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.end&amp;quot;,     TYPE_NUM, pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.renew_till&amp;quot;,  TYPE_NUM, state-&amp;gt;rep_renew_till,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.authtime&amp;quot;,    TYPE_NUM, state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.tr_type&amp;quot;,     TYPE_NUM, state-&amp;gt;rep_transited_type,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.caddrs&amp;quot;,      TYPE_STR, state-&amp;gt;rep_caddrs, &lt;br /&gt;
                   &amp;quot;kdcrep.tkt.skey_etype&amp;quot;,  TYPE_NUM, state-&amp;gt;rep_session_enctype);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5106</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5106"/>
				<updated>2013-03-19T21:20:56Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC. However, any modification in the list of the auditable events will cause the API to be changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE: 'event_id' is an assigned ID of the auditable event and 'status' indicates whether the event succeeded (status = 1) or failed (status = 0). &lt;br /&gt;
 &lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto, const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id, const char *cname, const char *sname, const int from_port,&lt;br /&gt;
                  krb5_enctype sesskey_etype, krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id, krb5_timestamp authtime,  const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,  const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-based) ===&lt;br /&gt;
&lt;br /&gt;
Design-2 is based on JSON serialization of the KDC auditable events. (See CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html#cls-encodings )&lt;br /&gt;
&lt;br /&gt;
This approach is simple and extremely flexible as auditable events and attributes can be added and modified without changing API.  The drawback here is that some performance overhead due to the encoding operations will occur (of course, only if audit plugin is loaded/enabled).&lt;br /&gt;
&lt;br /&gt;
Note: The encoding operations can be performed using the MIT Kerberos libkrb5support.so library. For the decoding and further processing of the audit output one can use the variety of tools (Sky is the limit!) including native MIT Kerberos json decoders. See subsection &amp;quot;Output&amp;quot; for the details.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event. */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
 &lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_req_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
The plugin implementor can use wide variety of tools to process JSON event record.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the KDC audit record:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;C8A7D0C7A86E373E&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362867131,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&amp;quot;end&amp;quot;:1362867131,&amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362780731,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1,&amp;quot;skey_etype&amp;quot;:18&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&amp;quot;port&amp;quot;:37652,&amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}},&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
* &amp;quot;event_id&amp;quot; for audit event ID&lt;br /&gt;
* &amp;quot;event_status&amp;quot;  to indicate if the event is reported on success or failure. &lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and service principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to pass key-value pairs, if desired.  Alternatively, if general purpose interface is not implemented, pass the event-specific C structure to a plugable interface.  &lt;br /&gt;
&lt;br /&gt;
When compared to Design-2,  this approach reduces the amount of code needed to process audit-related information on the KDC side. The only additional code that would be necessary to write would be in creating sanitized surrogates of the event-specific structures to guarantee that security sensitive information does not leave KDC. &lt;br /&gt;
&lt;br /&gt;
When compared to Design-1,  this approach provides flexibility of adding new audit *attributes* without changing the audit API.  Note, that in both cases (Design-1 and Design-3) the audit API would need to be changed if new audit *events* were introduced.&lt;br /&gt;
&lt;br /&gt;
The drawback of Design-3 is a type-safety concern due to the nature of C variadic functions.  Also, the plugin implementors would need to do some heavy-lifting in C, as the expected input to their functions would be either the set of variadic parameters or event-specific C structures.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san*state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin generic record function is implemented, call it. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.record) {&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, call into event-specific function */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req)&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, state-&amp;gt;tkt_id,&lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   &amp;quot;skey_etype&amp;quot;,         TYPE_NUM, state-&amp;gt;session_key_enctype,&lt;br /&gt;
                   &amp;quot;pa_error&amp;quot;,           TYPE_NUM, preauth_err,&lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;kdcreq.msg_type&amp;quot;,    TYPE_STR, state-&amp;gt;req_msg_type,&lt;br /&gt;
                   &amp;quot;kdcreq.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;kdcreq.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;kdcreq.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;kdcreq.start&amp;quot;,       TYPE_NUM, state-&amp;gt;req_from,&lt;br /&gt;
                   &amp;quot;kdcreq.end&amp;quot;,         TYPE_NUM, state-&amp;gt;req_end,&lt;br /&gt;
                   &amp;quot;kdcreq.renew_till&amp;quot;,  TYPE_NUM, state-&amp;gt;req_rtime,&lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;kdcrep.msg_type&amp;quot;,    TYPE_STR,state-&amp;gt;rep_msg_type,&lt;br /&gt;
                   &amp;quot;kdcrep.client&amp;quot;,      TYPE_STR, state-&amp;gt;rep_client,&lt;br /&gt;
                   &amp;quot;kdcrep.server&amp;quot;,      TYPE_STR, state-&amp;gt;rep_server,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.flags&amp;quot;,   TYPE_NUM, state-&amp;gt;rep_tkt_flags,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.start&amp;quot;,   TYPE_NUM, state-&amp;gt;rep_tarttime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.end&amp;quot;,     TYPE_NUM, pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.renew_till&amp;quot;,  TYPE_NUM, state-&amp;gt;rep_renew_till,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.authtime&amp;quot;,    TYPE_NUM, state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.tr_type&amp;quot;,     TYPE_NUM, state-&amp;gt;rep_transited_type,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.caddrs&amp;quot;,      TYPE_STR, state-&amp;gt;rep_caddrs, &lt;br /&gt;
                   &amp;quot;kdcrep.tkt.skey_etype&amp;quot;,  TYPE_NUM, state-&amp;gt;rep_session_enctype);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=5105</id>
		<title>Projects/Documentation Tasks</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=5105"/>
				<updated>2013-03-19T16:42:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: RC4 vulnerability&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To keep track of the various tasks that need to be documented such as function documentation, administration, troubleshooting etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application development ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Designing a new protocol, or extending existing one, to use GSS-API || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing security API|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; GSS-API vs SASL vs KRB5 &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to the similarities and differences between Heimdal and MIT Kerberos API &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| GSS-API || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A basic introduction to GSS-API, making use of the sample client and server, with special attention paid to Kerberos-related GSS-API issues&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to tell the GSS-API library on the client side where the existing Kerberos ticket cache is &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to write mechanism-independent GSS-API code&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to GSS-API naming as compared to Kerberos principal naming&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Using IAKERB&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Delegating credentials&amp;lt;/ul&amp;gt;|| GH ||2012-10-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Available extensions&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating the flags set on the connection  to ensure things like mutual authentication, confidentiality, integrity, replay protection, and sequence protection&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Krb5 library guide|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Kerberos prompter behavior&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  An introduction to ticket caches and keytabs and their corresponding APIs &amp;lt;/ul&amp;gt;|| KR || || || under review&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the pre-auth mechanisms, FAST&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the principal manipulation and parsing&amp;lt;/ul&amp;gt;|| TY || TBD || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Password change including the automatic internal support for password change on expired passwords if a prompter is provided&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  krb5_appdefault_* functions and their alternatives &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Completed task&lt;br /&gt;
! Author&lt;br /&gt;
! Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Choosing security API|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Acceptor naming - How to get servers to use any key in a keytab&amp;lt;/ul&amp;gt;|| GH||2012-03-01|| || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Anonymous credentials&amp;lt;/ul&amp;gt; || GH || 2012-10-01 || || &lt;br /&gt;
|-&lt;br /&gt;
| Developing plugins|| GH ||2012-03-08||  || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to developing plugins &amp;lt;/ul&amp;gt;|| || || || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Overview of existing pluggable interfaces   &amp;lt;/ul&amp;gt;|| ||  ||ZT reviewed profile plugin || &lt;br /&gt;
|-&lt;br /&gt;
| A more advanced introduction to using the Kerberos libraries for initial authentication, focusing on the authentication steps, validating initial credential|| TY || 2012-04-27 || ||&lt;br /&gt;
|-&lt;br /&gt;
| MIT Kerberos features : quick facts || ZT || ongoing || || &lt;br /&gt;
|-&lt;br /&gt;
| How to build Kerberos from source || ZT || || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Introduction to Kerberos system || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Man page &amp;lt;/ul&amp;gt;|| TH || 2012-08-15|| || in progress&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;General overview&amp;lt;/ul&amp;gt;|| TH ||2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Intro for admins&amp;lt;/ul&amp;gt;|| TH ||2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Technical overview&amp;lt;/ul&amp;gt;|| TH ||2012-07-15 || ||in progress&lt;br /&gt;
|-&lt;br /&gt;
|Setting a new realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Choosing backend: LDAP vs DB2&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; DNS configuration and SRV records - how they are used, in what order&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing encryption types for principals|| TY|| 2012-12-14|| ||under review&lt;br /&gt;
|-&lt;br /&gt;
| Upgrading a Kerberos infrastructure (order, backward compatibility) || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Integration Kerberos with Login System|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Difference between real Kerberos authentication, Kerberos password verification on the server side, and &amp;quot;LDAP authentication&amp;quot; in a Kerberos environment&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating Kerberos tickets&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Clear text password over HTTPS &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuring with pam_krb5 module&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Storing/locating keytab&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Cross-realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;cross-realm interaction with AD &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Transitive trust&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Referrals&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Performance|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tuning tips&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tradeoffs&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin interface|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Keying workstation/ host key setting&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Using Smartcard with PKINIT|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Kerberized ssh|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuration&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Cross-realm and ssh&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| A guide to principal naming basics and structure|| ZT ||2013-03-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| Troubleshooting|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Troubleshooting  errors&amp;lt;/ul&amp;gt; || ZT || ongoing|| ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Realm renaming &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Basic concepts (passwd policy, ticket ) || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Approaches to authorization -- centralized vs distributed, etc. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Completed task&lt;br /&gt;
! Author&lt;br /&gt;
! Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Replication || ZT|| || || &lt;br /&gt;
|-&lt;br /&gt;
| Reverse DNS|| TY|| 2012-12-12|| || &lt;br /&gt;
|-&lt;br /&gt;
| Selecting and configuring plugins|| GH ||2012-03-15|| || &lt;br /&gt;
|-&lt;br /&gt;
| Anonymity support|| GH ||2012-10-01 || || &lt;br /&gt;
|-&lt;br /&gt;
| Trace logging ||GH ||2012-03-22|| ||&lt;br /&gt;
|-&lt;br /&gt;
| Using LDAP server for Kerberos backend|| ZT || || || Ubuntu 10.4 (lucid) &lt;br /&gt;
|-&lt;br /&gt;
| Acceptable date and time formats || ZT || 2012-07-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
| kadm5.acl man page  || ZT || 2012-08-15 || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Why Kerberos system is suitable for the internet, not only for the enterprise || TY || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Impact RC4 vulnerabilities on Kerberos || TY || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API documentation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most commonly used API functions (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tier 1 - Highest priority&lt;br /&gt;
|-&lt;br /&gt;
! Completed API&lt;br /&gt;
!  Author&lt;br /&gt;
! Reviewer&lt;br /&gt;
!  Date&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|krb5_build_principal_alloc_va [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_alloc_va.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal_ext [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_close.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default_name.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_destroy [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_destroy.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_dup [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_cc_dup.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_get_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_get_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_get_type [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_type.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_initialize [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_initialize.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_new_unique [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_new_unique.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_resolve [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_resolve.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_change_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_change_password.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_context.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_error_message.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_fwd_tgt_cred  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_fwd_tgt_cred.html]|| ZT || GH|| || Needs example&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_default_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_error_message.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_host_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_credentials  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_credentials.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_fallback_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_fallback_host_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_keytab  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_keytab.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_alloc  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_alloc.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_free  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_free.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_get_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_get_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_init  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_init.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_address_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_address_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_anonymous  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_anonymous.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_canonicalize  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_canonicalize.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_change_password_prompt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_change_password_prompt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_etype_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_etype_list.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_expire_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_expire_callback.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache_name   [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_forwardable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_forwardable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_out_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_out_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_pa  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_pa.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_preauth_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_preauth_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_proxiable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_proxiable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_renew_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_renew_life.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_salt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_salt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_tkt_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_tkt_life.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_profile  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_profile.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_prompt_types  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_prompt_types.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_renewed_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_renewed_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_validated_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_validated_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_context.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_secure_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_secure_context.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_config_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_config_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_thread_safe  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_thread_safe.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_close.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_type  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_type.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_resolve  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_resolve.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kuserok  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kuserok.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name_flags.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_principal_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_any_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_any_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_prompter_posix  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_prompter_posix.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_realm_compare  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_realm_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth.html]||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth_version  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth_version.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_default_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_set_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_password_using_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password_using_ccache.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_principal_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_principal_realm.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_callback.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_filename  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_filename.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_sname_to_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_sname_to_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_unparse_name_flags.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_flags_ext.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_us_timeofday  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_us_timeofday.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_verify_authdata_kdc_issued  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_verify_authdata_kdc_issued.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
We may want to have more examples for some of the common API functions.&lt;br /&gt;
&lt;br /&gt;
== Manpage proofreading ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! manpage&lt;br /&gt;
! original&lt;br /&gt;
! reviewer&lt;br /&gt;
! comments&lt;br /&gt;
|-&lt;br /&gt;
| k5identity.5 || src/gen-manpages/k5identity.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5login.5 || src/gen-manpages/k5login.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5srvutil.1 || src/kadmin/cli/k5srvutil.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin.1 || src/kadmin/cli/kadmin.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmind.8 || src/kadmin/server/kadmind.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_ldap_util.8 || src/plugins/kdb/ldap/ldap_util/kdb5_ldap_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_util.8 || src/kadmin/dbutil/kdb5_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdc.conf.5 || src/config-files/kdc.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdestroy.1 || src/clients/kdestroy/kdestroy.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kinit.1 || src/clients/kinit/kinit.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpasswd.1 || src/clients/kpasswd/kpasswd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kprop.8 || src/slave/kprop.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpropd.8 || src/slave/kpropd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kproplog.8 || src/slave/kproplog.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5-send-pr.1 || src/util/send-pr/send-pr.1 || || copyright issues. Removed from the documentation&lt;br /&gt;
|-&lt;br /&gt;
| krb5.conf.5 || src/config-files/krb5.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5kdc.8 || src/kdc/krb5kdc.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| ksu.1 || src/clients/ksu/ksu.M || GH || needs rewrite&lt;br /&gt;
|-&lt;br /&gt;
| kswitch.1 || src/clients/kswitch/kswitch.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kvno.1 || src/clients/kvno/kvno.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sclient.1 || src/appl/sample/sclient/sclient.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sserver.8 || src/appl/sample/sserver/sserver.M || GH ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abbreviations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! abbreviation&lt;br /&gt;
! full names?&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| GH || Greg Hudson&lt;br /&gt;
|-&lt;br /&gt;
| KR || Ken Raeburn&lt;br /&gt;
|-&lt;br /&gt;
| MIT || MITKC group&lt;br /&gt;
|-&lt;br /&gt;
| NW ||  Nico Williams&lt;br /&gt;
|-&lt;br /&gt;
| TH || Thomas  Hardjono&lt;br /&gt;
|-&lt;br /&gt;
| TY || Tom Yu&lt;br /&gt;
|-&lt;br /&gt;
| ZT || Zhanna Tsitkov&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5104</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5104"/>
				<updated>2013-03-19T15:11:58Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Added example for design3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC. However, any modification in the list of the auditable events will cause the API to be changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE: 'event_id' is an assigned ID of the auditable event and 'status' indicates whether the event succeeded (status = 1) or failed (status = 0). &lt;br /&gt;
 &lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto, const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id, const char *cname, const char *sname, const int from_port,&lt;br /&gt;
                  krb5_enctype sesskey_etype, krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id, krb5_timestamp authtime,  const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,  const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-based) ===&lt;br /&gt;
&lt;br /&gt;
Design-2 is based on JSON serialization of the KDC auditable events. (See CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html#cls-encodings )&lt;br /&gt;
&lt;br /&gt;
This approach is simple and extremely flexible as auditable events and attributes can be added and modified without changing API.  The drawback here is that some performance overhead due to the encoding operations will occur (of course, only if audit plugin is loaded/enabled).&lt;br /&gt;
&lt;br /&gt;
Note: The encoding operations can be performed using the MIT Kerberos libkrb5support.so library. For the decoding and further processing of the audit output one can use the variety of tools (Sky is the limit!) including native MIT Kerberos json decoders. See subsection &amp;quot;Output&amp;quot; for the details.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event. */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
 &lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_req_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
The plugin implementor can use wide variety of tools to process JSON event record.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the KDC audit record:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;C8A7D0C7A86E373E&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362867131,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&amp;quot;end&amp;quot;:1362867131,&amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362780731,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1,&amp;quot;skey_etype&amp;quot;:18&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&amp;quot;port&amp;quot;:37652,&amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}},&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
* &amp;quot;event_id&amp;quot; for audit event ID&lt;br /&gt;
* &amp;quot;event_status&amp;quot;  to indicate if the event is reported on success or failure. &lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and service principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to pass key-value pairs, if desired.  Alternatively, if general purpose interface is not implemented, pass the event-specific C structure to a plugable interface.  &lt;br /&gt;
&lt;br /&gt;
When compared to Design-2,  this approach reduces the amount of code needed to process audit related information on the KDC side.  The only additional code would be in creating sanitized surrogates of the event-specific structures to guarantee that security sensitive information does not leave KDC. &lt;br /&gt;
&lt;br /&gt;
When compared to Design-1,  this approach provides flexibility of adding new audit *attributes* without changing the audit API.  Note, that in both cases (Design-1 and Design-3) the audit API would need to be changed if new audit *events* were introduced.&lt;br /&gt;
&lt;br /&gt;
The drawback of Design-3 is a type-safety concerns tied to the nature of C variadic functions.  Also, the plugin implementors would need to do some heavy-lifting in C, as the expected input to their functions would be either the set of variadic parameters or event-specific C structures.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san*state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
           krb5_error_code  status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    /* If audit plugin generic record function is implemented, call it. */&lt;br /&gt;
    if (hdl-&amp;gt;vt.record) {&lt;br /&gt;
        rc = rec_as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
        return rc;&lt;br /&gt;
    }&lt;br /&gt;
    /* Otherwise, call into event-specific function */&lt;br /&gt;
    if (hdl-&amp;gt;vt.as_req)&lt;br /&gt;
        rc = hdl-&amp;gt;vt.as_req(hdl-&amp;gt;au_ctx, event_id, event_status, state);&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 static krb5_error_code&lt;br /&gt;
 rec_as_req(krb5_context context, struct as_req_state_san *state,&lt;br /&gt;
           krb5_error_code status)&lt;br /&gt;
 {&lt;br /&gt;
    krb5_error_code rc = 0;&lt;br /&gt;
    ...&lt;br /&gt;
    hdl-&amp;gt;vt.record(hdl-&amp;gt;au_ctx, event_id, event_status,&lt;br /&gt;
                   &amp;quot;tkt_id&amp;quot;,             TYPE_NUM, state-&amp;gt;tkt_id,&lt;br /&gt;
                   &amp;quot;kdc_status&amp;quot;,         TYPE_STR, state-&amp;gt;status,&lt;br /&gt;
                   &amp;quot;full_address&amp;quot;,       TYPE_STR, state-&amp;gt;full_address,                 &lt;br /&gt;
                   &amp;quot;skey_etype&amp;quot;,         TYPE_NUM, state-&amp;gt;session_key_enctype,&lt;br /&gt;
                   &amp;quot;pa_error&amp;quot;,           TYPE_NUM, preauth_err,&lt;br /&gt;
                   /* request */&lt;br /&gt;
                   &amp;quot;kdcreq.msg_type&amp;quot;,    TYPE_STR, state-&amp;gt;req_msg_type,&lt;br /&gt;
                   &amp;quot;kdcreq.client&amp;quot;,      TYPE_STR, state-&amp;gt;req_client,   &lt;br /&gt;
                   &amp;quot;kdcreq.server&amp;quot;,      TYPE_STR, state-&amp;gt;req_server,  &lt;br /&gt;
                   &amp;quot;kdcreq.kdc_options&amp;quot;, TYPE_STR, state-&amp;gt;req_kdc_options,&lt;br /&gt;
                   &amp;quot;kdcreq.start&amp;quot;,       TYPE_NUM, state-&amp;gt;req_from,&lt;br /&gt;
                   &amp;quot;kdcreq.end&amp;quot;,         TYPE_NUM, state-&amp;gt;req_end,&lt;br /&gt;
                   &amp;quot;kdcreq.renew_till&amp;quot;,  TYPE_NUM, state-&amp;gt;req_rtime,&lt;br /&gt;
                   /* reply */&lt;br /&gt;
                   &amp;quot;kdcrep.msg_type&amp;quot;,    TYPE_STR,state-&amp;gt;rep_msg_type,&lt;br /&gt;
                   &amp;quot;kdcrep.client&amp;quot;,      TYPE_STR, state-&amp;gt;rep_client,&lt;br /&gt;
                   &amp;quot;kdcrep.server&amp;quot;,      TYPE_STR, state-&amp;gt;rep_server,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.server&amp;quot;,  TYPE_STR, state-&amp;gt;rep_tkt_server,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.flags&amp;quot;,   TYPE_NUM, state-&amp;gt;rep_tkt_flags,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.start&amp;quot;,   TYPE_NUM, state-&amp;gt;rep_tarttime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.end&amp;quot;,     TYPE_NUM, pstate-&amp;gt;rep_endtime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.renew_till&amp;quot;,  TYPE_NUM, state-&amp;gt;rep_renew_till,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.authtime&amp;quot;,    TYPE_NUM, state-&amp;gt;rep_authtime,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.tr_type&amp;quot;,     TYPE_NUM, state-&amp;gt;rep_transited_type,&lt;br /&gt;
                   &amp;quot;kdcrep.tkt.caddrs&amp;quot;,      TYPE_STR, state-&amp;gt;rep_caddrs, &lt;br /&gt;
                   &amp;quot;kdcrep.tkt.skey_etype&amp;quot;,  TYPE_NUM, state-&amp;gt;rep_session_enctype)&lt;br /&gt;
    return rc;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5103</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5103"/>
				<updated>2013-03-19T14:35:46Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Added pros/cons for Design-3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC. However, any modification in the list of the auditable events will cause the API to be changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE: 'event_id' is an assigned ID of the auditable event and 'status' indicates whether the event succeeded (status = 1) or failed (status = 0). &lt;br /&gt;
 &lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto, const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id, const char *cname, const char *sname, const int from_port,&lt;br /&gt;
                  krb5_enctype sesskey_etype, krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id, krb5_timestamp authtime,  const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,  const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-based) ===&lt;br /&gt;
&lt;br /&gt;
Design-2 is based on JSON serialization of the KDC auditable events. (See CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html#cls-encodings )&lt;br /&gt;
&lt;br /&gt;
This approach is simple and extremely flexible as auditable events and attributes can be added and modified without changing API.  The drawback here is that some performance overhead due to the encoding operations will occur (of course, only if audit plugin is loaded/enabled).&lt;br /&gt;
&lt;br /&gt;
Note: The encoding operations can be performed using the MIT Kerberos libkrb5support.so library. For the decoding and further processing of the audit output one can use the variety of tools (Sky is the limit!) including native MIT Kerberos json decoders. See subsection &amp;quot;Output&amp;quot; for the details.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event. */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
 &lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_req_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
The plugin implementor can use wide variety of tools to process JSON event record.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the KDC audit record:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;C8A7D0C7A86E373E&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362867131,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&amp;quot;end&amp;quot;:1362867131,&amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362780731,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1,&amp;quot;skey_etype&amp;quot;:18&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&amp;quot;port&amp;quot;:37652,&amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}},&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
* &amp;quot;event_id&amp;quot; for audit event ID&lt;br /&gt;
* &amp;quot;event_status&amp;quot;  to indicate if the event is reported on success or failure. &lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and service principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to pass key-value pairs, if desired.  Alternatively, if general purpose interface is not implemented, pass the event-specific C structure to a plugable interface.  &lt;br /&gt;
&lt;br /&gt;
When compared to Design-2,  this approach reduces the amount of code needed to process audit related information on the KDC side.  The only additional code would be in creating sanitized surrogates of the event-specific structures to guarantee that security sensitive information does not leave KDC. &lt;br /&gt;
&lt;br /&gt;
When compared to Design-1,  this approach provides flexibility of adding new audit *attributes* without changing the audit API.  Note, that in both cases (Design-1 and Design-3) the audit API would need to be changed if new audit *events* were introduced.&lt;br /&gt;
&lt;br /&gt;
The drawback of Design-3 is a type-safety concerns tied to the nature of C variadic functions.  Also, the plugin implementors would need to do some heavy-lifting in C, as the expected input to their functions would be either the set of variadic parameters or event-specific C structures.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 &lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle_san shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state_san *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state_san*state);&lt;br /&gt;
&lt;br /&gt;
where new types server_handle_san, as_req_state_san and tgs_req_state_san are sanitized variants of server_handle, as_req_state and tgs_req_state structures respectively. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5102</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5102"/>
				<updated>2013-03-15T15:57:13Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC. However, any modification in the list of the auditable events will cause the API to be changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE: 'event_id' is an assigned ID of the auditable event and 'status' indicates whether the event succeeded (status = 1) or failed (status = 0). &lt;br /&gt;
 &lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto, const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id, const char *cname, const char *sname, const int from_port,&lt;br /&gt;
                  krb5_enctype sesskey_etype, krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id, krb5_timestamp authtime,  const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,  const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-based) ===&lt;br /&gt;
&lt;br /&gt;
Design-2 is based on JSON serialization of the KDC auditable events. (See CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html#cls-encodings )&lt;br /&gt;
&lt;br /&gt;
This approach is simple and extremely flexible as auditable events and attributes can be added and modified without changing API.  The drawback here is that some performance overhead due to the encoding operations will occur (of course, only if audit plugin is loaded/enabled).&lt;br /&gt;
&lt;br /&gt;
Note: The encoding operations can be performed using the MIT Kerberos libkrb5support.so library. For the decoding and further processing of the audit output one can use the variety of tools (Sky is the limit!) including native MIT Kerberos json decoders. See subsection &amp;quot;Output&amp;quot; for the details.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event. */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_req_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
The plugin implementor can use wide variety of tools to process JSON event record.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the KDC audit record:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;C8A7D0C7A86E373E&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362867131,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&amp;quot;end&amp;quot;:1362867131,&amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362780731,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1,&amp;quot;skey_etype&amp;quot;:18&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&amp;quot;port&amp;quot;:37652,&amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}},&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
* &amp;quot;event_id&amp;quot; for audit event ID&lt;br /&gt;
* &amp;quot;event_status&amp;quot;  to indicate if the event is reported on success or failure. &lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and service principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to pass key-value pairs, if desired.  Alternatively, pass the event specific C structure (such as as_req_state, perhaps trimmed of the security sensitive information) to a plugable interface.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# CEE Log Syntax (CLS) Encoding http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5101</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5101"/>
				<updated>2013-03-15T15:51:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Detailed Design-3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC. However, any modification in the list of the auditable events will cause the API to be changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE: 'event_id' is an assigned ID of the auditable event and 'status' indicates whether the event succeeded (status = 1) or failed (status = 0). &lt;br /&gt;
 &lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto, const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id, const char *cname, const char *sname, const int from_port,&lt;br /&gt;
                  krb5_enctype sesskey_etype, krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id, krb5_timestamp authtime,  const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,  const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-based) ===&lt;br /&gt;
&lt;br /&gt;
Design-2 is based on JSON serialization of the KDC auditable events. (See http://cee.mitre.org/language/1.0-beta1/cls.html#cls-encodings )&lt;br /&gt;
&lt;br /&gt;
This approach is simple and extremely flexible as auditable events and attributes can be added and modified without changing API.  The drawback here is that some performance overhead due to the encoding operations will occur (of course, only if audit plugin is loaded/enabled).&lt;br /&gt;
&lt;br /&gt;
Note: The encoding operations can be performed using the MIT Kerberos libkrb5support.so library. For the decoding and further processing of the audit output one can use the variety of tools (Sky is the limit!) including native MIT Kerberos json decoders. See subsection &amp;quot;Output&amp;quot; for the details.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event. */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_req_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
The plugin implementor can use wide variety of tools to process JSON event record.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the KDC audit record:&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;C8A7D0C7A86E373E&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362867131,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&amp;quot;end&amp;quot;:1362867131,&amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362780731,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1,&amp;quot;skey_etype&amp;quot;:18&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&amp;quot;port&amp;quot;:37652,&amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}},&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
* &amp;quot;event_id&amp;quot; for audit event ID&lt;br /&gt;
* &amp;quot;event_status&amp;quot;  to indicate if the event is reported on success or failure. &lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and service principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to pass key-value pairs, if desired.  Alternatively, pass the event specific C structure (such as as_req_state, perhaps trimmed of the security sensitive information) to a plugable interface.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* event specific functions */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 /* general purpose interface to pass unspecified number of &lt;br /&gt;
  *  key-type-value triplets to a plugable interface.&lt;br /&gt;
  */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, ... );&lt;br /&gt;
 &lt;br /&gt;
 /* one-API-per-event surrogate */&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                     struct server_handle shdl);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, const int event_id, const int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  struct as_req_state *state);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
               struct tgs_req_state *state);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5097</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5097"/>
				<updated>2013-03-14T15:38:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic functions) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to construct/parse key-value pairs.&lt;br /&gt;
                                                                        &lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-based) ===&lt;br /&gt;
&lt;br /&gt;
Design-2 is based on JSON serialization of the KDC auditable events. (See http://cee.mitre.org/language/1.0-beta1/cls.html#cls-encodings )&lt;br /&gt;
&lt;br /&gt;
This approach is extremely flexible as auditable events and attributes can be added and modified without changing API.  The drawback here is that some performance overhead due to the encoding operations will occur (of course, only if audit plugin is loaded/enabled).&lt;br /&gt;
&lt;br /&gt;
Note: The encoding operations can be performed using the MIT Kerberos libkrb5support.so library. For the decoding and further processing of the audit output one can use the variety of tools (Sky is the limit!) including native MIT Kerberos json decoders. See subsection &amp;quot;Output&amp;quot; for the details.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event.&lt;br /&gt;
  * Here 'event_id' is an assigned ID of the auditable event and&lt;br /&gt;
  * 'status' indicates whether the event succeeded or failed. &lt;br /&gt;
  */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
To process the audit output, the plugin implementor can use the wide variety of tools to process the linearized json-like key-value pairs.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the audit output:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;C8A7D0C7A86E373E&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362867131,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&amp;quot;end&amp;quot;:1362867131,&amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362780731,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1,&amp;quot;skey_etype&amp;quot;:18&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&amp;quot;port&amp;quot;:37652,&amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}},&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and server principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
Also, &amp;quot;event_id&amp;quot; and &amp;quot;event_status&amp;quot; for audit event ID and to indicate if the event is reported on success or failure. (Most likely these two already have some standard names)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC. However, any modification in the list of the auditable events will cause the API to be changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 /* status=1 means that the reported event was  successful ; otherwise - 0 */&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context, struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx, krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto, const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id, const char *cname, const char *sname, const int from_port,&lt;br /&gt;
                  krb5_enctype sesskey_etype, krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id, krb5_timestamp authtime,  const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,  const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5096</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5096"/>
				<updated>2013-03-14T15:22:19Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic functions) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to construct/parse key-value pairs.&lt;br /&gt;
                                                                        &lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-based) ===&lt;br /&gt;
&lt;br /&gt;
Design-2 is based on JSON serialization of the KDC auditable events. (See http://cee.mitre.org/language/1.0-beta1/cls.html#cls-encodings )&lt;br /&gt;
&lt;br /&gt;
This approach is extremely flexible as auditable events and attributes can be added and modified without changing API.  The drawback here is that some performance overhead due to the encoding operations will occur (of course, only if audit plugin is loaded/enabled).&lt;br /&gt;
&lt;br /&gt;
Note: The encoding operations can be performed using the MIT Kerberos libkrb5support.so library. For the decoding and further processing of the audit output one can use the variety of tools (Sky is the limit!) including native MIT Kerberos json decoders. See subsection &amp;quot;Output&amp;quot; for the details.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event.&lt;br /&gt;
  * Here 'event_id' is an assigned ID of the auditable event and&lt;br /&gt;
  * 'status' indicates whether the event succeeded or failed. &lt;br /&gt;
  */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
To process the audit output, the plugin implementor can use the wide variety of tools to process the linearized json-like key-value pairs.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the audit output:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;C8A7D0C7A86E373E&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362867131,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&amp;quot;end&amp;quot;:1362867131,&amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362780731,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1,&amp;quot;skey_etype&amp;quot;:18&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&amp;quot;port&amp;quot;:37652,&amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}},&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and server principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
Also, &amp;quot;event_id&amp;quot; and &amp;quot;event_status&amp;quot; for audit event ID and to indicate if the event is reported on success or failure. (Most likely these two already have some standard names)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC. However, any modification in the list of the auditable events will cause the API to be changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;br /&gt;
# http://cee.mitre.org/language/1.0-beta1/cls.html&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5095</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5095"/>
				<updated>2013-03-08T22:32:23Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic functions) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to construct/parse key-value pairs.&lt;br /&gt;
                                                                        &lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-like) ===&lt;br /&gt;
&lt;br /&gt;
Design-2 is based on JSON-like serialization of the KDC auditable events.&lt;br /&gt;
&lt;br /&gt;
This approach is extremely flexible as auditable events and attributes can be added and modified without changing API. The drawback here is that if audit plugin is loaded/enabled, some performance overhead due to the encoding operations will occur.&lt;br /&gt;
&lt;br /&gt;
Note: The encoding operations can be performed using the existing MIT Kerberos json.so (libkrb5support.so) library. For the decoding and further processing of the audit output one can use the variety of tools (Sky is the limit!) including native MIT Kerberos json decoders. See subsection &amp;quot;Output&amp;quot; for the details.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event.&lt;br /&gt;
  * Here 'event_id' is an assigned ID of the auditable event and&lt;br /&gt;
  * 'status' indicates whether the event succeeded or failed. &lt;br /&gt;
  */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
To process the audit output, the plugin implementor can use the wide variety of tools to process the linearized json-like key-value pairs.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the audit output:&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;C8A7D0C7A86E373E&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362867131,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;host&amp;quot;,&amp;quot;xxx.mit.edu&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;components&amp;quot;:[&amp;quot;user&amp;quot;],&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&amp;quot;end&amp;quot;:1362867131,&amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362780731,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1,&amp;quot;skey_etype&amp;quot;:18&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&amp;quot;port&amp;quot;:37652,&amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}},&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and server principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
Also, &amp;quot;event_id&amp;quot; and &amp;quot;event_status&amp;quot; for audit event ID and to indicate if the event is reported on success or failure. (Most likely these two already have some standard names)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC. However, any modification in the list of the auditable events will cause the API to be changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5093</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5093"/>
				<updated>2013-03-06T22:34:26Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Added ticket details.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, start/end/renew_till times, available enctypes, 2nd ticket (see below ticket details), auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket (see below ticket details), message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
:Ticket details:&lt;br /&gt;
::client and server principals, flags, ticket start/end/renew_till times, authtime, transited encoding type and contents, session key type, addresses;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic functions) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to construct/parse key-value pairs.&lt;br /&gt;
                                                                        &lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-like) ===&lt;br /&gt;
&lt;br /&gt;
Design-2 is based on JSON-like serialization of the KDC auditable events.&lt;br /&gt;
&lt;br /&gt;
This approach is extremely flexible as auditable events and attributes can be added and modified without changing API. The drawback here is that if audit plugin is loaded/enabled, some performance overhead due to the encoding operations will occur.&lt;br /&gt;
&lt;br /&gt;
Note: The encoding operations can be performed using the existing MIT Kerberos json.so (libkrb5support.so) library. For the decoding and further processing of the audit output one can use the variety of tools (Sky is the limit!) including native MIT Kerberos json decoders. See subsection &amp;quot;Output&amp;quot; for the details.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event.&lt;br /&gt;
  * Here 'event_id' is an assigned ID of the auditable event and&lt;br /&gt;
  * 'status' indicates whether the event succeeded or failed. &lt;br /&gt;
  */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
To process the audit output, the plugin implementor can use the wide variety of tools to process the linearized json-like key-value pairs.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the audit output:&lt;br /&gt;
 &lt;br /&gt;
 ({&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;D56D26929446BA61&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:&lt;br /&gt;
      {&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362516533,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:&lt;br /&gt;
         {&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;client&amp;quot;:&lt;br /&gt;
         {&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:1362430134,&lt;br /&gt;
      &amp;quot;end&amp;quot;:1362516533,&lt;br /&gt;
      &amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362430133,&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1&lt;br /&gt;
    }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&lt;br /&gt;
   &amp;quot;port&amp;quot;:35899,&lt;br /&gt;
   &amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and server principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
Also, &amp;quot;event_id&amp;quot; and &amp;quot;event_status&amp;quot; for audit event ID and to indicate if the event is reported on success or failure. (Most likely these two already have some standard names)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC. However, any modification in the list of the auditable events will cause the API to be changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5092</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5092"/>
				<updated>2013-03-04T21:35:50Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, star/end/renew_till times, available enctypes, 2nd ticket, auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket, message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: chosen by KDC enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, star/end/renew_till times, available enctypes, 2nd ticket, auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket, message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: chosen by KDC enctype, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
=== Design 3 (variadic functions) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to construct/parse key-value pairs.&lt;br /&gt;
                                                                        &lt;br /&gt;
&lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-like) ===&lt;br /&gt;
&lt;br /&gt;
This approach is based on JSON-like serialization of the KDC auditable events and utilized the existing MIT Kerberos json.so (libkrb5support.so) library. &lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event.&lt;br /&gt;
  * Here 'event_id' is an assigned ID of the auditable event and&lt;br /&gt;
  * 'status' indicates whether the event succeeded or failed. &lt;br /&gt;
  */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==== Output ====&lt;br /&gt;
&lt;br /&gt;
To process the audit output, the plugin implementor can use the wide variety of tools to process the linearized json-like key-value pairs.  &lt;br /&gt;
&lt;br /&gt;
The following is an example of the audit output:&lt;br /&gt;
 &lt;br /&gt;
 ({&lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;D56D26929446BA61&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;server&amp;quot;:&lt;br /&gt;
      {&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362516533,&lt;br /&gt;
   &amp;quot;avail_etypes&amp;quot;:[18,17,16,23,25,26,1,3,2]&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:&lt;br /&gt;
         {&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;client&amp;quot;:&lt;br /&gt;
         {&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:1362430134,&lt;br /&gt;
      &amp;quot;end&amp;quot;:1362516533,&lt;br /&gt;
      &amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362430133,&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1&lt;br /&gt;
    }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&lt;br /&gt;
   &amp;quot;port&amp;quot;:35899,&lt;br /&gt;
   &amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,44,333]}&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;skey_etype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true&lt;br /&gt;
 })&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible basic field names are:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and server principal names;&lt;br /&gt;
* &amp;quot;full_address&amp;quot; for  address and portport &lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;skey_etype&amp;quot; and &amp;quot;avail_etypes&amp;quot; for available key types and chosen enc type;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;start&amp;quot;, &amp;quot;end&amp;quot; and &amp;quot;renew_till&amp;quot; for the ticket's start/end/renew-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
Also, &amp;quot;event_id&amp;quot; and &amp;quot;event_status&amp;quot; for audit event ID and to indicate if the event is reported on success or failure. (Most likely these two already have some standard names)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5089</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5089"/>
				<updated>2013-03-01T18:27:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Updated Events section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up - list of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication (Common Criteria Class FIA) &lt;br /&gt;
:AS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, star/end/renew_till times, enctypes, 2nd ticket, auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket, message type;&lt;br /&gt;
:: remote port;&lt;br /&gt;
:: pre-auth error;&lt;br /&gt;
:: enctypes: available and chosen by KDC (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:TGS exchange: &lt;br /&gt;
:: ticket ID (if available);&lt;br /&gt;
:: KDC status message;&lt;br /&gt;
:: kdc request: client and server principals, kdc options, star/end/renew_till times, enctypes, 2nd ticket, auth data type, pre-auth data type, addresses, message type,&lt;br /&gt;
:: kdc reply: client principal, ticket, message type;&lt;br /&gt;
:: principals: (if applicable) alternate client and server principals, 2nd ticket server name;&lt;br /&gt;
:: full address;&lt;br /&gt;
:: is_referral; &lt;br /&gt;
:: xrealm name;&lt;br /&gt;
:: enctypes: available and chosen by KDC, u2u enctype (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:: session key cleared (Common Criteria FCS_CKM.1, FCS_CKM.4);&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request.  Can be separate reports or part of AS/TGS request processing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-04 draft to securely communicate ticket id between all Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
=== Design 3 (key-value pairs) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to construct/parse key-value pairs.&lt;br /&gt;
                                                                        &lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON-like) ===&lt;br /&gt;
&lt;br /&gt;
This approach is based on JSON-like serialization of the KDC auditable events and utilized the existing MIT Kerberos json.so library. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event.&lt;br /&gt;
  * Here 'event_id' is an assigned ID of the auditable event and&lt;br /&gt;
  * 'status' indicates whether the event succeeded or failed. &lt;br /&gt;
  */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example (code and linearized  output) ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The output 'aud_str' string looks similar to the following:&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;94321337D58FC432&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362163527,&lt;br /&gt;
   &amp;quot;num_enctypes&amp;quot;:9,&lt;br /&gt;
   &amp;quot;ktype&amp;quot;:18,&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1}&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&lt;br /&gt;
      &amp;quot;end&amp;quot;:1362163527,&lt;br /&gt;
      &amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362077127, &lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;princ_cl&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
 &amp;quot;princ_srv&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&lt;br /&gt;
     &amp;quot;port&amp;quot;:45335,&lt;br /&gt;
     &amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,22,333]}&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;tkt_end&amp;quot;:1362163527,&lt;br /&gt;
 &amp;quot;authtime&amp;quot;:1362077127,&lt;br /&gt;
 &amp;quot;ktype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;avail_ktypes&amp;quot;:[18,17,16,23,25,26,1,3,2], &lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible field names are:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and server principal names;&lt;br /&gt;
* &amp;quot;port&amp;quot; for client's port;&lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;ktype&amp;quot; and &amp;quot;avail_ktypes&amp;quot; for available key types and used keytype;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;tkt_start&amp;quot;, &amp;quot;tkt_end&amp;quot; and &amp;quot;tkt_renewtill&amp;quot; for the ticket's start/end/renewed-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
Also, &amp;quot;event_id&amp;quot; and &amp;quot;event_status&amp;quot; for audit event ID and to indicate if the event is reported on success or failure. (Most likely these two already have some standard names)&lt;br /&gt;
 &lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5088</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5088"/>
				<updated>2013-02-28T19:11:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Added example for design2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up basic information: List of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication &lt;br /&gt;
: (Common Criteria Class FIA)&lt;br /&gt;
:AS exchange: &lt;br /&gt;
::Basic information: client principal name; requested service name; remote port; selected keytype for the ticket session key; pre-authentication error; KDC status message;&lt;br /&gt;
::On success: ticket id; returned ticket start, end and renew until times; ticket flags; &lt;br /&gt;
:TGS exchange: &lt;br /&gt;
::TGS&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; remote port; authtime timestamp; selected keytype for the ticket session key; KDC status message; if the request is for referral ticket indicate to which server;&lt;br /&gt;
:::On success: returned ticket start, end and renew until times; ticket flags; if the request was to renew ticket – indicate that ticket was renewed; &lt;br /&gt;
::Alternate&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: alternate TGT&lt;br /&gt;
::Cross-realm&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name, remote port; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: cross-realm TGT&lt;br /&gt;
::U2U&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: second ticket  client and server name&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request &lt;br /&gt;
;Session keys :&lt;br /&gt;
:(Common Criteria FCS_CKM.1, FCS_CKM.4):&lt;br /&gt;
: AS and TGS exchange: ticket id; client principal name; requested service name, remote port;  authtime timestamp; keytype list in request and selected keytype for the ticket session key;&lt;br /&gt;
: AS and TGS exchange: ticket id; session key cleaning;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-03 draft to securely communicate ticket id between Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
=== Design 3 (key-value pairs) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to construct/parse key-value pairs.&lt;br /&gt;
                                                                        &lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON based) ===&lt;br /&gt;
&lt;br /&gt;
This approach is based on JSON serialization of the KDC auditable events and utilized the MIT Kerberos json.so library. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event.&lt;br /&gt;
  * Here 'event_id' is an assigned ID of the auditable event and&lt;br /&gt;
  * 'status' indicates whether the event succeeded or failed. &lt;br /&gt;
  */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example (code and linearized  output) ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The output 'aud_str' string looks similar to the following:&lt;br /&gt;
 &lt;br /&gt;
 &amp;quot;event_id&amp;quot;:5,&lt;br /&gt;
 &amp;quot;event_status&amp;quot;:1,&lt;br /&gt;
 &amp;quot;tkt_id&amp;quot;:&amp;quot;94321337D58FC432&amp;quot;,&lt;br /&gt;
 &amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;kdcreq&amp;quot;:{&lt;br /&gt;
   &amp;quot;kdc_options&amp;quot;:65536,&lt;br /&gt;
   &amp;quot;end&amp;quot;:1362163527,&lt;br /&gt;
   &amp;quot;num_enctypes&amp;quot;:9,&lt;br /&gt;
   &amp;quot;ktype&amp;quot;:18,&lt;br /&gt;
   &amp;quot;server&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1}&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;kdcrep&amp;quot;:{&lt;br /&gt;
   &amp;quot;msg_type&amp;quot;:13,&lt;br /&gt;
   &amp;quot;client&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
   &amp;quot;ticket&amp;quot;:{&lt;br /&gt;
      &amp;quot;server&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;flags&amp;quot;:589824,&lt;br /&gt;
      &amp;quot;client&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
      &amp;quot;start&amp;quot;:0,&lt;br /&gt;
      &amp;quot;end&amp;quot;:1362163527,&lt;br /&gt;
      &amp;quot;renew_till&amp;quot;:0,&lt;br /&gt;
      &amp;quot;authtime&amp;quot;:1362077127, &lt;br /&gt;
      &amp;quot;tr_type&amp;quot;:1&lt;br /&gt;
   }&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;princ_cl&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
 &amp;quot;princ_srv&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&amp;quot;&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&lt;br /&gt;
     &amp;quot;port&amp;quot;:45335,&lt;br /&gt;
     &amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,22,333]}&lt;br /&gt;
 },&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&lt;br /&gt;
 &amp;quot;tkt_end&amp;quot;:1362163527,&lt;br /&gt;
 &amp;quot;authtime&amp;quot;:1362077127,&lt;br /&gt;
 &amp;quot;avail_ktypes&amp;quot;:[18,17,16,23,25,26,1,3,2], &lt;br /&gt;
 &amp;quot;ktype&amp;quot;:18,&lt;br /&gt;
 &amp;quot;sesskey_cleared&amp;quot;:true}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible field names are:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and server principal names;&lt;br /&gt;
* &amp;quot;port&amp;quot; for client's port;&lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;ktype&amp;quot; and &amp;quot;avail_ktypes&amp;quot; for available key types and used keytype;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;tkt_start&amp;quot;, &amp;quot;tkt_end&amp;quot; and &amp;quot;tkt_renewtill&amp;quot; for the ticket's start/end/renewed-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
Also, &amp;quot;event_id&amp;quot; and &amp;quot;event_status&amp;quot; for audit event ID and to indicate if the event is reported on success or failure. (Most likely these two already have some standard names)&lt;br /&gt;
 &lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=5084</id>
		<title>Projects/Documentation Tasks</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=5084"/>
				<updated>2013-02-26T18:09:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Added Kerb for internet topic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To keep track of the various tasks that need to be documented such as function documentation, administration, troubleshooting etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application development ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Designing a new protocol, or extending existing one, to use GSS-API || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing security API|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; GSS-API vs SASL vs KRB5 &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to the similarities and differences between Heimdal and MIT Kerberos API &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| GSS-API || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A basic introduction to GSS-API, making use of the sample client and server, with special attention paid to Kerberos-related GSS-API issues&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to tell the GSS-API library on the client side where the existing Kerberos ticket cache is &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to write mechanism-independent GSS-API code&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to GSS-API naming as compared to Kerberos principal naming&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Using IAKERB&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Delegating credentials&amp;lt;/ul&amp;gt;|| GH ||2012-10-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Available extensions&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating the flags set on the connection  to ensure things like mutual authentication, confidentiality, integrity, replay protection, and sequence protection&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Krb5 library guide|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Kerberos prompter behavior&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  An introduction to ticket caches and keytabs and their corresponding APIs &amp;lt;/ul&amp;gt;|| KR || || || under review&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the pre-auth mechanisms, FAST&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the principal manipulation and parsing&amp;lt;/ul&amp;gt;|| TY || TBD || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Password change including the automatic internal support for password change on expired passwords if a prompter is provided&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  krb5_appdefault_* functions and their alternatives &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Completed task&lt;br /&gt;
! Author&lt;br /&gt;
! Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Choosing security API|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Acceptor naming - How to get servers to use any key in a keytab&amp;lt;/ul&amp;gt;|| GH||2012-03-01|| || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Anonymous credentials&amp;lt;/ul&amp;gt; || GH || 2012-10-01 || || &lt;br /&gt;
|-&lt;br /&gt;
| Developing plugins|| GH ||2012-03-08||  || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to developing plugins &amp;lt;/ul&amp;gt;|| || || || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Overview of existing pluggable interfaces   &amp;lt;/ul&amp;gt;|| ||  ||ZT reviewed profile plugin || &lt;br /&gt;
|-&lt;br /&gt;
| A more advanced introduction to using the Kerberos libraries for initial authentication, focusing on the authentication steps, validating initial credential|| TY || 2012-04-27 || ||&lt;br /&gt;
|-&lt;br /&gt;
| MIT Kerberos features : quick facts || ZT || ongoing || || &lt;br /&gt;
|-&lt;br /&gt;
| How to build Kerberos from source || ZT || || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Introduction to Kerberos system || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Man page &amp;lt;/ul&amp;gt;|| TH || 2012-08-15|| || in progress&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;General overview&amp;lt;/ul&amp;gt;|| TH ||2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Intro for admins&amp;lt;/ul&amp;gt;|| TH ||2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Technical overview&amp;lt;/ul&amp;gt;|| TH ||2012-07-15 || ||in progress&lt;br /&gt;
|-&lt;br /&gt;
|Setting a new realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Choosing backend: LDAP vs DB2&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; DNS configuration and SRV records - how they are used, in what order&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing encryption types for principals|| TY|| 2012-12-14|| ||under review&lt;br /&gt;
|-&lt;br /&gt;
| Upgrading a Kerberos infrastructure (order, backward compatibility) || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Integration Kerberos with Login System|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Difference between real Kerberos authentication, Kerberos password verification on the server side, and &amp;quot;LDAP authentication&amp;quot; in a Kerberos environment&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating Kerberos tickets&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Clear text password over HTTPS &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuring with pam_krb5 module&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Storing/locating keytab&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Cross-realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;cross-realm interaction with AD &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Transitive trust&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Referrals&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Performance|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tuning tips&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tradeoffs&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin interface|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Keying workstation/ host key setting&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Using Smartcard with PKINIT|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Kerberized ssh|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuration&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Cross-realm and ssh&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| A guide to principal naming basics and structure|| ZT ||2013-03-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| Troubleshooting|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Troubleshooting  errors&amp;lt;/ul&amp;gt; || ZT || ongoing|| ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Realm renaming &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Basic concepts (passwd policy, ticket ) || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Approaches to authorization -- centralized vs distributed, etc. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Completed task&lt;br /&gt;
! Author&lt;br /&gt;
! Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Replication || ZT|| || || &lt;br /&gt;
|-&lt;br /&gt;
| Reverse DNS|| TY|| 2012-12-12|| || &lt;br /&gt;
|-&lt;br /&gt;
| Selecting and configuring plugins|| GH ||2012-03-15|| || &lt;br /&gt;
|-&lt;br /&gt;
| Anonymity support|| GH ||2012-10-01 || || &lt;br /&gt;
|-&lt;br /&gt;
| Trace logging ||GH ||2012-03-22|| ||&lt;br /&gt;
|-&lt;br /&gt;
| Using LDAP server for Kerberos backend|| ZT || || || Ubuntu 10.4 (lucid) &lt;br /&gt;
|-&lt;br /&gt;
| Acceptable date and time formats || ZT || 2012-07-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
| kadm5.acl man page  || ZT || 2012-08-15 || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Why Kerberos system is suitable for the internet, not only for the enterprise || TY || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== API documentation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most commonly used API functions (in alphabetical order):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tier 1 - Highest priority&lt;br /&gt;
|-&lt;br /&gt;
! Completed API&lt;br /&gt;
!  Author&lt;br /&gt;
! Reviewer&lt;br /&gt;
!  Date&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|krb5_build_principal_alloc_va [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_alloc_va.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal_ext [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_close.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default_name.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_destroy [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_destroy.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_dup [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_cc_dup.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_get_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_get_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_get_type [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_type.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_initialize [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_initialize.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_new_unique [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_new_unique.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_resolve [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_resolve.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_change_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_change_password.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_context.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_error_message.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_fwd_tgt_cred  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_fwd_tgt_cred.html]|| ZT || GH|| || Needs example&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_default_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_error_message.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_host_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_credentials  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_credentials.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_fallback_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_fallback_host_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_keytab  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_keytab.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_alloc  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_alloc.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_free  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_free.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_get_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_get_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_init  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_init.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_address_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_address_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_anonymous  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_anonymous.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_canonicalize  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_canonicalize.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_change_password_prompt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_change_password_prompt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_etype_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_etype_list.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_expire_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_expire_callback.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache_name   [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_forwardable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_forwardable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_out_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_out_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_pa  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_pa.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_preauth_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_preauth_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_proxiable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_proxiable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_renew_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_renew_life.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_salt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_salt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_tkt_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_tkt_life.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_profile  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_profile.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_prompt_types  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_prompt_types.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_renewed_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_renewed_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_validated_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_validated_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_context.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_secure_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_secure_context.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_config_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_config_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_thread_safe  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_thread_safe.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_close.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_type  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_type.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_resolve  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_resolve.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kuserok  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kuserok.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name_flags.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_principal_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_any_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_any_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_prompter_posix  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_prompter_posix.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_realm_compare  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_realm_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth.html]||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth_version  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth_version.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_default_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_set_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_password_using_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password_using_ccache.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_principal_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_principal_realm.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_callback.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_filename  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_filename.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_sname_to_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_sname_to_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_unparse_name_flags.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_flags_ext.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_us_timeofday  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_us_timeofday.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_verify_authdata_kdc_issued  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_verify_authdata_kdc_issued.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
We may want to have more examples for some of the common API functions.&lt;br /&gt;
&lt;br /&gt;
== Manpage proofreading ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! manpage&lt;br /&gt;
! original&lt;br /&gt;
! reviewer&lt;br /&gt;
! comments&lt;br /&gt;
|-&lt;br /&gt;
| k5identity.5 || src/gen-manpages/k5identity.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5login.5 || src/gen-manpages/k5login.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5srvutil.1 || src/kadmin/cli/k5srvutil.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin.1 || src/kadmin/cli/kadmin.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmind.8 || src/kadmin/server/kadmind.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_ldap_util.8 || src/plugins/kdb/ldap/ldap_util/kdb5_ldap_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_util.8 || src/kadmin/dbutil/kdb5_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdc.conf.5 || src/config-files/kdc.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdestroy.1 || src/clients/kdestroy/kdestroy.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kinit.1 || src/clients/kinit/kinit.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpasswd.1 || src/clients/kpasswd/kpasswd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kprop.8 || src/slave/kprop.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpropd.8 || src/slave/kpropd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kproplog.8 || src/slave/kproplog.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5-send-pr.1 || src/util/send-pr/send-pr.1 || || copyright issues. Removed from the documentation&lt;br /&gt;
|-&lt;br /&gt;
| krb5.conf.5 || src/config-files/krb5.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5kdc.8 || src/kdc/krb5kdc.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| ksu.1 || src/clients/ksu/ksu.M || GH || needs rewrite&lt;br /&gt;
|-&lt;br /&gt;
| kswitch.1 || src/clients/kswitch/kswitch.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kvno.1 || src/clients/kvno/kvno.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sclient.1 || src/appl/sample/sclient/sclient.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sserver.8 || src/appl/sample/sserver/sserver.M || GH ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abbreviations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! abbreviation&lt;br /&gt;
! full names?&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| GH || Greg Hudson&lt;br /&gt;
|-&lt;br /&gt;
| KR || Ken Raeburn&lt;br /&gt;
|-&lt;br /&gt;
| MIT || MITKC group&lt;br /&gt;
|-&lt;br /&gt;
| NW ||  Nico Williams&lt;br /&gt;
|-&lt;br /&gt;
| TH || Thomas  Hardjono&lt;br /&gt;
|-&lt;br /&gt;
| TY || Tom Yu&lt;br /&gt;
|-&lt;br /&gt;
| ZT || Zhanna Tsitkov&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5083</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5083"/>
				<updated>2013-02-26T15:13:36Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Clarify Design-2 ties to the existin MIT Kerb json.so lib&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up basic information: List of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication &lt;br /&gt;
: (Common Criteria Class FIA)&lt;br /&gt;
:AS exchange: &lt;br /&gt;
::Basic information: client principal name; requested service name; remote port; selected keytype for the ticket session key; pre-authentication error; KDC status message;&lt;br /&gt;
::On success: ticket id; returned ticket start, end and renew until times; ticket flags; &lt;br /&gt;
:TGS exchange: &lt;br /&gt;
::TGS&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; remote port; authtime timestamp; selected keytype for the ticket session key; KDC status message; if the request is for referral ticket indicate to which server;&lt;br /&gt;
:::On success: returned ticket start, end and renew until times; ticket flags; if the request was to renew ticket – indicate that ticket was renewed; &lt;br /&gt;
::Alternate&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: alternate TGT&lt;br /&gt;
::Cross-realm&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name, remote port; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: cross-realm TGT&lt;br /&gt;
::U2U&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: second ticket  client and server name&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request &lt;br /&gt;
;Session keys :&lt;br /&gt;
:(Common Criteria FCS_CKM.1, FCS_CKM.4):&lt;br /&gt;
: AS and TGS exchange: ticket id; client principal name; requested service name, remote port;  authtime timestamp; keytype list in request and selected keytype for the ticket session key;&lt;br /&gt;
: AS and TGS exchange: ticket id; session key cleaning;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-03 draft to securely communicate ticket id between Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
=== Design 3 (key-value pairs) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to construct/parse key-value pairs.&lt;br /&gt;
                                                                        &lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON based) ===&lt;br /&gt;
&lt;br /&gt;
This approach is based on JSON serialization of the KDC auditable events and utilized the MIT Kerberos json.so library. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event.&lt;br /&gt;
  * Here 'event_id' is an assigned ID of the auditable event and&lt;br /&gt;
  * 'status' indicates whether the event succeeded or failed. &lt;br /&gt;
  */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
                           &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (TGS-REQ):&lt;br /&gt;
&lt;br /&gt;
 #include &amp;quot;k5-json.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct tgs_req_audit_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode tgs_req_audit_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, TGS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, TS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 The output aud_str string looks similar to the following:&lt;br /&gt;
 &lt;br /&gt;
 {&amp;quot;event_id&amp;quot;:5,&amp;quot;event_status&amp;quot;:1,&amp;quot;tkt_id&amp;quot;:&amp;quot;E5CBD3923BAEBA13&amp;quot;,&amp;quot;kdc_status&amp;quot;:&amp;quot;ISSUE&amp;quot;,&lt;br /&gt;
 &amp;quot;princ_cl&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;user&amp;quot;,&amp;quot;length&amp;quot;:1,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
 &amp;quot;princ_srv&amp;quot;:{&amp;quot;realm&amp;quot;:&amp;quot;KRBTEST.COM&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;host&amp;quot;,&amp;quot;length&amp;quot;:2,&amp;quot;type&amp;quot;:1},&lt;br /&gt;
 &amp;quot;full_address&amp;quot;:{&amp;quot;port&amp;quot;:42315,&amp;quot;address&amp;quot;:{&amp;quot;addrtype&amp;quot;:2,&amp;quot;length&amp;quot;:4,&amp;quot;addr&amp;quot;:[18,18,2,37]}},&lt;br /&gt;
 &amp;quot;rep_flags&amp;quot;:176,&amp;quot;authtime&amp;quot;:1361890372,&amp;quot;sesskey_cleared&amp;quot;:true,&lt;br /&gt;
 &amp;quot;tkt_start&amp;quot;:1361890415,&amp;quot;tkt_end&amp;quot;:1361976772,&lt;br /&gt;
 &amp;quot;ktype&amp;quot;:18,&amp;quot;avail_ktypes&amp;quot;:[18,17,16,23,25,26,1,3,2]}&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible field names are:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and server principal names;&lt;br /&gt;
* &amp;quot;port&amp;quot; for client's port;&lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;ktype&amp;quot; and &amp;quot;avail_ktypes&amp;quot; for available key types and used keytype;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;tkt_start&amp;quot;, &amp;quot;tkt_end&amp;quot; and &amp;quot;tkt_renewtill&amp;quot; for the ticket's start/end/renewed-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
Also, &amp;quot;event_id&amp;quot; and &amp;quot;event_status&amp;quot; for audit event ID and to indicate if the event is reported on success or failure. (Most likely these two already have some standard names)&lt;br /&gt;
 &lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5080</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5080"/>
				<updated>2013-02-20T21:04:51Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Added section title/placeholder  for design#3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up basic information: List of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication &lt;br /&gt;
: (Common Criteria Class FIA)&lt;br /&gt;
:AS exchange: &lt;br /&gt;
::Basic information: client principal name; requested service name; remote port; selected keytype for the ticket session key; pre-authentication error; KDC status message;&lt;br /&gt;
::On success: ticket id; returned ticket start, end and renew until times; ticket flags; &lt;br /&gt;
:TGS exchange: &lt;br /&gt;
::TGS&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; remote port; authtime timestamp; selected keytype for the ticket session key; KDC status message; if the request is for referral ticket indicate to which server;&lt;br /&gt;
:::On success: returned ticket start, end and renew until times; ticket flags; if the request was to renew ticket – indicate that ticket was renewed; &lt;br /&gt;
::Alternate&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: alternate TGT&lt;br /&gt;
::Cross-realm&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name, remote port; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: cross-realm TGT&lt;br /&gt;
::U2U&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: second ticket  client and server name&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request &lt;br /&gt;
;Session keys :&lt;br /&gt;
:(Common Criteria FCS_CKM.1, FCS_CKM.4):&lt;br /&gt;
: AS and TGS exchange: ticket id; client principal name; requested service name, remote port;  authtime timestamp; keytype list in request and selected keytype for the ticket session key;&lt;br /&gt;
: AS and TGS exchange: ticket id; session key cleaning;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-03 draft to securely communicate ticket id between Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
=== Design 3 (key-value pairs) ===&lt;br /&gt;
&lt;br /&gt;
Use C variadic function to construct/parse key-value pairs.&lt;br /&gt;
                                                                        &lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON based) ===&lt;br /&gt;
&lt;br /&gt;
This approach is based on JSON serialization of the KDC auditable events. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event.&lt;br /&gt;
  * Here 'event_id' is an assigned ID of the auditable event and&lt;br /&gt;
  * 'status' indicates whether the event succeeded or failed. &lt;br /&gt;
  */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible field names are:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and server principal names;&lt;br /&gt;
* &amp;quot;port&amp;quot; for client's port;&lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;ktype&amp;quot; and &amp;quot;avail_ktypes&amp;quot; for available key types and used keytype;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;tkt_start&amp;quot;, &amp;quot;tkt_end&amp;quot; and &amp;quot;tkt_renewtill&amp;quot; for the ticket's start/end/renewed-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
Also, &amp;quot;event_id&amp;quot; and &amp;quot;event_status&amp;quot; for audit event ID and to indicate if the event is reported on success or failure. (Most likely these two already have some standard names)&lt;br /&gt;
                            &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (AS-REQ):&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct as_req_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode as_req_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, AS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, AS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5079</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5079"/>
				<updated>2013-02-20T17:53:38Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Added &amp;quot;Dictionary&amp;quot; and Example&amp;quot; sub-sections to the JSON-based design section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up basic information: List of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication &lt;br /&gt;
: (Common Criteria Class FIA)&lt;br /&gt;
:AS exchange: &lt;br /&gt;
::Basic information: client principal name; requested service name; remote port; selected keytype for the ticket session key; pre-authentication error; KDC status message;&lt;br /&gt;
::On success: ticket id; returned ticket start, end and renew until times; ticket flags; &lt;br /&gt;
:TGS exchange: &lt;br /&gt;
::TGS&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; remote port; authtime timestamp; selected keytype for the ticket session key; KDC status message; if the request is for referral ticket indicate to which server;&lt;br /&gt;
:::On success: returned ticket start, end and renew until times; ticket flags; if the request was to renew ticket – indicate that ticket was renewed; &lt;br /&gt;
::Alternate&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: alternate TGT&lt;br /&gt;
::Cross-realm&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name, remote port; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: cross-realm TGT&lt;br /&gt;
::U2U&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: second ticket  client and server name&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request &lt;br /&gt;
;Session keys :&lt;br /&gt;
:(Common Criteria FCS_CKM.1, FCS_CKM.4):&lt;br /&gt;
: AS and TGS exchange: ticket id; client principal name; requested service name, remote port;  authtime timestamp; keytype list in request and selected keytype for the ticket session key;&lt;br /&gt;
: AS and TGS exchange: ticket id; session key cleaning;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-03 draft to securely communicate ticket id between Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
                                                                        &lt;br /&gt;
                                           &lt;br /&gt;
=== Design 2 (JSON based) ===&lt;br /&gt;
&lt;br /&gt;
This approach is based on JSON serialization of the KDC auditable events. &lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event.&lt;br /&gt;
  * Here 'event_id' is an assigned ID of the auditable event and&lt;br /&gt;
  * 'status' indicates whether the event succeeded or failed. &lt;br /&gt;
  */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions. */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status, const char *audit_string);&lt;br /&gt;
&lt;br /&gt;
==== Dictionary of the field names ====&lt;br /&gt;
&lt;br /&gt;
One needs to define a dictionary of the field names to be used to describe the events in some unified way. &lt;br /&gt;
&lt;br /&gt;
The possible field names are:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;tkt_id&amp;quot; for ticket ID;&lt;br /&gt;
* &amp;quot;client&amp;quot; and &amp;quot;server&amp;quot; for client and server principal names;&lt;br /&gt;
* &amp;quot;port&amp;quot; for client's port;&lt;br /&gt;
* &amp;quot;pa_error&amp;quot; for pre-authentication error;&lt;br /&gt;
* &amp;quot;ktype&amp;quot; and &amp;quot;avail_ktypes&amp;quot; for available key types and used keytype;&lt;br /&gt;
* &amp;quot;sesskey_cleared&amp;quot; to indicate that session key was cleared;&lt;br /&gt;
* &amp;quot;tkt_start&amp;quot;, &amp;quot;tkt_end&amp;quot; and &amp;quot;tkt_renewtill&amp;quot; for the ticket's start/end/renewed-until times; &lt;br /&gt;
* &amp;quot;rep_flags&amp;quot; for reply flags;&lt;br /&gt;
* &amp;quot;kdc_status&amp;quot; for KDC status message;&lt;br /&gt;
* &amp;quot;plugins&amp;quot; and &amp;quot;plugins_base_dir&amp;quot; for available plugins (reported on KDC startup);&lt;br /&gt;
* etc.&lt;br /&gt;
&lt;br /&gt;
Also, &amp;quot;event_id&amp;quot; and &amp;quot;event_status&amp;quot; for audit event ID and to indicate if the event is reported on success or failure. (Most likely these two already have some standard names)&lt;br /&gt;
                            &lt;br /&gt;
==== Example ====&lt;br /&gt;
&lt;br /&gt;
The typical call on KDC side (AS-REQ):&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code rc = 0;&lt;br /&gt;
 char *aud_str = NULL;&lt;br /&gt;
 struct as_req_state *state;&lt;br /&gt;
 ...&lt;br /&gt;
 if (kau_isloaded(kdc_context) == TRUE) {&lt;br /&gt;
    /* JSON encode as_req_state */&lt;br /&gt;
    rc = kau_jenc_asreq(kdc_context, AS_REQ, 0, state, &amp;amp;aud_str);   &lt;br /&gt;
    if (!rc &amp;amp;&amp;amp; aud_str != NULL) {&lt;br /&gt;
       rc = kau_kdc_event(kdc_context, AS_REQ, 0, aud_str)&lt;br /&gt;
       free(aud_str);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Design 1 (one-API-per-event) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.  The benefit of this approach is it's very low cost to KDC.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=5072</id>
		<title>Projects/Documentation Tasks</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=5072"/>
				<updated>2013-02-13T16:54:10Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: Updated Admin list with request from tkt 7568&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To keep track of the various tasks that need to be documented such as function documentation, administration, troubleshooting etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application development ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Designing a new protocol, or extending existing one, to use GSS-API || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing security API|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; GSS-API vs SASL vs KRB5 &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to the similarities and differences between Heimdal and MIT Kerberos API &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| GSS-API || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A basic introduction to GSS-API, making use of the sample client and server, with special attention paid to Kerberos-related GSS-API issues&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to tell the GSS-API library on the client side where the existing Kerberos ticket cache is &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; How to write mechanism-independent GSS-API code&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to GSS-API naming as compared to Kerberos principal naming&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Using IAKERB&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Delegating credentials&amp;lt;/ul&amp;gt;|| GH ||2012-10-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Available extensions&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating the flags set on the connection  to ensure things like mutual authentication, confidentiality, integrity, replay protection, and sequence protection&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Krb5 library guide|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Kerberos prompter behavior&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  An introduction to ticket caches and keytabs and their corresponding APIs &amp;lt;/ul&amp;gt;|| KR || || || under review&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the pre-auth mechanisms, FAST&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; An advanced guide to the principal manipulation and parsing&amp;lt;/ul&amp;gt;|| TY || TBD || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Thread safety&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Password change including the automatic internal support for password change on expired passwords if a prompter is provided&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  krb5_appdefault_* functions and their alternatives &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Completed task&lt;br /&gt;
! Author&lt;br /&gt;
! Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Choosing security API|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;  Acceptor naming - How to get servers to use any key in a keytab&amp;lt;/ul&amp;gt;|| GH||2012-03-01|| || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Anonymous credentials&amp;lt;/ul&amp;gt; || GH || 2012-10-01 || || &lt;br /&gt;
|-&lt;br /&gt;
| Developing plugins|| GH ||2012-03-08||  || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; A guide to developing plugins &amp;lt;/ul&amp;gt;|| || || || &lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Overview of existing pluggable interfaces   &amp;lt;/ul&amp;gt;|| ||  ||ZT reviewed profile plugin || &lt;br /&gt;
|-&lt;br /&gt;
| A more advanced introduction to using the Kerberos libraries for initial authentication, focusing on the authentication steps, validating initial credential|| TY || 2012-04-27 || ||&lt;br /&gt;
|-&lt;br /&gt;
| MIT Kerberos features : quick facts || ZT || ongoing || || &lt;br /&gt;
|-&lt;br /&gt;
| How to build Kerberos from source || ZT || || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Administration ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! task&lt;br /&gt;
! Proposed Author&lt;br /&gt;
! Target Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Introduction to Kerberos system || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Man page &amp;lt;/ul&amp;gt;|| TH || 2012-08-15|| || in progress&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;General overview&amp;lt;/ul&amp;gt;|| TH ||2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Intro for admins&amp;lt;/ul&amp;gt;|| TH ||2012-08-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Technical overview&amp;lt;/ul&amp;gt;|| TH ||2012-07-15 || ||in progress&lt;br /&gt;
|-&lt;br /&gt;
|Setting a new realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Choosing backend: LDAP vs DB2&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; DNS configuration and SRV records - how they are used, in what order&amp;lt;/ul&amp;gt;|| KR || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Choosing encryption types for principals|| TY|| 2012-12-14|| ||under review&lt;br /&gt;
|-&lt;br /&gt;
| Upgrading a Kerberos infrastructure (order, backward compatibility) || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Integration Kerberos with Login System|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Difference between real Kerberos authentication, Kerberos password verification on the server side, and &amp;quot;LDAP authentication&amp;quot; in a Kerberos environment&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Validating Kerberos tickets&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Clear text password over HTTPS &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuring with pam_krb5 module&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Storing/locating keytab&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Cross-realm|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;cross-realm interaction with AD &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Transitive trust&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Referrals&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Performance|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tuning tips&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Performance tradeoffs&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin interface|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Keying workstation/ host key setting&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Using Smartcard with PKINIT|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Kerberized ssh|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt; Configuration&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Cross-realm and ssh&amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| A guide to principal naming basics and structure|| ZT ||2013-03-01 || ||&lt;br /&gt;
|-&lt;br /&gt;
| Troubleshooting|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Troubleshooting  errors&amp;lt;/ul&amp;gt; || ZT || ongoing|| ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Realm renaming &amp;lt;/ul&amp;gt;|| || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Basic concepts (passwd policy, ticket ) || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Approaches to authorization -- centralized vs distributed, etc. || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! Completed task&lt;br /&gt;
! Author&lt;br /&gt;
! Date&lt;br /&gt;
! Reviewer&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
| Replication || ZT|| || || &lt;br /&gt;
|-&lt;br /&gt;
| Reverse DNS|| TY|| 2012-12-12|| || &lt;br /&gt;
|-&lt;br /&gt;
| Selecting and configuring plugins|| GH ||2012-03-15|| || &lt;br /&gt;
|-&lt;br /&gt;
| Anonymity support|| GH ||2012-10-01 || || &lt;br /&gt;
|-&lt;br /&gt;
| Trace logging ||GH ||2012-03-22|| ||&lt;br /&gt;
|-&lt;br /&gt;
| Using LDAP server for Kerberos backend|| ZT || || || Ubuntu 10.4 (lucid) &lt;br /&gt;
|-&lt;br /&gt;
| Acceptable date and time formats || ZT || 2012-07-15 || ||&lt;br /&gt;
|-&lt;br /&gt;
| kadm5.acl man page  || ZT || 2012-08-15 || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API documentation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Most commonly used API functions (in alphabetical order)===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tier 1 - Highest priority&lt;br /&gt;
|-&lt;br /&gt;
! Completed API&lt;br /&gt;
!  Author&lt;br /&gt;
! Reviewer&lt;br /&gt;
!  Date&lt;br /&gt;
! Reviewer Comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|krb5_build_principal_alloc_va [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_alloc_va.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal_ext [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_build_principal_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_close.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_default_name.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_destroy [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_destroy.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_dup [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_cc_dup.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_get_name [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_get_principal [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_get_type [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_get_type.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_initialize [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_initialize.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_new_unique [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_new_unique.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_cc_resolve [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_cc_resolve.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_change_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_change_password.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_context.html]|| ZT|| GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_error_message.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_free_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_fwd_tgt_cred  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_fwd_tgt_cred.html]|| ZT || GH|| || Needs example&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_default_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_error_message  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_error_message.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_host_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_credentials  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_credentials.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_fallback_host_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_fallback_host_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_keytab  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_keytab.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_alloc  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_alloc.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_free  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_free.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_get_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_get_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_init  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_init.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_address_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_address_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_anonymous  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_anonymous.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_canonicalize  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_canonicalize.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_change_password_prompt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_change_password_prompt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_etype_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_etype_list.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_expire_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_expire_callback.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache_name   [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_ccache_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_fast_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_forwardable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_forwardable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_out_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_out_ccache.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_pa  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_pa.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_preauth_list  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_preauth_list.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_proxiable  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_proxiable.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_renew_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_renew_life.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_salt  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_salt.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_tkt_life  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_opt_set_tkt_life.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_init_creds_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_profile  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_profile.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_prompt_types  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_prompt_types.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_renewed_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_renewed_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_validated_creds  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_get_validated_creds.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_context.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_secure_context  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_init_secure_context.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_config_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_config_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_thread_safe  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_is_thread_safe.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_close  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_close.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_default_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_type  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_get_type.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_resolve  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kt_resolve.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kuserok  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_kuserok.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_parse_name_flags.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_principal_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_any_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_any_realm.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_flags  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_principal_compare_flags.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_prompter_posix  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_prompter_posix.html]|| ZT||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_realm_compare  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_realm_compare.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth.html]||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth_version  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_recvauth_version.html] ||ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_default_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_default_realm.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_set_password  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_password_using_ccache  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_password_using_ccache.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_principal_realm  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_principal_realm.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_callback  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_callback.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_filename  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_set_trace_filename.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_sname_to_principal  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_sname_to_principal.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_ext.html]|| ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags  [http://web.mit.edu/kerberos/krb5-current/dockrb_appldev/refs/api/krb5_unparse_name_flags.html] || ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags_ext  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_unparse_name_flags_ext.html] || ZT ||GH || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_us_timeofday  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_us_timeofday.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_verify_authdata_kdc_issued  [http://web.mit.edu/kerberos/krb5-current/doc/krb_appldev/refs/api/krb5_verify_authdata_kdc_issued.html]|| ZT || GH|| ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
We may want to have more examples for some of the common API functions.&lt;br /&gt;
&lt;br /&gt;
== Manpage proofreading ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|-&lt;br /&gt;
! manpage&lt;br /&gt;
! original&lt;br /&gt;
! reviewer&lt;br /&gt;
! comments&lt;br /&gt;
|-&lt;br /&gt;
| k5identity.5 || src/gen-manpages/k5identity.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5login.5 || src/gen-manpages/k5login.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| k5srvutil.1 || src/kadmin/cli/k5srvutil.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmin.1 || src/kadmin/cli/kadmin.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kadmind.8 || src/kadmin/server/kadmind.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_ldap_util.8 || src/plugins/kdb/ldap/ldap_util/kdb5_ldap_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdb5_util.8 || src/kadmin/dbutil/kdb5_util.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdc.conf.5 || src/config-files/kdc.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kdestroy.1 || src/clients/kdestroy/kdestroy.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kinit.1 || src/clients/kinit/kinit.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpasswd.1 || src/clients/kpasswd/kpasswd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kprop.8 || src/slave/kprop.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kpropd.8 || src/slave/kpropd.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kproplog.8 || src/slave/kproplog.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5-send-pr.1 || src/util/send-pr/send-pr.1 || || copyright issues. Removed from the documentation&lt;br /&gt;
|-&lt;br /&gt;
| krb5.conf.5 || src/config-files/krb5.conf.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5kdc.8 || src/kdc/krb5kdc.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| ksu.1 || src/clients/ksu/ksu.M || GH || needs rewrite&lt;br /&gt;
|-&lt;br /&gt;
| kswitch.1 || src/clients/kswitch/kswitch.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| kvno.1 || src/clients/kvno/kvno.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sclient.1 || src/appl/sample/sclient/sclient.M || GH ||&lt;br /&gt;
|-&lt;br /&gt;
| sserver.8 || src/appl/sample/sserver/sserver.M || GH ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abbreviations ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &lt;br /&gt;
|-&lt;br /&gt;
! abbreviation&lt;br /&gt;
! full names?&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| GH || Greg Hudson&lt;br /&gt;
|-&lt;br /&gt;
| KR || Ken Raeburn&lt;br /&gt;
|-&lt;br /&gt;
| MIT || MITKC group&lt;br /&gt;
|-&lt;br /&gt;
| NW ||  Nico Williams&lt;br /&gt;
|-&lt;br /&gt;
| TH || Thomas  Hardjono&lt;br /&gt;
|-&lt;br /&gt;
| TY || Tom Yu&lt;br /&gt;
|-&lt;br /&gt;
| ZT || Zhanna Tsitkov&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5071</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5071"/>
				<updated>2013-02-11T19:42:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up basic information: List of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication &lt;br /&gt;
: (Common Criteria Class FIA)&lt;br /&gt;
:AS exchange: &lt;br /&gt;
::Basic information: client principal name; requested service name; remote port; selected keytype for the ticket session key; pre-authentication error; KDC status message;&lt;br /&gt;
::On success: ticket id; returned ticket start, end and renew until times; ticket flags; &lt;br /&gt;
:TGS exchange: &lt;br /&gt;
::TGS&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; remote port; authtime timestamp; selected keytype for the ticket session key; KDC status message; if the request is for referral ticket indicate to which server;&lt;br /&gt;
:::On success: returned ticket start, end and renew until times; ticket flags; if the request was to renew ticket – indicate that ticket was renewed; &lt;br /&gt;
::Alternate&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: alternate TGT&lt;br /&gt;
::Cross-realm&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name, remote port; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: cross-realm TGT&lt;br /&gt;
::U2U&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: second ticket  client and server name&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request &lt;br /&gt;
;Session keys :&lt;br /&gt;
:(Common Criteria FCS_CKM.1, FCS_CKM.4):&lt;br /&gt;
: AS and TGS exchange: ticket id; client principal name; requested service name, remote port;  authtime timestamp; keytype list in request and selected keytype for the ticket session key;&lt;br /&gt;
: AS and TGS exchange: ticket id; session key cleaning;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-03 draft to securely communicate ticket id between Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
                                                                        &lt;br /&gt;
=== Design 2 (newer) ===&lt;br /&gt;
&lt;br /&gt;
This approach is based on serialization of the KDC auditable events. &lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Load/unload Audit plugin */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, const int event_id, const int status, const char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 &lt;br /&gt;
 /* Check if Audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Create a ticket ID */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_make_tkt_id(const krb5_keyblock sk, char **out);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **out);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  const char *audit_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Design 1 (older) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5070</id>
		<title>Projects/Audit</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Audit&amp;diff=5070"/>
				<updated>2013-02-11T17:10:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tsitkova: New design based on serialization.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
Create an Audit infrastructure within MIT Kerberos to monitor security related events on the KDC.&lt;br /&gt;
In future expand Kerberos Audit facility to the application servers, kadmin if it remains desirable. &lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
The new audit system should be: &lt;br /&gt;
&lt;br /&gt;
* build-time enabled;&lt;br /&gt;
* run-time pluggable;&lt;br /&gt;
* simple, so it could be easily replaced with the OS specific implementations;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
This section details the categories of the auditable events and the associated information. &lt;br /&gt;
&lt;br /&gt;
;Audit module loaded/unloaded:  Startup and shutdown of the audit system must be recorded by audit system;&lt;br /&gt;
; KDC started/stopped&lt;br /&gt;
:KDC start-up basic information: List of KDC realms and corresponding ports on which the Kerberos server should listen for UDP and TCP requests; location and names of the plugins; &lt;br /&gt;
:KDC stopped - no additional information;&lt;br /&gt;
; Authentication &lt;br /&gt;
: (Common Criteria Class FIA)&lt;br /&gt;
:AS exchange: &lt;br /&gt;
::Basic information: client principal name; requested service name; remote port; selected keytype for the ticket session key; pre-authentication error; KDC status message;&lt;br /&gt;
::On success: ticket id; returned ticket start, end and renew until times; ticket flags; &lt;br /&gt;
:TGS exchange: &lt;br /&gt;
::TGS&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; remote port; authtime timestamp; selected keytype for the ticket session key; KDC status message; if the request is for referral ticket indicate to which server;&lt;br /&gt;
:::On success: returned ticket start, end and renew until times; ticket flags; if the request was to renew ticket – indicate that ticket was renewed; &lt;br /&gt;
::Alternate&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: alternate TGT&lt;br /&gt;
::Cross-realm&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name, remote port; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: cross-realm TGT&lt;br /&gt;
::U2U&lt;br /&gt;
:::Basic information: ticket id; client principal name; requested service name; authtime timestamp; KDC status message; &lt;br /&gt;
:::On success: second ticket  client and server name&lt;br /&gt;
:Policy: Policies violation when processing requests - TBD;  &lt;br /&gt;
::AS request; TGS request; S4U2PROXY request &lt;br /&gt;
;Session keys :&lt;br /&gt;
:(Common Criteria FCS_CKM.1, FCS_CKM.4):&lt;br /&gt;
: AS and TGS exchange: ticket id; client principal name; requested service name, remote port;  authtime timestamp; keytype list in request and selected keytype for the ticket session key;&lt;br /&gt;
: AS and TGS exchange: ticket id; session key cleaning;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Design details ==&lt;br /&gt;
&lt;br /&gt;
=== Ticket ID ===&lt;br /&gt;
&lt;br /&gt;
Ticket ID is recorded as part of audit messages. This allows to link tickets to their initial TGT at any stage of the Kerberos exchange. &lt;br /&gt;
&lt;br /&gt;
TODO: Consider a new authorization data element AD_TKT_ID per http://tools.ietf.org/html/draft-ietf-krb-wg-cammac-03 draft to securely communicate ticket id between Kerberos exchange participants.&lt;br /&gt;
&lt;br /&gt;
                                                                        &lt;br /&gt;
=== Design 2 (newer) ===&lt;br /&gt;
&lt;br /&gt;
This approach is based on serialization of the KDC auditable events. &lt;br /&gt;
&lt;br /&gt;
==== KDC facing API ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Record KDC event */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_event(krb5_context context, int event_id, int status, char *audit_str);&lt;br /&gt;
&lt;br /&gt;
 /* Helpers */&lt;br /&gt;
 /* Check if audit plugin is loaded */&lt;br /&gt;
 krb5_boolean&lt;br /&gt;
 kau_isloaded(krb5_context context);&lt;br /&gt;
 &lt;br /&gt;
 /* Basic serialization functions */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_shandle(krb5_context context, int event_id, int status,&lt;br /&gt;
                  struct server_handle shdl, char **str_out);&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_asreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                struct as_req_state *state, char **str_out);&lt;br /&gt;
 &lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_jenc_tgsreq(krb5_context context, int event_id, int status,&lt;br /&gt;
                 struct tgs_reg_state *state, char **str_out);&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char             *name;&lt;br /&gt;
    kau_open_fn       open;&lt;br /&gt;
    kau_close_fn      close;&lt;br /&gt;
    kau_record_fn     record;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
&lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_record_fn)(kau_ctx au_ctx, const int event_id, const int status,&lt;br /&gt;
                  const char *audit_string);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Design 1 (older) ===&lt;br /&gt;
&lt;br /&gt;
This design exercises the idea of one-API-per-KDC-event.&lt;br /&gt;
&lt;br /&gt;
==== KDC facing API  ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin loaded/unloaded */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 load_audit_plugin(krb5_context context);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 unload_audit_plugin(krb5_context context);&lt;br /&gt;
&lt;br /&gt;
 /* KDC started /stopped */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_start(krb5_context context, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_kdc_stop(krb5_context context, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* AS exchange: Successful (status=1) or unsuccessful (status=0) attempt */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_as_req_pa(krb5_context context, struct as_req_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* TGS exchange: Successful (status=1) or unsuccessful (status=0) attempt; alternate, u2u, s4u and cross-realm TGS */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs(krb5_context context,&lt;br /&gt;
         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_tgs_alt(krb5_context context,&lt;br /&gt;
             struct tgs_req_audit_state *state, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_u2u(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
             krb5_principal cl2, int status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_tgs_xrealm(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                char* xrealm, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Policy driven events - TBD */&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_as_req(krb5_context context, struct as_req_state *state,&lt;br /&gt;
                   krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_s4u2proxy_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                          krb5_db_entry *st_client, krb5_error_code status);&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 kau_policy_tgs_req(krb5_context context, struct tgs_req_audit_state *state,&lt;br /&gt;
                    krb5_ticket *header_ticket, krb5_error_code status);&lt;br /&gt;
&lt;br /&gt;
 /* Session key generation and cleaning up */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_generated(krb5_context context,&lt;br /&gt;
                          struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_as_cleared(krb5_context context,&lt;br /&gt;
                        struct as_req_state *state, int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_generated(krb5_context context,&lt;br /&gt;
                           struct tgs_req_audit_state *state,int status);&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_sesskey_tgs_cleared(krb5_context context,&lt;br /&gt;
                         struct tgs_req_audit_state *state, int status);&lt;br /&gt;
&lt;br /&gt;
 /* Name of audit module */&lt;br /&gt;
 krb5_error_code &lt;br /&gt;
 kau_plugin_name(krb5_context context, char **name);&lt;br /&gt;
&lt;br /&gt;
 struct as_req_state {&lt;br /&gt;
    loop_respond_fn respond;&lt;br /&gt;
    void *arg;&lt;br /&gt;
    ...&lt;br /&gt;
    kdc_realm_t *active_realm;&lt;br /&gt;
    krb5_error_code preauth_err;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
 struct tgs_req_audit_state {&lt;br /&gt;
    krb5_kdc_req *request;&lt;br /&gt;
    krb5_timestamp authtime;&lt;br /&gt;
    char *sname, *cname, *s4u_name, *u2ucname;&lt;br /&gt;
    krb5_principal altprinc;&lt;br /&gt;
    char *xrealm;&lt;br /&gt;
    const krb5_fulladdr *from;&lt;br /&gt;
    unsigned int c_flags;&lt;br /&gt;
    const char *status; /* KDC status message */&lt;br /&gt;
    krb5_enctype useenctype;&lt;br /&gt;
    krb5_boolean tkt_renewed;&lt;br /&gt;
    krb5_boolean is_referral;&lt;br /&gt;
    char *tkt_id;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==== Pluggable interface ====&lt;br /&gt;
&lt;br /&gt;
 /* Audit plugin vtable */&lt;br /&gt;
 typedef struct krb5_audit_vtable_st {&lt;br /&gt;
    /* Mandatory: name of module. */&lt;br /&gt;
    char *name;&lt;br /&gt;
    kau_open_fn  open;&lt;br /&gt;
    kau_close_fn close;&lt;br /&gt;
    kau_kdc_start_fn  kdc_start;&lt;br /&gt;
    kau_kdc_stop_fn   kdc_stop;&lt;br /&gt;
    kau_as_req_fn     as_req;&lt;br /&gt;
    kau_tgs_fn        tgs;&lt;br /&gt;
    kau_tgs_alt_fn    tgs_alt;&lt;br /&gt;
    kau_tgs_u2u_fn    tgs_u2u;&lt;br /&gt;
    kau_tgs_xrealm_fn tgs_xrealm;&lt;br /&gt;
    kau_policy_as_req_fn        policy_as_req;&lt;br /&gt;
    kau_policy_tgs_req_fn       policy_tgs_req;&lt;br /&gt;
    kau_policy_s4u2proxy_req_fn policy_s4u2proxy_req;&lt;br /&gt;
    kau_sesskey_as_generated_fn  sesskey_as_generated;&lt;br /&gt;
    kau_sesskey_as_cleared_fn    sesskey_as_cleared;&lt;br /&gt;
    kau_sesskey_tgs_generated_fn sesskey_tgs_generated;&lt;br /&gt;
    kau_sesskey_tgs_cleared_fn   sesskey_tgs_cleared;&lt;br /&gt;
 } *krb5_audit_vtable;&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_open_fn)(kau_ctx *au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_close_fn)(kau_ctx au_ctx);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_start_fn)(kau_ctx au_ctx,&lt;br /&gt;
                     krb5_deltat clockskew, const char *realm_port,&lt;br /&gt;
                     krb5_boolean allow_weak_crypto,&lt;br /&gt;
                     const char *plugins, const char *plugin_dir, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_kdc_stop_fn)(kau_ctx au_ctx, krb5_error_code  status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_as_req_fn)(kau_ctx au_ctx, const char *tkt_id,                  &lt;br /&gt;
                  const char *cname, const char *sname,&lt;br /&gt;
                  const int from_port, krb5_enctype sesskey_etype,&lt;br /&gt;
                  krb5_flags tkt_flags, const char *tkt_cname, &lt;br /&gt;
                  krb5_deltat tkt_start_time, krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
                  const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
               krb5_timestamp authtime, &lt;br /&gt;
               const char *cname, const char *sname,&lt;br /&gt;
               const int from_port,  krb5_enctype session_key_etype,&lt;br /&gt;
               const int is_referral, const int tkt_renewed,&lt;br /&gt;
               krb5_flags tkt_flags, krb5_deltat tkt_start_time,&lt;br /&gt;
               krb5_deltat tkt_end_time, krb5_deltat tkt_renew_till,&lt;br /&gt;
               const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_alt_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime, &lt;br /&gt;
                   const char *cname, const char *sname,  const char *altsrv, &lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_u2u_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                   krb5_timestamp authtime,&lt;br /&gt;
                   const char *cname, const char *sname,&lt;br /&gt;
                   const char *cl2, const char *srv2,&lt;br /&gt;
                   const int from_port, const char *kdc_status, int status);&lt;br /&gt;
  &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_tgs_xrealm_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                      krb5_timestamp authtime,&lt;br /&gt;
                      const char *cname, const char *sname, const char *xrealm,&lt;br /&gt;
                      krb5_flags c_flags, krb5_flags s_flags,&lt;br /&gt;
                      const int from_port, const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                const char *cname, const char *sname,&lt;br /&gt;
                                const int from_port,&lt;br /&gt;
                                const char * ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_as_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                              const char *cname, const char *sname,&lt;br /&gt;
                              const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                              const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_generated_fn)(kau_ctx au_ctx, const char *tkt_id,&lt;br /&gt;
                                 const char *cname, const char *sname,&lt;br /&gt;
                                 const int from_port,&lt;br /&gt;
                                 const char *ktypes, krb5_enctype used_ktype,&lt;br /&gt;
                                 const char *kdc_status, int status);&lt;br /&gt;
 &lt;br /&gt;
 typedef krb5_error_code&lt;br /&gt;
 (*kau_sesskey_tgs_cleared_fn)(kau_ctx au_ctx, const char *tkt_id,                        &lt;br /&gt;
                               const char *cname, const char *sname,&lt;br /&gt;
                               const int from_port, krb5_enctype used_ktype,&lt;br /&gt;
                               const char *kdc_status, int status);&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following  ./configure option to be added:&lt;br /&gt;
&lt;br /&gt;
;--with-audit-plugin=simple: (For demo and testing purposes) Build the audit plugin &amp;quot;simple&amp;quot; and enable audit plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test implementation ==&lt;br /&gt;
&lt;br /&gt;
We will use libaudit module available on Fedora, Debian, Suse for the first round. &lt;br /&gt;
&lt;br /&gt;
Some &amp;quot;simple&amp;quot; audit plugin will be implemented and Python test system will become aware of its existence. New ./configure --with-audit-plugin option will be introduced to build &amp;quot;simple&amp;quot; audit plugin for testing purpose.  If audit is enabled and audit plugin is available, &amp;quot;make check&amp;quot; will store audit messages into audit log file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
# Common Criteria for Information Technology Security Evaluation  http://www.commoncriteriaportal.org/files/ccfiles/CCPART2V3.1R4.pdf&lt;br /&gt;
# Oracle Solaris Auditing   http://docs.oracle.com/cd/E19963-01/html/821-1456/auditov-1.html &lt;br /&gt;
# Understanding Linux Audit   http://doc.opensuse.org/products/draft/SLES/SLES-security_sd_draft/cha.audit.comp.html&lt;br /&gt;
# Advanced Security Audit Policy Settings http://technet.microsoft.com/en-us/library/dd772712(v=ws.10).aspx&lt;br /&gt;
# Events Classification in Log Audit  http://airccse.org/journal/nsa/0410ijnsa5.pdf&lt;/div&gt;</summary>
		<author><name>Tsitkova</name></author>	</entry>

	</feed>