diff --git a/knowledge base/file permissions.md b/knowledge base/file permissions.md
new file mode 100644
index 0000000..33f06d6
--- /dev/null
+++ b/knowledge base/file permissions.md
@@ -0,0 +1,170 @@
+# File permissions
+
+Core to the security model used by Linux systems.
+They determine who can access files and directories on a system and how.
+
+1. [TL;DR](#tldr)
+1. [Representation](#representation)
+1. [Advanced permissions](#advanced-permissions)
+ 1. [Set-user-ID (SUID)](#set-user-id-suid)
+ 1. [Set-group-ID (SGID)](#set-group-id-sgid)
+ 1. [Sticky Bit](#sticky-bit)
+1. [Make files read-only](#make-files-read-only)
+1. [Further readings](#further-readings)
+ 1. [Sources](#sources)
+
+## TL;DR
+
+```sh
+# View permissions.
+ls -l 'path/to/file'
+
+# Change permissions.
+chmod u=rw,g+x,o-a 'path/to/file'
+chmod 670 'path/to/file'
+```
+
+Directories need the execution permissions to be traversed.
+
+## Representation
+
+Permissions are part of the files' metadata:
+
+```sh
+$ ls -l
+lrwxrwxrwx 1 me me 31 Jan 2 22:09 gui_rpc_auth.cfg.standard -> /var/lib/boinc/gui_rpc_auth.cfg
+drwxr-xr-x. 4 root root 68 Jun 13 20:25 tuned
+-rw-r--r--. 1 user users 4017 Feb 24 2022 vimrc
+```
+
+The first character states the **type** of the file: `-` for files, `d` for directories, `l` for links and so on.
+
+The next nine characters (e.g.: `rw-r--r--`) are 3 sets of 3 flags indicating the file's **permissions**.
+Each of the 3 `rwx` characters in a set refers to the different operations (`r`ead, `w`rite and e`x`ecute) one can
+perform on that file.
+The first set shows the permissions for the user owning the file, the second is for the group, and the last is for
+everyone and everything else.
+Permissions can be expressed in both _symbolic_ (e.g., `u=rw`, `g=r`, `o=r`) and _numeric_ (octal, e.g., `644`)
+representations.
+
+The dot after the permissions shows whether the file has extended attributes.
+
+The third column shows the **user** owning the file.
+
+The fourth column shows the **group** owning the file.
+
+## Advanced permissions
+
+There are 3 special permissions apart from the usual `rwx` ones.
+Those are `SUID`, `SGID`, and the `Sticky Bit`.
+
+### Set-user-ID (SUID)
+
+Files are executed by default with the privileges of the user who launched them.
+If one sets the SUID bit on the executable, the file will always run with the privileges **of the owner** of the file.
+
+> Only the owner of the file (or `root`) can set the SUID bit.
+
+The SUID bit is set by:
+
+- Replacing the `x` permissions of the user permissions set with an `s`:
+
+ ```sh
+ chmod 'u+s' 'vimrc'
+ ```
+
+- Using the octal representation prefixed by `4`:
+
+ ```sh
+ chmod '4744' 'vimrc'
+ ```
+
+When the SUID bit is set, the files show an `s` where there should be the `x` in the user's permissions set:
+
+```sh
+$ ls -l 'vimrc'
+-rwsr--r--. 1 user users 4017 Feb 24 2022 vimrc
+```
+
+The SUID bit is unset by removing the `s` (`u-s`) or prefixing the octal notation with `0` instead of `4`.
+
+### Set-group-ID (SGID)
+
+Newly created files and directories are assigned by default the same group as the creator's default group.
+When the SGID bit is set on directories, all **newly created** subdirectories and files under it will inherit the same group
+ownership as of the directory itself.
+
+SGID is useful in multi-user setups where users with different primary group have access to shared files.
+
+When the SGID bit is set, the directories show an `s` where there should be the `x` in the group's permissions set:
+
+```sh
+$ ls -l 'tuned'
+drwxr-sr-x. 4 root root 68 Jun 13 20:25 tuned
+```
+
+### Sticky Bit
+
+If the sticky bit is set on directories, their subdirectories and files will only be deletable by either the owner of
+the file, the owner of the parent directory, or `root`.
+
+Useful to prevent users from deleting other users' files inside shared folders where everyone has write access.
+
+The sticky bit is set by replacing the `x` permissions of the others permissions set with a `t`:
+
+```sh
+$ chmod 'o+t' 'vimrc'
+$ ls -l
+-rwsr--r-t. 1 user users 4017 Feb 24 2022 vimrc
+```
+
+## Make files read-only
+
+Change files' attributes on Linux file systems using the `chattr` command:
+
+```sh
+# Make files read-only.
+chattr +i '/path/to/file.php'
+chattr +i '/var/www/html/'
+
+# Find everything in '/var/www/html' and set it to read-only.
+find '/var/www/html' -iname "*" -print0 | xargs -I {} -0 chattr +i {}
+
+# Make files read-write.
+chattr -i '/path/to/file.php'
+```
+
+FreeBSD, Mac OS X and other BSD unix user need to use the `chflags` command:
+
+```sh
+# Make files read-only.
+chflags schg '/path/to/file.php'
+
+# Make files read-write.
+chflags noschg '/path/to/file.php'
+```
+
+## Further readings
+
+- [`chmod`][chmod]
+- [Access Control Lists][ACL]
+
+### Sources
+
+- [How to Set File Permissions in Linux]
+- [Linux permissions: SUID, SGID, and sticky bit]
+- [How to set readonly file permissions on Linux/Unix web server DocumentRoot]
+
+
+
+
+[acl]: acl.md
+[chmod]: chmod.md
+
+
+[how to set file permissions in linux]: https://www.geeksforgeeks.org/permissions-in-linux/
+[linux permissions: suid, sgid, and sticky bit]: https://www.redhat.com/sysadmin/suid-sgid-sticky-bit
+[how to set readonly file permissions on linux/unix web server documentroot]: https://www.cyberciti.biz/faq/howto-set-readonly-file-permission-in-linux-unix/
diff --git a/knowledge base/file permissions.placeholder b/knowledge base/file permissions.placeholder
deleted file mode 100644
index 286845f..0000000
--- a/knowledge base/file permissions.placeholder
+++ /dev/null
@@ -1,27 +0,0 @@
-https://www.cyberciti.biz/faq/howto-set-readonly-file-permission-in-linux-unix/
-
-
-Change file attributes on a Linux file system to read-only using the `chattr` command:
-
-```sh
-chattr +i /path/to/file.php
-chattr +i /var/www/html/
-
-# find everything in /var/www/html and set to read-only #
-find /var/www/html -iname "*" -print0 | xargs -I {} -0 chattr +i {}
-```
-
-```sh
-To remove read-only attribute pass the -i option:
-# chattr -i /path/to/file.php
-```
-
-FreeBSD, Mac OS X and other BSD unix user need to use the `chflags` command:
-
-```sh
-# set read-only
-chflags schg /path/to/file.php
-
-# remove read-only
-chflags noschg /path/to/file.php
-```