Commit 51442e8d authored by Konstantin Meskhidze's avatar Konstantin Meskhidze Committed by Mickaël Salaün

landlock: Document network support

Describe network access rules for TCP sockets. Add network access
example in the tutorial. Add kernel configuration support for network.
Signed-off-by: default avatarKonstantin Meskhidze <konstantin.meskhidze@huawei.com>
Link: https://lore.kernel.org/r/20231026014751.414649-13-konstantin.meskhidze@huawei.com
[mic: Update date, and do light cosmetic changes]
Signed-off-by: default avatarMickaël Salaün <mic@digikod.net>
parent 5e990dce
...@@ -8,13 +8,13 @@ Landlock: unprivileged access control ...@@ -8,13 +8,13 @@ Landlock: unprivileged access control
===================================== =====================================
:Author: Mickaël Salaün :Author: Mickaël Salaün
:Date: October 2022 :Date: October 2023
The goal of Landlock is to enable to restrict ambient rights (e.g. global The goal of Landlock is to enable to restrict ambient rights (e.g. global
filesystem access) for a set of processes. Because Landlock is a stackable filesystem or network access) for a set of processes. Because Landlock
LSM, it makes possible to create safe security sandboxes as new security layers is a stackable LSM, it makes possible to create safe security sandboxes as new
in addition to the existing system-wide access-controls. This kind of sandbox security layers in addition to the existing system-wide access-controls. This
is expected to help mitigate the security impact of bugs or kind of sandbox is expected to help mitigate the security impact of bugs or
unexpected/malicious behaviors in user space applications. Landlock empowers unexpected/malicious behaviors in user space applications. Landlock empowers
any process, including unprivileged ones, to securely restrict themselves. any process, including unprivileged ones, to securely restrict themselves.
...@@ -28,20 +28,34 @@ appropriately <kernel_support>`. ...@@ -28,20 +28,34 @@ appropriately <kernel_support>`.
Landlock rules Landlock rules
============== ==============
A Landlock rule describes an action on an object. An object is currently a A Landlock rule describes an action on an object which the process intends to
file hierarchy, and the related filesystem actions are defined with `access perform. A set of rules is aggregated in a ruleset, which can then restrict
rights`_. A set of rules is aggregated in a ruleset, which can then restrict
the thread enforcing it, and its future children. the thread enforcing it, and its future children.
The two existing types of rules are:
Filesystem rules
For these rules, the object is a file hierarchy,
and the related filesystem actions are defined with
`filesystem access rights`.
Network rules (since ABI v4)
For these rules, the object is a TCP port,
and the related actions are defined with `network access rights`.
Defining and enforcing a security policy Defining and enforcing a security policy
---------------------------------------- ----------------------------------------
We first need to define the ruleset that will contain our rules. For this We first need to define the ruleset that will contain our rules.
example, the ruleset will contain rules that only allow read actions, but write
actions will be denied. The ruleset then needs to handle both of these kind of For this example, the ruleset will contain rules that only allow filesystem
actions. This is required for backward and forward compatibility (i.e. the read actions and establish a specific TCP connection. Filesystem write
kernel and user space may not know each other's supported restrictions), hence actions and other TCP actions will be denied.
the need to be explicit about the denied-by-default access rights.
The ruleset then needs to handle both these kinds of actions. This is
required for backward and forward compatibility (i.e. the kernel and user
space may not know each other's supported restrictions), hence the need
to be explicit about the denied-by-default access rights.
.. code-block:: c .. code-block:: c
...@@ -62,6 +76,9 @@ the need to be explicit about the denied-by-default access rights. ...@@ -62,6 +76,9 @@ the need to be explicit about the denied-by-default access rights.
LANDLOCK_ACCESS_FS_MAKE_SYM | LANDLOCK_ACCESS_FS_MAKE_SYM |
LANDLOCK_ACCESS_FS_REFER | LANDLOCK_ACCESS_FS_REFER |
LANDLOCK_ACCESS_FS_TRUNCATE, LANDLOCK_ACCESS_FS_TRUNCATE,
.handled_access_net =
LANDLOCK_ACCESS_NET_BIND_TCP |
LANDLOCK_ACCESS_NET_CONNECT_TCP,
}; };
Because we may not know on which kernel version an application will be Because we may not know on which kernel version an application will be
...@@ -70,9 +87,7 @@ should try to protect users as much as possible whatever the kernel they are ...@@ -70,9 +87,7 @@ should try to protect users as much as possible whatever the kernel they are
using. To avoid binary enforcement (i.e. either all security features or using. To avoid binary enforcement (i.e. either all security features or
none), we can leverage a dedicated Landlock command to get the current version none), we can leverage a dedicated Landlock command to get the current version
of the Landlock ABI and adapt the handled accesses. Let's check if we should of the Landlock ABI and adapt the handled accesses. Let's check if we should
remove the ``LANDLOCK_ACCESS_FS_REFER`` or ``LANDLOCK_ACCESS_FS_TRUNCATE`` remove access rights which are only supported in higher versions of the ABI.
access rights, which are only supported starting with the second and third
version of the ABI.
.. code-block:: c .. code-block:: c
...@@ -92,6 +107,12 @@ version of the ABI. ...@@ -92,6 +107,12 @@ version of the ABI.
case 2: case 2:
/* Removes LANDLOCK_ACCESS_FS_TRUNCATE for ABI < 3 */ /* Removes LANDLOCK_ACCESS_FS_TRUNCATE for ABI < 3 */
ruleset_attr.handled_access_fs &= ~LANDLOCK_ACCESS_FS_TRUNCATE; ruleset_attr.handled_access_fs &= ~LANDLOCK_ACCESS_FS_TRUNCATE;
__attribute__((fallthrough));
case 3:
/* Removes network support for ABI < 4 */
ruleset_attr.handled_access_net &=
~(LANDLOCK_ACCESS_NET_BIND_TCP |
LANDLOCK_ACCESS_NET_CONNECT_TCP);
} }
This enables to create an inclusive ruleset that will contain our rules. This enables to create an inclusive ruleset that will contain our rules.
...@@ -143,10 +164,23 @@ for the ruleset creation, by filtering access rights according to the Landlock ...@@ -143,10 +164,23 @@ for the ruleset creation, by filtering access rights according to the Landlock
ABI version. In this example, this is not required because all of the requested ABI version. In this example, this is not required because all of the requested
``allowed_access`` rights are already available in ABI 1. ``allowed_access`` rights are already available in ABI 1.
We now have a ruleset with one rule allowing read access to ``/usr`` while For network access-control, we can add a set of rules that allow to use a port
denying all other handled accesses for the filesystem. The next step is to number for a specific action: HTTPS connections.
restrict the current thread from gaining more privileges (e.g. thanks to a SUID
binary). .. code-block:: c
struct landlock_net_port_attr net_port = {
.allowed_access = LANDLOCK_ACCESS_NET_CONNECT_TCP,
.port = 443,
};
err = landlock_add_rule(ruleset_fd, LANDLOCK_RULE_NET_PORT,
&net_port, 0);
The next step is to restrict the current thread from gaining more privileges
(e.g. through a SUID binary). We now have a ruleset with the first rule
allowing read access to ``/usr`` while denying all other handled accesses for
the filesystem, and a second rule allowing HTTPS connections.
.. code-block:: c .. code-block:: c
...@@ -355,7 +389,7 @@ Access rights ...@@ -355,7 +389,7 @@ Access rights
------------- -------------
.. kernel-doc:: include/uapi/linux/landlock.h .. kernel-doc:: include/uapi/linux/landlock.h
:identifiers: fs_access :identifiers: fs_access net_access
Creating a new ruleset Creating a new ruleset
---------------------- ----------------------
...@@ -374,6 +408,7 @@ Extending a ruleset ...@@ -374,6 +408,7 @@ Extending a ruleset
.. kernel-doc:: include/uapi/linux/landlock.h .. kernel-doc:: include/uapi/linux/landlock.h
:identifiers: landlock_rule_type landlock_path_beneath_attr :identifiers: landlock_rule_type landlock_path_beneath_attr
landlock_net_port_attr
Enforcing a ruleset Enforcing a ruleset
------------------- -------------------
...@@ -451,6 +486,14 @@ always allowed when using a kernel that only supports the first or second ABI. ...@@ -451,6 +486,14 @@ always allowed when using a kernel that only supports the first or second ABI.
Starting with the Landlock ABI version 3, it is now possible to securely control Starting with the Landlock ABI version 3, it is now possible to securely control
truncation thanks to the new ``LANDLOCK_ACCESS_FS_TRUNCATE`` access right. truncation thanks to the new ``LANDLOCK_ACCESS_FS_TRUNCATE`` access right.
Network support (ABI < 4)
-------------------------
Starting with the Landlock ABI version 4, it is now possible to restrict TCP
bind and connect actions to only a set of allowed ports thanks to the new
``LANDLOCK_ACCESS_NET_BIND_TCP`` and ``LANDLOCK_ACCESS_NET_CONNECT_TCP``
access rights.
.. _kernel_support: .. _kernel_support:
Kernel support Kernel support
...@@ -469,6 +512,12 @@ still enable it by adding ``lsm=landlock,[...]`` to ...@@ -469,6 +512,12 @@ still enable it by adding ``lsm=landlock,[...]`` to
Documentation/admin-guide/kernel-parameters.rst thanks to the bootloader Documentation/admin-guide/kernel-parameters.rst thanks to the bootloader
configuration. configuration.
To be able to explicitly allow TCP operations (e.g., adding a network rule with
``LANDLOCK_ACCESS_NET_BIND_TCP``), the kernel must support TCP
(``CONFIG_INET=y``). Otherwise, sys_landlock_add_rule() returns an
``EAFNOSUPPORT`` error, which can safely be ignored because this kind of TCP
operation is already not possible.
Questions and answers Questions and answers
===================== =====================
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment