[apparmor] wrong loggingtime in apparmorlog
Hajo Locke
Hajo.Locke at gmx.de
Thu Feb 5 13:35:53 UTC 2015
Am 05.02.2015 um 12:59 schrieb Hajo Locke:
> Hello,
>
> Am 05.02.2015 um 11:49 schrieb Hajo Locke:
>> Hello,
>>
>>
>> Am 05.02.2015 um 00:11 schrieb Seth Arnold:
>>> On Wed, Feb 04, 2015 at 10:47:58AM +0100, Hajo Locke wrote:
>>>> Feb 4 09:55:01 hostname CRON[3898]: (root)...
>>>> Feb 4 11:30:50 hostname kernel: type=1400
>>>> audit(1423040101.577:7785293): apparmor="DENIED"...
>>>> Feb 4 09:55:01 hostname CRON[3911]: (root)...
>>>>
>>>> a relation to audit seems possible. i found more kernel loglines in
>>>> syslog with wrong date which are not in direct relation to apparmor.
>>>> i think complete kern.log is wrong.
>>>> may be more kernel related? we upgrade regularly, current version
>>>> on this machine is 3.13.0-43-generic (Ubuntu 14.04 LTS)
>>>> Currently only rebooting solves this problem. after reboot
>>>> timestamps in loglines are identical. But by increasing uptime the
>>>> difference between realtime and kernel-log-time grows.
>>>> one server with uptime ~2 days has kernel-time 53 seconds in future
>>>> (3.13.0-45-generic). server from loglines above has uptime 48 days
>>>> and difference is more than 1,5 hours.
>>> I've got a theory that's not very well thought through yet; to be
>>> honest,
>>> this is an interesting problem that I've never seen before.
>>>
>>> Here's some source code that's very similar to the rsyslog daemon
>>> used in
>>> Ubuntu 14.04 LTS:
>>>
>>> http://sources.debian.net/src/rsyslog/7.4.8-1%7Ebpo70%2B1/plugins/imklog/bsd.c/#L58
>>>
>>>
>>> Note this section:
>>>
>>> /* ... */
>>> clock_gettime(CLOCK_MONOTONIC, &monotonic);
>>> clock_gettime(CLOCK_REALTIME, &realtime);
>>> secOffs = realtime.tv_sec - monotonic.tv_sec;
>>> usecOffs = (realtime.tv_nsec - monotonic.tv_nsec) / 1000;
>>> if(usecOffs < 0) {
>>> secOffs--;
>>> usecOffs += 1000000l;
>>> }
>>>
>>> usecs += usecOffs;
>>> if(usecs > 999999l) {
>>> secs++;
>>> usecs -= 1000000l;
>>> }
>>> secs += secOffs;
>>> tv.tv_sec = secs;
>>> tv.tv_usec = usecs;
>>> tp = &tv;
>>>
>>> done:
>>> Syslog(pri, buf, tp);
>>> /* ... */
>>>
>>> rsyslog is changing the timestamp supplied to its internal Syslog()
>>> routine based on the time difference between the CLOCK_MONOTONIC and
>>> CLOCK_REALTIME clocks. The CLOCK_MONOTONIC clock will only ever move
>>> forward, while CLOCK_REALTIME can jump backwards if e.g. ntpdate(8) or
>>> date(1) sets an entirely new time.
>>>
>>> So, my theory -- this system is using ntpdate(8) in a cronjob to set
>>> the
>>> time rather than using ntpd(8), which would _skew_ the time in a
>>> fashion
>>> that's more amenable to keeping CLOCK_MONOTONIC and CLOCK_REALTIME
>>> closer
>>> to synchronized. (ntpd(8) can ask the system clock to speed up or slow
>>> down so that seconds take more or less time, but when skewing it won't
>>> jump the time forwards or backwards abruptly.)
>>>
>>> I've attached a little program that will output all the clocks
>>> documented
>>> in clock_gettime(3) as well as the difference between the MONOTONIC
>>> clock
>>> and REALTIME clock. If you've installed build-essential, you should be
>>> able to compile it and run with just "make clocks ; ./clocks".
>>>
>>> If I'm correct, the difference between the MONOTONIC and the REALTIME
>>> clock will get worse over the uptime of the system. And if I'm correct,
>>> you can fix the issue by switching to ntpd rather than using ntpdate
>>> periodically. You may also be able to use the klogParseKernelTimestamp
>>> configuration variable from rsyslog:
>>> http://www.rsyslog.com/doc/master/configuration/modules/imklog.html
>>
>> Thanks for your effort. i ran your program on affected machine and
>> this is output:
>>
>>
>> CLOCK_REALTIME Thu Feb 5 10:36:40 2015
>> CLOCK_REALTIME_COARSE Thu Feb 5 10:36:40 2015
>> CLOCK_MONOTONIC Thu Feb 19 09:50:37 1970
>> CLOCK_MONOTONIC_COARSE Thu Feb 19 09:50:37 1970
>> CLOCK_MONOTONIC_RAW Thu Feb 19 09:51:01 1970
>> CLOCK_BOOTTIME Thu Feb 19 09:50:37 1970
>> CLOCK_PROCESS_CPUTIME_ID Thu Jan 1 01:00:00 1970
>> CLOCK_THREAD_CPUTIME_ID Thu Jan 1 01:00:00 1970
>> CLOCK_REALTIME - CLOCK_MONOTONIC 1418863562.991217
>>
>>
>> Current real-time is: Do 5. Feb 10:36:42 CET 2015
>>
>> we do not use rsyslog, for historical reasons we use syslog-ng. I
>> dont know if this matters.
>> our systems run ntpd. In consultation with my fellows, nobody knows
>> about using ntpdate. while running ntpd the use of ntpdate results in
>> error.
>> The difference between CLOCK_REALTIME - CLOCK_MONOTONIC is 1:46:02
>>
>> if i reload apparmor and use date-command to compare times, i see a
>> difference of ~ 1:38
>> Feb 5 13:00:05 hostname kernel: type=1400
>> audit(1423131731.158:8016925): apparmor...
>> Do 5. Feb 11:22:11 CET 2015
>>
>> hmm, i cant handle these results. I can do some more tests if you want.
>
> i have some more indications for this issue. I dont know the internals
> of this kind of logging. i think dmesg itself is also affected and/or
> uses same functions.
>
> this is a sample output-line of dmesg
> [4279186.720842] type=1400 audit(1423136868.774:8028551): apparmor=......
>
> by using dmesg -T output should be human readable and already shows
> wrong time:
>
> [Do Feb 5 14:25:48 2015] type=1400 audit(1423136868.774:8028551):
> apparmor=....
> again 1423136868.774 ==> 12:47:48 < 1:38 < 14:25:48
> I dont know if this is live calculated and may be a hint to the real
> problem.
or even more basically:
echo "oddtest "`date "+%d.%m.%Y %H:%M:%S"`>/dev/kmsg
dmesg -T | grep oddtest
[Do Feb 5 16:09:03 2015] oddtest 05.02.2015 14:30:55
Oo
I dont know what this means. no virtual-servers, just real machines.
>
>
>>
>>>
>>> I hope this helps solve this issue.
>>>
>>> Thanks
>>
>> Thanks,
>> Hajo
>
>
> Hajo
>
>
Hajo
More information about the AppArmor
mailing list