As a web administrator, you may find it valuable to restrict some parts of a website from visitors, whether temporarily or on a permanent basis. While web applications may provide their own authentication and authorization methods, you can also rely on the web server itself to restrict access if these are inadequate or unavailable.
This tutorial will walk you through password-protecting assets on an Apache web server running on Ubuntu 18.04 in order to provide your server with additional security.
In order to complete this tutorial, you will need access to an Ubuntu 18.04 server.
In addition, you will need the following setup before you can begin:
A sudo
user on your server: You can create a user with sudo
privileges by following the Ubuntu 18.04 initial server setup guide.
An Apache2 web server: If you haven’t already set one up, the How To Install the Apache Web Server on Ubuntu 18.04 tutorial can guide you.
A site secured with SSL: How you set this up depends on whether you have a domain name for your site.
When all of these are in place, log into your server as the sudo
user and continue below.
Let’s begin by updating our server and installing a package that we’ll need. In order to complete this tutorial, we will be using a utility called htpasswd
, part of the apache2-utils
package, to create the file and manage the username and passwords needed to access restricted content.
- sudo apt update
- sudo apt install apache2-utils
With this installed, we now have access to the htpasswd
command.
The htpasswd
command will allow us to create a password file that Apache can use to authenticate users. We will create a hidden file for this purpose called .htpasswd
within our /etc/apache2
configuration directory.
The first time we use this utility, we need to add the -c
option to create the specified passwdfile. We specify a username (sammy
in this example) at the end of the command to create a new entry within the file:
- sudo htpasswd -c /etc/apache2/.htpasswd sammy
You will be asked to supply and confirm a password for the user.
Leave out the -c
argument for any additional users you wish to add so you don’t overwrite the file:
- sudo htpasswd /etc/apache2/.htpasswd another_user
If we view the contents of the file, we can see the username and the encrypted password for each record:
- cat /etc/apache2/.htpasswd
Outputsammy:$apr1$.0CAabqX$rb8lueIORA/p8UzGPYtGs/
another_user:$apr1$fqH7UG8a$SrUxurp/Atfq6j7GL/VEC1
We now have our users and passwords in a format that Apache can read.
In this step, we need to configure Apache to check this file before serving our protected content. We can do this in one of two ways: either directly in a site’s virtual host file or by placing .htaccess
files in the directories that need restriction. It’s generally best to use the virtual host file, but if you need to allow non-root users to manage their own access restrictions, check the restrictions into version control alongside the website, or have a web application using .htaccess
files for other purposes already, check out the second option.
Choose the option that best suits your needs.
The first option is to edit the Apache configuration and add the password protection to the virtual host file. This will generally give better performance because it avoids the expense of reading distributed configuration files. This option requires access to the configuration, which isn’t always available, but when you do have access, it’s recommended.
Begin by opening up the virtual host file that you wish to add a restriction to. For our example, we’ll be using the default-ssl.conf
file that holds the default virtual host installed through Ubuntu’s apache package. Open up the file with a command-line text editor such as nano:
- sudo nano /etc/apache2/sites-enabled/default-ssl.conf
Inside, with the comments stripped, the file should look similar to this:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Authentication is done on a per-directory basis. To set up authentication, you will need to target the directory you wish to restrict with a <Directory ___>
block. In our example, we’ll restrict the entire document root, but you can modify this listing to only target a specific directory within the web space:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/html">
</Directory>
</VirtualHost>
Within this directory block, specify that we are setting up Basic
authentication. For the AuthName
, choose a realm name that will be displayed to the user when prompting for credentials. Use the AuthUserFile
directive to point Apache to the password file we created. Finally, make it a requirement that only a valid-user
may access this resource, which means anyone who can verify their identity with a password will be allowed in:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/html">
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
</VirtualHost>
Save and close the file when you are finished. If you are using nano, you can do so by pressing CTRL+X
followed by Y
then ENTER
.
Before restarting the web server, you can check the configuration with the following command:
- sudo apache2ctl configtest
If everything checks out and you get Syntax OK
as output, you can restart the server to implement your password policy. Since systemctl
doesn’t display the outcome of all service management commands, we’ll use the the status
to be sure the server is running:
- sudo systemctl restart apache2
- sudo systemctl status apache2
Now, the directory you specified should be password protected.
Apache can use .htaccess
files in order to allow certain configuration items to be set within a content directory. Since Apache has to re-read these files on every request that involves the directory, which can negatively impact performance, Option 1 is preferred, but if you are already using .htaccess
file or need to allow non-root users to manage restrictions, .htaccess
files make sense.
To enable password protection using .htaccess
files, open the main Apache configuration file with a command-line text editor such as nano:
- sudo nano /etc/apache2/apache2.conf
Find the <Directory>
block for the /var/www
directory that holds the document root. Turn on .htaccess
processing by changing the AllowOverride
directive within that block from None
to All
:
. . .
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
. . .
Save and close the file when you are finished. If you are using nano, you can do so by pressing CTRL+X
followed by Y
then ENTER
.
Next, we need to add an .htaccess
file to the directory we wish to restrict. In our demonstration, we’ll restrict the entire document root (the entire website) which is based at /var/www/html
, but you can place this file in any directory where you wish to restrict access:
- sudo nano /var/www/html/.htaccess
Within this file, specify that we wish to set up Basic
authentication. For the AuthName
, choose a realm name that will be displayed to the user when prompting for credentials. Use the AuthUserFile
directive to point Apache to the password file we created. Finally, we will require a valid-user
to access this resource, which means anyone who can verify their identity with a password will be allowed in:
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
Save and close the file. Restart the web server to password protect all content in or below the directory with the .htaccess
file and use systemctl status
to verify the success of the restart:
- sudo systemctl restart apache2
- sudo systemctl status apache2
The directory you specified should now be password protected.
To confirm that your content is protected, try to access your restricted content in a web browser. You should be presented with a username and password prompt that looks like this:
If you enter the correct credentials, you will be allowed to access the content. If you enter the wrong credentials or hit “Cancel”, you will see the “Unauthorized” error page:
Congratulations! If you’ve followed along, you’ve now set up basic authentication for your site.
There is much more that you can do with Apache configuration and .htaccess
. To learn more about the flexibility and power available in Apache configuration, try one of these tutorials:
For a better understanding of the with the main configuration file, read the section about Getting Familiar with Important Apache Files and Directories in our Apache installation guide.
Learn more about the virtual host files in How To Set Up Apache Virtual Hosts on Ubuntu 16.04
Learn about rewriting URLs, customizing error pages like the “Unauthorized” message above, or including common elements on all your pages with Server Side Includes in our guide How To Use the .htaccess File.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
see sammy:$apr1$ in the password file. what apache documentation says
MD5 “$apr1$” + the result of an Apache-specific algorithm using an iterated (1,000 times) MD5 digest of various combinations of a random 32-bit salt and the password.
So it’s a form of MD5 that is weak!