2000-02-03 04:40:56 +00:00
/*
2000-05-17 02:48:04 +00:00
* Auditing VFS module for samba . Log selected file operations to syslog
2000-02-03 04:40:56 +00:00
* facility .
*
2003-05-11 23:34:18 +00:00
* Copyright ( C ) Tim Potter 1999 - 2000
* Copyright ( C ) Alexander Bokovoy 2002
* Copyright ( C ) Stefan ( metze ) Metzmacher 2002
2000-02-03 04:40:56 +00:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2007-07-09 19:25:36 +00:00
* the Free Software Foundation ; either version 3 of the License , or
2000-02-03 04:40:56 +00:00
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2007-07-10 05:23:25 +00:00
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
2000-02-03 04:40:56 +00:00
*/
2003-05-11 23:34:18 +00:00
# include "includes.h"
2011-02-25 23:20:06 +01:00
# include "system/filesys.h"
2011-02-25 16:19:10 +01:00
# include "system/syslog.h"
2011-03-22 22:34:22 +01:00
# include "smbd/smbd.h"
2011-06-29 15:33:54 +10:00
# include "lib/param/loadparm.h"
2003-05-11 23:34:18 +00:00
# undef DBGC_CLASS
# define DBGC_CLASS DBGC_VFS
2000-02-03 04:40:56 +00:00
2003-05-11 23:34:18 +00:00
static int audit_syslog_facility ( vfs_handle_struct * handle )
2002-03-19 02:51:48 +00:00
{
2005-09-29 15:57:21 +00:00
static const struct enum_list enum_log_facilities [ ] = {
2018-07-09 23:57:59 +02:00
# ifdef LOG_AUTH
{ LOG_AUTH , " AUTH " } ,
# endif
# ifdef LOG_AUTHPRIV
{ LOG_AUTHPRIV , " AUTHPRIV " } ,
# endif
# ifdef LOG_AUDIT
{ LOG_AUDIT , " AUDIT " } ,
# endif
# ifdef LOG_CONSOLE
{ LOG_CONSOLE , " CONSOLE " } ,
# endif
# ifdef LOG_CRON
{ LOG_CRON , " CRON " } ,
# endif
# ifdef LOG_DAEMON
{ LOG_DAEMON , " DAEMON " } ,
# endif
# ifdef LOG_FTP
{ LOG_FTP , " FTP " } ,
# endif
# ifdef LOG_INSTALL
{ LOG_INSTALL , " INSTALL " } ,
# endif
# ifdef LOG_KERN
{ LOG_KERN , " KERN " } ,
# endif
# ifdef LOG_LAUNCHD
{ LOG_LAUNCHD , " LAUNCHD " } ,
# endif
# ifdef LOG_LFMT
{ LOG_LFMT , " LFMT " } ,
# endif
# ifdef LOG_LPR
{ LOG_LPR , " LPR " } ,
# endif
# ifdef LOG_MAIL
{ LOG_MAIL , " MAIL " } ,
# endif
# ifdef LOG_MEGASAFE
{ LOG_MEGASAFE , " MEGASAFE " } ,
# endif
# ifdef LOG_NETINFO
{ LOG_NETINFO , " NETINFO " } ,
# endif
# ifdef LOG_NEWS
{ LOG_NEWS , " NEWS " } ,
# endif
# ifdef LOG_NFACILITIES
{ LOG_NFACILITIES , " NFACILITIES " } ,
# endif
2018-07-02 01:05:36 +02:00
# ifdef LOG_NTP
2018-07-09 23:57:59 +02:00
{ LOG_NTP , " NTP " } ,
# endif
# ifdef LOG_RAS
{ LOG_RAS , " RAS " } ,
# endif
# ifdef LOG_REMOTEAUTH
{ LOG_REMOTEAUTH , " REMOTEAUTH " } ,
2018-07-02 01:05:36 +02:00
# endif
# ifdef LOG_SECURITY
2018-07-09 23:57:59 +02:00
{ LOG_SECURITY , " SECURITY " } ,
# endif
# ifdef LOG_SYSLOG
{ LOG_SYSLOG , " SYSLOG " } ,
# endif
# ifdef LOG_USER
{ LOG_USER , " USER " } ,
# endif
# ifdef LOG_UUCP
{ LOG_UUCP , " UUCP " } ,
# endif
{ LOG_LOCAL0 , " LOCAL0 " } ,
{ LOG_LOCAL1 , " LOCAL1 " } ,
{ LOG_LOCAL2 , " LOCAL2 " } ,
{ LOG_LOCAL3 , " LOCAL3 " } ,
{ LOG_LOCAL4 , " LOCAL4 " } ,
{ LOG_LOCAL5 , " LOCAL5 " } ,
{ LOG_LOCAL6 , " LOCAL6 " } ,
{ LOG_LOCAL7 , " LOCAL7 " } ,
{ - 1 , NULL }
2005-09-29 15:57:21 +00:00
} ;
int facility ;
facility = lp_parm_enum ( SNUM ( handle - > conn ) , " audit " , " facility " , enum_log_facilities , LOG_USER ) ;
return facility ;
2003-05-11 23:34:18 +00:00
}
2002-03-19 02:51:48 +00:00
2003-05-11 23:34:18 +00:00
static int audit_syslog_priority ( vfs_handle_struct * handle )
{
2005-09-29 15:57:21 +00:00
static const struct enum_list enum_log_priorities [ ] = {
{ LOG_EMERG , " EMERG " } ,
{ LOG_ALERT , " ALERT " } ,
{ LOG_CRIT , " CRIT " } ,
{ LOG_ERR , " ERR " } ,
{ LOG_WARNING , " WARNING " } ,
{ LOG_NOTICE , " NOTICE " } ,
{ LOG_INFO , " INFO " } ,
2011-05-24 17:19:52 +02:00
{ LOG_DEBUG , " DEBUG " } ,
2018-07-02 01:05:36 +02:00
{ - 1 , NULL }
2005-09-29 15:57:21 +00:00
} ;
int priority ;
Fix Coverity warnings
ID 449, 448, 447, 446, 445, 444, 443, 442, 441, 440, 439, 438, 437
(This used to be commit 0d50b4ee9068d04d1d9eb7786e08775d7ba16bc8)
2008-03-23 15:51:52 +01:00
priority = lp_parm_enum ( SNUM ( handle - > conn ) , " audit " , " priority " ,
enum_log_priorities , LOG_NOTICE ) ;
if ( priority = = - 1 ) {
priority = LOG_WARNING ;
}
2005-09-29 15:57:21 +00:00
return priority ;
2002-07-30 09:59:53 +00:00
}
2000-02-03 04:40:56 +00:00
/* Implementation of vfs_ops. Pass everything on to the default
operation but log event first . */
2006-07-11 18:01:26 +00:00
static int audit_connect ( vfs_handle_struct * handle , const char * svc , const char * user )
2000-02-03 04:40:56 +00:00
{
2003-05-11 23:34:18 +00:00
int result ;
2009-11-30 15:53:04 -08:00
result = SMB_VFS_NEXT_CONNECT ( handle , svc , user ) ;
if ( result < 0 ) {
return result ;
}
2003-05-11 23:34:18 +00:00
openlog ( " smbd_audit " , LOG_PID , audit_syslog_facility ( handle ) ) ;
syslog ( audit_syslog_priority ( handle ) , " connect to service %s by user %s \n " ,
2000-05-17 02:48:04 +00:00
svc , user ) ;
2000-02-03 04:40:56 +00:00
2009-11-30 15:53:04 -08:00
return 0 ;
2000-02-03 04:40:56 +00:00
}
2006-07-11 18:01:26 +00:00
static void audit_disconnect ( vfs_handle_struct * handle )
2000-02-03 04:40:56 +00:00
{
2003-05-11 23:34:18 +00:00
syslog ( audit_syslog_priority ( handle ) , " disconnected \n " ) ;
2006-07-11 18:01:26 +00:00
SMB_VFS_NEXT_DISCONNECT ( handle ) ;
2003-05-11 23:34:18 +00:00
return ;
2000-02-03 04:40:56 +00:00
}
2019-09-04 13:38:56 -07:00
static int audit_mkdirat ( vfs_handle_struct * handle ,
struct files_struct * dirfsp ,
const struct smb_filename * smb_fname ,
mode_t mode )
{
2020-12-14 15:42:23 +01:00
struct smb_filename * full_fname = NULL ;
2019-09-04 13:38:56 -07:00
int result ;
2020-12-14 15:42:23 +01:00
full_fname = full_path_from_dirfsp_atname ( talloc_tos ( ) ,
dirfsp ,
smb_fname ) ;
if ( full_fname = = NULL ) {
errno = ENOMEM ;
return - 1 ;
}
2019-09-04 13:38:56 -07:00
result = SMB_VFS_NEXT_MKDIRAT ( handle ,
dirfsp ,
smb_fname ,
mode ) ;
syslog ( audit_syslog_priority ( handle ) , " mkdirat %s %s%s \n " ,
2020-12-14 15:42:23 +01:00
full_fname - > base_name ,
2019-09-04 13:38:56 -07:00
( result < 0 ) ? " failed: " : " " ,
( result < 0 ) ? strerror ( errno ) : " " ) ;
2020-12-14 15:42:23 +01:00
TALLOC_FREE ( full_fname ) ;
2019-09-04 13:38:56 -07:00
return result ;
}
2020-05-20 22:58:47 +02:00
static int audit_openat ( vfs_handle_struct * handle ,
const struct files_struct * dirfsp ,
const struct smb_filename * smb_fname ,
struct files_struct * fsp ,
2022-06-03 15:53:29 +02:00
const struct vfs_open_how * how )
2020-05-20 22:58:47 +02:00
{
int result ;
2022-06-03 15:53:29 +02:00
result = SMB_VFS_NEXT_OPENAT ( handle , dirfsp , smb_fname , fsp , how ) ;
2020-05-20 22:58:47 +02:00
syslog ( audit_syslog_priority ( handle ) ,
" openat %s (fd %d) %s%s%s \n " ,
fsp_str_dbg ( fsp ) , result ,
2022-06-03 15:53:29 +02:00
( ( how - > flags & O_WRONLY ) | | ( how - > flags & O_RDWR ) ) ?
" for writing " : " " ,
2020-05-20 22:58:47 +02:00
( result < 0 ) ? " failed: " : " " ,
( result < 0 ) ? strerror ( errno ) : " " ) ;
return result ;
}
2008-01-11 14:19:28 +01:00
static int audit_close ( vfs_handle_struct * handle , files_struct * fsp )
2000-02-03 04:40:56 +00:00
{
2003-05-11 23:34:18 +00:00
int result ;
2008-01-11 14:19:28 +01:00
result = SMB_VFS_NEXT_CLOSE ( handle , fsp ) ;
2000-02-03 04:40:56 +00:00
2003-05-11 23:34:18 +00:00
syslog ( audit_syslog_priority ( handle ) , " close fd %d %s%s \n " ,
2020-10-03 17:41:17 +02:00
fsp_get_pathref_fd ( fsp ) ,
2000-05-17 02:48:04 +00:00
( result < 0 ) ? " failed: " : " " ,
( result < 0 ) ? strerror ( errno ) : " " ) ;
2000-02-03 04:40:56 +00:00
2000-05-17 02:48:04 +00:00
return result ;
2000-02-03 04:40:56 +00:00
}
2019-08-08 15:30:54 -07:00
static int audit_renameat ( vfs_handle_struct * handle ,
files_struct * srcfsp ,
const struct smb_filename * smb_fname_src ,
files_struct * dstfsp ,
const struct smb_filename * smb_fname_dst )
{
2021-06-16 19:54:46 -07:00
struct smb_filename * full_fname_src = NULL ;
struct smb_filename * full_fname_dst = NULL ;
2019-08-08 15:30:54 -07:00
int result ;
2021-06-16 19:54:46 -07:00
int saved_errno = 0 ;
2019-08-08 15:30:54 -07:00
2021-06-16 19:54:46 -07:00
full_fname_src = full_path_from_dirfsp_atname ( talloc_tos ( ) ,
srcfsp ,
smb_fname_src ) ;
if ( full_fname_src = = NULL ) {
errno = ENOMEM ;
return - 1 ;
}
full_fname_dst = full_path_from_dirfsp_atname ( talloc_tos ( ) ,
dstfsp ,
smb_fname_dst ) ;
if ( full_fname_dst = = NULL ) {
TALLOC_FREE ( full_fname_src ) ;
errno = ENOMEM ;
return - 1 ;
}
2019-08-08 15:30:54 -07:00
result = SMB_VFS_NEXT_RENAMEAT ( handle ,
srcfsp ,
smb_fname_src ,
dstfsp ,
smb_fname_dst ) ;
2021-06-16 19:54:46 -07:00
if ( result = = - 1 ) {
saved_errno = errno ;
}
2019-08-08 15:30:54 -07:00
syslog ( audit_syslog_priority ( handle ) , " renameat %s -> %s %s%s \n " ,
2021-06-16 19:54:46 -07:00
full_fname_src - > base_name ,
full_fname_dst - > base_name ,
2019-08-08 15:30:54 -07:00
( result < 0 ) ? " failed: " : " " ,
( result < 0 ) ? strerror ( errno ) : " " ) ;
2021-06-16 19:54:46 -07:00
TALLOC_FREE ( full_fname_src ) ;
TALLOC_FREE ( full_fname_dst ) ;
if ( saved_errno ! = 0 ) {
errno = saved_errno ;
}
2019-08-08 15:30:54 -07:00
return result ;
}
2019-09-16 17:57:25 -07:00
static int audit_unlinkat ( vfs_handle_struct * handle ,
struct files_struct * dirfsp ,
const struct smb_filename * smb_fname ,
int flags )
{
2021-01-20 14:56:50 +01:00
struct smb_filename * full_fname = NULL ;
2019-09-16 17:57:25 -07:00
int result ;
2021-01-20 14:56:50 +01:00
full_fname = full_path_from_dirfsp_atname ( talloc_tos ( ) ,
dirfsp ,
smb_fname ) ;
if ( full_fname = = NULL ) {
return - 1 ;
}
2019-09-16 17:57:25 -07:00
result = SMB_VFS_NEXT_UNLINKAT ( handle ,
dirfsp ,
smb_fname ,
flags ) ;
syslog ( audit_syslog_priority ( handle ) , " unlinkat %s %s%s \n " ,
2021-01-20 14:56:50 +01:00
full_fname - > base_name ,
2019-09-16 17:57:25 -07:00
( result < 0 ) ? " failed: " : " " ,
( result < 0 ) ? strerror ( errno ) : " " ) ;
2021-01-20 14:56:50 +01:00
TALLOC_FREE ( full_fname ) ;
2019-09-16 17:57:25 -07:00
return result ;
}
2008-01-07 13:44:37 +01:00
static int audit_fchmod ( vfs_handle_struct * handle , files_struct * fsp , mode_t mode )
2002-03-19 02:51:48 +00:00
{
2003-05-11 23:34:18 +00:00
int result ;
2002-03-19 02:51:48 +00:00
2008-01-07 13:44:37 +01:00
result = SMB_VFS_NEXT_FCHMOD ( handle , fsp , mode ) ;
2003-05-11 23:34:18 +00:00
syslog ( audit_syslog_priority ( handle ) , " fchmod %s mode 0x%x %s%s \n " ,
2009-07-10 18:11:32 -07:00
fsp - > fsp_name - > base_name , mode ,
2002-03-19 02:51:48 +00:00
( result < 0 ) ? " failed: " : " " ,
( result < 0 ) ? strerror ( errno ) : " " ) ;
2001-10-24 00:45:41 +00:00
2002-03-19 02:51:48 +00:00
return result ;
}
2001-10-24 00:45:41 +00:00
2009-07-23 20:28:58 -04:00
static struct vfs_fn_pointers vfs_audit_fns = {
. connect_fn = audit_connect ,
2011-12-03 20:45:04 -08:00
. disconnect_fn = audit_disconnect ,
2019-09-04 13:38:56 -07:00
. mkdirat_fn = audit_mkdirat ,
2020-05-20 22:58:47 +02:00
. openat_fn = audit_openat ,
2009-07-23 20:28:58 -04:00
. close_fn = audit_close ,
2019-08-08 15:30:54 -07:00
. renameat_fn = audit_renameat ,
2019-09-16 17:57:25 -07:00
. unlinkat_fn = audit_unlinkat ,
2011-12-03 20:45:04 -08:00
. fchmod_fn = audit_fchmod ,
2009-06-30 22:44:39 -07:00
} ;
2015-08-13 18:16:20 +02:00
static_decl_vfs ;
2017-04-20 12:24:43 -07:00
NTSTATUS vfs_audit_init ( TALLOC_CTX * ctx )
2003-04-16 14:45:11 +00:00
{
2009-07-23 20:28:58 -04:00
return smb_register_vfs ( SMB_VFS_INTERFACE_VERSION , " audit " ,
& vfs_audit_fns ) ;
2003-04-16 14:45:11 +00:00
}