Erstellen Sie mit Docker einen Authentifizierungs-Proxyserver

Hintergrund

Der intern zertifizierte Proxyserver ist nur ein Hindernis für die Softwareentwicklung. Apps, die keinen Proxy mit Authentifizierung unterstützen, Änderungen jedes Mal durch Ändern von Kennwörtern festlegen, Unterschiede zwischen Entwicklungsmitgliedern festlegen ... Diese Probleme haben mich immer beunruhigt. Als ich dort nachschaute, stellte ich fest, dass die Vorfahren Squid zum Einrichten eines Authentifizierungs-Proxyservers [^ 1] verwendeten. Außerdem habe ich Squid auf dem Mac eingerichtet und verwendet. (Sehr angenehm!)

Die Entwicklungsmitglieder sind jedoch gekommen, um Dinge wie "Ist die Sicherheit damit einverstanden?" Und "Es ist nicht gut, weil sich die Umgebung mit anderen Mitgliedern ändert" zu sagen.

Da es keine Hilfe dafür gibt, habe ich das Authentifizierungs-Proxy-Konstruktionsskript für Mac für die Mitglieder bereitgestellt und es ist mir gelungen, die Umgebung vorerst zu vereinheitlichen. Der Mechanismus der Inhalte (insbesondere Squid) wurde jedoch nicht so stark entwickelt. Wenn es also ein Problem gibt, muss ich es berücksichtigen, und ich konnte es nicht sehr auf andere Projekte ausweiten.

Dieses Mal haben wir es möglich gemacht, einen Authentifizierungs-Proxyserver so einfach wie möglich nur mit Docker zu erstellen. Daher werden wir den Mechanismus einführen, der sich auf die Squid-Einstellungen konzentriert.

[^ 1]: Docker-Container mit authentifiziertem Proxy ohne Authentifizierung oder [Stress reduzieren, der durch authentifizierten Proxy mit Squid verursacht wird](https: / /qiita.com/scalper/items/e945dd103d356db6eae6), Authentifizierung des Authentifizierungsproxys überspringen, indem ein HTTP-Proxy auf einem Mac eingerichtet wird usw. Es gibt auch viele.

Was ich gemacht habe

Dieses Mal werden wir die folgenden Repositorys vorstellen. Die neuesten Informationen finden Sie hier.

https://github.com/k-ishigaki/proxy-docker

Voraussetzungen

Es sollte funktionieren, wenn Docker (Docker Compose) installiert ist. Die Version von Docker, die ich verwendet habe, war:

$ docker version
(Weggelassen)
Server: Docker Engine - Community
 Engine:
  Version:          19.03.12
  API version:      1.40 (minimum version 1.12)
(Weggelassen)
$ docker --version
Docker version 19.03.9, build 9d988398e7
$ docker-compose --version
docker-compose version 1.26.2, build eefe0d31

Gesamtbild

Richten Sie einen Authentifizierungs-Proxyserver (Squid) im Docker-Container ein und fügen Sie Authentifizierungsinformationen hinzu (Autorisierungsheader). Auf diese Weise können Anwendungen, die den Proxy verwenden, ohne Authentifizierung eine Verbindung zum Internet herstellen.

alt

Tintenfischeinstellungen

Ich werde die Einstellungen von squid.conf.template einzeln erklären.

Grundeinstellungen

Stellen Sie den Standby-Port auf 8080 ein. Wenn Sie "sichtbarer_Hostname" nicht festlegen, wird ein Fehler mit der Meldung "Es ist nicht festgelegt" angezeigt. Setzen Sie ihn daher auf "keine" [^ sichtbarer_Hostname]. Aktivieren Sie DNS. Wenn dies festgelegt ist, können Sie den Proxyserver für den Domänennamen angeben. (Es scheint, dass es einige Umgebungen gibt, die nicht funktionieren, aber ich kenne die Ursache nicht.)

http_port 8080
visible_hostname none
dns_defnames on

[^ sichtbarer_Hostname]: Sichtbaren_Hostname setzen, was einen Fehler verursacht, wenn versucht wird, Tintenfisch nach langer Zeit zu starten!

ACL-Definition

Definieren Sie die ACL (Access Control) von Squid. localnet definiert den Zugriff vom lokalen Netzwerk, to_localnet_fast definiert den Zugriff auf das lokale Netzwerk, to_localhost_fast definiert den Zugriff auf den lokalen Host und to_direct_access_domains definiert den Zugriff auf die angegebene Domäne.

In der dst (Ziel) ACL wird das -n Flag angegeben, um die DNS-Suche zu deaktivieren. Wenn aktiviert, ist der Netzwerkzugriff extrem langsam. Außerdem gibt to_direct_access_domains an, die in .direct_access_domains [^ direct_access_domains] angegebenen Domänen einzuschließen.

[^ direct_access_domains]: Ich versuche, aus einer anderen Datei zu importieren, damit ich die Proxy-Ausschlussdomäne wie die interne Portal-Site einfach festlegen kann.

acl localnet src 0.0.0.1-0.255.255.255
acl localnet src 10.0.0.0/8
(Weggelassen)
acl to_localnet_fast dst -n 0.0.0.1-0.255.255.255
acl to_localnet_fast dst -n 10.0.0.0/8
(Weggelassen)
acl to_localhost_fast dst -n 127.0.0.0/8
acl to_direct_access_domains dstdomain -n "/.direct_access_domains"

Erlaubnis zum Tintenfisch

Gibt das Netzwerk an, das den Zugriff auf Squid ermöglicht. Es ist nur der Zugriff über das interne Netzwerk zulässig [^ http_access].

[^ http_access]: Um den Zugriff von virtuellen Umgebungen wie VirtualBox zu ermöglichen, ist der Zugriff nicht nur von localhost, sondern auch von localnet zulässig.

http_access allow localhost
http_access allow localnet

Übertragen Sie die Einstellungen mit Authentifizierung auf einen Proxyserver

Geben Sie die Anforderung an, die mit Authentifizierung an den Proxyserver übertragen werden soll. Standardmäßig arbeitet Squid mit "Versuch, auf den durch" cache_peer "angegebenen Proxy zu übertragen, und wenn dies nicht möglich ist, versuchen Sie, eine direkte Verbindung herzustellen". "Never_direct allow <Verbindungsziel außer dem Verbindungsziel, das eine direkte Verbindung zulässt" Geben Sie das Verbindungsziel an, das [^ always_direct] verbietet.

[^ always_direct]: always_direct allow <Verbindungsziel, das eine direkte Verbindung ermöglicht> ist nicht festgelegt, da bei der Verbindung zum Unternehmensnetzwerk über VPN eine Verbindung über den Proxy hergestellt wird.

Geben Sie den übergeordneten Proxy (Proxy mit Authentifizierung) mit "cache_peer" an. Ersetzen Sie beim Starten des Docker-Containers Variablen wie "$ proxy_port" durch "envsubst".

never_direct allow !to_localhost_fast !to_localnet_fast !to_direct_access_domains
cache_peer $proxy_host parent $proxy_port 0 proxy-only no-digest no-netdb-exchange login=$proxy_auth

Einstellungen, um Squid geheim zu halten

Standardmäßig enthalten Proxyserver wie Squid Informationen wie "PROXY_VIA" mit der Aufschrift "Ich gehe durch einen Proxy". Je nach Umgebung ist die Kommunikation möglicherweise nicht möglich, wenn der Kommunikationsheader unterschiedlich ist. Löschen Sie daher die Informationen, die Squid selbst erstellt. Um nur für die Übertragung zu arbeiten, wird der Squid-Cache mit "Cache alle verweigern" deaktiviert.

forwarded_for delete
via off
cache deny all
request_header_access Cache-Control deny all
request_header_access Connection deny all
request_header_add Proxy-Connection "Keep-Alive" all

Starten des Proxys der Authentifizierungsagentur mit Docker

Das Docker-Image wird über Docker Compose erstellt und gestartet. Da der zu erstellende Proxy festgelegt werden muss, setzen Sie "HTTP_PROXY_FOR_PROXY" in der Umgebungsvariablen, die erstellt und gestartet werden soll. Um das Basis-Image (Alpine) abzurufen, muss der Proxy auf der Docker-Daemon-Seite festgelegt werden. Da sich die Einstellungsmethode jedoch je nach Docker-Ausführungsumgebung unterscheidet, laden Sie das lokale Image mit load, anstatt es mit pull herunterzuladen. Ich mache es.

Wenn "<proxy_user>" und "<proxy_password>" Symbole enthalten, müssen Sie den URL-codierten Wert eingeben.

cd proxy-docker
docker load ./alpine.tar
HTTP_PROXY_FOR_PROXY=http://<proxy_user>:<proxy_password>@<proxy_host>:<proxy_port> HOST_PORT=8080 docker-compose up -d

Docker Compose-Einstellungen

Die Parameter zum Erstellen und Starten sind in "docker-compose.yml" definiert. Ich versuche, "HTTP_PROXY" und "HTTPS_PROXY" in "args" (Umgebungsvariable zur Erstellungszeit) und "environment" (Umgebungsvariable beim Start) zu setzen. Außerdem kann der Port auf der Hostseite mit "HOST_PORT" festgelegt werden. Wenn der 8080-Port bereits belegt ist, können Sie einen anderen Port angeben.

version: "3.4"

x-proxy_settings: &proxy_settings
    HTTP_PROXY: "${HTTP_PROXY_FOR_PROXY:?HTTP_PROXY_FOR_PROXY must be set. Prease read README}"
    HTTPS_PROXY: "${HTTP_PROXY_FOR_PROXY}"

services:
    proxy:
        build:
            context: .
            args:
                <<: *proxy_settings
        environment:
            <<: *proxy_settings
        ports:
            - "${HOST_PORT:-8080}:8080"

Dockerfile-Einstellungen

Da es lang ist, werde ich den Inhalt weglassen, aber ich mache das Folgende.

Zusammenfassung

Ich habe kurz die Einstellung des Authentifizierungs-Proxyservers mit Squid und das Starten mit Docker vorgestellt. Wir hoffen, dass so viele Personen wie möglich diese Informationen verwenden können, um die Unannehmlichkeiten eines authentifizierten Proxys zu beseitigen.

Recommended Posts

Erstellen Sie mit Docker einen Authentifizierungs-Proxyserver
Proxyserver durch Tintenfisch mit Docker-Image
Docker-Build für mehrere Projekte mit Fock
So erstellen Sie CloudStack mit Docker
Erstellen Sie in Eile ein Maven-Projekt mit dem Docker-Container von Maven
Erstellen Sie eine Umgebung mit Docker unter AWS
Erstellen Sie eine Ultra96v2-Entwicklungsumgebung auf Docker 1
Erstellen Sie mit Docker eine Umgebung für "API-Entwicklung + API-Überprüfung mithilfe der Swagger-Benutzeroberfläche"
Erstellen Sie eine Kotlin-App mit dem OpenJDK Docker-Container
[Rails] So erstellen Sie eine Umgebung mit Docker
(Im Aufbau) Versuchen Sie, mit Docker auf dem MacBook Memo einen automatisierten Infra-Server für den Chef zu erstellen
Implementierung der Google-Anmeldung mithilfe der Google OAuth 2.0-Authentifizierung (Server Edition)
[Road_node.js_1-1] Der Weg zum Erstellen der Node.js Express MySQL-Umgebung mit Docker
Erstellen Sie einen Docker-Container für einen einfachen Python-Webserver
Erstellen Sie mit Docker eine Ruby2.7.x + Rails6.0.x + MySQL8.0.x-Umgebung
Erstellen Sie mit Docker ein Android-Image für Orange Pi 4
Versuchen Sie, mit Docker eine Java-Entwicklungsumgebung zu erstellen
Ich habe versucht, einen API-Server mit Go (Echo) x MySQL x Docker x Clean Architecture zu erstellen
Ich möchte Java Applet ohne Verwendung einer IDE erstellen
Ich habe versucht, die Umgebung nach und nach mit Docker aufzubauen
Konfigurationsskript für die Verwendung von Docker in einer Proxy-Umgebung unter Ubuntu 20.04.1