/* * Copyright (c) 2004 Apple Computer, Inc. All Rights Reserved. * * The contents of this file constitute Original Code as defined in and are * subject to the Apple Public Source License Version 1.2 (the 'License'). * You may not use this file except in compliance with the License. Please obtain * a copy of the License at http://www.apple.com/publicsource and read it before * using this file. * * This Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the * specific language governing rights and limitations under the License. */ #ifndef _H_CCAUDIT #define _H_CCAUDIT #include #include namespace Security { namespace CommonCriteria { // for Tiger, this should be incorporated into Security's OSStatus range enum ExternalErrors { errNone = 0, errInvalidCredential = 1111, // try to make easier to find in log errUserCanceled, errTooManyTries, errEndOfExternalErrors // sentry/placeholder }; class AuditMask { public: AuditMask() { } AuditMask(const AuditMask &am) { set(am.get()); } AuditMask(const au_mask_t &am) { set(am); } ~AuditMask() { } void set(const au_mask_t &am) { set(am.am_success, am.am_failure); } void set(unsigned int s, unsigned int f) { mMask.am_success = s; mMask.am_failure = f; } const au_mask_t &get(void) const { return mMask; } private: au_mask_t mMask; }; // For the most part, we won't have a machine ID to initialize the // au_tid_t's machine field. There's no machine ID in the audit token, // for example, since MIG is localhost-only. class TerminalId { public: TerminalId() { } TerminalId(const TerminalId &t) { set(t.get()); } TerminalId(const au_tid_t &tid) { set(tid); } TerminalId(dev_t p, u_int32_t m) { port(p); machine(m); } ~TerminalId() { } void set(void); // set using localhost void set(const au_tid_t &tid) { port(tid.port); machine(tid.machine); } void port(dev_t p) { mTid.port = p; } void machine(u_int32_t m) { mTid.machine = m; } const au_tid_t &get(void) const { return mTid; } private: au_tid_t mTid; }; // audit session state for the current process; only used by Server class AuditSession { public: AuditSession() { } AuditSession(au_id_t auid, AuditMask &mask, au_asid_t sid, TerminalId &tid) : mAuditId(auid), mEventMask(mask), mTerminalId(tid), mSessionId(sid) { } ~AuditSession() { } // set audit info for this process in kernel void registerSession(void); void auditId(au_id_t auid) { mAuditId = auid; } void eventMask(AuditMask &mask) { mEventMask = mask; } void terminalId(TerminalId &tid) { mTerminalId = tid; } void sessionId(au_asid_t sid) { mSessionId = sid; } au_id_t auditId(void) { return mAuditId; } AuditMask &eventMask(void) { return mEventMask; } TerminalId &terminalId(void) { return mTerminalId; } au_asid_t sessionId(void) { return mSessionId; } private: au_id_t mAuditId; AuditMask mEventMask; TerminalId mTerminalId; au_asid_t mSessionId; }; // // For submitting audit records. Not general-purpose: no ability to // submit arbitrary BSM tokens, for example. However, the SecurityServer // has only limited auditing requirements under Common Criteria. // class AuditRecord { public: AuditRecord(const audit_token_t &auditToken) : mAuditId(auditToken.val[0]), mRUid(auditToken.val[3]), mRGid(auditToken.val[4]), mEUid(auditToken.val[1]), mEGid(auditToken.val[2]), mPid(auditToken.val[5]), mSessionId(auditToken.val[6]), mTerminalId(auditToken.val[7], 0) { } ~AuditRecord() { } // returnCode == 0 --> success; nonzero returnCode --> failure void submit(const short event_code, const int returnCode, const char *msg = NULL); private: au_id_t mAuditId; uid_t mRUid; gid_t mRGid; uid_t mEUid; gid_t mEGid; pid_t mPid; au_asid_t mSessionId; TerminalId mTerminalId; }; } // end namespace CommonCriteria } // end namespace Security #endif // _H_CCAUDIT