blob: ed02ad648707569558ea889bf6c78198b0b218d0 [file] [log] [blame]
#!/bin/bash
#
# apache templates
#
# Copyright 2019 Luigi Santivetti <luigi.santivetti@gmail.com>
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
declare -r vhost_http_t="\
<VirtualHost *:${_APACHE_HTTP_PORT_}>
ServerName ${_APACHE_SERVER_NAME_}
ServerAlias ${_APACHE_SERVER_ALIAS_}
ErrorLog \"${_APACHE_VHOST_HTTP_LOG_F_}\"
RewriteEngine on
# NOTE: any POST or PUT send with http (:80) will be redirected
# with the side effect of dropping any data sent. We don't care
# nothing should transit over http anyway.
# Enforce https and www.
RewriteCond %{REQUEST_SCHEME} =http [NC]
RewriteCond %{SERVER_NAME} =${_APACHE_SERVER_NAME_} [NC]
RewriteRule ^ https://${_APACHE_SERVER_ALIAS_}%{REQUEST_URI} [NE,R=permanent,L]
# Enforce https
RewriteCond %{REQUEST_SCHEME} =http [NC]
RewriteCond %{SERVER_NAME} =${_APACHE_SERVER_ALIAS_} [NC]
RewriteRule ^ https://${_APACHE_SERVER_ALIAS_}%{REQUEST_URI} [NE,R=permanent,L]
</VirtualHost>"
declare -r vhost_https_t="\
<IfModule mod_ssl.c>
<VirtualHost *:${_APACHE_HTTPS_PORT_}>
ServerName ${_APACHE_SERVER_NAME_}
ServerAlias ${_APACHE_SERVER_ALIAS_}
# DocumentRoot is the only publicly accessible data:
#
# - index.php, for dispatching requested URIs
# - theme/css, style
# - theme/js, style
DocumentRoot \"${_APACHE_DOCUMENT_ROOT_D_}\"
ErrorLog \"${_APACHE_SSL_LOG_F_}\"
LogLevel ${_APACHE_SSL_LOG_LEVEL_}
# Flags:
#
# NE, not escape, as keep chars such as & and ?
#
# R=status, redirect, if a valid URI is generated in the rewrite then
# issue a request to the browser. It always prepends the rewrite with
# [this protocol]://[thishost][:thisport]
#
# L, last, do not feed the rewrite result to the next rule
#
# NC, non case sensitive
#
# NOTE: This is to enforce 'www.' and *DO NOT* rediret! Skip POST and PUT
# because apache does an internal redirect 301 or 302 and drops the data
# attached to the request.
RewriteEngine on
RewriteCond %{REQUEST_METHOD} !^(POST|PUT) [NC]
RewriteCond %{SERVER_NAME} =${_APACHE_SERVER_NAME_} [NC]
RewriteRule ^ https://${_APACHE_SERVER_ALIAS_}%{REQUEST_URI} [NE]
# Proxy configuration
AllowEncodedSlashes on
# Route to vhost-gerrit.conf
#
# NOTE: 127.0.0.1 relative to container network
ProxyPassMatch /gerrit(/?)(.*) http://127.0.0.1:${_APACHE_GERRIT_PROXY_PORT_}/\$2 nocanon
ProxyPassReverse /gerrit(/?)(.*) http://127.0.0.1:${_APACHE_GERRIT_PROXY_PORT_}/\$2
# Within this context, it uses a file system path instead of URL path
#
# i.e.
# out %{REQUEST_URI} expands to https://servername.domain/whatever/
# in %{REQUEST_URI} expands to var/www/html/whatever/
#
# NOTE: %{REQUEST_URI} in directory context expands with a leading slash
# and a trailing slash
<Directory \"${_APACHE_DOCUMENT_ROOT_D_}\">
DirectorySlash Off
Require all granted
# This assumes to be calling a php handler, so:
#
# NOTE: Do not redirect or it will break the request.
RewriteCond %{REQUEST_FILENAME} !.*\.(css|js|mp4|jpg)$ [NC]
RewriteCond %{REQUEST_URI} !^/index.php [NC]
RewriteRule ^(.*)$ index.php/\$1 [NC,L]
</Directory>
# Lock out undesired auth requests
<Location \"/login/auth\">
Order Deny,Allow
Deny from all
Allow from ${_APACHE_MOD_AUTHNZ_LOCALHOST_}
</Location>
<LocationMatch \"^(/invite|/page/invite|/page/invite\\.html)$\">
AuthType Basic
AuthName \"Invite @ ${_APACHE_SERVER_NAME_}\"
# authnz_external
AuthBasicProvider external
# Call into php again
AuthExternal ${_APACHE_EXT_AUTH_KEYWORD_}
# mod_authz_core configuration
Require valid-user
</LocationMatch>
# NOTE: path relative to container rootfs
Include ${_APACHE_CON_SSL_CONF_F_}
SSLCertificateFile ${_APACHE_CON_SSL_CERT_F_}
SSLCertificateKeyFile ${_APACHE_CON_SSL_KEY_F_}
# Configure external authentication module
<IfModule mod_authnz_external.c>
DefineExternalAuth ${_APACHE_EXT_AUTH_KEYWORD_} pipe ${_APACHE_CON_EXT_AUTH_F_}
</IfModule>
# Configure set default environment
<IfModule mod_env.c>
SetEnv CI_ENV ${_APACHE_CODE_IGNITER_ENV_}
</IfModule>
</VirtualHost>
</IfModule>"
if [ "${_GERRIT_HAS_HTTPS_}" -eq 1 ]; then
declare -r vhost_gerrit_t_has_ssl="\
SSLProxyEngine on
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off"
else
declare -r vhost_gerrit_t_has_ssl=""
fi
declare -r vhost_gerrit_t="\
<VirtualHost 127.0.0.1:${_APACHE_GERRIT_PROXY_PORT_}>
# Restrict to only requests from 127.0.0.1
<LocationMatch \".*\">
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</LocationMatch>
ErrorLog \"${_APACHE_VHOST_GERRIT_LOG_F_}\"
LogLevel ${_APACHE_VHOST_GERRIT_LOG_LEVEL_}
${vhost_gerrit_t_has_ssl}
ProxyVia off
ProxyRequests off
ProxyPreserveHost on
ProxyErrorOverride on
AllowEncodedSlashes on
# Proxy incoming requests towards Gerrit Code Review
ProxyPassMatch \\
^/(.*)$ ${_GERRIT_PROXY_PROTOCOL_}://${_GERRIT_DKRC_FRONTEND_IP_}:${_GERRIT_PROXY_PORT_}/gerrit/\$1 nocanon
ProxyPassReverse \\
^/(.*)$ ${_GERRIT_PROXY_PROTOCOL_}://${_GERRIT_DKRC_FRONTEND_IP_}:${_GERRIT_PROXY_PORT_}/gerrit/\$1
<LocationMatch \"(/gerrit/login(/?)|/login(/?))\">
AuthType Basic
AuthName \"Gerrit @ ${_APACHE_SERVER_NAME_}\"
# authnz_external
AuthBasicProvider external
# Call into php again
AuthExternal ${_APACHE_EXT_AUTH_KEYWORD_}
# mod_authz_core configuration
Require valid-user
</LocationMatch>
# Configure external authentication module
<IfModule mod_authnz_external.c>
DefineExternalAuth ${_APACHE_EXT_AUTH_KEYWORD_} pipe ${_APACHE_CON_EXT_AUTH_F_}
</IfModule>
</VirtualHost>"
declare -r ports_t="\
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf
#
# Port mapped to the host (only one)
#
Listen ${_APACHE_HTTP_PORT_}
#
# Gerrit, vhost, proxied
#
Listen ${_APACHE_GERRIT_PROXY_PORT_}
<IfModule ssl_module>
Listen ${_APACHE_HTTPS_PORT_}
</IfModule>
<IfModule mod_gnutls.c>
Listen ${_APACHE_HTTPS_PORT_}
</IfModule>"
declare -r apache2_t="\
# This is the main Apache server configuration file. It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.4/ for detailed information about
# the directives and /usr/share/doc/apache2/README.Debian about Debian specific
# hints.
#
#
# Summary of how the Apache 2 configuration works in Debian:
# The Apache 2 web server configuration in Debian is quite different to
# upstream's suggested way to configure the web server. This is because Debian's
# default Apache2 installation attempts to make adding and removing modules,
# virtual hosts, and extra configuration directives as flexible as possible, in
# order to make automating the changes and administering the server as easy as
# possible.
# It is split into several files forming the configuration hierarchy outlined
# below, all located in the /etc/apache2/ directory:
#
# /etc/apache2/
# |-- apache2.conf
# | |-- ports.conf
# |-- mods-enabled
# | |-- *.load
# | |-- *.conf
# |-- conf-enabled
# | |-- *.conf
# +-- sites-enabled
# |-- *.conf
#
#
# * apache2.conf is the main configuration file (this file). It puts the pieces
# together by including all remaining configuration files when starting up the
# web server.
#
# * ports.conf is always included from the main configuration file. It is
# supposed to determine listening ports for incoming connections which can be
# customized anytime.
#
# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/
# directories contain particular configuration snippets which manage modules,
# global configuration fragments, or virtual host configurations,
# respectively.
#
# They are activated by symlinking available configuration files from their
# respective *-available/ counterparts. These should be managed by using our
# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See
# their respective man pages for detailed information.
#
# * The binary is called apache2. Due to the use of environment variables, in
# the default configuration, apache2 needs to be started/stopped with
# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not
# work with the default configuration.
#
# Global configuration
#
ServerName ${_APACHE_SERVER_NAME_}
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE! If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the Mutex documentation (available
# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
#ServerRoot \"/etc/apache2\"
#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
#Mutex file:\${APACHE_LOCK_DIR} default
#
# The directory where shm and other runtime files will be stored.
#
DefaultRuntimeDir \${APACHE_RUN_DIR}
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile \${APACHE_PID_FILE}
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to \"Off\" to deactivate.
#
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5
# These need to be set in /etc/apache2/envvars
User \${APACHE_RUN_USER}
Group \${APACHE_RUN_GROUP}
#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog \${APACHE_LOG_DIR}/error.log
#
# LogLevel: Control the severity of messages logged to the error_log.
# Available values: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the log level for particular modules, e.g.
# \"LogLevel info ssl:warn\"
#
LogLevel trace1
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
# Include list of ports to listen on
Include ports.conf
# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
#<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory>
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives. See also the AllowOverride
# directive.
#
AccessFileName .htaccess
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<FilesMatch \"^\.ht\">
Require all denied
</FilesMatch>
#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# These deviate from the Common Log Format definitions in that they use %O
# (the actual bytes sent including headers) instead of %b (the size of the
# requested file), because the latter makes it impossible to detect partial
# requests.
#
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
# Use mod_remoteip instead.
#
LogFormat \"%v:%p %h %l %u %t \\\"%r\\\" %>s %O \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" vhost_combined
LogFormat \"%h %l %u %t \\\"%r\\\" %>s %O \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined
LogFormat \"%h %l %u %t \\\"%r\\\" %>s %O\" common
LogFormat \"%{Referer}i -> %U\" referer
LogFormat \"%{User-agent}i\" agent
# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.
# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet"
if [ "${mod_mode}" = "${release}" ]; then
declare -rg dockerfile_debug_tools_t=""
else
declare -rg dockerfile_debug_tools_t="\
# debug only
RUN apt-get -y install nmap
RUN apt-get -y install net-tools"
fi
declare -rg dockerfile_t="\
# Ref https://hub.docker.com/_/php/
# php:7.3-apache-stretch
# Apache/2.4.25 (Debian)
# PHP 7.3 Cli
ARG VERSION=7.3.9-apache-stretch
FROM php:\$VERSION AS base
RUN apt-get update
RUN apt-get -y install sudo
${dockerfile_debug_tools_t}
# install apxs tools
RUN apt-get -y install apache2-dev
# mysqli driver
RUN docker-php-ext-install mysqli
# mysql dbd
#RUN apt-get -y install libaprutil1-dbd-mysql
# serivce and a2* need root access
USER root
# import mod_authnz_external source
COPY ${_APACHE_MOD_AUTHNZ_EXTERNAL_D_} /${_APACHE_MOD_AUTHNZ_EXTERNAL_D_}
# build and install mod_authnz_external
WORKDIR /${_APACHE_MOD_AUTHNZ_EXTERNAL_D_}
RUN apxs -c mod_authnz_external.c
RUN sudo apxs -i -a mod_authnz_external.la
# stop apache, it starts with docker-compose
RUN [\"/bin/bash\", \"-c\", \"service apache2 stop\"]
# disable default conf
RUN [\"/bin/bash\", \"-c\", \"a2dissite 000-default\"]
# enable proxy
RUN [\"/bin/bash\", \"-c\", \"a2enmod proxy\"]
RUN [\"/bin/bash\", \"-c\", \"a2enmod proxy_http\"]
RUN [\"/bin/bash\", \"-c\", \"a2enmod proxy_ajp\"]
RUN [\"/bin/bash\", \"-c\", \"a2enmod rewrite\"]
RUN [\"/bin/bash\", \"-c\", \"a2enmod deflate\"]
RUN [\"/bin/bash\", \"-c\", \"a2enmod headers\"]
RUN [\"/bin/bash\", \"-c\", \"a2enmod proxy_balancer\"]
RUN [\"/bin/bash\", \"-c\", \"a2enmod proxy_connect\"]
RUN [\"/bin/bash\", \"-c\", \"a2enmod proxy_html\"]
# enable mod_authnz_external
RUN [\"/bin/bash\", \"-c\", \"a2enmod authnz_external\"]
# enable dbd
#RUN [\"/bin/bash\", \"-c\", \"a2enmod dbd\"]
#RUN [\"/bin/bash\", \"-c\", \"a2enmod authn_dbd\"]
#RUN [\"/bin/bash\", \"-c\", \"a2enmod authn_socache\"]
# enable session
#RUN [\"/bin/bash\", \"-c\", \"a2enmod session\"]
#RUN [\"/bin/bash\", \"-c\", \"a2enmod session_dbd\"]
# enable auth form
#RUN [\"/bin/bash\", \"-c\", \"a2enmod request\"]
#RUN [\"/bin/bash\", \"-c\", \"a2enmod auth_form\"]
# enable SSL
RUN [\"/bin/bash\", \"-c\", \"a2enmod ssl\"]"
declare -r http_authentication_bang_t="\
#!/bin/bash
for key in username password; do
read -r value; eval \"declare -r \$key=\\\"\$value\\\"\"
done
declare -ir http_expected_status=\"${_APACHE_MOD_AUTHNZ_SUCCESS_CODE_}\"
declare -r php_api=\"https://${_APACHE_MOD_AUTHNZ_LOCALHOST_}/login/auth\"
declare curl_flags
curl_flags+=\" -k -L --post301 --post302 --post303\"
curl_flags+=\" -w %{http_code}\"
curl_flags+=\" -o ${_APACHE_MOD_AUTHNZ_DEBUG_FLAG_}\"
curl_flags+=\" -H \\\"${_APACHE_MOD_AUTHNZ_H_ACCEPT_}\\\"\"
curl_flags+=\" -H \\\"${_APACHE_MOD_AUTHNZ_H_CONTENT_}\\\"\"
curl_flags+=\" --data \\\"username=\$username&password=\$password\\\"\"
declare -ir http_status=\"\$(eval \"curl \$curl_flags \$php_api\")\"
[ \"\$http_status\" -eq \"\$http_expected_status\" ]
declare -ir _CODE=\"\$?\"
echo \"\$(date +'%d/%m/%Y - %H:%M:%S'): \${BASH_SOURCE[0]}: HTTP_STATUS: \$http_status\" >&2
exit \$_CODE"