mirror of
https://github.com/rsyslog/rsyslog.git
synced 2025-12-19 23:10:41 +01:00
added new config directive $omfileForceChown to fix some broken system configs.
See ticket for details: http://bugzilla.adiscon.com/show_bug.cgi?id=150
This commit is contained in:
parent
b34a23c652
commit
bfac3c68f4
@ -8,6 +8,9 @@ Version 4.7.0 [v4-devel] (rgerhards), 2009-09-??
|
||||
- added $LogRSyslogStatusMessages configuration directive
|
||||
permitting to turn off rsyslog start/stop/HUP messages. See Debian
|
||||
ticket http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=463793
|
||||
- added new config directive $omfileForceChown to (try to) fix some broken
|
||||
system configs.
|
||||
See ticket for details: http://bugzilla.adiscon.com/show_bug.cgi?id=150
|
||||
---------------------------------------------------------------------------
|
||||
Version 4.5.3 [v4-beta] (rgerhards), 2009-08-??
|
||||
- bugfix: repeated messages were incorrectly processed
|
||||
|
||||
64
doc/rsconf1_omfileforcechown.html
Normal file
64
doc/rsconf1_omfileforcechown.html
Normal file
@ -0,0 +1,64 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>rsyslog.conf file</title>
|
||||
</head>
|
||||
<body>
|
||||
<a href="rsyslog_conf_global.html">back</a>
|
||||
|
||||
<h2>$omfileForceChown</h2>
|
||||
<p><b>Type:</b> global configuration directive</p>
|
||||
<p><b>Parameter Values:</b> boolean (on/off, yes/no)</p>
|
||||
<p><b>Available since:</b> 4.7.0+, 5.3.0+</p>
|
||||
<p><b>Default:</b> off</p>
|
||||
<p><b>Description:</b></p>
|
||||
<p>Forces rsyslogd to change the ownership for output files that already exist. Please note
|
||||
that this tries to fix a potential problem that exists outside the scope of rsyslog. Actually,
|
||||
it tries to fix invalid ownership/permission settings set by the original file creator.
|
||||
<p>Rsyslog changes the ownership during initial execution with root privileges. When a privelege
|
||||
drop is configured, privileges are dropped after the file owner ship is changed. Not that this currently
|
||||
is a limitation in rsyslog's privilege drop code, which is on the TODO list to be removed. See Caveats
|
||||
section below for the important implications.
|
||||
<p><b>Caveats:</b></p>
|
||||
<p>This directive tries to fix a problem that actually is outside the scope of rsyslog. As such,
|
||||
there are a couple of restrictions and situations in which it will not work. <b>Users are strongly
|
||||
encouraged to fix their system instead of turning this directive on</b> - it should only be used
|
||||
as a last resort.
|
||||
<p>At least in the following scenario, this directive will fail expectedly:
|
||||
<p>It does not address
|
||||
the situation that someone changes the ownership *after* rsyslogd has started.
|
||||
Let's, for example, consider a log rotation script.
|
||||
<ul>
|
||||
<li>rsyslog is started
|
||||
<li>ownership is changed
|
||||
<li>privileges dropped
|
||||
<li>log rotation (lr) script starts
|
||||
<li>lr removes files
|
||||
<li>lr creates new files with root:adm (or whatever else)
|
||||
<li>lr HUPs rsyslogd
|
||||
<li>rsyslogd closes files
|
||||
<li>rsyslogd tries to open files
|
||||
<li>rsyslogd tries to change ownership --> fail as we are non-root now
|
||||
<li>file open fails
|
||||
</ul>
|
||||
|
||||
Please note that once the privilege drop code is refactored, this directive will
|
||||
no longer work, because then privileges will be dropped before any action is performed,
|
||||
and thus we will no longer be able to chown files that do not belong to the
|
||||
user rsyslogd is configured to run under.
|
||||
|
||||
<p>So <b>expect the directive to go away</b>. It will not
|
||||
be removed in version 4, but may disappear at any time for any version greater than 4.
|
||||
|
||||
<p><b>Sample:</b></p>
|
||||
<p><code><b>$FileOwner loguser</b>
|
||||
<br><b>$omfileForceChown on</b></code></p>
|
||||
|
||||
<p>[<a href="rsyslog_conf.html">rsyslog.conf overview</a>] [<a href="manual.html">manual
|
||||
index</a>] [<a href="http://www.rsyslog.com/">rsyslog site</a>]</p>
|
||||
<p><font size="2">This documentation is part of the
|
||||
<a href="http://www.rsyslog.com/">rsyslog</a> project.<br>
|
||||
Copyright © 2007 by <a href="http://www.gerhards.net/rainer">Rainer Gerhards</a> and
|
||||
<a href="http://www.adiscon.com/">Adiscon</a>. Released under the GNU GPL
|
||||
version 2 or higher.</font></p>
|
||||
</body>
|
||||
</html>
|
||||
@ -225,6 +225,7 @@ error recovery thus can handle write errors without data loss. Note that this op
|
||||
severely reduces the effect of zip compression and should be switched to off
|
||||
for that use case. Note that the default -off- is primarily an aid to preserve
|
||||
the traditional syslogd behaviour.</li>
|
||||
<li><a href="rsconf1_omfileforcechown.html">$omfileForceChown</a> - force ownership change for all files</li>
|
||||
<li><b>$RepeatedMsgContainsOriginalMsg</b> [on/<b>off</b>] - "last message repeated n times" messages, if generated,
|
||||
have a different format that contains the message that is being repeated.
|
||||
Note that only the first "n" characters are included, with n to be at least 80 characters, most
|
||||
|
||||
@ -88,11 +88,13 @@ typedef struct s_dynaFileCacheEntry dynaFileCacheEntry;
|
||||
#define IOBUF_DFLT_SIZE 1024 /* default size for io buffers */
|
||||
#define FLUSH_INTRVL_DFLT 1 /* default buffer flush interval (in seconds) */
|
||||
|
||||
#define DFLT_bForceChown 0
|
||||
/* globals for default values */
|
||||
static int iDynaFileCacheSize = 10; /* max cache for dynamic files */
|
||||
static int fCreateMode = 0644; /* mode to use when creating files */
|
||||
static int fDirCreateMode = 0700; /* mode to use when creating files */
|
||||
static int bFailOnChown; /* fail if chown fails? */
|
||||
static int bForceChown = DFLT_bForceChown; /* Force chown() on existing files? */
|
||||
static uid_t fileUID; /* UID to be used for newly created files */
|
||||
static uid_t fileGID; /* GID to be used for newly created files */
|
||||
static uid_t dirUID; /* UID to be used for newly created directories */
|
||||
@ -115,6 +117,7 @@ typedef struct _instanceData {
|
||||
int fDirCreateMode; /* creation mode for mkdir() */
|
||||
int bCreateDirs; /* auto-create directories? */
|
||||
int bSyncFile; /* should the file by sync()'ed? 1- yes, 0- no */
|
||||
bool bForceChown; /* force chown() on existing files? */
|
||||
uid_t fileUID; /* IDs for creation */
|
||||
uid_t dirUID;
|
||||
gid_t fileGID;
|
||||
@ -152,12 +155,14 @@ CODESTARTdbgPrintInstInfo
|
||||
"\tcreate directories: %s\n"
|
||||
"\tfile owner %d, group %d\n"
|
||||
"\tdirectory owner %d, group %d\n"
|
||||
"\tforce chown() for all files: %s\n"
|
||||
"\tfail if owner/group can not be set: %s\n",
|
||||
pData->f_fname,
|
||||
pData->iDynaFileCacheSize,
|
||||
pData->bCreateDirs ? "yes" : "no",
|
||||
pData->fileUID, pData->fileGID,
|
||||
pData->dirUID, pData->dirGID,
|
||||
pData->bForceChown ? "yes" : "no",
|
||||
pData->bFailOnChown ? "yes" : "no"
|
||||
);
|
||||
} else { /* regular file */
|
||||
@ -346,7 +351,22 @@ prepareFile(instanceData *pData, uchar *newFileName)
|
||||
int fd;
|
||||
DEFiRet;
|
||||
|
||||
if(access((char*)newFileName, F_OK) != 0) {
|
||||
if(access((char*)newFileName, F_OK) == 0) {
|
||||
if(pData->bForceChown) {
|
||||
/* Try to fix wrong ownership set by someone else. Note that this code
|
||||
* will no longer work once we have made the $PrivDrop code fully secure.
|
||||
* This change is based on an idea of Michael Terry, provided as part of
|
||||
* the effort to make rsyslogd the Ubuntu default syslogd.
|
||||
* rgerhards, 2009-09-11
|
||||
*/
|
||||
if(chown((char*)newFileName, pData->fileUID, pData->fileGID) != 0) {
|
||||
if(pData->bFailOnChown) {
|
||||
int eSave = errno;
|
||||
errno = eSave;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* file does not exist, create it (and eventually parent directories */
|
||||
fd = -1;
|
||||
if(pData->bCreateDirs) {
|
||||
@ -367,7 +387,7 @@ prepareFile(instanceData *pData, uchar *newFileName)
|
||||
pData->fCreateMode);
|
||||
if(fd != -1) {
|
||||
/* check and set uid/gid */
|
||||
if(pData->fileUID != (uid_t)-1 || pData->fileGID != (gid_t) -1) {
|
||||
if(pData->bForceChown || pData->fileUID != (uid_t)-1 || pData->fileGID != (gid_t) -1) {
|
||||
/* we need to set owner/group */
|
||||
if(fchown(fd, pData->fileUID, pData->fileGID) != 0) {
|
||||
if(pData->bFailOnChown) {
|
||||
@ -678,6 +698,7 @@ CODESTARTparseSelectorAct
|
||||
pData->fDirCreateMode = fDirCreateMode;
|
||||
pData->bCreateDirs = bCreateDirs;
|
||||
pData->bFailOnChown = bFailOnChown;
|
||||
pData->bForceChown = bForceChown;
|
||||
pData->fileUID = fileUID;
|
||||
pData->fileGID = fileGID;
|
||||
pData->dirUID = dirUID;
|
||||
@ -712,6 +733,7 @@ static rsRetVal resetConfigVariables(uchar __attribute__((unused)) *pp, void __a
|
||||
dirUID = -1;
|
||||
dirGID = -1;
|
||||
bFailOnChown = 1;
|
||||
bForceChown = DFLT_bForceChown;
|
||||
iDynaFileCacheSize = 10;
|
||||
fCreateMode = 0644;
|
||||
fDirCreateMode = 0700;
|
||||
@ -778,6 +800,7 @@ CODEmodInit_QueryRegCFSLineHdlr
|
||||
CHKiRet(omsdRegCFSLineHdlr((uchar *)"filecreatemode", 0, eCmdHdlrFileCreateMode, NULL, &fCreateMode, STD_LOADABLE_MODULE_ID));
|
||||
CHKiRet(omsdRegCFSLineHdlr((uchar *)"createdirs", 0, eCmdHdlrBinary, NULL, &bCreateDirs, STD_LOADABLE_MODULE_ID));
|
||||
CHKiRet(omsdRegCFSLineHdlr((uchar *)"failonchownfailure", 0, eCmdHdlrBinary, NULL, &bFailOnChown, STD_LOADABLE_MODULE_ID));
|
||||
CHKiRet(omsdRegCFSLineHdlr((uchar *)"omfileForceChown", 0, eCmdHdlrBinary, NULL, &bForceChown, STD_LOADABLE_MODULE_ID));
|
||||
CHKiRet(omsdRegCFSLineHdlr((uchar *)"actionfileenablesync", 0, eCmdHdlrBinary, NULL, &bEnableSync, STD_LOADABLE_MODULE_ID));
|
||||
CHKiRet(regCfSysLineHdlr((uchar *)"actionfiledefaulttemplate", 0, eCmdHdlrGetWord, NULL, &pszTplName, NULL));
|
||||
CHKiRet(omsdRegCFSLineHdlr((uchar *)"resetconfigvariables", 1, eCmdHdlrCustomHandler, resetConfigVariables, NULL, STD_LOADABLE_MODULE_ID));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user