FreeBSD, being a direct descendant of BSD UNIX®, is
based on several key UNIX concepts. The first and most
pronounced is that FreeBSD is a multi-user operating system. The system can handle
several users all working simultaneously on completely unrelated tasks. The system is
responsible for properly sharing and managing requests for hardware devices, peripherals,
memory, and CPU time fairly to each user.
Because the system is capable of supporting multiple users, everything the system
manages has a set of permissions governing who can read, write, and execute the resource.
These permissions are stored as three octets broken into three pieces, one for the owner
of the file, one for the group that the file belongs to, and one for everyone else. This
numerical representation works like this:
You can use the -l
command line argument to ls(1) to view a long
directory listing that includes a column with information about a file's permissions for
the owner, group, and everyone else. For example, a ls -l in an
arbitrary directory may show:
% ls -l
total 530
-rw-r--r-- 1 root wheel 512 Sep 5 12:31 myfile
-rw-r--r-- 1 root wheel 512 Sep 5 12:31 otherfile
-rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt
...
Here is how the first column of ls -l is broken up:
-rw-r--r--
The first (leftmost) character tells if this file is a regular file, a directory, a
special character device, a socket, or any other special pseudo-file device. In this
case, the - indicates a regular file. The next three characters,
rw- in this example, give the permissions for the owner of the
file. The next three characters, r--, give the permissions for
the group that the file belongs to. The final three characters, r--, give the permissions for the rest of the world. A dash means
that the permission is turned off. In the case of this file, the permissions are set so
the owner can read and write to the file, the group can read the file, and the rest of
the world can only read the file. According to the table above, the permissions for this
file would be 644, where each digit represents the three parts
of the file's permission.
This is all well and good, but how does the system control permissions on devices?
FreeBSD actually treats most hardware devices as a file that programs can open, read, and
write data to just like any other file. These special device files are stored on the /dev directory.
Directories are also treated as files. They have read, write, and execute permissions.
The executable bit for a directory has a slightly different meaning than that of files.
When a directory is marked executable, it means it can be traversed into, that is, it is
possible to “cd” (change directory) into it. This also means that within the
directory it is possible to access files whose names are known (subject, of course, to
the permissions on the files themselves).
In particular, in order to perform a directory listing, read permission must be set on
the directory, whilst to delete a file that one knows the name of, it is necessary to
have write and execute permissions
to the directory containing the file.
There are more permission bits, but they are primarily used in special circumstances
such as setuid binaries and sticky directories. If you want more information on file
permissions and how to set them, be sure to look at the chmod(1) manual
page.
Contributed by Tom Rhodes.
Symbolic permissions, sometimes referred to as symbolic expressions, use characters in
place of octal values to assign permissions to files or directories. Symbolic expressions
use the syntax of (who) (action) (permissions), where the following values are
available:
These values are used with the chmod(1) command just
like before, but with letters. For an example, you could use the following command to
block other users from accessing FILE:
% chmod go= FILE
A comma separated list can be provided when more than one set of changes to a file
must be made. For example the following command will remove the group and
“world” write permission on FILE, then it
adds the execute permissions for everyone:
% chmod go-w,a+x FILE
Contributed by Tom Rhodes.
In addition to file permissions discussed previously, FreeBSD supports the use of
“file flags.” These flags add an additional level of security and control
over files, but not directories.
These file flags add an additional level of control over files, helping to ensure that
in some cases not even the root can remove or alter files.
File flags are altered by using the chflags(1) utility,
using a simple interface. For example, to enable the system undeletable flag on the file
file1, issue the following command:
# chflags sunlink file1
And to disable the system undeletable flag, simply issue the previous command with
“no” in front of the sunlink
. Observe:
# chflags nosunlink file1
To view the flags of this file, use the ls(1) command with the
-lo
flags:
# ls -lo file1
The output should look like the following:
-rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1
Several flags may only added or removed to files by the root
user. In other cases, the file owner may set these flags. It is recommended that
administrators read over the chflags(1) and chflags(2) manual
pages for more information.