Seccomp and SELinux

illustrations

Seccomp and SELinux

Published on Aug 25, 2022 by Reino Wallin

Introduction

Containerization has become increasingly popular in recent years as a means of deploying and managing applications in a flexible, scalable, and efficient manner. However, container security has also become a growing concern for many organizations, given the potential risks associated with running multiple applications on a single host. To mitigate these risks, it is essential to implement a combination of security controls, including SELinux and seccomp.

What is SELinux?

Security-Enhanced Linux (SELinux) is a Linux kernel security module that provides a mechanism for enforcing mandatory access control (MAC) policies. It is designed to isolate applications and prevent them from accessing resources that they should not have access to, even if they have been compromised. SELinux uses a set of security policies to define what actions are allowed for each application on the system, based on their security context.

What is seccomp?

Seccomp is a Linux kernel feature that enables the filtering of system calls made by applications. It provides a sandboxed environment for applications to run in, preventing them from making unauthorized system calls that could compromise the security of the host. Seccomp can be used to reduce the attack surface of an application by restricting the system calls that it can make.

How do SELinux and seccomp work together?

SELinux and seccomp can work together to provide a layered defense mechanism for container security. By using SELinux to define policies for each container, you can ensure that each container only has access to the resources it needs and prevent it from accessing any other resources on the host. Seccomp can then be used to further reduce the attack surface of each container by restricting the system calls that it can make.

For example, consider a container that is running a web server. SELinux can be used to define policies that allow the container to access the necessary resources, such as the network and the web server files, while preventing it from accessing any other resources on the host. Seccomp can then be used to restrict the system calls that the web server can make, preventing it from making any unauthorized system calls that could compromise the security of the host.

Another example is a container that is running a database server. SELinux can be used to define policies that allow the container to access the necessary resources, such as the database files, while preventing it from accessing any other resources on the host. Seccomp can then be used to restrict the system calls that the database server can make, preventing it from making any unauthorized system calls that could compromise the security of the host.

Examples

Here’s an example of how to implement SELinux and seccomp in a Dockerfile:

FROM ubuntu:latest

# Install SELinux utilities and libraries
RUN apt-get update && apt-get install -y selinux-utils libselinux1

# Enable SELinux in the kernel
RUN echo 1 > /sys/fs/selinux/enforce

# Create a new SELinux policy for the container
COPY mycontainer.te /etc/mycontainer.te
RUN checkmodule -M -m -o mycontainer.mod mycontainer.te
RUN semodule_package -o mycontainer.pp -m mycontainer.mod
RUN semodule -i mycontainer.pp

# Install seccomp and configure system calls
RUN apt-get install -y libseccomp-dev
COPY mycontainer.json /etc/mycontainer.json

# Build the container
CMD ["bash"]

In this example, we’re installing the SELinux utilities and libraries, enabling SELinux in the kernel, and creating a new SELinux policy for the container. We’re also installing seccomp and configuring system calls using a JSON file.

Here’s an example of the mycontainer.te file:

policy_module(mycontainer, 1.0)

require {
        type unconfined_t;
        type container_t;
        class process fork;
        class file { read write };
}

allow unconfined_t container_t:process fork;
allow container_t file: { read write };

In this example, we’re allowing the container to fork processes and read and write files.

Here’s an example of the mycontainer.json file:

{
    "defaultAction": "SCMP_ACT_ALLOW",
    "syscalls": [
        {
            "name": "read",
            "action": "SCMP_ACT_ERRNO"
        },
        {
            "name": "write",
            "action": "SCMP_ACT_ERRNO"
        }
    ]
}

In this example, we’re allowing the read and write system calls, but setting the default action to return an error if an unauthorized system call is made.

Of course, the specific policies and system calls that you’ll need to allow or restrict will depend on the specific needs of your application.

Conclusion

In summary, container security is a crucial consideration for any organization that is deploying applications in a containerized environment. Implementing a combination of security controls, including SELinux and seccomp, can help to mitigate the risks associated with running multiple applications on a single host. By using SELinux to define policies for each container and seccomp to restrict the system calls that each container can make, you can ensure that your containerized environment is secure and that your applications are protected from potential security threats.