Bugzilla – Attachment 1396 Details for
Bug 1402
Support auditing through Linux Audit subsystem
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Proposed patch
openssh-4.7p1-linux-audit.patch (text/plain), 6.31 KB, created by
Tomas Mraz
on 2007-12-12 19:43:27 AEDT
(
hide
)
Description:
Proposed patch
Filename:
MIME Type:
Creator:
Tomas Mraz
Created:
2007-12-12 19:43:27 AEDT
Size:
6.31 KB
patch
obsolete
>diff -up openssh-4.7p1/auth.c.audit openssh-4.7p1/auth.c >--- openssh-4.7p1/auth.c.audit 2007-03-26 18:35:28.000000000 +0200 >+++ openssh-4.7p1/auth.c 2007-12-12 09:35:19.000000000 +0100 >@@ -286,6 +286,12 @@ auth_log(Authctxt *authctxt, int authent > get_canonical_hostname(options.use_dns), "ssh", &loginmsg); > # endif > #endif >+#if HAVE_LINUX_AUDIT >+ if (authenticated == 0 && !authctxt->postponed) { >+ linux_audit_record_event(-1, authctxt->user, NULL, >+ get_remote_ipaddr(), "sshd", 0); >+ } >+#endif > #ifdef SSH_AUDIT_EVENTS > if (authenticated == 0 && !authctxt->postponed) > audit_event(audit_classify_auth(method)); >@@ -492,6 +498,10 @@ getpwnamallow(const char *user) > record_failed_login(user, > get_canonical_hostname(options.use_dns), "ssh"); > #endif >+#ifdef HAVE_LINUX_AUDIT >+ linux_audit_record_event(-1, user, NULL, get_remote_ipaddr(), >+ "sshd", 0); >+#endif > #ifdef SSH_AUDIT_EVENTS > audit_event(SSH_INVALID_USER); > #endif /* SSH_AUDIT_EVENTS */ >diff -up openssh-4.7p1/loginrec.c.audit openssh-4.7p1/loginrec.c >--- openssh-4.7p1/loginrec.c.audit 2007-04-29 04:10:58.000000000 +0200 >+++ openssh-4.7p1/loginrec.c 2007-12-12 09:35:19.000000000 +0100 >@@ -176,6 +176,10 @@ > #include "auth.h" > #include "buffer.h" > >+#ifdef HAVE_LINUX_AUDIT >+# include <libaudit.h> >+#endif >+ > #ifdef HAVE_UTIL_H > # include <util.h> > #endif >@@ -202,6 +206,9 @@ int utmp_write_entry(struct logininfo *l > int utmpx_write_entry(struct logininfo *li); > int wtmp_write_entry(struct logininfo *li); > int wtmpx_write_entry(struct logininfo *li); >+#ifdef HAVE_LINUX_AUDIT >+int linux_audit_write_entry(struct logininfo *li); >+#endif > int lastlog_write_entry(struct logininfo *li); > int syslogin_write_entry(struct logininfo *li); > >@@ -440,6 +447,10 @@ login_write(struct logininfo *li) > > /* set the timestamp */ > login_set_current_time(li); >+#ifdef HAVE_LINUX_AUDIT >+ if (linux_audit_write_entry(li) == 0) >+ fatal("linux_audit_write_entry failed: %s", strerror(errno)); >+#endif > #ifdef USE_LOGIN > syslogin_write_entry(li); > #endif >@@ -1394,6 +1405,87 @@ wtmpx_get_entry(struct logininfo *li) > } > #endif /* USE_WTMPX */ > >+#ifdef HAVE_LINUX_AUDIT >+static void >+_audit_hexscape(const char *what, char *where, unsigned int size) >+{ >+ const char *ptr = what; >+ const char *hex = "0123456789ABCDEF"; >+ >+ while (*ptr) { >+ if (*ptr == '"' || *ptr < 0x21 || *ptr > 0x7E) { >+ unsigned int i; >+ ptr = what; >+ for (i = 0; *ptr && i+2 < size; i += 2) { >+ where[i] = hex[((unsigned)*ptr & 0xF0)>>4]; /* Upper nibble */ >+ where[i+1] = hex[(unsigned)*ptr & 0x0F]; /* Lower nibble */ >+ ptr++; >+ } >+ where[i] = '\0'; >+ return; >+ } >+ ptr++; >+ } >+ where[0] = '"'; >+ if ((unsigned)(ptr - what) < size - 3) >+ { >+ size = ptr - what + 3; >+ } >+ strncpy(where + 1, what, size - 3); >+ where[size-2] = '"'; >+ where[size-1] = '\0'; >+} >+ >+#define AUDIT_LOG_SIZE 128 >+#define AUDIT_ACCT_SIZE (AUDIT_LOG_SIZE - 8) >+ >+int >+linux_audit_record_event(int uid, const char *username, >+ const char *hostname, const char *ip, const char *ttyn, int success) >+{ >+ char buf[AUDIT_LOG_SIZE]; >+ int audit_fd, rc; >+ >+ audit_fd = audit_open(); >+ if (audit_fd < 0) { >+ if (errno == EINVAL || errno == EPROTONOSUPPORT || >+ errno == EAFNOSUPPORT) >+ return 1; /* No audit support in kernel */ >+ else >+ return 0; /* Must prevent login */ >+ } >+ if (username == NULL) >+ snprintf(buf, sizeof(buf), "uid=%d", uid); >+ else { >+ char encoded[AUDIT_ACCT_SIZE]; >+ _audit_hexscape(username, encoded, sizeof(encoded)); >+ snprintf(buf, sizeof(buf), "acct=%s", encoded); >+ } >+ rc = audit_log_user_message(audit_fd, AUDIT_USER_LOGIN, >+ buf, hostname, ip, ttyn, success); >+ close(audit_fd); >+ if (rc >= 0) >+ return 1; >+ else >+ return 0; >+} >+ >+int >+linux_audit_write_entry(struct logininfo *li) >+{ >+ switch(li->type) { >+ case LTYPE_LOGIN: >+ return (linux_audit_record_event(li->uid, NULL, li->hostname, >+ NULL, li->line, 1)); >+ case LTYPE_LOGOUT: >+ return (1); /* We only care about logins */ >+ default: >+ logit("%s: invalid type field", __func__); >+ return (0); >+ } >+} >+#endif /* HAVE_LINUX_AUDIT */ >+ > /** > ** Low-level libutil login() functions > **/ >diff -up openssh-4.7p1/config.h.in.audit openssh-4.7p1/config.h.in >--- openssh-4.7p1/config.h.in.audit 2007-09-04 08:50:04.000000000 +0200 >+++ openssh-4.7p1/config.h.in 2007-12-12 09:35:19.000000000 +0100 >@@ -1334,6 +1334,9 @@ > /* Define if you want SELinux support. */ > #undef WITH_SELINUX > >+/* Define if you want Linux audit support. */ >+#undef HAVE_LINUX_AUDIT >+ > /* Define to 1 if your processor stores words with the most significant byte > first (like Motorola and SPARC, unlike Intel and VAX). */ > #undef WORDS_BIGENDIAN >diff -up openssh-4.7p1/loginrec.h.audit openssh-4.7p1/loginrec.h >--- openssh-4.7p1/loginrec.h.audit 2006-08-05 04:39:40.000000000 +0200 >+++ openssh-4.7p1/loginrec.h 2007-12-12 09:35:19.000000000 +0100 >@@ -127,5 +127,9 @@ char *line_stripname(char *dst, const ch > char *line_abbrevname(char *dst, const char *src, int dstsize); > > void record_failed_login(const char *, const char *, const char *); >+#ifdef HAVE_LINUX_AUDIT >+int linux_audit_record_event(int uid, const char *username, >+ const char *hostname, const char *ip, const char *ttyn, int success); >+#endif /* HAVE_LINUX_AUDIT */ > > #endif /* _HAVE_LOGINREC_H_ */ >diff -up openssh-4.7p1/configure.ac.audit openssh-4.7p1/configure.ac >--- openssh-4.7p1/configure.ac.audit 2007-12-12 09:35:19.000000000 +0100 >+++ openssh-4.7p1/configure.ac 2007-12-12 09:35:19.000000000 +0100 >@@ -3218,6 +3218,18 @@ AC_ARG_WITH(selinux, > fi ] > ) > >+# Check whether user wants Linux audit support >+LINUX_AUDIT_MSG="no" >+AC_ARG_WITH(linux-audit, >+ [ --with-linux-audit Enable Linux audit support], >+ [ if test "x$withval" != "xno" ; then >+ AC_DEFINE(HAVE_LINUX_AUDIT,1,[Define if you want Linux audit support.]) >+ LINUX_AUDIT_MSG="yes" >+ AC_CHECK_HEADERS(libaudit.h) >+ SSHDLIBS="$SSHDLIBS -laudit" >+ fi ] >+) >+ > # Check whether user wants Kerberos 5 support > KRB5_MSG="no" > AC_ARG_WITH(kerberos5, >@@ -4039,6 +4051,7 @@ echo " PAM support > echo " OSF SIA support: $SIA_MSG" > echo " KerberosV support: $KRB5_MSG" > echo " SELinux support: $SELINUX_MSG" >+echo " Linux audit support: $LINUX_AUDIT_MSG" > echo " Smartcard support: $SCARD_MSG" > echo " S/KEY support: $SKEY_MSG" > echo " TCP Wrappers support: $TCPW_MSG"
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 1402
:
1396
|
1930
|
1931
|
1934
|
1939
|
1940
|
1942
|
1943
|
1945
|
1950
|
1951
|
1952
|
1954
|
1974
|
1975
|
1976
|
1981
|
2010
|
2011
|
2012
|
2013
|
2014
|
2015
|
2085
|
2086
|
2087
|
2088
|
2089
|
2090
|
2795