.. _PAMConfigurationChapter:

Pluggable Authentication Modules (PAM)
======================================

Introduction
------------

Before Bareos Version 18.2 authentication with a Bareos Director is done
primarily by a named Console connection.
Name and password are set in the regarding Bareos Console or |WebUI|
configuration resource.
Starting with Bareos Version 18.2 it is also possible to use Pluggable
Authentication Modules (PAM) to authenticate a user independently from the
Console Resource.

As consequence a dedicated named Console or |WebUI| configuration must be used
to establish a connection to a Bareos Director Daemon.
This connection has name and password credentials, but only to establish an
encrypted connection to the Director.
To be able to authenticate users with PAM using this console, each user needs
an additional User configuration that holds the regarding name and the Access
Control List (ACL) or ACL profile.
The ACL will be loaded as soon as the User is authenticated.

The credentials for user authentication comes from the PAM module which has been
enabled for the Bareos Director Daemon.

For a simplified technical overview the following diagram shows the connection
sequence of a Bareos Console to a Bareos Director using an interactive PAM
authentication using the pam_unix.so PAM module.

More technical details can be found in the Bareos Developer Guide:
:ref:`PAMDeveloperChapter`.

.. uml::
  :caption: Initiation of a Bareos Console connection using PAM authentication

  hide footbox

  actor user
  participant "B-Console" as console
  participant "Director" as director
  participant "PAM-Linux" as pam

  user -> console: start a named bconsole
  console <-> director: initiate TCP connection
  console <-> director: initiate a secure TLS connection (cert/psk)
  console <-> director: primary challenge/response authentication

  == PAM user authentication ==
  note left of pam: i.e. pam_unix.so\nconfigured in /etc/pam.d/bareos
  autonumber
  director -> pam: initialize pam module
  director <- pam: request username / password via callback
  console <- director: send "login:" / "password:" request encrypted via TLS
  user <- console: prompt "login:" / "Password:"
  user -> console: enter username / password (hidden)
  console -> director: send username / password encrypted via TLS
  director -> pam: give back username / password
  director <- pam: return success of authentication
  console <- director: send welcome message
  user <- console: show welcome message
  director -> pam: shutdown pam module

  autonumber stop
  == PAM user authentication end ==

  ... do something with console ...

  user -> console: quit session ('q'; Ctrl + D)
  console <-> director: Shutdown TLS
  console <-> director: Finish TCP connection

Configuration
-------------
To enable PAM authentication two systems have to be configured.
The PAM module in the operating system and the Bareos Console.

PAM Module
^^^^^^^^^^
This is depending on the operating system and on the used pam module.
For details read the manuals.
The name of the service that has to be registered is **bareos**.

Fedora 28 example:

.. code-block:: bareosconfig
   :caption: :file:`/etc/pam.d/bareos`

   auth       required     pam_unix.so
   account    required     pam_unix.so


.. warning::

   The |dir| runs as user **bareos**.
   However, some PAM modules require more privileges.
   E.g. **pam_unix** requires access to the file :file:`/etc/shadow`, which is
   normally not permitted.
   Make sure you verify your system accordingly.


.. note::

   **PAM_SSS** does not ask for a username, and you will see
   "PAM Authentication failed" without being prompted for your username.
   You can force a username prompt with ``auth required pam_permit.so``.

.. code-block:: bareosconfig
   :caption: :file:`/etc/pam.d/bareos` with pam_sss

   auth	   required pam_permit.so
   auth	   required pam_sss.so
   account required pam_sss.so

**pam_permit** always returns success and ensures the PAM conversation mechanism
is triggered, allowing Bareos to prompt for the username. **pam_sss** then
performs the actual authentication using the collected credentials.
Without **pam_permit**, **pam_sss** may fail immediately without prompting for
credentials.


Upgrading from previous versions
''''''''''''''''''''''''''''''''

Previous versions of Bareos only used PAM authentication (who is the user) but
not PAM authorization (what is the user allowed to do).
As a result configuring the account management group in PAM had no effect in
these versions so that, for example, a disabled user might still be able to log
in.

If on an existing installation ``account`` is not configured at all, the
**login will always fail** after upgrading from an affected version.

We strongly suggest that you configure proper authorization on production
systems.
We strictly advise against the possibility to regain the old behaviour by
configuring ``account required pam_permit.so``.

Bareos Console
^^^^^^^^^^^^^^

For PAM authentication a dedicated named console is used.
Set the directive UsePamAuthentication=yes in the regarding Director-Console
resource:

.. code-block:: bareosconfig
  :caption: :file:`bareos-dir.d/console/pam-console.conf`

  Console {
    Name = "PamConsole"
    Password = "Secretpassword"
    UsePamAuthentication = yes
  }

In the dedicated |bconsole| config use name and password according as to the
|dir|:

.. code-block:: bareosconfig
  :caption: :file:`bconsole.conf`

  Director {
    ...
  }

  Console {
    Name = "PamConsole"
    Password = "Secretpassword"
  }

PAM User
^^^^^^^^

Users have limited access to commands and jobs.
Therefore the appropriate rights should also be granted to PAM users.
This is an example of a User resource (Bareos Director Configuration):

.. code-block:: bareosconfig
  :caption: :file:`bareos-dir.d/user/a-pam-user.conf`

  User {
     Name = "a-pam-user"
     CommandACL = status, .status
     JobACL = *all*
  }


Additional information can be found at
https://github.com/bareos/bareos/tree/master/contrib/misc/bareos_pam_integration
