SlideShare una empresa de Scribd logo
1 de 160
Descargar para leer sin conexión
Apache Web server
 Complete Guide

    Dedoimedo
Foreword

Since I cannot be sure you have read my introductory article on
my website (http://www.dedoimedo.com/), here’s an abstract of
what you should expect from this document.

The Web server - Apache - Complete Guide is one of the many
topics covered in the series of books that I’m writing on Linux,
the goal of which is to help any enthusiastic Windows user or a
Linux newbie become a powerful, confident Linux professional. As
a preview of what you should expect when these books become
published, I have decided to post a single Part on my website.

I am truly convinced that you will thoroughly enjoy this docu-
ment, for it has been written with care and attention to tiniest
details. Every procedure is explained step by step, accompanied
by numerous examples and screenshots.

I hope this will be the best guide on the Apache Web server you
will have ever read.

The only thing that you will miss is the fact that links to other
Parts, covering other material, are not available in this stand-
alone release. However, every procedure required to setup the Web



                                1
www.dedoimedo.com                                     all rights reserved


server is fully self-contained. You will be able to fully configure the
Apache server by just using this document as your guide.

Lastly, let’s get one thing straight: you will not become Apache gu-
rus by reading this document. For that matter, I’m not an Apache
guru, either. There are so many aspects to the usability and secu-
rity of the Apache Web server, it is practically impossible to put
them all in a single book.

However, by reading this document, you WILL learn how to use
the Apache Web server on the basic and intermediate level. And
there’s no guide that will explain things as simply and as beautifully
as mine, I guarantee that.

From here on, the sky’s your limit.




                                  2
About

Dedoimedo is a website specializing in step-by-step tutorials in-
tended for human beings. Everything posted on my website is
written in plain, down-to-Earth English, with plenty of screenshot
examples and no steps ever skipped. You won’t easily find tutorials
simpler or friendlier than mine.

Myself, I’m a former physicist, currently living the dream and
working as a Linux Systems Expert, hacking the living daylight
out of the Linux kernel. Few people have the privilege to work in
what is essentially their hobby and passion and truly love it, so I’m
most grateful for the beauty, freedom and infinite possibilities of
the open-source world. I also hold a bunch of certifications of all
kinds, but you can read more about those on my website.

Have fun!




                                 3
Copyright

This document can be used under the following conditions:

If you want to modify or extend any part of this document, please
contact me by email for permission. In any case, you must publicly
credit me for the original work, including a link to my website.

If you wish to mirror either the original article on my website or
just this document, please contact me by email for permission. If
you want to hotlink, please do so with a complimentary explana-
tion, necessary credits and a link to my website.

If you want to use this document for commercial or business pur-
poses, please contact me by email with the details of your endeavor
so we can discuss it.




                                4
Disclaimer

I am not very fond of disclaimers, but they are a necessary part of
our world. So here we go:

I must emphasize the purpose of this document is for educational
purposes. It is not an official document and should not be treated
as such. Furthermore, I cannot take any responsibilities for errors,
inaccuracies or damages resulting from the use of this article (and
its contents).

All of the material in this document has been carefully worded
and prepared by me. However, if for some reason you may feel this
document infringes on copyright or intellectual property of another
work, please contact me with a detailed explanation pointing to a
troublesome part and I will try to sort the problem in the best way
possible.

This tutorial has also been posted as a web article on my website.
For any news, changes or updates, you should always refer first to
www.dedoimedo.com.




                                 5
Contents

1 Introduction                                                                                            11

2 Basic Setup                                                                                             13
  2.1 Verify installation . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
  2.2 Package files . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
  2.3 Main configuration file(s) . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
  2.4 Backup . . . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
  2.5 Edit the httpd.conf configuration file        .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
      2.5.1 ServerRoot . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   17
      2.5.2 PidFile . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
      2.5.3 ServerName . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
      2.5.4 /etc/hosts file . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
      2.5.5 DocumentRoot . . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
      2.5.6 ErrorLog . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
      2.5.7 Listen . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
  2.6 Create your HTML documents . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
  2.7 Start the Web Server . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
  2.8 Access the web site . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
      2.8.1 Local access . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
      2.8.2 External access . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   32
  2.9 Summary of basic setup . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   36



                                     6
www.dedoimedo.com                                             all rights reserved


3 Advanced setup                                                                      37
  3.1 Directory tags . . . . . . . . . . . . . . . . . . . . . . . . .        .   .   37
      3.1.1 Order (allow, deny) . . . . . . . . . . . . . . . . . .           .   .   40
      3.1.2 Indexes . . . . . . . . . . . . . . . . . . . . . . . .           .   .   43
      3.1.3 DirectoryMatch . . . . . . . . . . . . . . . . . . . .            .   .   48
  3.2 Files tags . . . . . . . . . . . . . . . . . . . . . . . . . . .        .   .   48
  3.3 Location tags . . . . . . . . . . . . . . . . . . . . . . . . .         .   .   49
  3.4 Directory, Files and Location . . . . . . . . . . . . . . . .           .   .   51
  3.5 Redirect . . . . . . . . . . . . . . . . . . . . . . . . . . . .        .   .   52
  3.6 Virtual Hosts . . . . . . . . . . . . . . . . . . . . . . . . .         .   .   54
      3.6.1 Single IP, two websites . . . . . . . . . . . . . . . .           .   .   57
      3.6.2 Two IPs, two websites . . . . . . . . . . . . . . . .             .   .   63
      3.6.3 Other scenarios . . . . . . . . . . . . . . . . . . . .           .   .   69
              3.6.3.1 Different content for intranet and Internet              .   .   69
              3.6.3.2 Different websites on different ports . . . .             .   .   72
  3.7 Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . .         .   .   74
      3.7.1 Module types . . . . . . . . . . . . . . . . . . . . .            .   .   74
  3.8 View installed modules . . . . . . . . . . . . . . . . . . . .          .   .   74
      3.8.1 LoadModule . . . . . . . . . . . . . . . . . . . . . .            .   .   76
      3.8.2 mod_access . . . . . . . . . . . . . . . . . . . . . .            .   .   78
      3.8.3 mod_dir . . . . . . . . . . . . . . . . . . . . . . . .           .   .   78
      3.8.4 mod_perl . . . . . . . . . . . . . . . . . . . . . . .            .   .   79
      3.8.5 mod_python . . . . . . . . . . . . . . . . . . . . .              .   .   79
      3.8.6 mod_ssl . . . . . . . . . . . . . . . . . . . . . . . .           .   .   79

4 .htaccess                                                                           80
  4.1 Create .htaccess file . . . . . . . . . . . . . . . .    . . . . .   .   .   .   83
  4.2 Create .htpasswd file . . . . . . . . . . . . . . .      . . . . .   .   .   .   83
  4.3 Copy .htaccess to restricted directory . . . . . .      . . . . .   .   .   .   85
  4.4 Configure httpd.conf to allow authentication via        .htaccess    .   .   .   85
  4.5 Restart server . . . . . . . . . . . . . . . . . . .    . . . . .   .   .   .   86

                                      7
www.dedoimedo.com                                                             all rights reserved


   4.6   Test setup . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   87
   4.7   Other configurations . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   90
         4.7.1 Inheritance & performance loss         .   .   .   .   .   .   .   .   .   .   .   .   .   90
         4.7.2 Disable web access to .htaccess        .   .   .   .   .   .   .   .   .   .   .   .   .   91

5 Secure Web server                                                                                        93
  5.1 Encrypted session . . . . . . . . . . . . . . . . . . . . . . . .                               .    94
  5.2 Requirements . . . . . . . . . . . . . . . . . . . . . . . . . .                                .    95
  5.3 Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . .                               .    96
  5.4 Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                             .    97
      5.4.1 Main configuration file(s) . . . . . . . . . . . . . . . .                                  .    97
      5.4.2 Backup . . . . . . . . . . . . . . . . . . . . . . . . .                                  .    98
      5.4.3 Edit the ssl.conf configuration file - part 1 . . . . . .                                   .    98
             5.4.3.1 LoadModule . . . . . . . . . . . . . . . . .                                     .    98
             5.4.3.2 Listen . . . . . . . . . . . . . . . . . . . . .                                 .    99
             5.4.3.3 VirtualHost . . . . . . . . . . . . . . . . . .                                  .    99
      5.4.4 Create SSL certificate . . . . . . . . . . . . . . . . .                                   .   101
             5.4.4.1 Create Certificate Authority (CA) . . . . .                                       .   102
             5.4.4.2 Create server key . . . . . . . . . . . . . . .                                  .   107
             5.4.4.3 Create Certificate Signing Request (CSR) .                                        .   108
             5.4.4.4 Sign Certificate Signing Request (CSR) with
                        Certificate Authority (CA) . . . . . . . . . .                                 .   110
             5.4.4.5 Verify certificates . . . . . . . . . . . . . . .                                 .   112
      5.4.5 Edit ssl.conf configuration file - part 2 . . . . . . . .                                   .   115
             5.4.5.1 Server Certificate . . . . . . . . . . . . . . .                                  .   115
             5.4.5.2 Server Private Key . . . . . . . . . . . . . .                                   .   116
             5.4.5.3 Certificate Authority . . . . . . . . . . . . .                                   .   116
      5.4.6 Test setup . . . . . . . . . . . . . . . . . . . . . . . .                                .   117
      5.4.7 Mini-summary . . . . . . . . . . . . . . . . . . . . . .                                  .   122
             5.4.7.1 Names . . . . . . . . . . . . . . . . . . . . .                                  .   122
             5.4.7.2 Commands . . . . . . . . . . . . . . . . . .                                     .   123

                                       8
www.dedoimedo.com                                                                            all rights reserved


                5.4.7.3   Difference between self-signed and CA-signed
                          certificates . . . . . . . . . . . . . . . . . .                                            .   124
               5.4.7.4 Verification . . . . . . . . . . . . . . . . . .                                               .   125
               5.4.7.5 File names and locations . . . . . . . . . . .                                                .   125
   5.5   Extras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                          .   126
         5.5.1 Do not use password-protected server keys . . . . . .                                                 .   126
               5.5.1.1 Create server key without password . . . . .                                                  .   126
         5.5.2 Submission of CSR to CA . . . . . . . . . . . . . . .                                                 .   128
               5.5.2.1 Create CSR . . . . . . . . . . . . . . . . . .                                                .   128
               5.5.2.2 Send CSR to CA . . . . . . . . . . . . . . .                                                  .   129
               5.5.2.3 Verify certificate . . . . . . . . . . . . . . .                                               .   129
   5.6   General considerations . . . . . . . . . . . . . . . . . . . . .                                            .   130
         5.6.1 Use secure server only . . . . . . . . . . . . . . . . .                                              .   130
         5.6.2 Use only IP-based virtual hosts . . . . . . . . . . . .                                               .   130
         5.6.3 Use server.key as file name for the server key . . . . .                                               .   131

6 Other configurations                                                                                                 132
  6.1 Firewall rules . . . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 132
      6.1.1 Advanced firewall rules . .                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 133
             6.1.1.1 Port forwarding .                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 134
             6.1.1.2 Destination NAT                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 135
             6.1.1.3 Static NAT . . .                    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 136
  6.2 Enable Web server on startup . .                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 139

7 Security                                                                                                            140
  7.1 Updates . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 141
  7.2 Hide your server version       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 141
  7.3 Logs . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 143
  7.4 Permissions . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 143
  7.5 Access to root (/) . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 145
  7.6 AllowOverride . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 145


                                             9
www.dedoimedo.com                                                           all rights reserved


   7.7    Disable public access to .ht files . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   146
   7.8    Dynamic content . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   146
          7.8.1 Disable CGI . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   146
          7.8.2 Disable Server Side Includes (SSI)      .   .   .   .   .   .   .   .   .   .   .   .   147
   7.9    Disable unnecessary modules . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   147
   7.10   Use ModSecurity (mod_security) module         .   .   .   .   .   .   .   .   .   .   .   .   147
   7.11   Chroot Jail . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   148
   7.12   Secure web server only . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   149
          7.12.1 Different DocumentRoot . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   149
          7.12.2 Permissions . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   149
          7.12.3 Duration of certificates . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   149
   7.13   Word of caution . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   150

8 Additional resources                                                                                  151

9 Exercises                                                                                          152
  9.1 Questions . . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   . 153
      9.1.1 Secure Web server & VirtualHost             .   .   .   .   .   .   .   .   .   .   .   . 153
      9.1.2 Directory, Files and Locations . .          .   .   .   .   .   .   .   .   .   .   .   . 154
      9.1.3 Server functionality, 1 . . . . . .         .   .   .   .   .   .   .   .   .   .   .   . 154
      9.1.4 Server functionality, 2 . . . . . .         .   .   .   .   .   .   .   .   .   .   .   . 155
      9.1.5 .htaccess . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   . 156
  9.2 Answers . . . . . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   . 157
      9.2.1 Secure Web server & VirtualHost             .   .   .   .   .   .   .   .   .   .   .   . 157
      9.2.2 Directory, Files and Locations . .          .   .   .   .   .   .   .   .   .   .   .   . 157
      9.2.3 Server functionality, 1 . . . . . .         .   .   .   .   .   .   .   .   .   .   .   . 157
      9.2.4 Server functionality, 2 . . . . . .         .   .   .   .   .   .   .   .   .   .   .   . 158
      9.2.5 .htaccess . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   . 159




                                       10
Chapter 1

Introduction

A Web server is a server that is responsible for accepting HTTP
requests from web clients and serving them HTTP responses, usu-
ally in the form of web pages containing static (text, images etc)
and dynamic (scripts) content.

The Apache Web server has been the most popular and widely
used Web server for the last decade. It is used by approximately
50% of all websites. Apache is cross-platform, lightweight, robust,
and used in small companies as well as large corporations. Apache
is also free and open-source.

The Apache Web server has almost endless possibilities, due to
its great modularity, which allows it to be integrated with numer-
ous other applications. One of the most popular bundles is the
LAMP Web server application stack, which includes the Apache
Web server alongside MySQL, PHP, Perl, and Python.

The Apache Web server is developed by the Apache Software Foun-
dation. You can read more about Apache on Wikipedia.


                                11
www.dedoimedo.com                                    all rights reserved


Being able to configure and secure the Apache Web server is one
of the most important tasks for a (Linux) system administrator.
Almost every company has some sort of a website that advertises it,
including intranet pages that are used by the company’s workers.
The Web interface is used for many tasks beside pure browsing,
including tasks as simple as meal orders and shift rosters, but also
important tasks like administration of databases. In most cases, a
local web server is setup to accommodate these needs.

If you are working for a company that hosts public websites, the
task becomes even more complicated. Web sites are used to serve
content to billions of users daily. Whoever controls this content
- controls the World Wide Web, from news and blogs to financial
transactions. Web servers are hubs of information and power. Mis-
configured or compromised servers can expose a large number of
people to undesired content and potentially incur huge damages to
involved parties.

Running a Web site is much more than opening a port and serving
a few HTML pages. There are tremendous network usability and
security considerations that must continuously be met, evaluated
and improved in order to maintain a safe and effective Web server.

In this Part of the Book, we will learn how to properly setup and
run the Apache Web server, including the secure (HTTPS) server.




                                12
Chapter 2

Basic Setup

In this chapter, we will setup a Web server that will serve pages
on our internal network. In this chapter, we will perform the most
basic setup with the minimum number of steps required to get
the server running. Later, we will slowly expand, introducing new
features and options.


2.1    Verify installation
First, we’ll verify that Apache is indeed installed:

   rpm -q httpd

If you get an empty prompt or a message saying the package is
not installed, you will need to download and install it. If the shell
displays the package name and version, you’re good to go.




                                 13
www.dedoimedo.com                                    all rights reserved


2.2    Package files
Rule no. 1: don’t panic! The list before you might seem intimi-
dating at the moment, but that is simply because you are not yet
familiar with Apache. But don’t worry. For now, treat the list as
a reference only. At this stage, you don’t need to know anything
or remember anything. We will slowly cover everything, step by
step.

Now, let us overview the location and purpose of the files used by
the Apache server. Please note that the list is partial and includes
only the most important entries. We will slowly expand this list
as we go through the Part.




                                14
www.dedoimedo.com                                     all rights reserved


      File name                 Description
      /usr/sbin/httpd           server binary
      /etc/httpd                directory containing server
                                configuration files
      /etc/httpd/conf           directory containing main
                                configuration files
      /etc/httpd/conf.d         directory containing
                                configuration files for
                                individually packaged
                                modules, like ssl, php, perl etc
      /etc/httpd/logs           symbolic link to
                                /var/log/httpd
      /etc/httpd/modules        symbolic link to
                                /usr/lib/httpd/modules
      /etc/httpd/run            symbolic link to /var/run
      /usr/lib/httpd/modules    server modules
      /var/log/httpd            server log
      /var/run                  runtime variables
      /var/run/httpd.pid        server process ID
      /var/www/html             public html files

We will discuss the main configuration file shortly.


2.3    Main configuration file(s)
The main configuration file for the Apache Web server is:

  /etc/httpd/conf/httpd.conf




                               15
www.dedoimedo.com                                     all rights reserved


This file is well commented and self explanatory. It contains quite
a large number of settings, but we’ll concentrate on just the few
necessary to setup the server.


2.4    Backup
This is one of the most important things to remember. Always
retain the copy of the original file so you can easily revert to the
default. At the very least, do NOT delete default lines; instead,
just comment them out so you’ll be able to see what the original
settings read and refer to them.

   cp /etc/httpd/conf/httpd.conf→
       /etc/httpd/conf/httpd.conf-default


2.5    Edit the httpd.conf configuration file
Let’s open this file in vi text editor and review the most important
entries. The file has many options - but we need only a few. In fact,
you will need to change just a single line to create your server and
get it running. However, you should be familiar with some other
settings before launching the server.

   vi /etc/httpd/conf/httpd.conf

This is what the file looks like - at least the beginning of it:




                                 16
www.dedoimedo.com                                    all rights reserved




Let’s go over the most important entries you should remember for
now.


2.5.1   ServerRoot
ServerRoot is the path to the server’s configuration, error and log
files. It is possible to change this path, provided all the necessary
files are copied to the new location accordingly. We will later
review this concept as a part of the security measure known as the
Chroot Jail, but more about that later (). The default location is
/etc/httpd.




                                17
www.dedoimedo.com                                  all rights reserved


As you can see, the file is rich with easy-to-understand comments.
Apropos the comments, please note that you should not place a
trailing slash at the end of the specified path.




2.5.2   PidFile
PidFile is the process identification number for the httpd. This
process number is important, because Apache spawns numerous
child processes when running to accommodate the web traffic. It
allows you to monitor and manipulate your server processes. See
image above.


2.5.3   ServerName
This is the one setting you will have to change to get your server
running. This is where you declare the name of your website.

                                18
www.dedoimedo.com                                 all rights reserved


I will use www.ninja.com - just a random name with no association
whatsoever to the real site bearing this name.

The generous comments in the file remind us that if we do not have
a registered DNS name, we should use an IP address. One, we’ll
discuss registered DNS names later. Two, we’re going to use the
hosts file to demonstrate the address-to-name translation.




2.5.4   /etc/hosts file
As you already know, the hosts file allows easy matching of names
to IP addresses, . In general, using the hosts file is a good way
of testing your IP-to-name (or vice versa) configurations before
committing these changes into a production environment.



                               19
www.dedoimedo.com                                  all rights reserved


First, with no new entries added to the hosts file, typing
www.ninja.com in the address bar of a web browser takes us to
the site itself (on the Internet).




Now, we shall edit the file and add an entry, pointing www.ninja.com
to a local IP address.

  vi /etc/hosts




                               20
www.dedoimedo.com                                   all rights reserved




After saving the hosts file, we can no longer see the Internet site.
Furthermore, we don’t get any fancy results from our own Web
server, because it is not running yet.




                                21
www.dedoimedo.com        all rights reserved




                    22
www.dedoimedo.com                                     all rights reserved


2.5.5   DocumentRoot
DocumentRoot tells you where your web documents (html files, im-
ages etc) should be located. It is possible to reference files in other
directories using aliases and symbolic links. The default directory
is /var/www/html.




2.5.6   ErrorLog
ErrorLog tells you where the log containing all server errors is
located. This file is critical for debugging and solving server mis-
configuration problems and for proper traffic shaping. By default,
all messages with the value of warning (warn) and higher will be
logged. This is described in the LogLevel directive just below.


                                 23
www.dedoimedo.com                                     all rights reserved


The default location is logs/error_log. Please note that this is rela-
tive to the ServerRoot.             Therefore, our log file is
/etc/httpd/logs/error_log.      However, let us not forget that
/etc/httpd/logs is a symbolic link to /var/log/httpd. Thus, finally,
the actual error log is /var/log/httpd/error_log.




                                 24
www.dedoimedo.com                                  all rights reserved


2.5.7   Listen
The Listen command tells the Web server what ports to use for
incoming connections. By default, port 80 is used, although any
one or several can be used. The accepted conventions calls for
using port 80 for non-secure web communications (without any
encryption of traffic). Secure web communications are normally
handled on port 443.

We’ll talk about the Secure Web server later.




That’s it. These are all the settings you need to know for now and
tamper with in order to successfully launch the Web server. Save
the configuration file (Esc then :x in vi text editor).


                                25
www.dedoimedo.com                                 all rights reserved


2.6    Create your HTML documents
Now, just to make things more interesting, we shall create a num-
ber of files and place them in the DocumentRoot directory
(/var/www/html), including a simple index.html file. Here’s the
source of our index.html file (the two echoes are used to make the
output easier to read):




                               26
www.dedoimedo.com                                  all rights reserved


And here is the preview of files we have in the html directory:




Now that we know what we have, it’s time to power up the server.




                               27
www.dedoimedo.com                                    all rights reserved


2.7    Start the Web Server
Start the httpd service:

   service httpd start

If everything worked out fine, the web server should start without
any errors and you should see the following image:




Still, it does not hurt to check the status of the service or verify
its process ID:




                                28
www.dedoimedo.com                                      all rights reserved




There are 9 processes running for Apache. This may be confusing,
but there’s a very simple explanation for this. In the httpd.conf
file, you will find a directive called StartServers. This directive tells
the Web server how many server processes to launch on startup.
The default setting is 8 server processes.

Once started, the Web server dynamically kills and creates pro-
cesses based on the traffic load, with the number of server processes
fluctuating between MinSpareServers and MaxSpareServers. So
far, everything figures out just nicely. Now, let’s make another
check.

The Apache Web server, if configured to listen on port 80 (or any
“secure” port below 1024) must be started as root. Otherwise,
it can also be started by regular (non-root) users. As a security


                                  29
www.dedoimedo.com                                   all rights reserved


precaution, the server processes spawned by Apache run as user
apache, which belongs to the group apache. Indeed, we can easily
verify that:




You can change these settings in the httpd.conf file, as well.


2.8     Access the web site
2.8.1   Local access
Now, let’s access our homepage.

Open a web browser and type www.ninja.com in the address bar.
Earlier, we were unable to access it, even though we have specified
the entry for our website in the hosts file. This was because the


                                30
www.dedoimedo.com                                   all rights reserved


server was not running. But now, www.ninja.com resolves to our
custom webpage.




Our server works.

Alternatively, we could have simply accessed it by typing localhost
in the web browser address bar.




                                31
www.dedoimedo.com                                  all rights reserved




2.8.2   External access
Accessing the web server locally is not the most challenging thing
to do. Let’s access it from other machines.




                                32
www.dedoimedo.com                              all rights reserved


Here’s our webpage, seen in another CentOS machine, belonging
to the same subnet:




                             33
www.dedoimedo.com                                     all rights reserved


Here’s our webpage, seen in the Opera browser running on a Win-
dows machine:




As you might expect, using www.ninja.com on the other machines
does not yield the desired result. This is because there is nothing
telling these machines to match the name to the IP address of
our server (192.168.1.128). On the server itself, we overcame the
problem using the hosts file.

Theoretically, we could do the same thing on every host on our
network, but this is slightly impractical and cumbersome. How-
ever, this will not solve the problem of accessibility from hosts that
we have no control of, outside our local network. To overcome this
monumental problem, we’ll use name resolution by configuring and


                                 34
www.dedoimedo.com                                all rights reserved


running a Domain Name System (DNS) server. This material is
covered in great detail in the next Part.




Meanwhile, everything works as we’ve expected. Soon, we will go
over some advanced configurations.




                              35
www.dedoimedo.com                                         all rights reserved


2.9    Summary of basic setup
To make things simple and clear, here’s an overview of the steps
you will have to take to setup and launch Apache:

  • Verify installation of the Apache RPM.

  • Backup the /etc/httpd/conf/httpd.conf main configuration file.

  • Open it in the vi text editor and review the options listed therein.

  • Setup the DocumentRoot directive (default /var/www/html).

  • Setup the ServerName directive (for example, www.ninja.com).

  • Optionally setup other directives (like ServerRoot, ErrorLog, Listen
    etc).

  • Configure the /etc/hosts file so that you can access the website by
    name.

  • Create a sample HTML file and place it in the DocumentRoot directory.

  • Start the httpd server.

  • Test the setup by accessing the web site.




                                    36
Chapter 3

Advanced setup

The httpd.conf file can be extensively customized using a range
of directives. We have studied a few and will now review several
more. Please note that it is impossible to list every single directive
here. Nevertheless, we will go over some of the more useful and
practical directives, which will greatly enhance the usability (and
also the security) of your web server.


3.1    Directory tags
Directory tags allow you to specify the configurations separately
for each directory serving the web pages. If you are familiar with
HTML and CSS, then using <div> containers might be the sim-
plest analogy. This allows you to serve content to specific IP ranges
while denying other ranges, limit access to certain files, set the be-
havior of pages contained in these directories, and more.




                                 37
www.dedoimedo.com                                           all rights reserved




Just about any directory can be listed, although it is not necessary.
The most sensible solution is to setup very restrictive parameters
to the root (/) directory and custom, desired parameters to direc-
tories inside DocumentRoot.

Directory tags take the following form (again this is very analogous
to HTML <div> tags):

   • <Directory directory_path> tag begins a block.

   • Next, follows a series of options defining what users accessing web pages
     located in this directory can do.

   • </Directory> tag closes the block.




                                     38
www.dedoimedo.com                                   all rights reserved


Here’s a sample block, showing the default settings applied to the
root (/) directory:

   <Directory />
     Options FollowSymLinks
     AllowOverride none
   </Directory>

Let’s try to understand what we have here:

   <Directory />

This declares the block for the root (/) directory and all sub-
directories.

   Options FollowSymLinks

The Options directive declares which server features are valid for
the specified directory; FollowSymLinks is one of the possible op-
tions - it allows webpages to use symbolic links to point to files
located anywhere on the root (/) directory. Please note this is not
the best configuration from the security point of view; however, it
does demonstrate the functionality of the Directory tags. We will
discuss the server security measures later in the Part.

   AllowOverride none

The AllowOverride directive governs the behavior of .htaccess files
(more about them later). It tells whether the restrictions imposed
by the Options can be overridden by specific settings inside the
.htaccess files. The default behavior is set to none and should

                                39
www.dedoimedo.com                                    all rights reserved


remain that way. This will prevent security breaches or nuisances
due to misconfiguration.

   </Directory>

This tag closes the block.


3.1.1   Order (allow, deny)
Allow and Deny directives govern the access to the directory de-
clared (via the Directory tags). The Order directive specifies how
the allow and deny directives are treated. The Order of allow,
deny can be looked upon as default-allow or blacklist; only “bad”
hosts or IPs are disallowed. The Order of deny, allow can be
looked upon as default-deny or whitelist; only “good” hosts or IPs
are allowed.

Possible declaration of allowed or denied clients can be via host
name, domain name, IP address, partial IP address, and more.

Here, we’ll restrict access to the directory (or rather, the server)
by denying access from all - and only permitting access from a
single IP address, that of another machine on the LAN (in this
case, 192.168.1.129).




                                40
www.dedoimedo.com                                          all rights reserved




Let’s review the changes to the httpd.conf file:

  • I have commented out the original parameters, which allowed access
    from all hosts (or IPs).

  • I have changed the order of allow, deny directives. Again, this is im-
    portant, because the order defines the precedence of the rules. Thus,
    first, we’ll deny everyone (this can be called default deny policy, so to
    speak) and then permit only specific hosts (or IPs). If the Order were
    reversed (allow, deny rather than deny, allow), no one would be able
    to access the server. This is critically important to remember when
    implementing allow, deny policies.




                                    41
www.dedoimedo.com                                  all rights reserved


The changes will only take effect after the Web server is restarted
or the configuration file reloaded. This can be achieved by running
either:

  service httpd restart

Or:

  service httpd reload

After httpd reads the new configuration file, the changes will take
effect. Now, let’s try to access the server from the Windows ma-
chine.




                                42
www.dedoimedo.com                                    all rights reserved


As you can see, we are denied access. But accessing from the
CentOS client with the IP of 192.168.1.129 works fine.




3.1.2   Indexes
The Indexes directive tells the server whether to display the di-
rectory listing when asked. The behavior of this directive depends
on another directive - the DirectoryIndex. The DirectoryIndex di-
rective tells the server the name of the default page that it should
serve when a user requests the listing of a directory.

This is the typical everyday scenario. Users are trying to access
webpages by simply typing their names, without typing the ex-
act homepage (like index.html, index.php etc). Various file names


                                43
www.dedoimedo.com                                     all rights reserved


specified under the DirectoryIndex are looked for and the first one
found is presented to the user. If no file is found, the listing of the
directory is then generated by the server.

This is something you may want to avoid, especially if there are files
you do not wish your users to see. However, if the Options Indexes
directives are used, then directory listings will be generated.

One solution is to place a dummy index.html file in every directory,
but this is cumbersome. The more elegant approach is to disable
the listing globally (remove Indexes from the Options directive
under DocumentRoot) and then allow per-directory listing when
you see fit.

The default configuration in the httpd.conf file specifies Options
Indexes for the Directory tags of the default DocumentRoot
(/var/www/html). We will change that.

First, we will remove Indexes from the Options line for our Docu-
mentRoot. Then, we will create two directories, called index_allow
and index_deny, where only the first will have the Options In-
dexes specified. Both of these directories will contain some random
files.




                                 44
www.dedoimedo.com                                       all rights reserved




This is the new configuration file. Save it, then restart httpd. Now,
if we request the directory listing for each one from our clients, we’ll
get the following results:




                                  45
www.dedoimedo.com        all rights reserved


  index_allow




                    46
www.dedoimedo.com        all rights reserved


  index_deny




                    47
www.dedoimedo.com                                    all rights reserved


3.1.3   DirectoryMatch
The directives enclosed in the Directory tags will be indiscrimi-
nately applied to all sub-directories. If you require a more fine-
tuned approach for several similar sub-directories, you will have
to use the DirectoryMatch tags. The main difference is that the
DirectoryMatch tags allow the use of regular expressions, allowing
you to match several sub-directories inside a single rule.

Again, for those familiar with HTML / CSS and the use of classes
and ids, the idea is very much similar.


3.2     Files tags
The Files tags are very similar to the Directory tags. The ma-
jor difference is that while the Directory tags govern the scope of
permissions (or restrictions) of the enclosed directives by directory
name, the Files tags do the same on the file name level. In other
words, the Files tags can be used to configure the behavior of a
single file - or a set of files that match a regular expression.

Here’s an example, showing the restrictions applied to .htaccess
and .htpasswd files, the files usually used in restricting access to
certain directories (and/or files) by requiring users to authenticate
before viewing the content:




                                 48
www.dedoimedo.com                                   all rights reserved




We will review this particular example later in this Part.

In the above example, we’ve seen the use of regular expressions
to allow multiple files to be covered by a single rule. However, a
comparable directive, more suitable for handling multiple files and
complex regular expressions is the FilesMatch directive.


3.3    Location tags
Again, the Location tags are quite similar to the two mentioned
above. The major difference is that the Location tags are used to
limit the scope of enclosed directives by URLs.




                                49
www.dedoimedo.com                                   all rights reserved


In other words, the Directory and Files tags should be used to con-
trol content that resides on the system (like various files and im-
ages, within their sub-directories), while the Location tags should
be used to control content that is located outside the system, like
databases, for instance.

Below, we can see a commented example included in the httpd.conf
file. If enabled, this block would allow you to access your server
statistics, but only if you connected from the server itself.




                                50
www.dedoimedo.com                                   all rights reserved


Here’s an example (please disregard the actual URL):




Again, for complex regular expressions, you should use the Loca-
tionMatch directive.


3.4    Directory, Files and Location
The Directory, Files and Location tags all perform a similar func-
tion: they categorize what restrictions are placed on content en-
closed by each one. At first glance, there seems to be very little
difference between them. However, just like the order of allow and
deny directives is critical, so is the correct use of these tags.

The configuration sections must be placed in a very particular order
to make sure they behave as intended. The order of precedence of

                                51
www.dedoimedo.com                                   all rights reserved


their execution by the server means that a misplaced section could
compromise the security of the server - or not get executed at all.

For more details, please refer to the following Apache documenta-
tion page: Configuration Sections - Apache HTTP Server.


3.5    Redirect
The Redirect setting allows you to map an old webpage to a new
URL. This could be the case if you changed domain, for example,
or moved around a lot of files, renaming and deleting them. To
demonstrate the directive, we’ll map our server to point to my
own site.




                                52
www.dedoimedo.com                        all rights reserved


Save the file, restart the server.




                                    53
www.dedoimedo.com                                  all rights reserved


3.6    Virtual Hosts
Virtual Hosts is an important, powerful feature that allows you to
run several websites from a single computer. Virtual Hosts can
be IP-based or named-based, offering a high level of customization
(and flexibility).




Virtual Hosts can use almost any option normally used in the
httpd.conf file. To make you better understand this, you can treat
Virtual Hosts as individual customized httpd.conf files nested in-
side the main httpd.conf file.




                                54
www.dedoimedo.com                                         all rights reserved


Let’s review a sample Virtual Host:

  <VirtualHost *:80>
    DocumentRoot /var/www/html/ninja-father
    ServerName www.ninja-father.com
    # other directives
  </VirtualHost>

What do we have here?

  <VirtualHost *:80>

This declares the name or the IP address of the site (server) that
should be served using the directives inside the VirtualHost block
on port 80. If no port number is used, the default one specified
under the Listen option is used. The default port is 80 (standard
convention). Asterisk (*) can be replaced with any name (for exam-
ple, www.ninja.com) or IP address (for example, 192.168.1.128),
depending on your needs and requirements. Let see several simple
examples:

  • <VirtualHost 192.168.1.128:80> will apply the directives listed in the
    block below to all incoming connections aimed at 192.168.1.128 on port
    80.

  • <VirtualHost 192.168.1.128> will apply the directives listed in the
    block below to all incoming connections aimed at 192.168.1.128 on the
    default port (as specified in the Listen directive). If this port is 80,
    then this option is identical to the one above.

  • <VirtualHost planck.matter.com> will apply the directives listed in the
    block below to all incoming connections aimed at planck.matter.com on

                                   55
www.dedoimedo.com                                         all rights reserved


     the default port (which can be 80, 8080 or any other).

   • <VirtualHost ninja.com:8777> will apply the directives listed in the
     block below to all incoming connections aimed at our site ninja.com on
     port 8777. This port must be specified under the Listen directive.




   DocumentRoot /var/www/html/ninja-father

This declares the directory where you should place all files that you
wish served when the VirtualHost is invoked (matching names or
IPs and the port).

   ServerName www.ninja-father.com

This is the name of the server. In other words, this is the address
people will type in the web browser address name in order to get
to your site. In order to successfully resolve this name to the IP
address of the Web Server, we will need to use /etc/hosts file like
before or setup a DNS Server (later).

   # other directives

This is just a comment specifying many other options can be used,
including those we have not yet reviewed here.

OK, now that we know what we’re dealing with, let’s create and
test several scenarios.




                                    56
www.dedoimedo.com                                        all rights reserved


3.6.1   Single IP, two websites
This is one of the most common setups. We will create two websites
- www.ninja-father.com and www.ninja-son.com. Both will reside
on our server, which has the IP address 192.168.1.128. In order to
make them both accessible to the world, we will create two Virtu-
alHost blocks and declare their DocumentRoot and ServerName
separately.

Here’s what we need to do:

  • Create directories inside /var/www/html called ninja-father and ninja-
    son.

  • Create simple index.html files for each.

  • Edit httpd.conf and create our two VirtualHost blocks.




                                   57
www.dedoimedo.com                                  all rights reserved


Here’s what the httpd.conf looks like:




Now, for the sake of convenience, we will also use the /etc/hosts
file to allow name resolution to work. It is also imperative in our
case, because using the IP address would always point to the first
VirtualHost listed in the httpd.conf file.




                                58
www.dedoimedo.com                                          all rights reserved




 Please note that specifying an IP address in two different lines is wrong.
   The hosts file will always use only the first entry. You should list all
                  names for a specific IP in a single line.




                                    59
www.dedoimedo.com                                    all rights reserved


For example, this is incorrect (although it would work in our case):




Don’t mind the commented lines, they are used for other configu-
rations: the first, our standard website; the second, for yet another
VirtualHost scenario, which we will discuss soon.

Now, we shall save the files (both httpd.conf and /etc/hosts) and
restart httpd. Then, using Firefox, we will try to access each one.




                                60
www.dedoimedo.com             all rights reserved


  www.ninja-father.com




                         61
www.dedoimedo.com                                    all rights reserved


   www.ninja-son.com




It works like magic. Best of all, the user has no idea that these two
sites reside on the same machine.




                                 62
www.dedoimedo.com                                    all rights reserved


3.6.2   Two IPs, two websites
This is another common scenario. You can assign a different IP
to each website, avoid possible resolution mixups and simplifying
your setup. However, this requires that you either use more than
a single network adapter or create virtual adapters. If you have,
let’s say 14 websites, having 14 physical network devices plugged
into your machines is not the best idea. Using virtual adapters is
the most sensible choice here.

We already have our two websites ready. We just need to create a
virtual network card and then change the httpd.conf file to reflect
the changes.

First, we will create a virtual adapter (eth0:1) with the IP address
of 192.168.1.200.




                                63
www.dedoimedo.com        all rights reserved




                    64
www.dedoimedo.com                      all rights reserved


Then, we’ll edit the httpd.conf file:




                                65
www.dedoimedo.com                                  all rights reserved


Lastly, we’ll edit the /etc/hosts file:




After restarting the server, we’ll be able to get to our two sites
easily. Again, the change is completely transparent to the user.




                                 66
www.dedoimedo.com             all rights reserved


  www.ninja-father.com




                         67
www.dedoimedo.com                                   all rights reserved


   www.ninja-son.com




Excellent.

Please note that the configuration of the virtual network adapter is
temporary. You will have to create a network script to preserve the
change between reboots. This setup has covered extensively in Part
?: Networking - sub-part 2: Basic and intermediate configurations
().




                                68
www.dedoimedo.com                                           all rights reserved


3.6.3     Other scenarios
Basically, the above two scenarios cover pretty much everything.
Once you get the hang of VirtualHost setting, creating any which
setup becomes a simple matter. Nevertheless, for the sake of clar-
ity, I will demonstrate several more typical scenarios in the exam-
ples below, including some features not mentioned yet in this Part
of the Book.

3.6.3.1   Different content for intranet and Internet

In practice, this scenario is very similar to having 2 different IPs
serving two different websites, except that you will use one website
but serve different parts of it to different customers.

Let’s assume you wish to achieve the following:

   • Allow users on the local network access to all content, but deny some
     to users on the Internet.

   • Allow users on the local network to list directory index, but deny this
     feature to the Internet users.

   • Display a different home page to local users and external customers.

   • Allow certain custom scripts to be available only to external customers.




                                     69
www.dedoimedo.com                               all rights reserved


Here’s what a sample configuration in httpd.conf file would look
like:

  AddHandler cgi-script .cgi

  NameVirtualHost 172.16.1.1:80
  <VirtualHost 172.16.1.1:80>
    DocumentRoot /www/intranet
    ServerName www.our-company.com
    <Directory /www/intranet>
        Option Indexes FollowSymLinks
    </Directory>
  </VirtualHost>

  NameVirtualHost 211.211.211.211:80
  <VirtualHost 211.211.211.211:80>
    DocumentRoot /www/web
    ServerName www.our-company.com
    <Directory /www/web>
        Options +ExecCGI FollowSymLinks
    </Directory>
  </VirtualHost>




                               70
www.dedoimedo.com                                    all rights reserved


This examples introduces a number of concepts we have not yet
seen, so let’s briefly review them:

   NameVirtualHost

This directory allows you to map named-based incoming connec-
tions to specific IP addresses. You might ask yourselves why you
need this, when we have seen perfectly good examples before, with-
out this feature. Well, the answer is: if somehow a named-based
request gets “lost” (due to DNS configuration, firewall rules or
similar), it might not match any of the VirtualHost blocks. In
that case, the default settings configured in httpd.conf will be ap-
plied to this request, which could be contrary to your needs. Using
NameVirtualHost forces all incoming connections to a certain IP
address to point to a certain VirtualHost block. This request will
also never fall back to the main configuration, allowing you a com-
plete modularity in your setup.

Thus, in our example, all requests to the internal IP address will
go the VirtualHost with this IP address declared. We can also
see that the users will be able to view directory listings and follow
symbolic links.

   +ExecCGI

We see this directive listed under Options in the second block,
which refers to the Internet customers. All incoming connections
on the external IP will go to the VirtualHost with this IP declared.
We can see the users won’t be able to demand directory listings,
but they will be able to follow symbolic links - and execute .cgi
scripts located in this directory.

                                 71
www.dedoimedo.com                                    all rights reserved


The ExecCGI directive tells the server to allow server-side script-
ing in the specified directory. The plus (+) signs signifies this
Option is used in addition to all those Options already specified
for the root directory. Similarly, the minus (-) sign can remove
some of the privileges, compared to the Options already specified
for the root directory.

However, alone, this directive is insufficient to allow scripting in
this directory.

   AddHandler cgi-script.cgi

In order to enable .cgi scripts to work outside the default script
directory, a directive must be added to the httpd.conf configuration
file. Indeed, this is the first line of our sample code - AddHandler
cgi-script .cgi - it allows scripts in non-default directories to be
executed, by using the +ExecCGI option, as we’ve done before.

The Apache Web server has many other options and features. You
are welcome to try them all, using this Part of the Book as the
foundation for expanding your knowledge. For more information,
please refer to:

   • Apache HTTP Server Version 2.o Documentation

   • RedHat Enterprise Linux 4: Reference Guide, Chapter 10: Apache
     HTTP Server

3.6.3.2   Different websites on different ports

We’ve already discussed this before. Let’s say you have a single
IP address with multiple websites served. Using the hosts file or


                                72
www.dedoimedo.com                                  all rights reserved


DNS resolution is a possibility, but this might not always work.
Configuring the Web server to listen on several ports for incoming
connections and then using NameVirtualHost feature to force the
connections to specific VirtualHost blocks will force the server to
behave as you desire.

Here’s an example:

  Listen 192.168.1.128:80
  Listen 192.168.1.128:9021

  NameVirtualHost 192.168.1.128:80
  <VirtualHost 192.168.1.128:80>
    DocumentRoot /www/white-socks
    ServerName www.white-socks.com
  </VirtualHost>

  NameVirtualHost 192.168.1.128:9021
  <VirtualHost 192.168.1.128:9021>
    DocumentRoot /www/black-socks
    ServerName www.black-socks.com
  </VirtualHost>

For more examples, please refer to: VirtualHost Examples - Apache
HTTP Server.




                                73
www.dedoimedo.com                                           all rights reserved


3.7     Modules
Modules are extensions that enhance the basic functionality of the
Web server. The modules reflect the growth of the Web and the
inclusion of dynamic content into the web pages. The static HTML
can provide only so much functionality. In fact, many of the options
we have seen and used above are provided by different modules.
For example, the Order directive is provided by the mod_access
module.


3.7.1    Module types
There are two types of modules:

   • Built-in modules, which are compiled into Apache and will load with
     the server any time it is started. Their functionality cannot be removed
     without recompiling the package. These modules are also known as
     static.

   • Loadable modules, which can be loaded on and off as required. These
     are the shared modules.


3.8     View installed modules
You can always list the modules currently used by the server.
The command below will display only the modules compiled into
Apache.

   httpd -l




                                     74
www.dedoimedo.com        all rights reserved




                    75
www.dedoimedo.com                                    all rights reserved


This command will list all modules, both static and shared:

   httpd -M




There is a wide range of modules available. We will review a num-
ber of more common ones. Please note that the list below is only
partial and just briefly introduces the range of available modules.


3.8.1   LoadModule
Shared modules are called by the Web server using the LoadModule
directive in the httpd.conf file. If you do not wish to use a certain
module, simply comment its line. However, you must remember
this will remove the functionality that the module provides.



                                76
www.dedoimedo.com                                  all rights reserved




These modules are referenced by a symbolic link in the /etc/httpd/
directory, pointing to /usr/lib/httpd/modules.




                                77
www.dedoimedo.com                                   all rights reserved




Let us go over some of the more interesting modules, just a sam-
pling.


3.8.2   mod_access
This module provides access control based on client host name, IP
address, or other characteristics of the client request.


3.8.3   mod_dir
This modules provides interface for redirects and serving directory
indexes. We have reviewed quite a bit of its functionality in the
previous sections.




                                78
www.dedoimedo.com                                   all rights reserved


3.8.4   mod_perl
This module allows dynamic content produced by Perl scripts to
be served to incoming requests without using the Perl interpreter
every time, reducing overhead and system load. This is done by
embedding a Perl interpreter into the Apache server. The module
can also emulate a CGI environment, allowing the reuse of Com-
mon Gateway Interface (CGI) scripts without any changes to the
setup.


3.8.5   mod_python
mod_python allows integration of the Python programming lan-
guage into the Apache server. It is intended to replace CGI as
a method of executing Python scripts on a web server. It offers
much faster execution and allows data to be maintained over mul-
tiple sessions.


3.8.6   mod_ssl
This module provides an interface to the OpenSSL library, allowing
the use of Secure Socket Layer (SSL) and Transport Layer Security
(TSL) secure communication protocols. This allows you to run a
Web server that will run encrypted sessions with clients, allowing
a safe exchange of potentially sensitive data. We will discuss this
module again when we setup a secure Web server (7.12).

For a detailed list of available modules and their functionality,
please refer to: Apache HTTP Server Module Index.




                                79
Chapter 4

.htaccess

.htaccess stands for hypertext access. This is the default name of
the Apache directory-level configuration file. This file can be used
to create security restrictions for particular directories. One of the
most common uses is to require user authentication in order to
serve certain web pages.

Before we setup .htaccess, there are some things you should re-
member:
   • .htaccess is not a replacement for a carefully laid out security plan. You
     should use the httpd.conf file to place restrictions on your server. Only
     then should you use .htaccess, to further restrict the already allowed
     users.

   • Do not ever use .htaccess to handle secure or privileged content, like
     user data.

   • .htaccess file is loaded every time a webpage is requested, incurring a
     performance loss.

   • Using this file grants individual users an ability to make security modi-
     fications to your site, creating possible risks if not properly configured.

                                      80
www.dedoimedo.com                                   all rights reserved


On the other hand, using .htaccess is useful if you run a multi-
user hosting plan. These users do not have root access to the main
configuration file and their only way of “shaping” traffic is by using
the .htaccess file. In general, the use of the .htaccess file should
be limited to non-root users only.

Before we can setup access-protected pages, we need to briefly
overview the layout and syntax of the .htaccess files. Let’s examine
what a typical .htaccess file looks like. Then, we will combine it
with our web content.

   AuthType Basic
   AuthName “Restricted web page”
   AuthUserFile “/etc/httpd/conf/.htpasswd
   require valid-user

   AuthType Basic

This line defines the type of authentication. Basic means there is
no encryption and the password hash is sent as clear text. This is
one of the major reasons why .htaccess cannot be considered for
protection of confidential user data.

   AuthName "Restricted web page"

When someone tries to access an .htaccess-protected page, a user-
name & password window will pop in the web browser. This win-
dow will bear a title - this is the AuthName. It can be anything
you like.

   AuthUserFile /etc/httpd/conf/.htpasswd

                                 81
www.dedoimedo.com                                           all rights reserved


This line defines the path to a file where user credentials are stored.
This file does not exist, but we will create it soon.

   require valid-user

This line indicates only successful authentication attempts will re-
sult in the loading of the page.

Now that we know what we’re about, we will:

   • Create an .htaccess file similar to the one above.

   • Create the .htpasswd file containing usernames & password necessary
     for the authentication.

   • Place .htaccess in the directory we wish users to validate before access-
     ing the content.

   • Tell httpd to allow user authentication via .htaccess files.

   • Restart the server.

   • Test the results.




                                     82
www.dedoimedo.com                                         all rights reserved


4.1      Create .htaccess file




4.2      Create .htpasswd file
First, we will access the directory where we intend to place the
file - /etc/httpd/conf. It can be any directory, but it must be
outside the DocumentRoot, so it so not viewable by your clients.
Furthermore, only the root should be able to modify this file.



      Make sure only root can modify the .htpasswd file! It should have
                          permissions set to 0644.



                                    83
www.dedoimedo.com                                 all rights reserved




Users and passwords are added to the file by running the htpasswd
command.

  htpasswd -c .htpasswd username

The name of the authentication file can be anything. You may
consider changing it to something else.




After you have finished adding the usernames (there can be one
or more), you can see the contents of the .htpasswd file. The
passwords are encrypted.


                               84
www.dedoimedo.com                                 all rights reserved




4.3    Copy .htaccess to restricted directory
We will place the .htaccess file in our DocumentRoot. To make
things interesting, we will also change the site and the homepage
somewhat. Instead of ninja.com, we will serve ourserver.com.
This is the site we will use to configure a DNS server in the next
Part ().


4.4    Configure httpd.conf to allow authentica-
       tion via .htaccess
By default, .htaccess files are given no control whatsoever. This
is accomplished by the AllowOverride directive. This directive


                               85
www.dedoimedo.com                                  all rights reserved


specifies what the .htaccess files can do - in addition and contrary
to main configuration settings. Please note that this could pose a
security risk. Badly configured .htaccess files can compromise the
security of your system.

We will allow .htaccess to authenticate users. We will replace the
original AllowOverride none to AllowOverride AuthConfig.




4.5    Restart server

  service httpd restart



                                86
www.dedoimedo.com                                     all rights reserved


4.6    Test setup
This is the webpage, seen without any restrictions.




                                87
www.dedoimedo.com                                    all rights reserved


Now, after restarting the server, we will be asked for authentication
credentials.




                                 88
www.dedoimedo.com                                   all rights reserved


If we succeed, we will reach the webpage, like before.




                                89
www.dedoimedo.com                                    all rights reserved


If we enter the wrong username & password - or none, we will be
rejected. You can customize the “reject” page, if you like.




4.7     Other configurations
While this pretty much covers the basic setup of .htaccess files,
there are several more things you should remember.


4.7.1   Inheritance & performance loss
Please remember that the .htaccess restrictions are inherited by all
sub-directories that exist in the directory you have placed the file.
This means that whenever one of your clients tries to access a page
in one of the sub-directories, the server will have to make a recur-
sive search up the directory tree until it finds the file. Furthermore,


                                 90
www.dedoimedo.com                                   all rights reserved


even if it does find the file, the server will have to check up every
directory up the tree to create a complete set of restrictions.


4.7.2   Disable web access to .htaccess
By default, Apache prevents any file beginning with letters .ht
to be visible through the web browser. This is a minor security
consideration, which allows you to keep your .htaccess files safe
from prying eyes, even though they are located in world-readable
location (DocumentRoot directories and sub-directories).

This behavior is governed by the combination of the AccessFile-
Name and Files directives. We have seen this example earlier when
we review the Files tag; now, we can see them in practical use.




                                91
www.dedoimedo.com                                    all rights reserved


You can also setup other types of files - or just specific files - from
being accessible - or accessible only to certain hosts.

Indeed, if we try to reach .htaccess through the web browser, we
will be denied access.




                                92
Chapter 5

Secure Web server

Running a secure Web server is something you should consider if
the daily use of your websites will include an exchange of confi-
dential, private information from your users. Regular Web servers
send and receive traffic in unencrypted form. Unfortunately, this
makes them vulnerable to man-in-the-middle attacks, where a po-
tential attacker could use sniffer tools to log packets en route from
clients to the server and derive sensitive information from them.
This mode of security is completely unacceptable for websites that
must deal in personal data, like bank accounts, medical or financial
records, or others.

The secure Web server eliminates this threat by offering two key
advantages:
   • It allows users to verify the identity of the server.

   • It allows users to conduct safe transactions with your server by en-
     crypting the authentication and the session.

To achieve this, the Apache Web server uses secure communication
protocols like the Secure Socket Layer (SSL) or the Transport Layer

                                      93
www.dedoimedo.com                                           all rights reserved


Security (TLS) to protect the flow of data.


5.1    Encrypted session
Before we setup a secure server, we should first understand how
encrypted communication between the server and the client is con-
ducted. Let us outline the details of a typical secure session:

  • A client tries to connect to port 443 on the secure Web server.

  • The client sends a list of available encryption methods it supports; if
    the client cannot support encryption, for instance very old browsers,
    the connection attempt will be unsuccessful. Modern browsers support
    both SSL and TLS without any problems.

  • The server will choose the strongest available encryption method that
    both sides can support.

  • The server will then send back to the client its certificate and the pub-
    lic encryption key. The certificate is a sort of an ID, telling the client
    important information about the server. To make this information
    credible, the certificate must be signed by a reputable Certificate Au-
    thority (CA), like EquiFax, Thawte or others. The public key will be
    used by the client to generate its own encryption hash should it choose
    to accept the server’s certificate.

  • The client receives the certificate. In most browsers, the certificate is
    first compared to an existing list of authorities. If the digital signature
    matches, the certificate will be accepted. If no match is found for the
    certificate, the browser might use the Online Certificate Status Protocol
    (OCSP) to connect to CAs in real time in an attempt to verify the
    certificate. Generally, the use of OCSP is not enabled by default in
    most browsers, in order to speed up the authentication process. If no

                                     94
www.dedoimedo.com                                             all rights reserved


      match is found still, the client will be issued a warning by the browser,
      informing it that the certificate could not be verified. The user now
      must decide whether he/she can take the risk and accept the certificate.
      In addition to being self-signed (i.e. no CA signature), the typical
      issues arising with certificate prompts include a mismatch between the
      site you are trying to access and the one registered in the certificate,
      dubious credentials or an expired certificate.

  • Regardless of what may occur, if the client accepts the connection, it
    will send back a hash encrypted with the server’s public key. This hash
    will be used to encrypt all communication between the server and the
    client throughout the session. Only the client will be able to decrypt
    the communications - or rather, anyone who possesses the private key.
    But if the client side is fairly secure and the server’s certificate is valid,
    the communication is safe.


5.2      Requirements
We have already mentioned that the client must support some sort
of encryption to able to establish secure connections to a server.
On the server end, the server must also support the secure com-
munication protocols. The Apache Web server uses the mod_ssl
module, which provides an interface to the OpenSSL library, al-
lowing the use of SSL and TLS.

By default, most distributions today ship with the OpenSSL library
installed and the Apache server compiled against the mod_ssl
module. If your distro does not include either one or both, you
will have to obtain them before you can use a secure Web server.




                                      95
www.dedoimedo.com                                   all rights reserved


You can check if you have the OpenSSL library installed:

   rpm -q openssl

And to certify if Apache uses mod_ssl, you should look for it in
the /etc/httpd/modules directory.




5.3    Limitations
On one hand, the secure Web server offers verification of the server’s
identity and safe transactions. On the other hand, it is slower than
the regular server. Therefore, you should take into consideration
the performance loss stemming from the use of encryption. You
should not use the secure Web server for regular daily content that
does not include any exchange of personal information.

                                96
www.dedoimedo.com                                    all rights reserved


5.4     Setup
5.4.1   Main configuration file(s)
The main configuration file for the secure Apache Web server is:

   /etc/httpd/conf.d/ssl.conf



This file is very similar to httpd.conf, except that it includes a
number of special directives. But the principle remains the same.
Basically, the configuration file contains a VirtualHost block, where
all secure Web server directives should be listed. We will edit this
block to suit our needs.




                                97
www.dedoimedo.com                                  all rights reserved


5.4.2     Backup
We will first backup the file before making any changes.

   cp /etc/httpd/conf.d/ssl.conf →
      /etc/httpd/conf.d/ssl.conf-backup


5.4.3     Edit the ssl.conf configuration file - part 1
Again, we need to make a number of changes to get our server
to work. However, before we can fully edit all of the necessary
options, we will have to digitally sign our server. This includes
creating the public key and signing it with a certificate from a
known, reputable CA. However, since we do not have a certificate,
it costs money and the process takes time, for the purpose of this
exercise, we will create our own CA and use it to sign our server.

But first, let us review the most important directives that we need
to get our server started. The procedure is identical to what we
have done earlier.

5.4.3.1   LoadModule

This directive instructs the server to use the mod_ssl module.
The path is relative to the ServerRoot directive specified in the
httpd.conf configuration file. Without loading the module, our
encryption will not work.




                                98
www.dedoimedo.com                                    all rights reserved




5.4.3.2   Listen

This directive instructs the server to listen for incoming connec-
tions on port 443. This is the accepted convention for secure Web
communications (https). It is critical that this port be different
from the port used by the regular server. See the image above.

5.4.3.3   VirtualHost

Here, we define our secure Web server. Using the VirtualHost
block is the most elegant way of doing it. This allows you to create
additional blocks and serve additional secure sites to your clients,
allowing you an extra degree of flexibility and security.




                                99
www.dedoimedo.com                                     all rights reserved




Like we did before, we need to setup the DocumentRoot, the
ServerName and other directives. Let us review the most im-
portant elements:

   <VirtualHost *:443>

This tells our server to listen on all interfaces for incoming connec-
tions on port 443. You may consider narrowing down the range to
specific IP addresses. Nevertheless, it is important to remember
that you can only use IP addresses! The secure Web server does
not permit named-based connections in its VirtualHost block. This
is because the SSL handshake occurs before the HTTP request can
identify the named-based virtual host.



                                 100
www.dedoimedo.com                                        all rights reserved




  Use only IP-based VirtualHost directives in the ssl.conf configuration
                file! Name-based virtual hosts will fail.




  DocumentRoot "/var/www/html"

This directive specifies the directory where all your web pages
should be stored. It is recommended that you use a different root
for non-secure and secure pages. However, in our example, we will
use the default selection. Just remember that this is NOT the
optimal setting.

  ServerName www.ourserver.com:443

This entry defines the server name. If you do not use the hosts
file or DNS server for name resolution, you will have to specify an
IP address. We have solved this limitation earlier, so we can use
the server name here. In a production setup, where your server is
used by clients on the Internet, you will have to use DNS for name
resolution. For study and testing and in small, private networks,
the hosts file is an adequate solution.

This covers the first part of our setup. Now we must create the
certificate.


5.4.4   Create SSL certificate
Like we said before, we will create a CA, create a server key and
then sign the key with our self-created CA. In a production setup,

                                  101
www.dedoimedo.com                                   all rights reserved


this will not work. If you intend to run any semi-serious business,
you will have to use a reputable, world-acknowledged CA to sign
your certificates.

Please note that the comparison between our setup and the real
scenario can be slightly confusing. If you get lost, there’s a ta-
ble summary (5.4.7) at the end of this section, emphasizing the
important differences between the two setups.

5.4.4.1   Create Certificate Authority (CA)

The first step is to create an encryption key, which we will use to
sign our CA. Please note that you should use a meaningful name
for the key. The best way to avoid confusion is to use the letters
ca in the name of the CA key. Likewise, use the word server when
creating the server key.

I have chosen the name myca.key, so that we do not confuse this
self-generated key (and the CA) with real keys.




                               102
www.dedoimedo.com                                    all rights reserved




Let us review the command:

   openssl genrsa -des3 -out myca.key 4096

This OpenSSL command line tool will generate an RSA key, using
the Triple-DES cypher. The -out flag signifies the output name.
The number at the end of the command tells us how long the key
will be; generally, the longer the better. A 4096-bit encryption is
quite sufficient.

Please refer to openssl man page for more details.

After the key is created, you will be asked to use a password. This
means you won’t be able to use this key without providing the


                               103
www.dedoimedo.com                                   all rights reserved


password. While in theory, this is an interesting security measure,
it offers little actual benefit. We’ll discuss this soon.

Now that we have the key, we will create a CA.

   openssl req -new -x509 -days 365 →
      -key myca.key -out myca.crt




What do we have here? Well, basically, we are creating a certifi-
cate, using the key we have created earlier. Let us go over the
details:




                               104
www.dedoimedo.com                                    all rights reserved


   req -new -x509

This part of the command tells us we want to issue a new X.509
Certificate Signing Request (CSR), where X.509 is an international
standard for public key and privilege management infrastructures.
In simple words, we want to create a certificate that will identify
our CA.

   -days 365

This tells us how long the certificate will be valid. Security aspects
of this parameter are examined in greater depth in the Security
chapter (7.12).

   -key myca.key -out myca.crt

We will use the key we have created earlier to sign the certificate
for the CA.

The command will invoke a guided text-interface wizard. We will
have to provide the password for the certificate key before we can
continue. After that, we will have to fill out an interactive form,
including the basic credentials that will identify us as the CA.




                                 105
www.dedoimedo.com                                           all rights reserved




Please note that you should be careful when entering the Common
Name. You should use meaningful entries that will allow you to
easily distinguish your records, especially if you have several CAs.
Most people will never have to bother with this setting, but should
a need arise, here’s a pair of simple rules that you should adhere
to when creating CAs:

   • For each CA, use the name of the site it will certify; in our case, ours-
     erver.com (or www.ourserver.com).

   • Append the letters CA to the end of the Common Name, so you will
     know this is the CA entry.

In a real life situation, your credentials would be replaced with
those of an existing, reputable CA.

                                    106
www.dedoimedo.com                                   all rights reserved


5.4.4.2   Create server key

We now have a certificate. It’s time to create the server key. The
principle is similar to what we’ve done before. The one thing
you should remember is that the server key should be named
server.key, in order to conform with Apache conventions.




After the encryption key is created, we will be asked to provide a
password to make the use of our key impossible without knowing
it. While this method is somewhat effective, it is not considered
a serious security measure. In fact, you are advised not to use it,
since the benefits do not outweigh the shortcomings.

Since you must provide the password any time the server is restarted
or reloaded, this means the secure server will not be able to start

                                107
www.dedoimedo.com                                    all rights reserved


after unattended reboot and will require a presence of an adminis-
trator to activate. This is cumbersome and can even be impracti-
cal. On the other hand, should your system be compromised, the
password will most likely present little challenge to the attacker.
Furthermore, compromised systems cannot be trusted, whether
passwords or other security methods are used.

Nevertheless, we will demonstrate both methods, so you can learn
and use both, should a need arise. We will begin with the password-
protected key and then later, create another one, which uses no
password.

5.4.4.3   Create Certificate Signing Request (CSR)

Now, we must “ask” our CA to sign our certificate. In a real
life situation, you would receive the server.csr from an existing,
established CA. Or you might even receive the signed key, with the
information you have provided in an application form, for instance.

Again, we must provide a password before we can continue. Then
again, we must go through an interactive form, providing details for
our site. In a real life situation, a real CA would ask you for these
details, whether via email, phone, an application form etc. For
more details, please refer to Submission of CSR to CA sub-section
below (5.5.2).




                                108
www.dedoimedo.com                                  all rights reserved




Since our CA and our website are one and the same, the form
will differ little from what we have done when creating the CA.
This can be confusing. Therefore, you should remember that the
Common Name for your CA should include the letters CA (or
similar), to distinguish it from the server record.

Lastly, you can provide an additional password for the server key,
to make misuse more difficult.




                               109
www.dedoimedo.com                                   all rights reserved




5.4.4.4   Sign Certificate Signing Request (CSR) with Certificate
          Authority (CA)

What remains to be done is to sign the CSR with the CA we
have created. Once we do that, our certificate will be valid for the
coming year. After that, we will have to renew it.




                               110
www.dedoimedo.com                                  all rights reserved




You should be familiar with the syntax by now:

  -CA myca.crt

This option instructs openssl to use our CA certificate.

  -CAkey myca.key

This option instructs openssl to sign the certificate with the CA
key.

  -set_serial 01




                               111
www.dedoimedo.com                                  all rights reserved


The set_serial option is used to create a serial number when
outputting a self-signed certificate. This allows you to track the
changes done to the certificate.

This covers the creation and signing of the SSL certificates.

5.4.4.5   Verify certificates

Let’s examine the certificates we have just created. This can help
you see if there are any problems with your files.

   openssl rsa -noout -text -in myca.key




                               112
www.dedoimedo.com                          all rights reserved


  openssl x509 -noout -text -in myca.crt




                             113
www.dedoimedo.com                           all rights reserved


  openssl rsa -noout -text -in server.key




                             114
www.dedoimedo.com                                      all rights reserved


   openssl x509 -noout -text -in server.crt




Everything looks good. Now, we can finish editing the ssl.conf file.


5.4.5     Edit ssl.conf configuration file - part 2
We now need to specify the location of our certificates and the
keys in the ssl.conf file so the server can find and use them. We
will comment out the sample entries in the file and use our own.
Necessarily, we will have to copy the relevant files to their right
location.

5.4.5.1   Server Certificate

This directive specifies the location of the server certificate (server.crt).
On CentOS 5, the default location is /etc/pki/tls/certs. We will

                                 115
www.dedoimedo.com                                    all rights reserved


use the same directory. Your choice may vary. The important
thing to remember is to make the files unavailable to anyone but
root.




5.4.5.2   Server Private Key

This directive points to the location of the server key (server.key).
Again, your choice should reflect your needs. See image above.

5.4.5.3   Certificate Authority

This directive specifies the location of the CA certificate.




                                 116
www.dedoimedo.com                                    all rights reserved




Now, let us copy the files to their relevant locations:

   cp server.key /etc/pki/tls/private/server.key
   cp server.crt /etc/pki/tls/certs/server.crt
   cp myca.crt /etc/pki/tls/certs/myca.crt

We are ready. Let’s test our setup.


5.4.6   Test setup
After saving the ssl.conf file, we need to restart our server.

   service httpd restart




                                117
www.dedoimedo.com                                  all rights reserved




As you can see, we must provide a password before we can continue.
Now,    we will try to access our server by typing
https://www.ourserver.com in the address line of a web browser.
You will most likely receive a warning message.




                               118
www.dedoimedo.com                                    all rights reserved




Let us examine the certificate before we accept it.




                               119
www.dedoimedo.com                                  all rights reserved




Indeed, everything looks fine. On the Web, though, very few peo-
ple would be convinced by this certificate. But in our setup, it
serves well. After accepting the certificate (either permanently or
temporarily for this session only), you will hit yet another warn-
ing.




                               120
www.dedoimedo.com                                   all rights reserved




This time, there’s a mismatch between the domain name
(www.ourserver.com) and the certificate (ourserver.com). This
should not be an issue if you are using the DNS server, but we will
discuss this separately in the next Part. For now, we will accept
the certificate.

After that, we should reach our site safely. Our setup works.




                               121
www.dedoimedo.com                                      all rights reserved




5.4.7     Mini-summary
Setting up the secure Web server might seem a little confusing.
Therefore, here’s a mini summary that should clarify the setup
process.

5.4.7.1    Names

This is a short list of file names used in this section:


        File name    Description
        myca.key     CA key
        myca.crt     CA certificate
        server.key   server key
        server.csr   server CSR
        server.crt   server certificate, signed by CA

                                  122
www.dedoimedo.com                                      all rights reserved


5.4.7.2   Commands

Below, you can find a summarized list of commands you will need
to run to create your certificate. Please note that the names I
have used are generic and might not suit your needs. However, it
is important that you use the name server.key for the server key
file, to conform with Apache standards.


      Command                                      Description
      openssl genrsa -des3 -out myca.key 4096      Create CA
                                                   key
      openssl req -new -x509 -days 365 -key        Create CA
      myca.key -out myca.crt                       certificate
      openssl genrsa -des3 -out server.key 4096    Create server
                                                   key
      openssl req -new -key server.key -out        Create CSR
      server.csr
      openssl x509 -req -days 365 -in server.csr   Sign CSR
      -CA myca.crt -CAkey myca.key -set_serial
      01 -out server.crt




                                   123
www.dedoimedo.com                                   all rights reserved


5.4.7.3   Difference between self-signed and CA-signed certificates

This will help you better understand the differences between our
exercise and a real, production setup.


     Step            Self-signed CA      Real CA
     Create CA       Yes                 No need
     key
     Create CA       Yes                 No need
     Create CSR      Yes                 As instructed by CA
     Create server   Yes                 Maybe:
     key                                 1. CA creates key,
                                         signs it and sends to
                                         customer
                                         2. CA creates CSR
                                         only and sends to
                                         customer, who then
                                         creates server key and
                                         signs with CA
     Sign server     Yes                 Maybe:
     key                                 1. CA sends signed
                                         key to customer
                                         2. CA sends CSR;
                                         customer signs the
                                         key by himself/herself




                                124
www.dedoimedo.com                                          all rights reserved


5.4.7.4   Verification

You will have to run these commands to check your certificates and
keys:

   openssl   rsa -noout -text -in server.key
   openssl   x509 -noout -text -in server.crt
   openssl   rsa -noout -text -in myca.key
   openssl   x509 -noout -text -in myca.crt

5.4.7.5   File names and locations

These are the locations of relevant files:


      Full path and name                 Description
      /etc/httpd/conf.d/ssl.conf         Main configuration file
      /etc/httpd/modules                 Location of all modules
      /etc/httpd/modules/mod_ssl.so Location of mod_ssl
                                    module
      /etc/pki/tls/certs                 Location of server and CA
                                         certificates
      /etc/pki/tls/private               Location of server keys




                                   125
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide
Apache Web server Complete Guide

Más contenido relacionado

La actualidad más candente

Plesk For Windows 7.6
Plesk For Windows 7.6Plesk For Windows 7.6
Plesk For Windows 7.6webhostingguy
 
Red hat enterprise_linux-7-beta-installation_guide-en-us
Red hat enterprise_linux-7-beta-installation_guide-en-usRed hat enterprise_linux-7-beta-installation_guide-en-us
Red hat enterprise_linux-7-beta-installation_guide-en-usmuhammad adeel
 
RHEL-7 Administrator Guide for RedHat 7
RHEL-7  Administrator Guide for RedHat 7RHEL-7  Administrator Guide for RedHat 7
RHEL-7 Administrator Guide for RedHat 7Hemnath R.
 
Linux 101-hacks
Linux 101-hacksLinux 101-hacks
Linux 101-hacksshekarkcb
 
System administration guide
System administration guideSystem administration guide
System administration guidemeoconhs2612
 
Ad Ch.1 8 (1)
Ad Ch.1 8 (1)Ad Ch.1 8 (1)
Ad Ch.1 8 (1)gopi1985
 
Verio Web Hosting Virtual Server Handbook
Verio Web Hosting Virtual Server HandbookVerio Web Hosting Virtual Server Handbook
Verio Web Hosting Virtual Server Handbookwebhostingguy
 
ID3 Algorithm - Reference Manual
ID3 Algorithm - Reference ManualID3 Algorithm - Reference Manual
ID3 Algorithm - Reference ManualMichel Alves
 
Windows 7 - Pocket Guide (english)
Windows 7 - Pocket Guide (english)Windows 7 - Pocket Guide (english)
Windows 7 - Pocket Guide (english)Marcos Gassen
 

La actualidad más candente (18)

Book hudson
Book hudsonBook hudson
Book hudson
 
Odoo development
Odoo developmentOdoo development
Odoo development
 
Flask docs
Flask docsFlask docs
Flask docs
 
Plesk For Windows 7.6
Plesk For Windows 7.6Plesk For Windows 7.6
Plesk For Windows 7.6
 
Red hat enterprise_linux-7-beta-installation_guide-en-us
Red hat enterprise_linux-7-beta-installation_guide-en-usRed hat enterprise_linux-7-beta-installation_guide-en-us
Red hat enterprise_linux-7-beta-installation_guide-en-us
 
Cluster administration rh
Cluster administration rhCluster administration rh
Cluster administration rh
 
RHEL-7 Administrator Guide for RedHat 7
RHEL-7  Administrator Guide for RedHat 7RHEL-7  Administrator Guide for RedHat 7
RHEL-7 Administrator Guide for RedHat 7
 
Bugzilla guide
Bugzilla guideBugzilla guide
Bugzilla guide
 
Linux 101-hacks
Linux 101-hacksLinux 101-hacks
Linux 101-hacks
 
Apis php-en sql .
Apis php-en sql .Apis php-en sql .
Apis php-en sql .
 
IPv6 Deployment Guide
IPv6 Deployment GuideIPv6 Deployment Guide
IPv6 Deployment Guide
 
R Admin
R AdminR Admin
R Admin
 
System administration guide
System administration guideSystem administration guide
System administration guide
 
Mongo db manual
Mongo db manualMongo db manual
Mongo db manual
 
Ad Ch.1 8 (1)
Ad Ch.1 8 (1)Ad Ch.1 8 (1)
Ad Ch.1 8 (1)
 
Verio Web Hosting Virtual Server Handbook
Verio Web Hosting Virtual Server HandbookVerio Web Hosting Virtual Server Handbook
Verio Web Hosting Virtual Server Handbook
 
ID3 Algorithm - Reference Manual
ID3 Algorithm - Reference ManualID3 Algorithm - Reference Manual
ID3 Algorithm - Reference Manual
 
Windows 7 - Pocket Guide (english)
Windows 7 - Pocket Guide (english)Windows 7 - Pocket Guide (english)
Windows 7 - Pocket Guide (english)
 

Destacado

Liberty Buildpack: Designed for Extension - Integrating your services in Blue...
Liberty Buildpack: Designed for Extension - Integrating your services in Blue...Liberty Buildpack: Designed for Extension - Integrating your services in Blue...
Liberty Buildpack: Designed for Extension - Integrating your services in Blue...Rohit Kelapure
 
JBoss at Work: Using JBoss AS 6
JBoss at Work: Using JBoss AS 6JBoss at Work: Using JBoss AS 6
JBoss at Work: Using JBoss AS 6Saltmarch Media
 
A Deep Dive into the Liberty Buildpack on IBM BlueMix
A Deep Dive into the Liberty Buildpack on IBM BlueMix A Deep Dive into the Liberty Buildpack on IBM BlueMix
A Deep Dive into the Liberty Buildpack on IBM BlueMix Rohit Kelapure
 
JBoss EAP / WildFly, State of the Union
JBoss EAP / WildFly, State of the UnionJBoss EAP / WildFly, State of the Union
JBoss EAP / WildFly, State of the UnionDimitris Andreadis
 
EAP6 performance Tuning
EAP6 performance TuningEAP6 performance Tuning
EAP6 performance TuningPraveen Adupa
 
Go Within Cloud Foundry
Go Within Cloud FoundryGo Within Cloud Foundry
Go Within Cloud FoundryPlatform CF
 
JBoss Application Server 7
JBoss Application Server 7JBoss Application Server 7
JBoss Application Server 7Ray Ploski
 
Websphere Application Server V8.5
Websphere Application Server V8.5Websphere Application Server V8.5
Websphere Application Server V8.5IBM WebSphereIndia
 
Migrate Heroku & OpenShift Applications to IBM BlueMix
Migrate Heroku & OpenShift Applications to IBM BlueMixMigrate Heroku & OpenShift Applications to IBM BlueMix
Migrate Heroku & OpenShift Applications to IBM BlueMixRohit Kelapure
 
SSL & TLS Architecture short
SSL & TLS Architecture shortSSL & TLS Architecture short
SSL & TLS Architecture shortAvirot Mitamura
 

Destacado (15)

Performance_Up.ppt
Performance_Up.pptPerformance_Up.ppt
Performance_Up.ppt
 
Liberty Buildpack: Designed for Extension - Integrating your services in Blue...
Liberty Buildpack: Designed for Extension - Integrating your services in Blue...Liberty Buildpack: Designed for Extension - Integrating your services in Blue...
Liberty Buildpack: Designed for Extension - Integrating your services in Blue...
 
JBoss at Work: Using JBoss AS 6
JBoss at Work: Using JBoss AS 6JBoss at Work: Using JBoss AS 6
JBoss at Work: Using JBoss AS 6
 
A Deep Dive into the Liberty Buildpack on IBM BlueMix
A Deep Dive into the Liberty Buildpack on IBM BlueMix A Deep Dive into the Liberty Buildpack on IBM BlueMix
A Deep Dive into the Liberty Buildpack on IBM BlueMix
 
JBoss EAP / WildFly, State of the Union
JBoss EAP / WildFly, State of the UnionJBoss EAP / WildFly, State of the Union
JBoss EAP / WildFly, State of the Union
 
EAP6 performance Tuning
EAP6 performance TuningEAP6 performance Tuning
EAP6 performance Tuning
 
Go Within Cloud Foundry
Go Within Cloud FoundryGo Within Cloud Foundry
Go Within Cloud Foundry
 
JBoss AS / EAP and Java EE6
JBoss AS / EAP and Java EE6JBoss AS / EAP and Java EE6
JBoss AS / EAP and Java EE6
 
JBoss AS 7
JBoss AS 7JBoss AS 7
JBoss AS 7
 
SSL TLS Protocol
SSL TLS ProtocolSSL TLS Protocol
SSL TLS Protocol
 
Jboss Tutorial Basics
Jboss Tutorial BasicsJboss Tutorial Basics
Jboss Tutorial Basics
 
JBoss Application Server 7
JBoss Application Server 7JBoss Application Server 7
JBoss Application Server 7
 
Websphere Application Server V8.5
Websphere Application Server V8.5Websphere Application Server V8.5
Websphere Application Server V8.5
 
Migrate Heroku & OpenShift Applications to IBM BlueMix
Migrate Heroku & OpenShift Applications to IBM BlueMixMigrate Heroku & OpenShift Applications to IBM BlueMix
Migrate Heroku & OpenShift Applications to IBM BlueMix
 
SSL & TLS Architecture short
SSL & TLS Architecture shortSSL & TLS Architecture short
SSL & TLS Architecture short
 

Similar a Apache Web server Complete Guide

Ibm tivoli intelligent think dynamic orchestrator pre proof of-concept cookbo...
Ibm tivoli intelligent think dynamic orchestrator pre proof of-concept cookbo...Ibm tivoli intelligent think dynamic orchestrator pre proof of-concept cookbo...
Ibm tivoli intelligent think dynamic orchestrator pre proof of-concept cookbo...Banking at Ho Chi Minh city
 
java web_programming
java web_programmingjava web_programming
java web_programmingbachector
 
digital marketing training in bangalore
digital marketing training in bangaloredigital marketing training in bangalore
digital marketing training in bangaloreVenus Tech Inc.
 
Own cloud manual
Own cloud manualOwn cloud manual
Own cloud manualIvan202217
 
RDB Synchronization, Transcoding and LDAP Directory Services ...
RDB Synchronization, Transcoding and LDAP Directory Services ...RDB Synchronization, Transcoding and LDAP Directory Services ...
RDB Synchronization, Transcoding and LDAP Directory Services ...Videoguy
 
BOOK - IBM zOS V1R10 communications server TCP / IP implementation volume 1 b...
BOOK - IBM zOS V1R10 communications server TCP / IP implementation volume 1 b...BOOK - IBM zOS V1R10 communications server TCP / IP implementation volume 1 b...
BOOK - IBM zOS V1R10 communications server TCP / IP implementation volume 1 b...Satya Harish
 
Ibm tivoli web access for information management sg246823
Ibm tivoli web access for information management sg246823Ibm tivoli web access for information management sg246823
Ibm tivoli web access for information management sg246823Banking at Ho Chi Minh city
 
Windows 7 dicas e truques - 378 páginas
Windows 7   dicas e truques - 378 páginasWindows 7   dicas e truques - 378 páginas
Windows 7 dicas e truques - 378 páginasUelisson Costa
 
Kali Linux Revealed - Mastering the Penetration Testing (Raphaël Hertzog, Jim...
Kali Linux Revealed - Mastering the Penetration Testing (Raphaël Hertzog, Jim...Kali Linux Revealed - Mastering the Penetration Testing (Raphaël Hertzog, Jim...
Kali Linux Revealed - Mastering the Penetration Testing (Raphaël Hertzog, Jim...SomiMukerjee
 
BOOK - IBM tivoli netcool service quality manager data mediation gateway deve...
BOOK - IBM tivoli netcool service quality manager data mediation gateway deve...BOOK - IBM tivoli netcool service quality manager data mediation gateway deve...
BOOK - IBM tivoli netcool service quality manager data mediation gateway deve...Satya Harish
 
Postgresql database administration volume 1
Postgresql database administration volume 1Postgresql database administration volume 1
Postgresql database administration volume 1Federico Campoli
 
Dreamweaver cs5 help
Dreamweaver cs5 helpDreamweaver cs5 help
Dreamweaver cs5 helpPhp RedStorm
 
Dreamweaver cs5 help
Dreamweaver cs5 helpDreamweaver cs5 help
Dreamweaver cs5 helpok71
 
Deployment guide series ibm total storage productivity center for data sg247140
Deployment guide series ibm total storage productivity center for data sg247140Deployment guide series ibm total storage productivity center for data sg247140
Deployment guide series ibm total storage productivity center for data sg247140Banking at Ho Chi Minh city
 
RAC Attack 12c Installation Instruction
RAC Attack 12c Installation InstructionRAC Attack 12c Installation Instruction
RAC Attack 12c Installation InstructionYury Velikanov
 

Similar a Apache Web server Complete Guide (20)

Ibm tivoli intelligent think dynamic orchestrator pre proof of-concept cookbo...
Ibm tivoli intelligent think dynamic orchestrator pre proof of-concept cookbo...Ibm tivoli intelligent think dynamic orchestrator pre proof of-concept cookbo...
Ibm tivoli intelligent think dynamic orchestrator pre proof of-concept cookbo...
 
Java web programming
Java web programmingJava web programming
Java web programming
 
java web_programming
java web_programmingjava web_programming
java web_programming
 
digital marketing training in bangalore
digital marketing training in bangaloredigital marketing training in bangalore
digital marketing training in bangalore
 
Own cloud manual
Own cloud manualOwn cloud manual
Own cloud manual
 
Webapp2 2.2
Webapp2 2.2Webapp2 2.2
Webapp2 2.2
 
RDB Synchronization, Transcoding and LDAP Directory Services ...
RDB Synchronization, Transcoding and LDAP Directory Services ...RDB Synchronization, Transcoding and LDAP Directory Services ...
RDB Synchronization, Transcoding and LDAP Directory Services ...
 
BOOK - IBM zOS V1R10 communications server TCP / IP implementation volume 1 b...
BOOK - IBM zOS V1R10 communications server TCP / IP implementation volume 1 b...BOOK - IBM zOS V1R10 communications server TCP / IP implementation volume 1 b...
BOOK - IBM zOS V1R10 communications server TCP / IP implementation volume 1 b...
 
Userguide
UserguideUserguide
Userguide
 
Userguide
UserguideUserguide
Userguide
 
Ibm tivoli web access for information management sg246823
Ibm tivoli web access for information management sg246823Ibm tivoli web access for information management sg246823
Ibm tivoli web access for information management sg246823
 
Windows 7 dicas e truques - 378 páginas
Windows 7   dicas e truques - 378 páginasWindows 7   dicas e truques - 378 páginas
Windows 7 dicas e truques - 378 páginas
 
Kali Linux Revealed - Mastering the Penetration Testing (Raphaël Hertzog, Jim...
Kali Linux Revealed - Mastering the Penetration Testing (Raphaël Hertzog, Jim...Kali Linux Revealed - Mastering the Penetration Testing (Raphaël Hertzog, Jim...
Kali Linux Revealed - Mastering the Penetration Testing (Raphaël Hertzog, Jim...
 
Red paper
Red paperRed paper
Red paper
 
BOOK - IBM tivoli netcool service quality manager data mediation gateway deve...
BOOK - IBM tivoli netcool service quality manager data mediation gateway deve...BOOK - IBM tivoli netcool service quality manager data mediation gateway deve...
BOOK - IBM tivoli netcool service quality manager data mediation gateway deve...
 
Postgresql database administration volume 1
Postgresql database administration volume 1Postgresql database administration volume 1
Postgresql database administration volume 1
 
Dreamweaver cs5 help
Dreamweaver cs5 helpDreamweaver cs5 help
Dreamweaver cs5 help
 
Dreamweaver cs5 help
Dreamweaver cs5 helpDreamweaver cs5 help
Dreamweaver cs5 help
 
Deployment guide series ibm total storage productivity center for data sg247140
Deployment guide series ibm total storage productivity center for data sg247140Deployment guide series ibm total storage productivity center for data sg247140
Deployment guide series ibm total storage productivity center for data sg247140
 
RAC Attack 12c Installation Instruction
RAC Attack 12c Installation InstructionRAC Attack 12c Installation Instruction
RAC Attack 12c Installation Instruction
 

Más de webhostingguy

Running and Developing Tests with the Apache::Test Framework
Running and Developing Tests with the Apache::Test FrameworkRunning and Developing Tests with the Apache::Test Framework
Running and Developing Tests with the Apache::Test Frameworkwebhostingguy
 
MySQL and memcached Guide
MySQL and memcached GuideMySQL and memcached Guide
MySQL and memcached Guidewebhostingguy
 
Novell® iChain® 2.3
Novell® iChain® 2.3Novell® iChain® 2.3
Novell® iChain® 2.3webhostingguy
 
Load-balancing web servers Load-balancing web servers
Load-balancing web servers Load-balancing web serversLoad-balancing web servers Load-balancing web servers
Load-balancing web servers Load-balancing web serverswebhostingguy
 
SQL Server 2008 Consolidation
SQL Server 2008 ConsolidationSQL Server 2008 Consolidation
SQL Server 2008 Consolidationwebhostingguy
 
Master Service Agreement
Master Service AgreementMaster Service Agreement
Master Service Agreementwebhostingguy
 
PHP and MySQL PHP Written as a set of CGI binaries in C in ...
PHP and MySQL PHP Written as a set of CGI binaries in C in ...PHP and MySQL PHP Written as a set of CGI binaries in C in ...
PHP and MySQL PHP Written as a set of CGI binaries in C in ...webhostingguy
 
Dell Reference Architecture Guide Deploying Microsoft® SQL ...
Dell Reference Architecture Guide Deploying Microsoft® SQL ...Dell Reference Architecture Guide Deploying Microsoft® SQL ...
Dell Reference Architecture Guide Deploying Microsoft® SQL ...webhostingguy
 
Managing Diverse IT Infrastructure
Managing Diverse IT InfrastructureManaging Diverse IT Infrastructure
Managing Diverse IT Infrastructurewebhostingguy
 
Web design for business.ppt
Web design for business.pptWeb design for business.ppt
Web design for business.pptwebhostingguy
 
IT Power Management Strategy
IT Power Management Strategy IT Power Management Strategy
IT Power Management Strategy webhostingguy
 
Excel and SQL Quick Tricks for Merchandisers
Excel and SQL Quick Tricks for MerchandisersExcel and SQL Quick Tricks for Merchandisers
Excel and SQL Quick Tricks for Merchandiserswebhostingguy
 
Parallels Hosting Products
Parallels Hosting ProductsParallels Hosting Products
Parallels Hosting Productswebhostingguy
 
Microsoft PowerPoint presentation 2.175 Mb
Microsoft PowerPoint presentation 2.175 MbMicrosoft PowerPoint presentation 2.175 Mb
Microsoft PowerPoint presentation 2.175 Mbwebhostingguy
 

Más de webhostingguy (20)

File Upload
File UploadFile Upload
File Upload
 
Running and Developing Tests with the Apache::Test Framework
Running and Developing Tests with the Apache::Test FrameworkRunning and Developing Tests with the Apache::Test Framework
Running and Developing Tests with the Apache::Test Framework
 
MySQL and memcached Guide
MySQL and memcached GuideMySQL and memcached Guide
MySQL and memcached Guide
 
Novell® iChain® 2.3
Novell® iChain® 2.3Novell® iChain® 2.3
Novell® iChain® 2.3
 
Load-balancing web servers Load-balancing web servers
Load-balancing web servers Load-balancing web serversLoad-balancing web servers Load-balancing web servers
Load-balancing web servers Load-balancing web servers
 
SQL Server 2008 Consolidation
SQL Server 2008 ConsolidationSQL Server 2008 Consolidation
SQL Server 2008 Consolidation
 
What is mod_perl?
What is mod_perl?What is mod_perl?
What is mod_perl?
 
What is mod_perl?
What is mod_perl?What is mod_perl?
What is mod_perl?
 
Master Service Agreement
Master Service AgreementMaster Service Agreement
Master Service Agreement
 
Notes8
Notes8Notes8
Notes8
 
PHP and MySQL PHP Written as a set of CGI binaries in C in ...
PHP and MySQL PHP Written as a set of CGI binaries in C in ...PHP and MySQL PHP Written as a set of CGI binaries in C in ...
PHP and MySQL PHP Written as a set of CGI binaries in C in ...
 
Dell Reference Architecture Guide Deploying Microsoft® SQL ...
Dell Reference Architecture Guide Deploying Microsoft® SQL ...Dell Reference Architecture Guide Deploying Microsoft® SQL ...
Dell Reference Architecture Guide Deploying Microsoft® SQL ...
 
Managing Diverse IT Infrastructure
Managing Diverse IT InfrastructureManaging Diverse IT Infrastructure
Managing Diverse IT Infrastructure
 
Web design for business.ppt
Web design for business.pptWeb design for business.ppt
Web design for business.ppt
 
IT Power Management Strategy
IT Power Management Strategy IT Power Management Strategy
IT Power Management Strategy
 
Excel and SQL Quick Tricks for Merchandisers
Excel and SQL Quick Tricks for MerchandisersExcel and SQL Quick Tricks for Merchandisers
Excel and SQL Quick Tricks for Merchandisers
 
OLUG_xen.ppt
OLUG_xen.pptOLUG_xen.ppt
OLUG_xen.ppt
 
Parallels Hosting Products
Parallels Hosting ProductsParallels Hosting Products
Parallels Hosting Products
 
Microsoft PowerPoint presentation 2.175 Mb
Microsoft PowerPoint presentation 2.175 MbMicrosoft PowerPoint presentation 2.175 Mb
Microsoft PowerPoint presentation 2.175 Mb
 
Reseller's Guide
Reseller's GuideReseller's Guide
Reseller's Guide
 

Apache Web server Complete Guide

  • 1. Apache Web server Complete Guide Dedoimedo
  • 2. Foreword Since I cannot be sure you have read my introductory article on my website (http://www.dedoimedo.com/), here’s an abstract of what you should expect from this document. The Web server - Apache - Complete Guide is one of the many topics covered in the series of books that I’m writing on Linux, the goal of which is to help any enthusiastic Windows user or a Linux newbie become a powerful, confident Linux professional. As a preview of what you should expect when these books become published, I have decided to post a single Part on my website. I am truly convinced that you will thoroughly enjoy this docu- ment, for it has been written with care and attention to tiniest details. Every procedure is explained step by step, accompanied by numerous examples and screenshots. I hope this will be the best guide on the Apache Web server you will have ever read. The only thing that you will miss is the fact that links to other Parts, covering other material, are not available in this stand- alone release. However, every procedure required to setup the Web 1
  • 3. www.dedoimedo.com all rights reserved server is fully self-contained. You will be able to fully configure the Apache server by just using this document as your guide. Lastly, let’s get one thing straight: you will not become Apache gu- rus by reading this document. For that matter, I’m not an Apache guru, either. There are so many aspects to the usability and secu- rity of the Apache Web server, it is practically impossible to put them all in a single book. However, by reading this document, you WILL learn how to use the Apache Web server on the basic and intermediate level. And there’s no guide that will explain things as simply and as beautifully as mine, I guarantee that. From here on, the sky’s your limit. 2
  • 4. About Dedoimedo is a website specializing in step-by-step tutorials in- tended for human beings. Everything posted on my website is written in plain, down-to-Earth English, with plenty of screenshot examples and no steps ever skipped. You won’t easily find tutorials simpler or friendlier than mine. Myself, I’m a former physicist, currently living the dream and working as a Linux Systems Expert, hacking the living daylight out of the Linux kernel. Few people have the privilege to work in what is essentially their hobby and passion and truly love it, so I’m most grateful for the beauty, freedom and infinite possibilities of the open-source world. I also hold a bunch of certifications of all kinds, but you can read more about those on my website. Have fun! 3
  • 5. Copyright This document can be used under the following conditions: If you want to modify or extend any part of this document, please contact me by email for permission. In any case, you must publicly credit me for the original work, including a link to my website. If you wish to mirror either the original article on my website or just this document, please contact me by email for permission. If you want to hotlink, please do so with a complimentary explana- tion, necessary credits and a link to my website. If you want to use this document for commercial or business pur- poses, please contact me by email with the details of your endeavor so we can discuss it. 4
  • 6. Disclaimer I am not very fond of disclaimers, but they are a necessary part of our world. So here we go: I must emphasize the purpose of this document is for educational purposes. It is not an official document and should not be treated as such. Furthermore, I cannot take any responsibilities for errors, inaccuracies or damages resulting from the use of this article (and its contents). All of the material in this document has been carefully worded and prepared by me. However, if for some reason you may feel this document infringes on copyright or intellectual property of another work, please contact me with a detailed explanation pointing to a troublesome part and I will try to sort the problem in the best way possible. This tutorial has also been posted as a web article on my website. For any news, changes or updates, you should always refer first to www.dedoimedo.com. 5
  • 7. Contents 1 Introduction 11 2 Basic Setup 13 2.1 Verify installation . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2 Package files . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.3 Main configuration file(s) . . . . . . . . . . . . . . . . . . . . . 15 2.4 Backup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.5 Edit the httpd.conf configuration file . . . . . . . . . . . . . . 16 2.5.1 ServerRoot . . . . . . . . . . . . . . . . . . . . . . . . 17 2.5.2 PidFile . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.5.3 ServerName . . . . . . . . . . . . . . . . . . . . . . . . 18 2.5.4 /etc/hosts file . . . . . . . . . . . . . . . . . . . . . . . 19 2.5.5 DocumentRoot . . . . . . . . . . . . . . . . . . . . . . 23 2.5.6 ErrorLog . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.5.7 Listen . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.6 Create your HTML documents . . . . . . . . . . . . . . . . . . 26 2.7 Start the Web Server . . . . . . . . . . . . . . . . . . . . . . . 28 2.8 Access the web site . . . . . . . . . . . . . . . . . . . . . . . . 30 2.8.1 Local access . . . . . . . . . . . . . . . . . . . . . . . . 30 2.8.2 External access . . . . . . . . . . . . . . . . . . . . . . 32 2.9 Summary of basic setup . . . . . . . . . . . . . . . . . . . . . 36 6
  • 8. www.dedoimedo.com all rights reserved 3 Advanced setup 37 3.1 Directory tags . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.1.1 Order (allow, deny) . . . . . . . . . . . . . . . . . . . . 40 3.1.2 Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.1.3 DirectoryMatch . . . . . . . . . . . . . . . . . . . . . . 48 3.2 Files tags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.3 Location tags . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.4 Directory, Files and Location . . . . . . . . . . . . . . . . . . 51 3.5 Redirect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.6 Virtual Hosts . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.6.1 Single IP, two websites . . . . . . . . . . . . . . . . . . 57 3.6.2 Two IPs, two websites . . . . . . . . . . . . . . . . . . 63 3.6.3 Other scenarios . . . . . . . . . . . . . . . . . . . . . . 69 3.6.3.1 Different content for intranet and Internet . . 69 3.6.3.2 Different websites on different ports . . . . . . 72 3.7 Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 3.7.1 Module types . . . . . . . . . . . . . . . . . . . . . . . 74 3.8 View installed modules . . . . . . . . . . . . . . . . . . . . . . 74 3.8.1 LoadModule . . . . . . . . . . . . . . . . . . . . . . . . 76 3.8.2 mod_access . . . . . . . . . . . . . . . . . . . . . . . . 78 3.8.3 mod_dir . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.8.4 mod_perl . . . . . . . . . . . . . . . . . . . . . . . . . 79 3.8.5 mod_python . . . . . . . . . . . . . . . . . . . . . . . 79 3.8.6 mod_ssl . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4 .htaccess 80 4.1 Create .htaccess file . . . . . . . . . . . . . . . . . . . . . . . . 83 4.2 Create .htpasswd file . . . . . . . . . . . . . . . . . . . . . . . 83 4.3 Copy .htaccess to restricted directory . . . . . . . . . . . . . . 85 4.4 Configure httpd.conf to allow authentication via .htaccess . . . 85 4.5 Restart server . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 7
  • 9. www.dedoimedo.com all rights reserved 4.6 Test setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.7 Other configurations . . . . . . . . . . . . . . . . . . . . . . . 90 4.7.1 Inheritance & performance loss . . . . . . . . . . . . . 90 4.7.2 Disable web access to .htaccess . . . . . . . . . . . . . 91 5 Secure Web server 93 5.1 Encrypted session . . . . . . . . . . . . . . . . . . . . . . . . . 94 5.2 Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 5.3 Limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 5.4 Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.4.1 Main configuration file(s) . . . . . . . . . . . . . . . . . 97 5.4.2 Backup . . . . . . . . . . . . . . . . . . . . . . . . . . 98 5.4.3 Edit the ssl.conf configuration file - part 1 . . . . . . . 98 5.4.3.1 LoadModule . . . . . . . . . . . . . . . . . . 98 5.4.3.2 Listen . . . . . . . . . . . . . . . . . . . . . . 99 5.4.3.3 VirtualHost . . . . . . . . . . . . . . . . . . . 99 5.4.4 Create SSL certificate . . . . . . . . . . . . . . . . . . 101 5.4.4.1 Create Certificate Authority (CA) . . . . . . 102 5.4.4.2 Create server key . . . . . . . . . . . . . . . . 107 5.4.4.3 Create Certificate Signing Request (CSR) . . 108 5.4.4.4 Sign Certificate Signing Request (CSR) with Certificate Authority (CA) . . . . . . . . . . . 110 5.4.4.5 Verify certificates . . . . . . . . . . . . . . . . 112 5.4.5 Edit ssl.conf configuration file - part 2 . . . . . . . . . 115 5.4.5.1 Server Certificate . . . . . . . . . . . . . . . . 115 5.4.5.2 Server Private Key . . . . . . . . . . . . . . . 116 5.4.5.3 Certificate Authority . . . . . . . . . . . . . . 116 5.4.6 Test setup . . . . . . . . . . . . . . . . . . . . . . . . . 117 5.4.7 Mini-summary . . . . . . . . . . . . . . . . . . . . . . . 122 5.4.7.1 Names . . . . . . . . . . . . . . . . . . . . . . 122 5.4.7.2 Commands . . . . . . . . . . . . . . . . . . . 123 8
  • 10. www.dedoimedo.com all rights reserved 5.4.7.3 Difference between self-signed and CA-signed certificates . . . . . . . . . . . . . . . . . . . 124 5.4.7.4 Verification . . . . . . . . . . . . . . . . . . . 125 5.4.7.5 File names and locations . . . . . . . . . . . . 125 5.5 Extras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 5.5.1 Do not use password-protected server keys . . . . . . . 126 5.5.1.1 Create server key without password . . . . . . 126 5.5.2 Submission of CSR to CA . . . . . . . . . . . . . . . . 128 5.5.2.1 Create CSR . . . . . . . . . . . . . . . . . . . 128 5.5.2.2 Send CSR to CA . . . . . . . . . . . . . . . . 129 5.5.2.3 Verify certificate . . . . . . . . . . . . . . . . 129 5.6 General considerations . . . . . . . . . . . . . . . . . . . . . . 130 5.6.1 Use secure server only . . . . . . . . . . . . . . . . . . 130 5.6.2 Use only IP-based virtual hosts . . . . . . . . . . . . . 130 5.6.3 Use server.key as file name for the server key . . . . . . 131 6 Other configurations 132 6.1 Firewall rules . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 6.1.1 Advanced firewall rules . . . . . . . . . . . . . . . . . . 133 6.1.1.1 Port forwarding . . . . . . . . . . . . . . . . . 134 6.1.1.2 Destination NAT . . . . . . . . . . . . . . . . 135 6.1.1.3 Static NAT . . . . . . . . . . . . . . . . . . . 136 6.2 Enable Web server on startup . . . . . . . . . . . . . . . . . . 139 7 Security 140 7.1 Updates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 7.2 Hide your server version . . . . . . . . . . . . . . . . . . . . . 141 7.3 Logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 7.4 Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 7.5 Access to root (/) . . . . . . . . . . . . . . . . . . . . . . . . . 145 7.6 AllowOverride . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 9
  • 11. www.dedoimedo.com all rights reserved 7.7 Disable public access to .ht files . . . . . . . . . . . . . . . . . 146 7.8 Dynamic content . . . . . . . . . . . . . . . . . . . . . . . . . 146 7.8.1 Disable CGI . . . . . . . . . . . . . . . . . . . . . . . . 146 7.8.2 Disable Server Side Includes (SSI) . . . . . . . . . . . . 147 7.9 Disable unnecessary modules . . . . . . . . . . . . . . . . . . . 147 7.10 Use ModSecurity (mod_security) module . . . . . . . . . . . . 147 7.11 Chroot Jail . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 7.12 Secure web server only . . . . . . . . . . . . . . . . . . . . . . 149 7.12.1 Different DocumentRoot . . . . . . . . . . . . . . . . . 149 7.12.2 Permissions . . . . . . . . . . . . . . . . . . . . . . . . 149 7.12.3 Duration of certificates . . . . . . . . . . . . . . . . . . 149 7.13 Word of caution . . . . . . . . . . . . . . . . . . . . . . . . . . 150 8 Additional resources 151 9 Exercises 152 9.1 Questions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 9.1.1 Secure Web server & VirtualHost . . . . . . . . . . . . 153 9.1.2 Directory, Files and Locations . . . . . . . . . . . . . . 154 9.1.3 Server functionality, 1 . . . . . . . . . . . . . . . . . . 154 9.1.4 Server functionality, 2 . . . . . . . . . . . . . . . . . . 155 9.1.5 .htaccess . . . . . . . . . . . . . . . . . . . . . . . . . . 156 9.2 Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 9.2.1 Secure Web server & VirtualHost . . . . . . . . . . . . 157 9.2.2 Directory, Files and Locations . . . . . . . . . . . . . . 157 9.2.3 Server functionality, 1 . . . . . . . . . . . . . . . . . . 157 9.2.4 Server functionality, 2 . . . . . . . . . . . . . . . . . . 158 9.2.5 .htaccess . . . . . . . . . . . . . . . . . . . . . . . . . . 159 10
  • 12. Chapter 1 Introduction A Web server is a server that is responsible for accepting HTTP requests from web clients and serving them HTTP responses, usu- ally in the form of web pages containing static (text, images etc) and dynamic (scripts) content. The Apache Web server has been the most popular and widely used Web server for the last decade. It is used by approximately 50% of all websites. Apache is cross-platform, lightweight, robust, and used in small companies as well as large corporations. Apache is also free and open-source. The Apache Web server has almost endless possibilities, due to its great modularity, which allows it to be integrated with numer- ous other applications. One of the most popular bundles is the LAMP Web server application stack, which includes the Apache Web server alongside MySQL, PHP, Perl, and Python. The Apache Web server is developed by the Apache Software Foun- dation. You can read more about Apache on Wikipedia. 11
  • 13. www.dedoimedo.com all rights reserved Being able to configure and secure the Apache Web server is one of the most important tasks for a (Linux) system administrator. Almost every company has some sort of a website that advertises it, including intranet pages that are used by the company’s workers. The Web interface is used for many tasks beside pure browsing, including tasks as simple as meal orders and shift rosters, but also important tasks like administration of databases. In most cases, a local web server is setup to accommodate these needs. If you are working for a company that hosts public websites, the task becomes even more complicated. Web sites are used to serve content to billions of users daily. Whoever controls this content - controls the World Wide Web, from news and blogs to financial transactions. Web servers are hubs of information and power. Mis- configured or compromised servers can expose a large number of people to undesired content and potentially incur huge damages to involved parties. Running a Web site is much more than opening a port and serving a few HTML pages. There are tremendous network usability and security considerations that must continuously be met, evaluated and improved in order to maintain a safe and effective Web server. In this Part of the Book, we will learn how to properly setup and run the Apache Web server, including the secure (HTTPS) server. 12
  • 14. Chapter 2 Basic Setup In this chapter, we will setup a Web server that will serve pages on our internal network. In this chapter, we will perform the most basic setup with the minimum number of steps required to get the server running. Later, we will slowly expand, introducing new features and options. 2.1 Verify installation First, we’ll verify that Apache is indeed installed: rpm -q httpd If you get an empty prompt or a message saying the package is not installed, you will need to download and install it. If the shell displays the package name and version, you’re good to go. 13
  • 15. www.dedoimedo.com all rights reserved 2.2 Package files Rule no. 1: don’t panic! The list before you might seem intimi- dating at the moment, but that is simply because you are not yet familiar with Apache. But don’t worry. For now, treat the list as a reference only. At this stage, you don’t need to know anything or remember anything. We will slowly cover everything, step by step. Now, let us overview the location and purpose of the files used by the Apache server. Please note that the list is partial and includes only the most important entries. We will slowly expand this list as we go through the Part. 14
  • 16. www.dedoimedo.com all rights reserved File name Description /usr/sbin/httpd server binary /etc/httpd directory containing server configuration files /etc/httpd/conf directory containing main configuration files /etc/httpd/conf.d directory containing configuration files for individually packaged modules, like ssl, php, perl etc /etc/httpd/logs symbolic link to /var/log/httpd /etc/httpd/modules symbolic link to /usr/lib/httpd/modules /etc/httpd/run symbolic link to /var/run /usr/lib/httpd/modules server modules /var/log/httpd server log /var/run runtime variables /var/run/httpd.pid server process ID /var/www/html public html files We will discuss the main configuration file shortly. 2.3 Main configuration file(s) The main configuration file for the Apache Web server is: /etc/httpd/conf/httpd.conf 15
  • 17. www.dedoimedo.com all rights reserved This file is well commented and self explanatory. It contains quite a large number of settings, but we’ll concentrate on just the few necessary to setup the server. 2.4 Backup This is one of the most important things to remember. Always retain the copy of the original file so you can easily revert to the default. At the very least, do NOT delete default lines; instead, just comment them out so you’ll be able to see what the original settings read and refer to them. cp /etc/httpd/conf/httpd.conf→ /etc/httpd/conf/httpd.conf-default 2.5 Edit the httpd.conf configuration file Let’s open this file in vi text editor and review the most important entries. The file has many options - but we need only a few. In fact, you will need to change just a single line to create your server and get it running. However, you should be familiar with some other settings before launching the server. vi /etc/httpd/conf/httpd.conf This is what the file looks like - at least the beginning of it: 16
  • 18. www.dedoimedo.com all rights reserved Let’s go over the most important entries you should remember for now. 2.5.1 ServerRoot ServerRoot is the path to the server’s configuration, error and log files. It is possible to change this path, provided all the necessary files are copied to the new location accordingly. We will later review this concept as a part of the security measure known as the Chroot Jail, but more about that later (). The default location is /etc/httpd. 17
  • 19. www.dedoimedo.com all rights reserved As you can see, the file is rich with easy-to-understand comments. Apropos the comments, please note that you should not place a trailing slash at the end of the specified path. 2.5.2 PidFile PidFile is the process identification number for the httpd. This process number is important, because Apache spawns numerous child processes when running to accommodate the web traffic. It allows you to monitor and manipulate your server processes. See image above. 2.5.3 ServerName This is the one setting you will have to change to get your server running. This is where you declare the name of your website. 18
  • 20. www.dedoimedo.com all rights reserved I will use www.ninja.com - just a random name with no association whatsoever to the real site bearing this name. The generous comments in the file remind us that if we do not have a registered DNS name, we should use an IP address. One, we’ll discuss registered DNS names later. Two, we’re going to use the hosts file to demonstrate the address-to-name translation. 2.5.4 /etc/hosts file As you already know, the hosts file allows easy matching of names to IP addresses, . In general, using the hosts file is a good way of testing your IP-to-name (or vice versa) configurations before committing these changes into a production environment. 19
  • 21. www.dedoimedo.com all rights reserved First, with no new entries added to the hosts file, typing www.ninja.com in the address bar of a web browser takes us to the site itself (on the Internet). Now, we shall edit the file and add an entry, pointing www.ninja.com to a local IP address. vi /etc/hosts 20
  • 22. www.dedoimedo.com all rights reserved After saving the hosts file, we can no longer see the Internet site. Furthermore, we don’t get any fancy results from our own Web server, because it is not running yet. 21
  • 23. www.dedoimedo.com all rights reserved 22
  • 24. www.dedoimedo.com all rights reserved 2.5.5 DocumentRoot DocumentRoot tells you where your web documents (html files, im- ages etc) should be located. It is possible to reference files in other directories using aliases and symbolic links. The default directory is /var/www/html. 2.5.6 ErrorLog ErrorLog tells you where the log containing all server errors is located. This file is critical for debugging and solving server mis- configuration problems and for proper traffic shaping. By default, all messages with the value of warning (warn) and higher will be logged. This is described in the LogLevel directive just below. 23
  • 25. www.dedoimedo.com all rights reserved The default location is logs/error_log. Please note that this is rela- tive to the ServerRoot. Therefore, our log file is /etc/httpd/logs/error_log. However, let us not forget that /etc/httpd/logs is a symbolic link to /var/log/httpd. Thus, finally, the actual error log is /var/log/httpd/error_log. 24
  • 26. www.dedoimedo.com all rights reserved 2.5.7 Listen The Listen command tells the Web server what ports to use for incoming connections. By default, port 80 is used, although any one or several can be used. The accepted conventions calls for using port 80 for non-secure web communications (without any encryption of traffic). Secure web communications are normally handled on port 443. We’ll talk about the Secure Web server later. That’s it. These are all the settings you need to know for now and tamper with in order to successfully launch the Web server. Save the configuration file (Esc then :x in vi text editor). 25
  • 27. www.dedoimedo.com all rights reserved 2.6 Create your HTML documents Now, just to make things more interesting, we shall create a num- ber of files and place them in the DocumentRoot directory (/var/www/html), including a simple index.html file. Here’s the source of our index.html file (the two echoes are used to make the output easier to read): 26
  • 28. www.dedoimedo.com all rights reserved And here is the preview of files we have in the html directory: Now that we know what we have, it’s time to power up the server. 27
  • 29. www.dedoimedo.com all rights reserved 2.7 Start the Web Server Start the httpd service: service httpd start If everything worked out fine, the web server should start without any errors and you should see the following image: Still, it does not hurt to check the status of the service or verify its process ID: 28
  • 30. www.dedoimedo.com all rights reserved There are 9 processes running for Apache. This may be confusing, but there’s a very simple explanation for this. In the httpd.conf file, you will find a directive called StartServers. This directive tells the Web server how many server processes to launch on startup. The default setting is 8 server processes. Once started, the Web server dynamically kills and creates pro- cesses based on the traffic load, with the number of server processes fluctuating between MinSpareServers and MaxSpareServers. So far, everything figures out just nicely. Now, let’s make another check. The Apache Web server, if configured to listen on port 80 (or any “secure” port below 1024) must be started as root. Otherwise, it can also be started by regular (non-root) users. As a security 29
  • 31. www.dedoimedo.com all rights reserved precaution, the server processes spawned by Apache run as user apache, which belongs to the group apache. Indeed, we can easily verify that: You can change these settings in the httpd.conf file, as well. 2.8 Access the web site 2.8.1 Local access Now, let’s access our homepage. Open a web browser and type www.ninja.com in the address bar. Earlier, we were unable to access it, even though we have specified the entry for our website in the hosts file. This was because the 30
  • 32. www.dedoimedo.com all rights reserved server was not running. But now, www.ninja.com resolves to our custom webpage. Our server works. Alternatively, we could have simply accessed it by typing localhost in the web browser address bar. 31
  • 33. www.dedoimedo.com all rights reserved 2.8.2 External access Accessing the web server locally is not the most challenging thing to do. Let’s access it from other machines. 32
  • 34. www.dedoimedo.com all rights reserved Here’s our webpage, seen in another CentOS machine, belonging to the same subnet: 33
  • 35. www.dedoimedo.com all rights reserved Here’s our webpage, seen in the Opera browser running on a Win- dows machine: As you might expect, using www.ninja.com on the other machines does not yield the desired result. This is because there is nothing telling these machines to match the name to the IP address of our server (192.168.1.128). On the server itself, we overcame the problem using the hosts file. Theoretically, we could do the same thing on every host on our network, but this is slightly impractical and cumbersome. How- ever, this will not solve the problem of accessibility from hosts that we have no control of, outside our local network. To overcome this monumental problem, we’ll use name resolution by configuring and 34
  • 36. www.dedoimedo.com all rights reserved running a Domain Name System (DNS) server. This material is covered in great detail in the next Part. Meanwhile, everything works as we’ve expected. Soon, we will go over some advanced configurations. 35
  • 37. www.dedoimedo.com all rights reserved 2.9 Summary of basic setup To make things simple and clear, here’s an overview of the steps you will have to take to setup and launch Apache: • Verify installation of the Apache RPM. • Backup the /etc/httpd/conf/httpd.conf main configuration file. • Open it in the vi text editor and review the options listed therein. • Setup the DocumentRoot directive (default /var/www/html). • Setup the ServerName directive (for example, www.ninja.com). • Optionally setup other directives (like ServerRoot, ErrorLog, Listen etc). • Configure the /etc/hosts file so that you can access the website by name. • Create a sample HTML file and place it in the DocumentRoot directory. • Start the httpd server. • Test the setup by accessing the web site. 36
  • 38. Chapter 3 Advanced setup The httpd.conf file can be extensively customized using a range of directives. We have studied a few and will now review several more. Please note that it is impossible to list every single directive here. Nevertheless, we will go over some of the more useful and practical directives, which will greatly enhance the usability (and also the security) of your web server. 3.1 Directory tags Directory tags allow you to specify the configurations separately for each directory serving the web pages. If you are familiar with HTML and CSS, then using <div> containers might be the sim- plest analogy. This allows you to serve content to specific IP ranges while denying other ranges, limit access to certain files, set the be- havior of pages contained in these directories, and more. 37
  • 39. www.dedoimedo.com all rights reserved Just about any directory can be listed, although it is not necessary. The most sensible solution is to setup very restrictive parameters to the root (/) directory and custom, desired parameters to direc- tories inside DocumentRoot. Directory tags take the following form (again this is very analogous to HTML <div> tags): • <Directory directory_path> tag begins a block. • Next, follows a series of options defining what users accessing web pages located in this directory can do. • </Directory> tag closes the block. 38
  • 40. www.dedoimedo.com all rights reserved Here’s a sample block, showing the default settings applied to the root (/) directory: <Directory /> Options FollowSymLinks AllowOverride none </Directory> Let’s try to understand what we have here: <Directory /> This declares the block for the root (/) directory and all sub- directories. Options FollowSymLinks The Options directive declares which server features are valid for the specified directory; FollowSymLinks is one of the possible op- tions - it allows webpages to use symbolic links to point to files located anywhere on the root (/) directory. Please note this is not the best configuration from the security point of view; however, it does demonstrate the functionality of the Directory tags. We will discuss the server security measures later in the Part. AllowOverride none The AllowOverride directive governs the behavior of .htaccess files (more about them later). It tells whether the restrictions imposed by the Options can be overridden by specific settings inside the .htaccess files. The default behavior is set to none and should 39
  • 41. www.dedoimedo.com all rights reserved remain that way. This will prevent security breaches or nuisances due to misconfiguration. </Directory> This tag closes the block. 3.1.1 Order (allow, deny) Allow and Deny directives govern the access to the directory de- clared (via the Directory tags). The Order directive specifies how the allow and deny directives are treated. The Order of allow, deny can be looked upon as default-allow or blacklist; only “bad” hosts or IPs are disallowed. The Order of deny, allow can be looked upon as default-deny or whitelist; only “good” hosts or IPs are allowed. Possible declaration of allowed or denied clients can be via host name, domain name, IP address, partial IP address, and more. Here, we’ll restrict access to the directory (or rather, the server) by denying access from all - and only permitting access from a single IP address, that of another machine on the LAN (in this case, 192.168.1.129). 40
  • 42. www.dedoimedo.com all rights reserved Let’s review the changes to the httpd.conf file: • I have commented out the original parameters, which allowed access from all hosts (or IPs). • I have changed the order of allow, deny directives. Again, this is im- portant, because the order defines the precedence of the rules. Thus, first, we’ll deny everyone (this can be called default deny policy, so to speak) and then permit only specific hosts (or IPs). If the Order were reversed (allow, deny rather than deny, allow), no one would be able to access the server. This is critically important to remember when implementing allow, deny policies. 41
  • 43. www.dedoimedo.com all rights reserved The changes will only take effect after the Web server is restarted or the configuration file reloaded. This can be achieved by running either: service httpd restart Or: service httpd reload After httpd reads the new configuration file, the changes will take effect. Now, let’s try to access the server from the Windows ma- chine. 42
  • 44. www.dedoimedo.com all rights reserved As you can see, we are denied access. But accessing from the CentOS client with the IP of 192.168.1.129 works fine. 3.1.2 Indexes The Indexes directive tells the server whether to display the di- rectory listing when asked. The behavior of this directive depends on another directive - the DirectoryIndex. The DirectoryIndex di- rective tells the server the name of the default page that it should serve when a user requests the listing of a directory. This is the typical everyday scenario. Users are trying to access webpages by simply typing their names, without typing the ex- act homepage (like index.html, index.php etc). Various file names 43
  • 45. www.dedoimedo.com all rights reserved specified under the DirectoryIndex are looked for and the first one found is presented to the user. If no file is found, the listing of the directory is then generated by the server. This is something you may want to avoid, especially if there are files you do not wish your users to see. However, if the Options Indexes directives are used, then directory listings will be generated. One solution is to place a dummy index.html file in every directory, but this is cumbersome. The more elegant approach is to disable the listing globally (remove Indexes from the Options directive under DocumentRoot) and then allow per-directory listing when you see fit. The default configuration in the httpd.conf file specifies Options Indexes for the Directory tags of the default DocumentRoot (/var/www/html). We will change that. First, we will remove Indexes from the Options line for our Docu- mentRoot. Then, we will create two directories, called index_allow and index_deny, where only the first will have the Options In- dexes specified. Both of these directories will contain some random files. 44
  • 46. www.dedoimedo.com all rights reserved This is the new configuration file. Save it, then restart httpd. Now, if we request the directory listing for each one from our clients, we’ll get the following results: 45
  • 47. www.dedoimedo.com all rights reserved index_allow 46
  • 48. www.dedoimedo.com all rights reserved index_deny 47
  • 49. www.dedoimedo.com all rights reserved 3.1.3 DirectoryMatch The directives enclosed in the Directory tags will be indiscrimi- nately applied to all sub-directories. If you require a more fine- tuned approach for several similar sub-directories, you will have to use the DirectoryMatch tags. The main difference is that the DirectoryMatch tags allow the use of regular expressions, allowing you to match several sub-directories inside a single rule. Again, for those familiar with HTML / CSS and the use of classes and ids, the idea is very much similar. 3.2 Files tags The Files tags are very similar to the Directory tags. The ma- jor difference is that while the Directory tags govern the scope of permissions (or restrictions) of the enclosed directives by directory name, the Files tags do the same on the file name level. In other words, the Files tags can be used to configure the behavior of a single file - or a set of files that match a regular expression. Here’s an example, showing the restrictions applied to .htaccess and .htpasswd files, the files usually used in restricting access to certain directories (and/or files) by requiring users to authenticate before viewing the content: 48
  • 50. www.dedoimedo.com all rights reserved We will review this particular example later in this Part. In the above example, we’ve seen the use of regular expressions to allow multiple files to be covered by a single rule. However, a comparable directive, more suitable for handling multiple files and complex regular expressions is the FilesMatch directive. 3.3 Location tags Again, the Location tags are quite similar to the two mentioned above. The major difference is that the Location tags are used to limit the scope of enclosed directives by URLs. 49
  • 51. www.dedoimedo.com all rights reserved In other words, the Directory and Files tags should be used to con- trol content that resides on the system (like various files and im- ages, within their sub-directories), while the Location tags should be used to control content that is located outside the system, like databases, for instance. Below, we can see a commented example included in the httpd.conf file. If enabled, this block would allow you to access your server statistics, but only if you connected from the server itself. 50
  • 52. www.dedoimedo.com all rights reserved Here’s an example (please disregard the actual URL): Again, for complex regular expressions, you should use the Loca- tionMatch directive. 3.4 Directory, Files and Location The Directory, Files and Location tags all perform a similar func- tion: they categorize what restrictions are placed on content en- closed by each one. At first glance, there seems to be very little difference between them. However, just like the order of allow and deny directives is critical, so is the correct use of these tags. The configuration sections must be placed in a very particular order to make sure they behave as intended. The order of precedence of 51
  • 53. www.dedoimedo.com all rights reserved their execution by the server means that a misplaced section could compromise the security of the server - or not get executed at all. For more details, please refer to the following Apache documenta- tion page: Configuration Sections - Apache HTTP Server. 3.5 Redirect The Redirect setting allows you to map an old webpage to a new URL. This could be the case if you changed domain, for example, or moved around a lot of files, renaming and deleting them. To demonstrate the directive, we’ll map our server to point to my own site. 52
  • 54. www.dedoimedo.com all rights reserved Save the file, restart the server. 53
  • 55. www.dedoimedo.com all rights reserved 3.6 Virtual Hosts Virtual Hosts is an important, powerful feature that allows you to run several websites from a single computer. Virtual Hosts can be IP-based or named-based, offering a high level of customization (and flexibility). Virtual Hosts can use almost any option normally used in the httpd.conf file. To make you better understand this, you can treat Virtual Hosts as individual customized httpd.conf files nested in- side the main httpd.conf file. 54
  • 56. www.dedoimedo.com all rights reserved Let’s review a sample Virtual Host: <VirtualHost *:80> DocumentRoot /var/www/html/ninja-father ServerName www.ninja-father.com # other directives </VirtualHost> What do we have here? <VirtualHost *:80> This declares the name or the IP address of the site (server) that should be served using the directives inside the VirtualHost block on port 80. If no port number is used, the default one specified under the Listen option is used. The default port is 80 (standard convention). Asterisk (*) can be replaced with any name (for exam- ple, www.ninja.com) or IP address (for example, 192.168.1.128), depending on your needs and requirements. Let see several simple examples: • <VirtualHost 192.168.1.128:80> will apply the directives listed in the block below to all incoming connections aimed at 192.168.1.128 on port 80. • <VirtualHost 192.168.1.128> will apply the directives listed in the block below to all incoming connections aimed at 192.168.1.128 on the default port (as specified in the Listen directive). If this port is 80, then this option is identical to the one above. • <VirtualHost planck.matter.com> will apply the directives listed in the block below to all incoming connections aimed at planck.matter.com on 55
  • 57. www.dedoimedo.com all rights reserved the default port (which can be 80, 8080 or any other). • <VirtualHost ninja.com:8777> will apply the directives listed in the block below to all incoming connections aimed at our site ninja.com on port 8777. This port must be specified under the Listen directive. DocumentRoot /var/www/html/ninja-father This declares the directory where you should place all files that you wish served when the VirtualHost is invoked (matching names or IPs and the port). ServerName www.ninja-father.com This is the name of the server. In other words, this is the address people will type in the web browser address name in order to get to your site. In order to successfully resolve this name to the IP address of the Web Server, we will need to use /etc/hosts file like before or setup a DNS Server (later). # other directives This is just a comment specifying many other options can be used, including those we have not yet reviewed here. OK, now that we know what we’re dealing with, let’s create and test several scenarios. 56
  • 58. www.dedoimedo.com all rights reserved 3.6.1 Single IP, two websites This is one of the most common setups. We will create two websites - www.ninja-father.com and www.ninja-son.com. Both will reside on our server, which has the IP address 192.168.1.128. In order to make them both accessible to the world, we will create two Virtu- alHost blocks and declare their DocumentRoot and ServerName separately. Here’s what we need to do: • Create directories inside /var/www/html called ninja-father and ninja- son. • Create simple index.html files for each. • Edit httpd.conf and create our two VirtualHost blocks. 57
  • 59. www.dedoimedo.com all rights reserved Here’s what the httpd.conf looks like: Now, for the sake of convenience, we will also use the /etc/hosts file to allow name resolution to work. It is also imperative in our case, because using the IP address would always point to the first VirtualHost listed in the httpd.conf file. 58
  • 60. www.dedoimedo.com all rights reserved Please note that specifying an IP address in two different lines is wrong. The hosts file will always use only the first entry. You should list all names for a specific IP in a single line. 59
  • 61. www.dedoimedo.com all rights reserved For example, this is incorrect (although it would work in our case): Don’t mind the commented lines, they are used for other configu- rations: the first, our standard website; the second, for yet another VirtualHost scenario, which we will discuss soon. Now, we shall save the files (both httpd.conf and /etc/hosts) and restart httpd. Then, using Firefox, we will try to access each one. 60
  • 62. www.dedoimedo.com all rights reserved www.ninja-father.com 61
  • 63. www.dedoimedo.com all rights reserved www.ninja-son.com It works like magic. Best of all, the user has no idea that these two sites reside on the same machine. 62
  • 64. www.dedoimedo.com all rights reserved 3.6.2 Two IPs, two websites This is another common scenario. You can assign a different IP to each website, avoid possible resolution mixups and simplifying your setup. However, this requires that you either use more than a single network adapter or create virtual adapters. If you have, let’s say 14 websites, having 14 physical network devices plugged into your machines is not the best idea. Using virtual adapters is the most sensible choice here. We already have our two websites ready. We just need to create a virtual network card and then change the httpd.conf file to reflect the changes. First, we will create a virtual adapter (eth0:1) with the IP address of 192.168.1.200. 63
  • 65. www.dedoimedo.com all rights reserved 64
  • 66. www.dedoimedo.com all rights reserved Then, we’ll edit the httpd.conf file: 65
  • 67. www.dedoimedo.com all rights reserved Lastly, we’ll edit the /etc/hosts file: After restarting the server, we’ll be able to get to our two sites easily. Again, the change is completely transparent to the user. 66
  • 68. www.dedoimedo.com all rights reserved www.ninja-father.com 67
  • 69. www.dedoimedo.com all rights reserved www.ninja-son.com Excellent. Please note that the configuration of the virtual network adapter is temporary. You will have to create a network script to preserve the change between reboots. This setup has covered extensively in Part ?: Networking - sub-part 2: Basic and intermediate configurations (). 68
  • 70. www.dedoimedo.com all rights reserved 3.6.3 Other scenarios Basically, the above two scenarios cover pretty much everything. Once you get the hang of VirtualHost setting, creating any which setup becomes a simple matter. Nevertheless, for the sake of clar- ity, I will demonstrate several more typical scenarios in the exam- ples below, including some features not mentioned yet in this Part of the Book. 3.6.3.1 Different content for intranet and Internet In practice, this scenario is very similar to having 2 different IPs serving two different websites, except that you will use one website but serve different parts of it to different customers. Let’s assume you wish to achieve the following: • Allow users on the local network access to all content, but deny some to users on the Internet. • Allow users on the local network to list directory index, but deny this feature to the Internet users. • Display a different home page to local users and external customers. • Allow certain custom scripts to be available only to external customers. 69
  • 71. www.dedoimedo.com all rights reserved Here’s what a sample configuration in httpd.conf file would look like: AddHandler cgi-script .cgi NameVirtualHost 172.16.1.1:80 <VirtualHost 172.16.1.1:80> DocumentRoot /www/intranet ServerName www.our-company.com <Directory /www/intranet> Option Indexes FollowSymLinks </Directory> </VirtualHost> NameVirtualHost 211.211.211.211:80 <VirtualHost 211.211.211.211:80> DocumentRoot /www/web ServerName www.our-company.com <Directory /www/web> Options +ExecCGI FollowSymLinks </Directory> </VirtualHost> 70
  • 72. www.dedoimedo.com all rights reserved This examples introduces a number of concepts we have not yet seen, so let’s briefly review them: NameVirtualHost This directory allows you to map named-based incoming connec- tions to specific IP addresses. You might ask yourselves why you need this, when we have seen perfectly good examples before, with- out this feature. Well, the answer is: if somehow a named-based request gets “lost” (due to DNS configuration, firewall rules or similar), it might not match any of the VirtualHost blocks. In that case, the default settings configured in httpd.conf will be ap- plied to this request, which could be contrary to your needs. Using NameVirtualHost forces all incoming connections to a certain IP address to point to a certain VirtualHost block. This request will also never fall back to the main configuration, allowing you a com- plete modularity in your setup. Thus, in our example, all requests to the internal IP address will go the VirtualHost with this IP address declared. We can also see that the users will be able to view directory listings and follow symbolic links. +ExecCGI We see this directive listed under Options in the second block, which refers to the Internet customers. All incoming connections on the external IP will go to the VirtualHost with this IP declared. We can see the users won’t be able to demand directory listings, but they will be able to follow symbolic links - and execute .cgi scripts located in this directory. 71
  • 73. www.dedoimedo.com all rights reserved The ExecCGI directive tells the server to allow server-side script- ing in the specified directory. The plus (+) signs signifies this Option is used in addition to all those Options already specified for the root directory. Similarly, the minus (-) sign can remove some of the privileges, compared to the Options already specified for the root directory. However, alone, this directive is insufficient to allow scripting in this directory. AddHandler cgi-script.cgi In order to enable .cgi scripts to work outside the default script directory, a directive must be added to the httpd.conf configuration file. Indeed, this is the first line of our sample code - AddHandler cgi-script .cgi - it allows scripts in non-default directories to be executed, by using the +ExecCGI option, as we’ve done before. The Apache Web server has many other options and features. You are welcome to try them all, using this Part of the Book as the foundation for expanding your knowledge. For more information, please refer to: • Apache HTTP Server Version 2.o Documentation • RedHat Enterprise Linux 4: Reference Guide, Chapter 10: Apache HTTP Server 3.6.3.2 Different websites on different ports We’ve already discussed this before. Let’s say you have a single IP address with multiple websites served. Using the hosts file or 72
  • 74. www.dedoimedo.com all rights reserved DNS resolution is a possibility, but this might not always work. Configuring the Web server to listen on several ports for incoming connections and then using NameVirtualHost feature to force the connections to specific VirtualHost blocks will force the server to behave as you desire. Here’s an example: Listen 192.168.1.128:80 Listen 192.168.1.128:9021 NameVirtualHost 192.168.1.128:80 <VirtualHost 192.168.1.128:80> DocumentRoot /www/white-socks ServerName www.white-socks.com </VirtualHost> NameVirtualHost 192.168.1.128:9021 <VirtualHost 192.168.1.128:9021> DocumentRoot /www/black-socks ServerName www.black-socks.com </VirtualHost> For more examples, please refer to: VirtualHost Examples - Apache HTTP Server. 73
  • 75. www.dedoimedo.com all rights reserved 3.7 Modules Modules are extensions that enhance the basic functionality of the Web server. The modules reflect the growth of the Web and the inclusion of dynamic content into the web pages. The static HTML can provide only so much functionality. In fact, many of the options we have seen and used above are provided by different modules. For example, the Order directive is provided by the mod_access module. 3.7.1 Module types There are two types of modules: • Built-in modules, which are compiled into Apache and will load with the server any time it is started. Their functionality cannot be removed without recompiling the package. These modules are also known as static. • Loadable modules, which can be loaded on and off as required. These are the shared modules. 3.8 View installed modules You can always list the modules currently used by the server. The command below will display only the modules compiled into Apache. httpd -l 74
  • 76. www.dedoimedo.com all rights reserved 75
  • 77. www.dedoimedo.com all rights reserved This command will list all modules, both static and shared: httpd -M There is a wide range of modules available. We will review a num- ber of more common ones. Please note that the list below is only partial and just briefly introduces the range of available modules. 3.8.1 LoadModule Shared modules are called by the Web server using the LoadModule directive in the httpd.conf file. If you do not wish to use a certain module, simply comment its line. However, you must remember this will remove the functionality that the module provides. 76
  • 78. www.dedoimedo.com all rights reserved These modules are referenced by a symbolic link in the /etc/httpd/ directory, pointing to /usr/lib/httpd/modules. 77
  • 79. www.dedoimedo.com all rights reserved Let us go over some of the more interesting modules, just a sam- pling. 3.8.2 mod_access This module provides access control based on client host name, IP address, or other characteristics of the client request. 3.8.3 mod_dir This modules provides interface for redirects and serving directory indexes. We have reviewed quite a bit of its functionality in the previous sections. 78
  • 80. www.dedoimedo.com all rights reserved 3.8.4 mod_perl This module allows dynamic content produced by Perl scripts to be served to incoming requests without using the Perl interpreter every time, reducing overhead and system load. This is done by embedding a Perl interpreter into the Apache server. The module can also emulate a CGI environment, allowing the reuse of Com- mon Gateway Interface (CGI) scripts without any changes to the setup. 3.8.5 mod_python mod_python allows integration of the Python programming lan- guage into the Apache server. It is intended to replace CGI as a method of executing Python scripts on a web server. It offers much faster execution and allows data to be maintained over mul- tiple sessions. 3.8.6 mod_ssl This module provides an interface to the OpenSSL library, allowing the use of Secure Socket Layer (SSL) and Transport Layer Security (TSL) secure communication protocols. This allows you to run a Web server that will run encrypted sessions with clients, allowing a safe exchange of potentially sensitive data. We will discuss this module again when we setup a secure Web server (7.12). For a detailed list of available modules and their functionality, please refer to: Apache HTTP Server Module Index. 79
  • 81. Chapter 4 .htaccess .htaccess stands for hypertext access. This is the default name of the Apache directory-level configuration file. This file can be used to create security restrictions for particular directories. One of the most common uses is to require user authentication in order to serve certain web pages. Before we setup .htaccess, there are some things you should re- member: • .htaccess is not a replacement for a carefully laid out security plan. You should use the httpd.conf file to place restrictions on your server. Only then should you use .htaccess, to further restrict the already allowed users. • Do not ever use .htaccess to handle secure or privileged content, like user data. • .htaccess file is loaded every time a webpage is requested, incurring a performance loss. • Using this file grants individual users an ability to make security modi- fications to your site, creating possible risks if not properly configured. 80
  • 82. www.dedoimedo.com all rights reserved On the other hand, using .htaccess is useful if you run a multi- user hosting plan. These users do not have root access to the main configuration file and their only way of “shaping” traffic is by using the .htaccess file. In general, the use of the .htaccess file should be limited to non-root users only. Before we can setup access-protected pages, we need to briefly overview the layout and syntax of the .htaccess files. Let’s examine what a typical .htaccess file looks like. Then, we will combine it with our web content. AuthType Basic AuthName “Restricted web page” AuthUserFile “/etc/httpd/conf/.htpasswd require valid-user AuthType Basic This line defines the type of authentication. Basic means there is no encryption and the password hash is sent as clear text. This is one of the major reasons why .htaccess cannot be considered for protection of confidential user data. AuthName "Restricted web page" When someone tries to access an .htaccess-protected page, a user- name & password window will pop in the web browser. This win- dow will bear a title - this is the AuthName. It can be anything you like. AuthUserFile /etc/httpd/conf/.htpasswd 81
  • 83. www.dedoimedo.com all rights reserved This line defines the path to a file where user credentials are stored. This file does not exist, but we will create it soon. require valid-user This line indicates only successful authentication attempts will re- sult in the loading of the page. Now that we know what we’re about, we will: • Create an .htaccess file similar to the one above. • Create the .htpasswd file containing usernames & password necessary for the authentication. • Place .htaccess in the directory we wish users to validate before access- ing the content. • Tell httpd to allow user authentication via .htaccess files. • Restart the server. • Test the results. 82
  • 84. www.dedoimedo.com all rights reserved 4.1 Create .htaccess file 4.2 Create .htpasswd file First, we will access the directory where we intend to place the file - /etc/httpd/conf. It can be any directory, but it must be outside the DocumentRoot, so it so not viewable by your clients. Furthermore, only the root should be able to modify this file. Make sure only root can modify the .htpasswd file! It should have permissions set to 0644. 83
  • 85. www.dedoimedo.com all rights reserved Users and passwords are added to the file by running the htpasswd command. htpasswd -c .htpasswd username The name of the authentication file can be anything. You may consider changing it to something else. After you have finished adding the usernames (there can be one or more), you can see the contents of the .htpasswd file. The passwords are encrypted. 84
  • 86. www.dedoimedo.com all rights reserved 4.3 Copy .htaccess to restricted directory We will place the .htaccess file in our DocumentRoot. To make things interesting, we will also change the site and the homepage somewhat. Instead of ninja.com, we will serve ourserver.com. This is the site we will use to configure a DNS server in the next Part (). 4.4 Configure httpd.conf to allow authentica- tion via .htaccess By default, .htaccess files are given no control whatsoever. This is accomplished by the AllowOverride directive. This directive 85
  • 87. www.dedoimedo.com all rights reserved specifies what the .htaccess files can do - in addition and contrary to main configuration settings. Please note that this could pose a security risk. Badly configured .htaccess files can compromise the security of your system. We will allow .htaccess to authenticate users. We will replace the original AllowOverride none to AllowOverride AuthConfig. 4.5 Restart server service httpd restart 86
  • 88. www.dedoimedo.com all rights reserved 4.6 Test setup This is the webpage, seen without any restrictions. 87
  • 89. www.dedoimedo.com all rights reserved Now, after restarting the server, we will be asked for authentication credentials. 88
  • 90. www.dedoimedo.com all rights reserved If we succeed, we will reach the webpage, like before. 89
  • 91. www.dedoimedo.com all rights reserved If we enter the wrong username & password - or none, we will be rejected. You can customize the “reject” page, if you like. 4.7 Other configurations While this pretty much covers the basic setup of .htaccess files, there are several more things you should remember. 4.7.1 Inheritance & performance loss Please remember that the .htaccess restrictions are inherited by all sub-directories that exist in the directory you have placed the file. This means that whenever one of your clients tries to access a page in one of the sub-directories, the server will have to make a recur- sive search up the directory tree until it finds the file. Furthermore, 90
  • 92. www.dedoimedo.com all rights reserved even if it does find the file, the server will have to check up every directory up the tree to create a complete set of restrictions. 4.7.2 Disable web access to .htaccess By default, Apache prevents any file beginning with letters .ht to be visible through the web browser. This is a minor security consideration, which allows you to keep your .htaccess files safe from prying eyes, even though they are located in world-readable location (DocumentRoot directories and sub-directories). This behavior is governed by the combination of the AccessFile- Name and Files directives. We have seen this example earlier when we review the Files tag; now, we can see them in practical use. 91
  • 93. www.dedoimedo.com all rights reserved You can also setup other types of files - or just specific files - from being accessible - or accessible only to certain hosts. Indeed, if we try to reach .htaccess through the web browser, we will be denied access. 92
  • 94. Chapter 5 Secure Web server Running a secure Web server is something you should consider if the daily use of your websites will include an exchange of confi- dential, private information from your users. Regular Web servers send and receive traffic in unencrypted form. Unfortunately, this makes them vulnerable to man-in-the-middle attacks, where a po- tential attacker could use sniffer tools to log packets en route from clients to the server and derive sensitive information from them. This mode of security is completely unacceptable for websites that must deal in personal data, like bank accounts, medical or financial records, or others. The secure Web server eliminates this threat by offering two key advantages: • It allows users to verify the identity of the server. • It allows users to conduct safe transactions with your server by en- crypting the authentication and the session. To achieve this, the Apache Web server uses secure communication protocols like the Secure Socket Layer (SSL) or the Transport Layer 93
  • 95. www.dedoimedo.com all rights reserved Security (TLS) to protect the flow of data. 5.1 Encrypted session Before we setup a secure server, we should first understand how encrypted communication between the server and the client is con- ducted. Let us outline the details of a typical secure session: • A client tries to connect to port 443 on the secure Web server. • The client sends a list of available encryption methods it supports; if the client cannot support encryption, for instance very old browsers, the connection attempt will be unsuccessful. Modern browsers support both SSL and TLS without any problems. • The server will choose the strongest available encryption method that both sides can support. • The server will then send back to the client its certificate and the pub- lic encryption key. The certificate is a sort of an ID, telling the client important information about the server. To make this information credible, the certificate must be signed by a reputable Certificate Au- thority (CA), like EquiFax, Thawte or others. The public key will be used by the client to generate its own encryption hash should it choose to accept the server’s certificate. • The client receives the certificate. In most browsers, the certificate is first compared to an existing list of authorities. If the digital signature matches, the certificate will be accepted. If no match is found for the certificate, the browser might use the Online Certificate Status Protocol (OCSP) to connect to CAs in real time in an attempt to verify the certificate. Generally, the use of OCSP is not enabled by default in most browsers, in order to speed up the authentication process. If no 94
  • 96. www.dedoimedo.com all rights reserved match is found still, the client will be issued a warning by the browser, informing it that the certificate could not be verified. The user now must decide whether he/she can take the risk and accept the certificate. In addition to being self-signed (i.e. no CA signature), the typical issues arising with certificate prompts include a mismatch between the site you are trying to access and the one registered in the certificate, dubious credentials or an expired certificate. • Regardless of what may occur, if the client accepts the connection, it will send back a hash encrypted with the server’s public key. This hash will be used to encrypt all communication between the server and the client throughout the session. Only the client will be able to decrypt the communications - or rather, anyone who possesses the private key. But if the client side is fairly secure and the server’s certificate is valid, the communication is safe. 5.2 Requirements We have already mentioned that the client must support some sort of encryption to able to establish secure connections to a server. On the server end, the server must also support the secure com- munication protocols. The Apache Web server uses the mod_ssl module, which provides an interface to the OpenSSL library, al- lowing the use of SSL and TLS. By default, most distributions today ship with the OpenSSL library installed and the Apache server compiled against the mod_ssl module. If your distro does not include either one or both, you will have to obtain them before you can use a secure Web server. 95
  • 97. www.dedoimedo.com all rights reserved You can check if you have the OpenSSL library installed: rpm -q openssl And to certify if Apache uses mod_ssl, you should look for it in the /etc/httpd/modules directory. 5.3 Limitations On one hand, the secure Web server offers verification of the server’s identity and safe transactions. On the other hand, it is slower than the regular server. Therefore, you should take into consideration the performance loss stemming from the use of encryption. You should not use the secure Web server for regular daily content that does not include any exchange of personal information. 96
  • 98. www.dedoimedo.com all rights reserved 5.4 Setup 5.4.1 Main configuration file(s) The main configuration file for the secure Apache Web server is: /etc/httpd/conf.d/ssl.conf This file is very similar to httpd.conf, except that it includes a number of special directives. But the principle remains the same. Basically, the configuration file contains a VirtualHost block, where all secure Web server directives should be listed. We will edit this block to suit our needs. 97
  • 99. www.dedoimedo.com all rights reserved 5.4.2 Backup We will first backup the file before making any changes. cp /etc/httpd/conf.d/ssl.conf → /etc/httpd/conf.d/ssl.conf-backup 5.4.3 Edit the ssl.conf configuration file - part 1 Again, we need to make a number of changes to get our server to work. However, before we can fully edit all of the necessary options, we will have to digitally sign our server. This includes creating the public key and signing it with a certificate from a known, reputable CA. However, since we do not have a certificate, it costs money and the process takes time, for the purpose of this exercise, we will create our own CA and use it to sign our server. But first, let us review the most important directives that we need to get our server started. The procedure is identical to what we have done earlier. 5.4.3.1 LoadModule This directive instructs the server to use the mod_ssl module. The path is relative to the ServerRoot directive specified in the httpd.conf configuration file. Without loading the module, our encryption will not work. 98
  • 100. www.dedoimedo.com all rights reserved 5.4.3.2 Listen This directive instructs the server to listen for incoming connec- tions on port 443. This is the accepted convention for secure Web communications (https). It is critical that this port be different from the port used by the regular server. See the image above. 5.4.3.3 VirtualHost Here, we define our secure Web server. Using the VirtualHost block is the most elegant way of doing it. This allows you to create additional blocks and serve additional secure sites to your clients, allowing you an extra degree of flexibility and security. 99
  • 101. www.dedoimedo.com all rights reserved Like we did before, we need to setup the DocumentRoot, the ServerName and other directives. Let us review the most im- portant elements: <VirtualHost *:443> This tells our server to listen on all interfaces for incoming connec- tions on port 443. You may consider narrowing down the range to specific IP addresses. Nevertheless, it is important to remember that you can only use IP addresses! The secure Web server does not permit named-based connections in its VirtualHost block. This is because the SSL handshake occurs before the HTTP request can identify the named-based virtual host. 100
  • 102. www.dedoimedo.com all rights reserved Use only IP-based VirtualHost directives in the ssl.conf configuration file! Name-based virtual hosts will fail. DocumentRoot "/var/www/html" This directive specifies the directory where all your web pages should be stored. It is recommended that you use a different root for non-secure and secure pages. However, in our example, we will use the default selection. Just remember that this is NOT the optimal setting. ServerName www.ourserver.com:443 This entry defines the server name. If you do not use the hosts file or DNS server for name resolution, you will have to specify an IP address. We have solved this limitation earlier, so we can use the server name here. In a production setup, where your server is used by clients on the Internet, you will have to use DNS for name resolution. For study and testing and in small, private networks, the hosts file is an adequate solution. This covers the first part of our setup. Now we must create the certificate. 5.4.4 Create SSL certificate Like we said before, we will create a CA, create a server key and then sign the key with our self-created CA. In a production setup, 101
  • 103. www.dedoimedo.com all rights reserved this will not work. If you intend to run any semi-serious business, you will have to use a reputable, world-acknowledged CA to sign your certificates. Please note that the comparison between our setup and the real scenario can be slightly confusing. If you get lost, there’s a ta- ble summary (5.4.7) at the end of this section, emphasizing the important differences between the two setups. 5.4.4.1 Create Certificate Authority (CA) The first step is to create an encryption key, which we will use to sign our CA. Please note that you should use a meaningful name for the key. The best way to avoid confusion is to use the letters ca in the name of the CA key. Likewise, use the word server when creating the server key. I have chosen the name myca.key, so that we do not confuse this self-generated key (and the CA) with real keys. 102
  • 104. www.dedoimedo.com all rights reserved Let us review the command: openssl genrsa -des3 -out myca.key 4096 This OpenSSL command line tool will generate an RSA key, using the Triple-DES cypher. The -out flag signifies the output name. The number at the end of the command tells us how long the key will be; generally, the longer the better. A 4096-bit encryption is quite sufficient. Please refer to openssl man page for more details. After the key is created, you will be asked to use a password. This means you won’t be able to use this key without providing the 103
  • 105. www.dedoimedo.com all rights reserved password. While in theory, this is an interesting security measure, it offers little actual benefit. We’ll discuss this soon. Now that we have the key, we will create a CA. openssl req -new -x509 -days 365 → -key myca.key -out myca.crt What do we have here? Well, basically, we are creating a certifi- cate, using the key we have created earlier. Let us go over the details: 104
  • 106. www.dedoimedo.com all rights reserved req -new -x509 This part of the command tells us we want to issue a new X.509 Certificate Signing Request (CSR), where X.509 is an international standard for public key and privilege management infrastructures. In simple words, we want to create a certificate that will identify our CA. -days 365 This tells us how long the certificate will be valid. Security aspects of this parameter are examined in greater depth in the Security chapter (7.12). -key myca.key -out myca.crt We will use the key we have created earlier to sign the certificate for the CA. The command will invoke a guided text-interface wizard. We will have to provide the password for the certificate key before we can continue. After that, we will have to fill out an interactive form, including the basic credentials that will identify us as the CA. 105
  • 107. www.dedoimedo.com all rights reserved Please note that you should be careful when entering the Common Name. You should use meaningful entries that will allow you to easily distinguish your records, especially if you have several CAs. Most people will never have to bother with this setting, but should a need arise, here’s a pair of simple rules that you should adhere to when creating CAs: • For each CA, use the name of the site it will certify; in our case, ours- erver.com (or www.ourserver.com). • Append the letters CA to the end of the Common Name, so you will know this is the CA entry. In a real life situation, your credentials would be replaced with those of an existing, reputable CA. 106
  • 108. www.dedoimedo.com all rights reserved 5.4.4.2 Create server key We now have a certificate. It’s time to create the server key. The principle is similar to what we’ve done before. The one thing you should remember is that the server key should be named server.key, in order to conform with Apache conventions. After the encryption key is created, we will be asked to provide a password to make the use of our key impossible without knowing it. While this method is somewhat effective, it is not considered a serious security measure. In fact, you are advised not to use it, since the benefits do not outweigh the shortcomings. Since you must provide the password any time the server is restarted or reloaded, this means the secure server will not be able to start 107
  • 109. www.dedoimedo.com all rights reserved after unattended reboot and will require a presence of an adminis- trator to activate. This is cumbersome and can even be impracti- cal. On the other hand, should your system be compromised, the password will most likely present little challenge to the attacker. Furthermore, compromised systems cannot be trusted, whether passwords or other security methods are used. Nevertheless, we will demonstrate both methods, so you can learn and use both, should a need arise. We will begin with the password- protected key and then later, create another one, which uses no password. 5.4.4.3 Create Certificate Signing Request (CSR) Now, we must “ask” our CA to sign our certificate. In a real life situation, you would receive the server.csr from an existing, established CA. Or you might even receive the signed key, with the information you have provided in an application form, for instance. Again, we must provide a password before we can continue. Then again, we must go through an interactive form, providing details for our site. In a real life situation, a real CA would ask you for these details, whether via email, phone, an application form etc. For more details, please refer to Submission of CSR to CA sub-section below (5.5.2). 108
  • 110. www.dedoimedo.com all rights reserved Since our CA and our website are one and the same, the form will differ little from what we have done when creating the CA. This can be confusing. Therefore, you should remember that the Common Name for your CA should include the letters CA (or similar), to distinguish it from the server record. Lastly, you can provide an additional password for the server key, to make misuse more difficult. 109
  • 111. www.dedoimedo.com all rights reserved 5.4.4.4 Sign Certificate Signing Request (CSR) with Certificate Authority (CA) What remains to be done is to sign the CSR with the CA we have created. Once we do that, our certificate will be valid for the coming year. After that, we will have to renew it. 110
  • 112. www.dedoimedo.com all rights reserved You should be familiar with the syntax by now: -CA myca.crt This option instructs openssl to use our CA certificate. -CAkey myca.key This option instructs openssl to sign the certificate with the CA key. -set_serial 01 111
  • 113. www.dedoimedo.com all rights reserved The set_serial option is used to create a serial number when outputting a self-signed certificate. This allows you to track the changes done to the certificate. This covers the creation and signing of the SSL certificates. 5.4.4.5 Verify certificates Let’s examine the certificates we have just created. This can help you see if there are any problems with your files. openssl rsa -noout -text -in myca.key 112
  • 114. www.dedoimedo.com all rights reserved openssl x509 -noout -text -in myca.crt 113
  • 115. www.dedoimedo.com all rights reserved openssl rsa -noout -text -in server.key 114
  • 116. www.dedoimedo.com all rights reserved openssl x509 -noout -text -in server.crt Everything looks good. Now, we can finish editing the ssl.conf file. 5.4.5 Edit ssl.conf configuration file - part 2 We now need to specify the location of our certificates and the keys in the ssl.conf file so the server can find and use them. We will comment out the sample entries in the file and use our own. Necessarily, we will have to copy the relevant files to their right location. 5.4.5.1 Server Certificate This directive specifies the location of the server certificate (server.crt). On CentOS 5, the default location is /etc/pki/tls/certs. We will 115
  • 117. www.dedoimedo.com all rights reserved use the same directory. Your choice may vary. The important thing to remember is to make the files unavailable to anyone but root. 5.4.5.2 Server Private Key This directive points to the location of the server key (server.key). Again, your choice should reflect your needs. See image above. 5.4.5.3 Certificate Authority This directive specifies the location of the CA certificate. 116
  • 118. www.dedoimedo.com all rights reserved Now, let us copy the files to their relevant locations: cp server.key /etc/pki/tls/private/server.key cp server.crt /etc/pki/tls/certs/server.crt cp myca.crt /etc/pki/tls/certs/myca.crt We are ready. Let’s test our setup. 5.4.6 Test setup After saving the ssl.conf file, we need to restart our server. service httpd restart 117
  • 119. www.dedoimedo.com all rights reserved As you can see, we must provide a password before we can continue. Now, we will try to access our server by typing https://www.ourserver.com in the address line of a web browser. You will most likely receive a warning message. 118
  • 120. www.dedoimedo.com all rights reserved Let us examine the certificate before we accept it. 119
  • 121. www.dedoimedo.com all rights reserved Indeed, everything looks fine. On the Web, though, very few peo- ple would be convinced by this certificate. But in our setup, it serves well. After accepting the certificate (either permanently or temporarily for this session only), you will hit yet another warn- ing. 120
  • 122. www.dedoimedo.com all rights reserved This time, there’s a mismatch between the domain name (www.ourserver.com) and the certificate (ourserver.com). This should not be an issue if you are using the DNS server, but we will discuss this separately in the next Part. For now, we will accept the certificate. After that, we should reach our site safely. Our setup works. 121
  • 123. www.dedoimedo.com all rights reserved 5.4.7 Mini-summary Setting up the secure Web server might seem a little confusing. Therefore, here’s a mini summary that should clarify the setup process. 5.4.7.1 Names This is a short list of file names used in this section: File name Description myca.key CA key myca.crt CA certificate server.key server key server.csr server CSR server.crt server certificate, signed by CA 122
  • 124. www.dedoimedo.com all rights reserved 5.4.7.2 Commands Below, you can find a summarized list of commands you will need to run to create your certificate. Please note that the names I have used are generic and might not suit your needs. However, it is important that you use the name server.key for the server key file, to conform with Apache standards. Command Description openssl genrsa -des3 -out myca.key 4096 Create CA key openssl req -new -x509 -days 365 -key Create CA myca.key -out myca.crt certificate openssl genrsa -des3 -out server.key 4096 Create server key openssl req -new -key server.key -out Create CSR server.csr openssl x509 -req -days 365 -in server.csr Sign CSR -CA myca.crt -CAkey myca.key -set_serial 01 -out server.crt 123
  • 125. www.dedoimedo.com all rights reserved 5.4.7.3 Difference between self-signed and CA-signed certificates This will help you better understand the differences between our exercise and a real, production setup. Step Self-signed CA Real CA Create CA Yes No need key Create CA Yes No need Create CSR Yes As instructed by CA Create server Yes Maybe: key 1. CA creates key, signs it and sends to customer 2. CA creates CSR only and sends to customer, who then creates server key and signs with CA Sign server Yes Maybe: key 1. CA sends signed key to customer 2. CA sends CSR; customer signs the key by himself/herself 124
  • 126. www.dedoimedo.com all rights reserved 5.4.7.4 Verification You will have to run these commands to check your certificates and keys: openssl rsa -noout -text -in server.key openssl x509 -noout -text -in server.crt openssl rsa -noout -text -in myca.key openssl x509 -noout -text -in myca.crt 5.4.7.5 File names and locations These are the locations of relevant files: Full path and name Description /etc/httpd/conf.d/ssl.conf Main configuration file /etc/httpd/modules Location of all modules /etc/httpd/modules/mod_ssl.so Location of mod_ssl module /etc/pki/tls/certs Location of server and CA certificates /etc/pki/tls/private Location of server keys 125