Hi Alex,
Thanks for the excellent explanation. I've also checked how file
system stores a symbolic link after reading your post.
Now I know why symlink doesn't work as I thought ;-P
On Wed, Jan 1, 2014 at 2:29 AM, Alexander Viro <aviro(a)redhat.com> wrote:
On Tue, Dec 31, 2013 at 06:49:49PM +0800, Aaron Lewis wrote:
> Hi Alex,
>
> Sorry, I didn't make it clear.
>
> I need to protect all files under a directory, e.g /secure/
>
> So if there's any newly created symlinks that points to files under
> that directory, e.g /secure/some_file, I will need to know.
> (/secure is not a symlink, but an existing directory)
> However "-a exit,always -F arch=b64 -S symlink -F success=1 -F
> dir=/secure" doesn't do the job.
> If I do "ln -s /secure/some_file /tmp/aa", no auditing log is generated
... because a symlink had been created in /tmp.
> So I suspect auditing on symlink isn't for the source file/directory,
> but the target "string".
The target string here is "/secure/some_file".
> If I do "ln -s /bin/ls /secure/new_file", an auditing log is generated.
... since that creates a symlink in /secure, symlink's target being
"/bin/ls".
> That's what I mean by "bug".
Check which directory is modified by your commands. Really. ls -l /secure
will change after the second one, but will remain unchanged after the first
one.
You can get notified when /secure is changed by symlink addition; you can
not get notifications whenever somewhere appears a symlink that would
resolve to something under /secure - see the posting upthread for the
reasons why that really can't be done.
BTW, ln(1) manpage is atrocious. GNU variant suffers from the usual attitude
of GNU project towards manpages (they hate the need to be concise and
prefer info(1) to man(1)), but BSD variant isn't much better ;-/
An honest variant would have to contain something like "ln(1) conflates
two unrelated functionalities - creating extra links to existing files
and creation of symlinks. The syntax is superficially similar in both
cases, but they would've been better off as separate commands."
The thing is, original ln(1) syntax imitates that of cp(1) - ln from to
takes an existing file ("from") and makes "to" a new name for the
same
file. Unlike cp(1), the file itself isn't copied - both directory
entries end up refering to the same object. Other forms also imitate cp(1) -
just as you can say cp <bunch of files> directory, you can say
ln <bunch of files> directory.
ln -s is something entirely different. ln -s target name creates a new
symlink with "target" as contents. Target does *not* refer to a file;
it's just a string to be interpreted when pathname resolution steps into
name.
That creates a nasty source of confusion - in the normal case (ln old new)
we are making the file "old" show up elsewhere ("new"), but in ln -s
old new
we are making a symlink "new" that points to string "old". Note
that
both cases invite the use of word 'target', but in completely different
meanings and applied to different ln(1) arguments ;-/
--
Best Regards,
Aaron Lewis - PGP: 0x13714D33 -
http://pgp.mit.edu/
Finger Print: 9F67 391B B770 8FF6 99DC D92D 87F6 2602 1371 4D33