Information
The /tmp directory is a world-writable directory used for temporary storage by all users and some applications.
Notes:
-
If an entry for /tmp exists in /etc/fstab it will take precedence over entries in the tmp.mount file.
-
tmpfs can be resized using the size={size} parameter in /etc/fstab or on the Options line in the tmp.mount file. If we don't specify the size, it will be half the RAM.
Resize tmpfs examples:
-
/etc/fstab
tmpfs /tmp tmpfs rw,noexec,nodev,nosuid,size=2G 0 0
-
tmp.mount
[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime,size=2G,noexec,nodev,nosuid
Making /tmp its own file system allows an administrator to set the noexec option on the mount, making /tmp useless for an attacker to install executable code. It would also prevent an attacker from establishing a hardlink to a system setuid program and wait for it to be updated. Once the program was updated, the hardlink would be broken and the attacker would have his own copy of the program. If the program happened to have a security vulnerability, the attacker could continue to exploit the known flaw.
This can be accomplished by either mounting tmpfs to /tmp, or creating a separate partition for /tmp.
Solution
Create or update an entry for /tmp in either /etc/fstab
OR
in a systemd tmp.mount file:
If /etc/fstab is used:
- Configure /etc/fstab as appropriate.
Example:
tmpfs /tmp tmpfs defaults,rw,nosuid,nodev,noexec,relatime 0 0
- Run the following command to remount /tmp
# mount -o remount,noexec,nodev,nosuid /tmp
OR
If an explicit systemd target is used to mount /tmp:
- Run the following command to create the file /etc/systemd/system/tmp.mount if it doesn't exist:
# [ ! -f /etc/systemd/system/tmp.mount ] && cp -v /usr/share/systemd/tmp.mount /etc/systemd/system/
- Edit the file /etc/systemd/system/tmp.mount :
Example tmp.mount file:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Temporary Directory (/tmp)
Documentation=man:hier(7)
Documentation=https://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
ConditionPathIsSymbolicLink=!/tmp
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
After=swap.target
[Mount]
What=tmpfs
Where=/tmp
Type=tmpfs
Options=mode=1777,strictatime,nosuid,nodev,nosuid
[Install]
WantedBy=local-fs.target
- Run the following command to reload the systemd daemon:
# systemctl daemon-reload
- Run the following command to unmask tmp.mount :
# systemctl unmask tmp.mount
- Run the following command to enable and start tmp.mount :
# systemctl enable --now tmp.mount
Impact:
Since the /tmp directory is intended to be world-writable, there is a risk of resource exhaustion if it is not bound to a separate partition.
Running out of /tmp space is a problem regardless of what kind of filesystem lies under it, but in a default installation a disk-based /tmp will essentially have the whole disk available, as it only creates a single / partition. On the other hand, a RAM-based /tmp as with tmpfs will almost certainly be much smaller, which can lead to applications filling up the filesystem much more easily.