|
NAME | SYNOPSIS | DESCRIPTION | CONFIGURATION OPTIONS | STATUS OPTIONS | RULE OPTIONS | PERFORMANCE TIPS | EXAMPLES | DISABLED BY DEFAULT | FILES | SEE ALSO | AUTHOR | COLOPHON |
|
|
|
AUDITCTL(8) System Administration Utilities AUDITCTL(8)
auditctl - a utility to assist controlling the kernel's audit
system
auditctl [options]
The auditctl program is used to configure kernel options related
to auditing, to see status of the configuration, and to load
discretionary audit rules.
-b backlog
Set max number (limit) of outstanding audit buffers allowed
(Kernel Default=64) If all buffers are full, the failure
flag is consulted by the kernel for action.
--backlog_wait_time wait_time
Set the time for the kernel to wait (Kernel Default 60*HZ)
when the backlog limit is reached before queuing more audit
events to be transferred to auditd. The number must be
greater than or equal to zero and less than 10 times the
default value.
--reset_backlog_wait_time_actual
Reset the actual backlog wait time counter shown by the
status command.
-c Continue loading rules in spite of an error. This
summarizes the results of loading the rules. The exit code
will not be success if any rule fails to load.
-D Delete all rules and watches. This can take a key option
(-k), too.
-e [0..2]
Set enabled flag. When 0 is passed, this can be used to
temporarily disable auditing. When 1 is passed as an
argument, it will enable auditing. To lock the audit
configuration so that it can't be changed, pass a 2 as the
argument. Locking the configuration is intended to be the
last command in audit.rules for anyone wishing this feature
to be active. Any attempt to change the configuration in
this mode will be audited and denied. The configuration can
only be changed by rebooting the machine.
-f [0..2]
Set failure mode 0=silent 1=printk 2=panic. This option
lets you determine how you want the kernel to handle
critical errors. Example conditions where this mode may
have an effect includes: transmission errors to userspace
audit daemon, backlog limit exceeded, out of kernel memory,
and rate limit exceeded. The default value is 1. Secure
environments will probably want to set this to 2.
-h, --help
Help
-i When given by itself, ignore errors when reading rules from
a file. This causes auditctl to always return a success
exit code. If passed as an argument to -s then it gives an
interpretation of the numbers to human readable words if
possible.
--loginuid-immutable
This option tells the kernel to make loginuids unchangeable
once they are set. Changing loginuids requires
CAP_AUDIT_CONTROL. So, its not something that can be done
by unprivileged users. Setting this makes loginuid tamper-
proof, but can cause some problems in certain kinds of
containers.
-q mount-point,subtree
If you have an existing directory watch and bind or move
mount another subtree in the watched subtree, you need to
tell the kernel to make the subtree being mounted
equivalent to the directory being watched. If the subtree
is already mounted at the time the directory watch is
issued, the subtree is automatically tagged for watching.
Please note the comma separating the two values. Omitting
it will cause errors.
-r rate
Set limit in messages/sec (0=none). If this rate is non-
zero and is exceeded, the failure flag is consulted by the
kernel for action. The default value is 0.
--reset-lost
Reset the lost record counter shown by the status command.
-R file
Read and execute auditctl commands from a file. The
commands are executed line-by-line, in the order that they
appear in the file. The file must be owned by root and not
readable by other users, or else it will be rejected. Empty
lines are skipped. Lines starting with the '#' character
are treated as comment lines. Each line is executed as if
it was provided to auditctl as command line arguments.
Since auditctl is the one reading the file and not a shell
such as bash, do not escape special shell characters. See
the EXAMPLES section for an example.
--signal signal
Send a signal to the audit daemon. You must have privileges
to do this. Supported signals are TERM, HUP, USR1, USR2,
CONT
and user friendly versions stop, reload, rotate, resume,
state.
-t Trim the subtrees after a mount command.
-l List all rules 1 per line. Two more options may be given to
this command. You can give either a key option (-k) to list
rules that match a key or a (-i) to have a0 through a3
interpreted to help determine the syscall argument values
are correct .
-m text
Send a user space message into the audit system. This can
only be done if you have CAP_AUDIT_WRITE capability
(normally the root user has this). The resulting event will
be the USER type.
-s Report the kernel's audit subsystem status. It will tell
you the in-kernel values that can be set by -e, -f, -r, and
-b options. The pid value is the process number of the
audit daemon. Note that a pid of 0 indicates that the audit
daemon is not running. The lost entry will tell you how
many event records that have been discarded due to the
kernel audit queue overflowing. The backlog field tells how
many event records are currently queued waiting for auditd
to read them. This option can be followed by the -i to get
a couple fields interpreted.
-v Print the version of auditctl.
-a [list,action|action,list]
Append rule to the end of list with action. Please note the
comma separating the two values. Omitting it will cause
errors. The fields may be in either order. It could be
list,action or action,list. The following describes the
valid list names:
task Add a rule to the per task list. This rule list is
used only at the time a task is created -- when
fork() or clone() are called by the parent task.
When using this list, you should only use fields
that are known at task creation time, such as the
uid, gid, etc.
exit Add a rule to the syscall exit list. This list is
used upon exit from a system call to determine if an
audit event should be created.
user Add a rule to the user message filter list. This
list is used by the kernel to filter events
originating in user space before relaying them to
the audit daemon. It should be noted that the only
fields that are valid are: uid, auid, gid, pid,
subj_user, subj_role, subj_type, subj_sen, subj_clr,
msgtype, and executable name. All other fields will
be treated as non-matching. It should be understood
that any event originating from user space from a
process that has CAP_AUDIT_WRITE will be recorded
into the audit trail. This means that the most
likely use for this filter is with rules that have
an action of never since nothing has to be done to
allow events to be recorded.
exclude
Add a rule to the event type exclusion filter list.
This list is used to filter events that you do not
want to see. For example, if you do not want to see
any avc messages, you would using this list to
record that. Events can be excluded by process ID,
user ID, group ID, login user ID, message type,
subject context, or executable name. The action is
ignored and uses its default of "never".
filesystem
Add a rule that will be applied to a whole
filesystem. The filesystem must be identified with a
fstype field. Normally this filter is used to
exclude any events for a whole filesystem such as
tracefs or debugfs.
io_uring
Add a rule to the io_uring syscall filter. Rules
against this filter specify the syscall operation
using the -S syscall notion explained below. You can
add a key field to the rule so that it may be
grouped with other rules watching the same
underlying syscall.
The following describes the valid actions for the rule:
never No audit records will be generated. This can be used
to suppress event generation. In general, you want
suppressions at the top of the list instead of the
bottom. This is because the event triggers on the
first matching rule.
always Allocate an audit context, always fill it in at
syscall entry time, and always write out a record at
syscall exit time.
-A list,action
Add rule to the beginning list with action.
-C [f=f | f!=f]
Build an inter-field comparison rule: field, operation,
field. You may pass multiple comparisons on a single
command line. Each one must start with -C. Each inter-field
equation is anded with each other as well as equations
starting with -F to trigger an audit record. There are 2
operators supported - equal, and not equal. Valid fields
are:
auid, uid, euid, suid, fsuid, obj_uid; and gid, egid, sgid,
fsgid, obj_gid
The two groups of uid and gid cannot be mixed. But any
comparison within the group can be made. The obj_uid/gid
fields are collected from the object of the event such as a
file or directory.
-d list,action
Delete rule from list with action. The rule is deleted only
if it exactly matches syscall name(s) and every field name
and value.
-F [n=v | n!=v | n<v | n>v | n<=v | n>=v | n&v | n&=v]
Build a rule field: name, operation, value. You may have up
to 64 fields passed on a single command line. Each one must
start with -F. Each field equation is anded with each other
(as well as equations starting with -C) to trigger an audit
record. There are 8 operators supported - equal, not equal,
less than, greater than, less than or equal, and greater
than or equal, bit mask, and bit test respectively. Bit
test will "and" the values and check that they are equal,
bit mask just "ands" the values. Fields that take a user ID
may instead have the user's name; the program will convert
the name to user ID. The same is true of group names. Valid
fields are:
a0, a1, a2, a3
Respectively, the first 4 arguments to a syscall.
Note that string arguments are not supported. This
is because the kernel is passed a pointer to the
string. Triggering on a pointer address value is not
likely to work. So, when using this, you should only
use on numeric values. This is most likely to be
used on platforms that multiplex socket or IPC
operations.
arch The CPU architecture of the syscall. The arch can be
found doing 'uname -m'. If you do not know the arch
of your machine but you want to use the 32 bit
syscall table and your machine supports 32 bit, you
can also use b32 for the arch. The same applies to
the 64 bit syscall table, you can use b64. In this
way, you can write rules that are somewhat arch
independent because the family type will be auto
detected. However, syscalls can be arch specific and
what is available on x86_64, may not be available on
ppc. The arch directive should precede the -S option
so that auditctl knows which internal table to use
to look up the syscall numbers.
auid The original ID the user logged in with. Its an
abbreviation of audit uid. Sometimes its referred to
as loginuid. Either the user account text or number
may be used.
devmajor
Device Major Number
devminor
Device Minor Number
dir Full Path of Directory to watch. This will place a
recursive watch on the directory and its whole
subtree. It can only be used on exit list. See "-w".
egid Effective Group ID. May be numeric or the groups
name.
euid Effective User ID. May be numeric or the user
account name.
exe Absolute path to application that while executing
this rule will apply to. It supports = and !=
operators. Note that you can only use this once for
each rule.
exit Exit value from a syscall. If the exit code is an
errno, you may use the text representation, too.
fsgid Filesystem Group ID. May be numeric or the groups
name.
fstype File system type. This is used with the filesystem
rule list. The only values supported are debugfs and
tracefs.
fsuid Filesystem User ID. May be numeric or the user
account name.
filetype
The target file's type. Can be either file, dir,
socket, link, character, block, or fifo.
gid Group ID. May be numeric or the groups name.
inode Inode Number
key Set a filter key on an audit rule. The filter key is
an arbitrary string of text that can be up to 31
bytes long. It can uniquely identify the audit
records produced by a rule. Typical use is for when
you have several rules that together satisfy a
security requirement. The key value can be searched
on with ausearch so that no matter which rule
triggered the event, you can find its results. The
key can also be used on delete all (-D) and list
rules (-l) to select rules with a specific key. You
may have more than one key on a rule if you want to
be able to search logged events in multiple ways or
if you have an auditd plugin that uses a key to aid
its analysis.
msgtype
This is used to match the event's record type. It
should only be used on the exclude or user filter
lists.
obj_uid
Object's UID
obj_gid
Object's GID
obj_user
Resource's SE Linux User
obj_role
Resource's SE Linux Role
obj_type
Resource's SE Linux Type
obj_lev_low
Resource's SE Linux Low Level
obj_lev_high
Resource's SE Linux High Level
path Insert a watch for the file system object at path.
You cannot insert a watch to the top level
directory. This is prohibited by the kernel.
Wildcards are not supported either and will generate
a warning. The way that watches work is by tracking
the inode internally. This can only be used on exit
list.
perm Permission filter for file operations. Supply the
access type that a file system watch will trigger
on. r=read, w=write, x=execute, a=attribute change.
These permissions are not the standard file
permissions, but rather the kind of syscall that
would do this kind of thing. The read & write
syscalls are omitted from this set since they would
overwhelm the logs. But rather for reads or writes,
the open flags are looked at to see what permission
was requested. The perm field can only be used on
exit list. You can use this without specifying a
syscall and the kernel will select the syscalls that
satisfy the access permissions being requested. This
also requires supplying an arch parameter before the
perm field. This way the kernel can better determine
what syscalls are needed. Not supplying an arch will
result in all system calls being subject to audit.
This will lower system performance.
pers OS Personality Number
pid Process ID
ppid Parent's Process ID
saddr_fam
Address family number as found in
/usr/include/bits/socket.h. For example, IPv4 would
be 2 and IPv6 would be 10.
sessionid
User's login session ID
subj_user
Program's SE Linux User
subj_role
Program's SE Linux Role
subj_type
Program's SE Linux Type
subj_sen
Program's SE Linux Sensitivity
subj_clr
Program's SE Linux Clearance
sgid Saved Group ID. See getresgid(2) man page.
success
If the exit value is >= 0 this is true/yes otherwise
its false/no. When writing a rule, use a 1 for
true/yes and a 0 for false/no
suid Saved User ID. See getresuid(2) man page.
uid User ID. May be numeric or the user account name.
-k key Set a filter key on an audit rule. This is deprecated when
used with watches. Convert any watches to the syscall form
of rules. It is still valid for use with deleting or
listing rules.
-p [r|w|x|a]
Describe the permission access type that a file system
watch will trigger on. This is deprecated. Convert watches
to the syscall form.
-S [Syscall name or number|all]
Any syscall name or number may be used. The word 'all' may
also be used. If the given syscall is made by a program,
then start an audit record. If a field rule is given and no
syscall is specified, it will default to all syscalls. You
may also specify multiple syscalls in the same rule by
using multiple -S options in the same rule. Doing so
improves performance since fewer rules need to be
evaluated. Alternatively, you may pass a comma separated
list of syscall names. If you are on a bi-arch system, like
x86_64, you should be aware that auditctl simply takes the
text, looks it up for the native arch (in this case b64)
and sends that rule to the kernel. If there are no
additional arch directives, IT WILL APPLY TO BOTH 32 & 64
BIT SYSCALLS. This can have undesirable effects since there
is no guarantee that any syscall has the same number on
both 32 and 64 bit interfaces. You will likely want to
control this and write 2 rules, one with arch equal to b32
and one with b64 to make sure the kernel finds the events
that you intend. See the arch field discussion for more
info.
-w path
Place a watch on path. If the path is a file, it's almost
the same as using the -F path option on a syscall rule. If
the watch is on a directory, it's almost the same as using
the -F dir option on a syscall rule. The -w form of writing
watches is for backwards compatibility and is deprecated
due to poor system performance. Convert watches of this
form to the syscall based form. The only valid options when
using a watch are the -p and -k.
-W path
Remove a watch for the file system object at path. The rule
must match exactly. See -d discussion for more info.
Syscall rules get evaluated for each syscall for every program. If
you have 10 syscall rules, every program on your system will delay
during a syscall while the audit system evaluates each rule. Too
many syscall rules will hurt performance. Try to combine as many
as you can whenever the filter, action, key, and fields are
identical. For example:
auditctl -a always,exit -F arch=b64 -S openat -F success=0
auditctl -a always,exit -F arch=b64 -S truncate -F success=0
could be re-written as one rule:
auditctl -a always,exit -F arch=b64 -S openat -S truncate -F success=0
Also, try to use file system auditing wherever practical. This
improves performance. For example, if you were wanting to capture
all failed opens & truncates like above, but were only concerned
about files in /etc and didn't care about /usr or /sbin, its
possible to use this rule:
auditctl -a always,exit -F arch=b64 -S openat,truncate -F dir=/etc -F success=0
This will be higher performance since the kernel will not evaluate
it each and every syscall. It will be handled by the filesystem
auditing code and only checked on filesystem related syscalls.
To see all syscalls made by a specific program:
# By pid:
auditctl -a always,exit -S all -F pid=1005
# By executable path
auditctl -a always,exit -S all -F exe=/usr/bin/ls
To see files opened by a specific user:
auditctl -a always,exit -S openat -F auid=510
To see unsuccessful openat calls:
auditctl -a always,exit -S openat -F success=0
To watch a file for changes (2 ways to express):
auditctl -w /etc/shadow -p wa # Note this slows the system
auditctl -a always,exit -F arch=b64 -F path=/etc/shadow -F perm=wa
To recursively watch a directory for changes (2 ways to express):
auditctl -w /etc/ -p wa # Note this slows the system
auditctl -a always,exit -F arch=b64 -F dir=/etc/ -F perm=wa
To see if an admin is accessing other user's files:
auditctl -a always,exit -F dir=/home/ -F uid=0 -C auid!=obj_uid
This is an example rules file:
# Remove all existing rules
-D
# Never record sudo invocations
-A exclude,always -F exe=/usr/bin/sudo
On many systems auditd is configured to install an -a never,task
rule by default. This rule causes every new process to skip all
audit rule processing. This is usually done to avoid a small
performance overhead imposed by syscall auditing. If you want to
use auditd, you need to remove that rule by deleting 10-no-
audit.rules and adding 10-base-config.rules to the audit rules
directory.
If you have defined audit rules that are not matching when they
should, check auditctl -l to make sure there is no never,task rule
there.
/etc/audit/audit.rules /etc/audit/audit-stop.rules
audit.rules(7), ausearch(8), aureport(8), auditd(8).
Steve Grubb
This page is part of the audit (Linux Audit) project. Information
about the project can be found at
⟨http://people.redhat.com/sgrubb/audit/⟩. If you have a bug report
for this manual page, send it to [email protected]. This
page was obtained from the project's upstream Git repository
⟨https://github.com/linux-audit/audit-userspace.git⟩ on
2025-08-11. (At that time, the date of the most recent commit
that was found in the repository was 2025-08-09.) If you discover
any rendering problems in this HTML version of the page, or you
believe there is a better or more up-to-date source for the page,
or you have corrections or improvements to the information in this
COLOPHON (which is not part of the original manual page), send a
mail to [email protected]
Red Hat Sep 2023 AUDITCTL(8)
Pages that refer to this page: audit_add_rule_data(3), audit_delete_rule_data(3), audit_request_rules_list_data(3), audit_reset_backlog_wait_time_actual(3), audit_reset_lost(3), audit_set_backlog_limit(3), audit_set_backlog_wait_time(3), audit_set_failure(3), audit.rules(7), auditd(8), augenrules(8), pam_loginuid(8)