# Apache Web-Proxy

Mit dem nachfolgenden Beispiel installieren Sie den Apache Webserver und konfigurieren diesen als Web-Proxy, welcher dann von Browsern und anderen HTTP-Klienten für den Internetzugang genutzt werden kann.&#x20;

{% code title="/srv/salt/apache-proxy/init.sls" %}

```yaml
#
# Build and maintain a Web-Proxy based on Apache
#

{% set port = 8045 %}

apache-packages:
  pkg.installed:
    - pkgs:
      - apache2
      - apache2-utils
      - libapache2-mod-authnz-external
      - pwauth

{% for module in ['proxy','proxy_connect','proxy_http'] %}
enable-mod-{{ module }}:
  apache_module.enabled:
    - name: {{ module }}
    - require: 
      - pkg: apache-packages
{% endfor %}

Disable default site:
  apache_site.disabled:
    - name: 000-default

#
# Disable Port 80. We don't serve content with Apache
#
Enable Port {{port}}:
  file.append:
    - name: /etc/apache2/ports.conf
    - text: Listen {{port}}
  
Disable Port 80:
  file.replace:
    - name: /etc/apache2/ports.conf
    - pattern: ^Listen 80$
    - repl: >-
        #Listen 80

#
# Copy a proxy config. The build-in state 
# https://docs.saltproject.io/en/latest/ref/states/all/salt.states.apache.html
# cannot handle proxy configurations
#
/etc/apache2/sites-available/proxy.conf:
  file.managed:
    - source: salt://apache-proxy/proxy.conf
    - template: jinja
    - defaults:
      port: {{port}}

Enable proxy:
  apache_site.enabled:
    - name: proxy

apache2:
  service.running:
    - enable: True
    - watch:
      - file: /etc/apache2/sites-available/proxy.conf
      - file: /etc/apache2/ports.conf
```

{% endcode %}

{% code title="/srv/apache-proxy/proxy.conf" %}

```markup
<VirtualHost *:{{ port}}>
	ProxyRequests On
	ProxyVia On
	AllowCONNECT 22-65535
	<IfModule mod_authnz_external.c>
		AddExternalAuth pwauth /usr/sbin/pwauth
		SetExternalAuthMethod pwauth pipe
	</IfModule>

	<Proxy *>
    	Order deny,allow
    	Deny from all
  		# Allow access only from local network
  		Allow from all
		AuthType Basic
		AuthName "Proxy requires authentication"
		AuthBasicProvider external
		AuthExternal pwauth
		Require valid-user
	</Proxy> 
    ServerName proxy.local
	ErrorLog "/var/log/apache2/proxy-error.log"
	CustomLog "/var/log/apache2/proxy-access.log" common
</VirtualHost>

```

{% endcode %}

Der Apache-Proxy kann auch filtern und [Zugriff auf bestimmte Domänen verbieten](http://httpd.apache.org/docs/trunk/en/mod/mod_proxy.html#proxyblock). Fügen Sie dazu innerhalb des virtuellen Hosts eine Zeile mit gesperrten Domains ein. Z. B. `ProxyBlock www.google.de facebook`

Eine Liste mit erlaubten Proxy-Usern »zusammenbauen« aus dem User-Pillar.

```
{% set valid_proxy_users = [] %}
{% for login,user in pillar['users'].iteritems() %}
{% if user['proxy'] %}
{% do valid_proxy_users.append(login) %}
{% endif %}
{% endfor %}
```

{% hint style="danger" %}
Verwenden Sie die zuvorgenannte Authentifierung nicht in produktiven Umgebungen. Das **Passwort wird im Klartext unverschlüsselt übertragen**. Wenn Sie eien Web-Proxy mit Authentifizierung einrichten möchten, muss für diesen TLS/HTTPS aktiviert werden.
{% endhint %}

In der Apache Proxy-Konfiguration werden die erlaubten User nun wie folgt angeben:

```
... snip
Require user {{ valid_proxy_users|join(' ') }}
... snap
```
