DockerとSquidを用いて、テスト用の認証プロキシサーバを構築する

ここ数回、UiPath製品群をプロキシ環境内で運用する手順を整理しています。

- [UiPath製品群をプロキシ環境で使用するための環境設定(UiPath Enterprise版/認証なしプロキシのケース)](https://qiita.com/masatomix/items/43e691e7d47e54638984)
- [UiPath製品群をプロキシ環境で使用するための環境設定(UiPath Community版/認証なしプロキシのケース)](https://qiita.com/masatomix/items/5be2a61a594307f5979a)

残るは認証プロキシーを越える件を整理したいのですが、認証プロキシっていわゆる業務環境やお客さま環境にしかなかったりして、テストがしづらいです。ということで**手元に「認証プロキシ」があればなーってことで、今回は「認証プロキシ」自体の構築手順を整理**しました。

具体的には、

- 仮想マシンを立ち上げるための [Vagrant](https://www.vagrantup.com/) を用いてLinux環境を構築
- そのLinuxにDockerをインストール
- そのDocker上に、OSSのプロキシサーバ「[Squid](http://www.squid-cache.org/)」のコンテナを構築
- そのコンテナ上で、SquidのForward Proxy の機能で認証プロキシを設定

となります。書くと長いですが、Vagrantで構築はワンタッチです :-) 便利な世の中です。

![Vagrant_Docker_squid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/5bf1ea81-73c4-7248-e0ca-8e776410350f.png)


## この記事の対象の方

- 顧客環境でテストができないので、手元に認証プロキシサーバが欲しいヒト
- 自宅のネット環境を認証プロキシ経由にしたいヒト :-)

あ、ちなみにコレで構築した認証プロキシは性能やセキュリティなどは考慮しておりませんのでご注意ください[^1]。あくまでテスト環境ということで。

[^1]: 認証プロキシ経由でのみネット接続可能にするには、そもそもプロキシ経由以外のネット接続を遮断するなど、ネットワークレベルでの制御が必要ですしね。。


## 前提

一応 MacのVagrantで構築しますが、最終的にはDockerなので環境はなんでもダイジョブかと。また最後に、Dockerでなく通常のUbuntu Linuxへの構築手順も記載しておきます。

```console
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.2
BuildVersion:	19C57

$ vagrant --version
Vagrant 2.0.4
$
```

## Vagrant上のDockerにSquidのコンテナをたてる

### GitHubから、Vagrantfileなど設定情報を取得

```
$ git clone https://github.com/masatomix/environment_template.git
$ cd environment_template
$ cat Vagrantfile
..
..
config.vm.provision :shell, :path => "./script/provision_docker_squid.sh",:privileged   => false
$
```

↑デフォルトではSquidのコンテナ構築は無効にしてあるので、アンコメントして有効にします。

### VagrantでUbuntu Linux環境構築、Dockerその他もインストール。その後 sshログイン

```console
$ vagrant up
... いろいろインストールで結構時間がかかる、、、
$ vagrant ssh

Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-154-generic x86_64)

*** System restart required ***
Last login: Sun Dec 29 21:15:59 2019 from 10.0.2.2

vagrant@ubuntu-xenial:~$
```

### IPアドレス 確認

構築したLinuxのアドレスが、プロキシサーバのIPアドレスになります。下記の``192.168.xx.xx`` にあるアドレスをメモっておきましょう。

```console
vagrant@ubuntu-xenial:~$ /sbin/ifconfig
..
enp0s8    Link encap:イーサネット  ハードウェアアドレス xxx
          inetアドレス:192.168.xx.xx  ブロードキャスト:192.168.xx.255  マスク:255.255.255.0
```


### 起動確認・停止・起動

構築が正しく行われていると、Docker上のSquidはすでに起動しているはずです。

```console
vagrant@ubuntu-xenial:~$ cd /vagrant/squid/
vagrant@ubuntu-xenial:/vagrant/squid$ 

起動確認
vagrant@ubuntu-xenial:/vagrant/squid$ sudo docker-compose ps
           Name                    Command         State           Ports
---------------------------------------------------------------------------------
squid_squid_1_d48da617dc4d   /sbin/entrypoint.sh   Up      0.0.0.0:3128->3128/tcp ← Stateが'Up'ならOK


停止
vagrant@ubuntu-xenial:/vagrant/squid$ sudo docker-compose down


起動
vagrant@ubuntu-xenial:/vagrant/squid$ sudo docker-compose up -d
```

疎通確認しましょう。インターネットオプションにプロキシとして上記の ``http://[IPアドレス]:3128`` を指定して、ネットへアクセスしてみましょう。
プロキシ認証画面がでればOKです。 あらかじめおいてあるユーザ情報ファイル``.htpasswd``にはID/Passが 

```
user01/user01
```

で登録されているので、プロキシ認証画面に入力してみてください。

![p01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73777/a6744ef6-1e93-5a4d-1926-1118cacd04a4.png)


もしくは ``curl``などで、

```console
$ curl https://qiita.com/ -x http://user01:user01@192.168.xx.xx:3128 -I
```

とうってみて、``HTTP/2 200`` などの応答が返ってくればOKです。

構築した環境の稼働確認は以上です。


### ユーザの作成

今回はテスト環境なのでユーザの追加などは不要かもしれませんが、認証プロキシのユーザを追加したいときは以下のコマンドで。

```console
vagrant@ubuntu-xenial:/vagrant/squid$ sudo htpasswd /vagrant/squid/.htpasswd user02
```

## 構築した環境の設定ファイルたち

Docker上に構築したSquidコンテナの設定ファイル ``docker-compose.yml``や、Squid自体の設定ファイル``squid.conf``は以下の通りに設定してあります。

まずは``docker-compose.yml``。

```console
vagrant@ubuntu-xenial:~$ cat /vagrant/squid/docker-compose.yml
```

```yaml:docker-compose.yml
version: '2'
services:
  squid:
    image: sameersbn/squid:3.5.27-2
    ports:
      - "3128:3128"
    volumes:
      - /srv/docker/squid/cache:/var/spool/squid
      - ./squid.conf:/etc/squid/squid.conf
      - ./.htpasswd:/etc/squid/.htpasswd
    restart: always
```

つづいて``squid.conf``。

```console
vagrant@ubuntu-xenial:~$ cat /vagrant/squid/squid.conf
```

```conf:squid.conf
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
#http_access allow all
#http_access allow localhost
#http_access deny all

http_port 3128

coredump_dir /var/spool/squid
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .               0       20%     4320

auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid/.htpasswd
auth_param basic children 5
auth_param basic realm Squid Basic Authentication (user:[user01]/pass:[user01])
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
acl pauth proxy_auth REQUIRED

http_access allow pauth

no_cache deny all

forwarded_for off
request_header_access Referer deny all
request_header_access X-FORWARDED-FOR deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

logformat mycombined   %>a %[ui %[un [%tl] "%rm %>ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log daemon:/var/log/squid/access.log mycombined
$
```

おつかれさまでした。



## 参考:Linux上にインストール

コンテナでなくLinuxへ直接Squidを入れたい場合の手順を記しておきます。
Ubuntu 16.04.6 LTS (Xenial Xerus) の例。

```console
$ sudo apt install -y squid
$ sudo apt install -y apache2-utils
$ sudo htpasswd -c /etc/squid/.htpasswd user01
```

でパスワードファイルまでつくっておきましょう。
設定ファイル``squid.conf`` は上記GitHubにあるモノそのままを ``/etc/squid/squid.conf`` へ配置してください。

あとは起動・停止コマンド。

```
$ sudo systemctl status  squid
● squid.service - LSB: Squid HTTP Proxy version 3.x
   Loaded: loaded (/etc/init.d/squid; bad; vendor preset: enabled)
   Active: active (running) since 日 2019-12-29 21:44:26 JST; 11min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2043 ExecStop=/etc/init.d/squid stop (code=exited, status=0/SUCCESS)
  Process: 2079 ExecStart=/etc/init.d/squid start (code=exited, status=0/SUCCESS)
    Tasks: 5
   Memory: 21.1M
      CPU: 568ms
   CGroup: /system.slice/squid.service
           ├─2119 /usr/sbin/squid -YC -f /etc/squid/squid.conf
           ├─2121 (squid-1) -YC -f /etc/squid/squid.conf
           ├─2122 (logfile-daemon) /var/log/squid/access.log
           ├─2123 (pinger)
           └─2127 (basic_ncsa_auth) /etc/squid/.htpasswd

12月 29 21:44:26 ubuntu-xenial systemd[1]: Starting LSB: Squid HTTP Proxy version 3.x...
12月 29 21:44:26 ubuntu-xenial squid[2079]:  * Starting Squid HTTP Proxy squid
12月 29 21:44:26 ubuntu-xenial squid[2119]: Squid Parent: will start 1 kids
12月 29 21:44:26 ubuntu-xenial squid[2079]:    ...done.
12月 29 21:44:26 ubuntu-xenial systemd[1]: Started LSB: Squid HTTP Proxy version 3.x.
12月 29 21:44:26 ubuntu-xenial squid[2119]: Squid Parent: (squid-1) process 2121 started

停止
$ sudo systemctl stop  squid

起動
$ sudo systemctl start  squid
```

おつかれさまでした。

## 関連リンク


- [UiPath製品群をプロキシ環境で使用するための環境設定(UiPath Enterprise版/認証なしプロキシのケース)](https://qiita.com/masatomix/items/43e691e7d47e54638984)
- [UiPath製品群をプロキシ環境で使用するための環境設定(UiPath Community版/認証なしプロキシのケース)](https://qiita.com/masatomix/items/5be2a61a594307f5979a)
- [sameersbn/squid:3.5.27-2](https://github.com/sameersbn/docker-squid)
- [Squid](http://www.squid-cache.org/)
- [Vagrant](https://www.vagrantup.com/)
- [Docker](https://www.docker.com/)
- [Squidでプロキシ(Basic認証)の設定](https://www.kannon.link/fuku/index.php/2018/11/03/01-51/)