radius.log permissions issue
Philip Molter
hrunting at hrunting.org
Thu Jul 16 16:50:43 CEST 2009
John Dennis wrote:
> FWIW, in our RPM's we force the creation of the radius.log file with
> ownership radiusd:radiusd at installation time before the server even runs.
>
> If you don't force the creation of the file with the right ownership
> then I think the issue revolves around when a log message is first
> emitted. The log file gets created the first time a log message is
> emitted. The server starts as root. During it's initialization phase it
> raises and lowers it's operating permissions between the root and
> radiusd user identity via the fr_suid_up() and fr_suid_down() calls.
> When it gets ready to process events it settles down to radiusd via
> fr_suid_down_permanent().
The problem is commit 047fe5ca74e3de2c7f32f98154d6655c0cfd7181.
Before this commit, in switch_users(), permissions were unconditionally
dropped if a user setting was specified, and the 'did_setuid' boolean
was set no matter what if setuid capability was even possible (ie. even
if a user name wasn't specified, did_setuid was set to true).
After this commit, the permission drop was abstracted into
fr_suid_down(), which checks did_setuid before it does anything. Since
did_setuid isn't set, fr_suid_down() doesn't do anything. After that
call, did_setuid is set to TRUE, so future calls to fr_suid_down() work
as expected, but all of the time spent between the code there and the
code in listen.c is run as root, including a check to see if the
directory is writable that immediately follows setuid in switch_users().
Previous to that commit, that wasn't the behavior.
Basically, that code is the problem. I'll try to submit a patch later
today that fixes the problem.
Yes, if an error occurs, there are log messages that get generated
before suid operations, but as far as I can tell, they're related to
fatal errors or debug messages.
> There are various strategies to assure the newly created log file has
> the right ownership:
>
> * drop privileges prior to calling fopen()
> * call chown() after fclose() at the exit of the logging call.
> * pre-create the file if necessary very early during start up.
>
> I think the latter is preferable as it avoid the expense of setting or
> checking for the right ownership for every log message emitted (ouch).
The latter is basically what happens, because in switch_users(), the
daemon tries to make sure it can write to the file as the user it is.
If the file exists, it's a simple append. If the file doesn't exist, it
creates it. If it can't write, it bails. Like I said, it just isn't
the user it thinks it is when this is called (mainconfig.c:629, version
2.1.6).
Philip
More information about the Freeradius-Users
mailing list