forked from elastic/beats
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a configurable seccomp filter on Linux
The adds a default seccomp (Secure Computing) filter on Linux that prohibits execve, execveat, fork, and vfork system calls for the Beat process. The seccomp filter policy is configurable as well. You can create your own whitelist or blacklist policy with specific actions. It uses github.com/elastic/go-seccomp-bpf. Whitelist Example ``` seccomp: default_action: errno syscalls: - action: allow names: - open - close - read - exit ``` Blacklist Example ``` seccomp: default_action: allow syscalls: - action: log names: - execve - execveat - fork - vfork - action: kill_process # Requires kernel 4.14+. names: - connect - accept - sendto - recvfrom - sendmsg - recvmsg - bind - listen ``` Closes elastic#5213 Decisions I Made - The default policy is a blacklist because it was the most simple to start with. Whitelisting is recommended because it is more robust. `man seccomp` states "A blacklist will have to be updated whenever a potentially dangerous system call is added (or a dangerous flag or option if those are blacklisted), and it is often possible to alter the representation of a value without altering its meaning, leading to a blacklist bypass." - I chose to not implement argument filtering. It would be useful to have for more granular policies, but I'd rather wait to see how the policies are used and see if argument filtering is required. - The code only makes use of the `seccomp` syscall to install the filter. It does not fallback to the `prctl(2)` `PR_SET_SECCOMP` operation because it does not support flags. The `SECCOMP_FILTER_FLAG_TSYNC` flag is necessary in Go because we have little control over when threads are started, and there are no guarantees that the filter would be installed before other threads start.
- Loading branch information
1 parent
08d9d08
commit 219fc1c
Showing
22 changed files
with
283 additions
and
156 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
[[linux-seccomp]] | ||
== Using Linux Secure Computing Mode (seccomp) | ||
|
||
beta[] | ||
|
||
On Linux 3.17 and later, {beatname_uc} can take advantage of secure computing | ||
mode, also known as seccomp. Seccomp restricts the system calls that a process | ||
can issue. Specifically {beatname_uc} can load a seccomp BPF filter at process | ||
start-up that drops the privileges to invoke specific system calls. Once a | ||
filter is loaded by the process it cannot be removed. | ||
|
||
The kernel exposes a large number of system calls that are not used by | ||
{beatname_uc}. By installing a seccomp filter, you can limit the total kernel | ||
surface exposed to {beatname_uc} (principle of least privilege). This minimizes | ||
the impact of unknown vulnerabilities that might be found in the process. | ||
|
||
The filter is expressed as a Berkeley Packet Filter (BPF) program. The BPF | ||
program is generated based on a policy defined in the {beatname_uc} | ||
configuration. If you don't specify a policy, {beatname_uc} uses a minimal | ||
default blacklist policy that prohibits `execve`, `execveat`, `fork`, and | ||
`vfork` syscalls. This is the default policy. | ||
|
||
[source,yaml] | ||
---- | ||
seccomp: | ||
default_action: allow <1> | ||
syscalls: | ||
- action: errno <2> | ||
names: <3> | ||
- execve | ||
- execveat | ||
- fork | ||
- vfork | ||
---- | ||
<1> If the system call being invoked by the process does not match one of the | ||
names below then it will be allowed. | ||
<2> If the system call being invoked matches one of the names below then an | ||
error will be returned to caller. This is known as a blacklist policy. | ||
<3> These are system calls being prohibited. | ||
|
||
[float] | ||
[[seccomp-policy-config]] | ||
=== Seccomp Policy Configuration | ||
|
||
These are the configuration options for a seccomp policy. | ||
|
||
*`enabled`*:: On Linux, this option is enabled by default. To disable seccomp | ||
filter loading, set this option to `false`. | ||
|
||
*`default_action`*:: The default action to take when none of the defined system | ||
calls match. See <<seccomp-policy-config-action,action>> for the full list of | ||
values. This is required. | ||
|
||
*`syscalls`*:: Each object in this list must contain an `action` and a list of | ||
system call `names`. The list must contain at least one item. | ||
|
||
*`names`*:: A list of system call names. The system call name must exist for | ||
the runtime architecture, otherwise an error will be logged and the filter will | ||
not be installed. At least one system call must be defined. | ||
|
||
[[seccomp-policy-config-action]] | ||
*`action`*:: The action to take when any of the system calls listed in `names` | ||
is executed. This is required. These are the available action values. The | ||
actions that are available depend on the kernel version. | ||
|
||
- `errno` - The system call will return `EPERM` (permission denied) to the | ||
caller. | ||
- `trace` - The kernel will notify a `ptrace` tracer. If no tracer is present | ||
then the system call fails with `ENOSYS` (function not implemented). | ||
- `trap` - The kernel will send a `SIGSYS` signal to the calling thread and not | ||
execute the system call. | ||
- `kill_thread` - The kernel will immediately terminate the thread. Other | ||
threads will continue to execute. | ||
- `kill_process` - The kernel will terminate the process. Available in Linux | ||
4.14 and later. | ||
- `log` - The kernel will log the system call before executing it. Available in | ||
Linux 4.14 and later. (This does not go to the Beat's log.) | ||
- `allow` - The kernel will allow the system call to execute. | ||
|
||
[float] | ||
=== Auditbeat Reports Seccomp Violations | ||
|
||
You can use Auditbeat to report any seccomp violations that occur on the system. | ||
The kernel generates an event for each violation and Auditbeat reports the | ||
event. The `event.action` value will be `violated-seccomp-policy` and the event | ||
will contain information about the process and system call. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.