4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
25 #include <sys/types.h>
26 #include <sys/param.h>
28 #include <sys/fcntl.h>
34 #include <sys/socket.h>
35 #include <sys/sockio.h>
36 #include <netinet/in.h>
37 #include <tsol/label.h>
39 #include <bsm/audit.h>
40 #include <bsm/audit_record.h>
41 #include <bsm/audit_uevents.h>
42 #include <bsm/libbsm.h>
43 #include <bsm/audit_private.h>
49 #define BAD_PASSWD (1)
50 #define UNKNOWN_USER (2)
51 #define EXCLUDED_USER (3)
52 #define NO_ANONYMOUS (4)
53 #define MISC_FAILURE (5)
55 static char luser
[LOGNAME_MAX
+ 1];
57 static void generate_record(char *, int, char *);
58 static int selected(uid_t
, char *, au_event_t
, int);
61 audit_ftpd_bad_pw(char *uname
)
63 if (cannot_audit(0)) {
66 (void) strncpy(luser
, uname
, LOGNAME_MAX
);
67 generate_record(luser
, BAD_PASSWD
, dgettext(bsm_dom
, "bad password"));
72 audit_ftpd_unknown(char *uname
)
74 if (cannot_audit(0)) {
77 (void) strncpy(luser
, uname
, LOGNAME_MAX
);
78 generate_record(luser
, UNKNOWN_USER
, dgettext(bsm_dom
, "unknown user"));
83 audit_ftpd_excluded(char *uname
)
85 if (cannot_audit(0)) {
88 (void) strncpy(luser
, uname
, LOGNAME_MAX
);
89 generate_record(luser
, EXCLUDED_USER
, dgettext(bsm_dom
,
95 audit_ftpd_no_anon(void)
97 if (cannot_audit(0)) {
100 generate_record("", NO_ANONYMOUS
, dgettext(bsm_dom
, "no anonymous"));
104 audit_ftpd_failure(char *uname
)
106 if (cannot_audit(0)) {
109 generate_record(uname
, MISC_FAILURE
, dgettext(bsm_dom
, "misc failure"));
113 audit_ftpd_success(char *uname
)
115 if (cannot_audit(0)) {
118 (void) strncpy(luser
, uname
, LOGNAME_MAX
);
119 generate_record(luser
, 0, "");
126 char *locuser
, /* username of local user */
127 int err
, /* error status */
128 /* (=0 success, >0 error code) */
129 char *msg
) /* error message */
131 int rd
; /* audit record descriptor */
132 char buf
[256]; /* temporary buffer */
135 uid_t ruid
; /* real uid */
136 gid_t rgid
; /* real gid */
139 uid_t ceuid
; /* current effective uid */
140 struct auditinfo_addr info
;
142 if (cannot_audit(0)) {
146 pwd
= getpwnam(locuser
);
155 ceuid
= geteuid(); /* save current euid */
156 (void) seteuid(0); /* change to root so you can audit */
158 /* determine if we're preselected */
159 if (!selected(uid
, locuser
, AUE_ftpd
, err
)) {
160 (void) seteuid(ceuid
);
164 ruid
= getuid(); /* get real uid */
165 rgid
= getgid(); /* get real gid */
169 /* see if terminal id already set */
170 if (getaudit_addr(&info
, sizeof (info
)) < 0) {
176 /* add subject token */
177 (void) au_write(rd
, au_to_subject_ex(uid
, uid
, gid
,
178 ruid
, rgid
, pid
, pid
, &info
.ai_termid
));
180 if (is_system_labeled())
181 (void) au_write(rd
, au_to_mylabel());
183 /* add return token */
186 /* add reason for failure */
187 if (err
== UNKNOWN_USER
)
188 (void) snprintf(buf
, sizeof (buf
),
189 "%s %s", msg
, locuser
);
191 (void) snprintf(buf
, sizeof (buf
), "%s", msg
);
192 (void) au_write(rd
, au_to_text(buf
));
194 (void) au_write(rd
, au_to_return64(-1, (int64_t)err
));
196 (void) au_write(rd
, au_to_return32(-1, (int32_t)err
));
200 (void) au_write(rd
, au_to_return64(0, (int64_t)0));
202 (void) au_write(rd
, au_to_return32(0, (int32_t)0));
206 /* write audit record */
207 if (au_close(rd
, 1, AUE_ftpd
) < 0) {
208 (void) au_close(rd
, 0, 0);
210 (void) seteuid(ceuid
);
224 mask
.am_success
= mask
.am_failure
= 0;
225 if (uid
> MAXEPHUID
) {
226 /* get non-attrib flags */
227 (void) auditon(A_GETKMASK
, (caddr_t
)&mask
, sizeof (mask
));
229 (void) au_user_mask(locuser
, &mask
);
233 sorf
= AU_PRS_SUCCESS
;
234 } else if (err
>= 1) {
235 sorf
= AU_PRS_FAILURE
;
240 return (au_preselect(event
, &mask
, sorf
, AU_PRS_REREAD
));
245 audit_ftpd_logout(void)
247 int rd
; /* audit record descriptor */
253 struct auditinfo_addr info
;
255 if (cannot_audit(0)) {
259 (void) priv_set(PRIV_ON
, PRIV_EFFECTIVE
, PRIV_PROC_AUDIT
, NULL
);
261 /* see if terminal id already set */
262 if (getaudit_addr(&info
, sizeof (info
)) < 0) {
266 /* determine if we're preselected */
267 if (au_preselect(AUE_ftpd_logout
, &info
.ai_mask
, AU_PRS_SUCCESS
,
268 AU_PRS_USECACHE
) == 0) {
269 (void) priv_set(PRIV_OFF
, PRIV_EFFECTIVE
, PRIV_PROC_AUDIT
,
282 /* add subject token */
283 (void) au_write(rd
, au_to_subject_ex(info
.ai_auid
, euid
,
284 egid
, uid
, gid
, pid
, pid
, &info
.ai_termid
));
286 if (is_system_labeled())
287 (void) au_write(rd
, au_to_mylabel());
289 /* add return token */
292 (void) au_write(rd
, au_to_return64(0, (int64_t)0));
294 (void) au_write(rd
, au_to_return32(0, (int32_t)0));
297 /* write audit record */
298 if (au_close(rd
, 1, AUE_ftpd_logout
) < 0) {
299 (void) au_close(rd
, 0, 0);
301 (void) priv_set(PRIV_OFF
, PRIV_EFFECTIVE
, PRIV_PROC_AUDIT
, NULL
);