[squidでhttpsプロキシ] dockerで手軽にActiveDirectory連携とSSLインターセプトするProxyをつくる

# 概要
squidによるProxyサーバで、こんなことがやりたい。

* ActiveDirectoryのセキュリティグループを利用して、アクセスログにユーザ名を残したい。
* セキュリティグループ毎に別のアクセス制限をかけたい。
* アップデートサイトなどはホワイトリストにして、NTLMのSSOを回避して無認証で通したい。
* SSLインターセプトして、HTTPSでもFQDN以降のフルパスでアクセス制限したい。

[![Screenshot from Gyazo](https://gyazo.com/b491cce2e7b60c76c0cb6f6ce54cd84c/raw)](https://gyazo.com/b491cce2e7b60c76c0cb6f6ce54cd84c)

アクセス条件は次のとおり

|ユーザ種別|ホワイトリスト|イントラサイト|特例サイト|一般サイト|ブラックリスト|
|:--:|:--:|:--:|:--:|:--:|:--:|
|システムユーザ|〇|×|×|×|×|
|通常ユーザ|〇|〇|×|×|×|
|一部許可ユーザ|〇|〇|〇|×|×|
|全許可ユーザ|〇|〇|〇|〇|×|


# 検証環境

## 機器など
* CentOS8(8.1.1911)
* squid(4.4)
* Windows Servr 2019
* Docker(19.03.5)


## その他のパラメータ

以降の作業内容では、以下のパラメータにあわせて説明をしています。
カスタマイズする場合には、適宜修正をしてください。

### ドメイン名
ADドメイン名：prosper2.net
NetBIOSドメイン名：PROSPER2

### LDAPグループ検索用ユーザ

dn: CN=searchuser,CN=Users,DC=prosper2,DC=net
sAMAccountName: searchuser
userPrincipalName: searchuser@prosper2.net
パスワード：s3arch#PWD

### SSLを終端するためのCA証明書

秘密鍵ファイル名：icaprivkey.pem
証明書ファイル名：icacert.pem
X509v3基本制限(critical): CA
X509v3鍵使用法(critical): Digital Signature, Certificate Sign, CRL Sign

### Docker環境

**Dockerコンテナ**
コンテナ名：proxy-ad
ホスト名：proxy-ad
ポートバインド：8081:8081/tcp

**Dockerネットワーク**
IPv6：有効
サブネット：`fd5a:ceb9:ed8d:a::/64`
ネットワーク名：br_proxy_nw



# 作業内容

## 事前準備

### ADユーザの準備

以下のユーザを作成しておく。
squid検索ユーザ以外は、既存のユーザにセキュリティグループを割り当ててもOK

|ユーザ種別|ユーザ名|OU|セキュリティグループ|
|:--:|:--:|:--:|:--:|
|通常ユーザ|josys.saburo|employee|-|
|一部許可ユーザ|jinji.jiro|employee|ProxyLimit|
|全許可ユーザ|soumu.taro|employee|ProxyUnlimit|
|squid検索ユーザ|searchuser|-|-|

なお、検索用ユーザはLDAPでアクセスするだけなので、対話ログインができないようにポリシーで制御しておいたほうがよいでしょう。


[![Screenshot from Gyazo](https://gyazo.com/347d13311951f3015ce88a018e6ac6cd/raw)](https://gyazo.com/347d13311951f3015ce88a018e6ac6cd)

searchuserのパスワードは `s3arch#PWD` として説明します。

### 証明書の準備
参考エントリ
**[ActiveDirectory証明機関（ADCS）から中間CAを生成する](https://qiita.com/bashaway/items/64963c46a1c2a9884d3c)**
**[OpenSSLでプライベート認証局の構築（ルートCA、中間CA）](https://qiita.com/bashaway/items/ac5ece9618a613f37ce5)**

SSLインターセプトのため、中間CAでSSLを終端しています。
参考エントリは自身の環境の例で説明していますが、中間CAの機能を有していればどのような方法で取得しても問題ありません。
ブラウザでアクセスするクライアント側には、生成した中間CAの上位となるCAの証明書をインストールしておきます。


### dockerネットワークのIPv6化
参考エントリ
**[dockerネットワークのipv6対応方法と通信経路の整理](https://qiita.com/bashaway/items/d21e6d17ca496072d626)**

squidがIPv6で自分自身にアクセスするため、dockerもIPv6にする必要があります。


## dockerコンテナ

`docker-compose.yml` でまとめてしまいたかったのですが、compose v3は、IPv6指定ができないので、ネットワーク作成は手動です。


### 構成ファイルの準備

ファイル構成

```
# tree ./ --charset=C
./
|-- docker-compose.yml
`-- proxy-ad
    |-- Dockerfile
    |-- blacklist
    |-- docker-entrypoint.sh
    |-- icacert.pem
    |-- icaprivkey.pem
    |-- intralist
    |-- permlist
    |-- rsyslog.conf
    |-- smb.conf
    |-- squid.conf
    |-- squid_log
    `-- whitelist
```

#### Dockerfile


```yaml:docker-compose.yml
version: '3'

services:

  proxy-ad:
    build: ./proxy-ad
    image: infraserv:proxy-ad
    container_name: proxy-ad
    hostname: proxy-ad
    restart: always
    networks:
      br_proxy_nw:
    ports:
      - 8081:8081
    cap_add:
      - SYS_ADMIN
    security_opt:
      - seccomp:unconfined
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    environment:
      TZ: 'Asia/Tokyo'

networks:
  br_proxy_nw:
    external: true
```


```docker:proxy-ad/Dockerfile
FROM centos:centos8
RUN  ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime ; \
     dnf -y update ; dnf -y install epel-release rsyslog logrotate cronie ; \
     rm -f /etc/logrotate.d/syslog ; \
     dnf -y install squid samba samba-winbind openldap-clients authselect samba-winbind-clients ; \
     mkdir /etc/squid/certs ;\
     systemctl enable squid
COPY squid.conf /etc/squid
COPY icacert.pem /etc/squid/certs
COPY icaprivkey.pem /etc/squid/certs
COPY squid_log /etc/logrotate.d
COPY blacklist /etc/squid
COPY whitelist /etc/squid
COPY permlist  /etc/squid
COPY intralist /etc/squid
COPY rsyslog.conf /etc
COPY smb.conf /etc/samba
COPY docker-entrypoint.sh /usr/local/bin/
RUN  mkdir /var/local/squid ;\
     /usr/lib64/squid/security_file_certgen -c -s /var/local/squid/ssl_db -M 4MB ;\
     chown -R squid.squid /var/local/squid ;\
     ln -s usr/local/bin/docker-entrypoint.sh /
ENTRYPOINT ["docker-entrypoint.sh"]
CMD [ "/usr/sbin/init" ]
```

`docker-entrypoint.sh` はヘルパースクリプトとして実行権限を与える必要があります。
以下ファイルを作成したら、 `chmod 755 docker-entrypoint.sh` で権限付与してください。


```sh:proxy-ad/docker-entrypoint.sh
#!/bin/sh

if [ ! -e /etc/systemd/system/multi-user.target.wants/smb.service ] ; then
  authselect select winbind --force
  net ads join -U searchuser%s3arch#PWD
  systemctl enable smb
  systemctl enable winbind
  systemctl start smb
  systemctl start winbind
fi

exec "$@"
```

#### samba
ドメイン名などは適宜修正してください。

```:proxy-ad/smb.conf
[global]
        workgroup = PROSPER2
        server string = proxy-ad
        security = ads
        hosts allow = 127.
        realm = PROSPER2.NET
```

#### squid

```:proxy-ad/squid.conf
# ------------------------------------------------------
#  authentication helpers
# ------------------------------------------------------

# NTLM authentication helper : ActiveDirectory SSO
#  max processes : 5
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 5

# LDAP search helper : check ActiveDirectory Security Group
#  -v 3  : use LDAP version 3
#  -P    : persistent LDAP connection
#  -R    : do not follow referrals
#  -S    : Strip Domain name
#  -b    : Base DN (search group)
#  -D -w : bind DN (search user) and password
#  -h    : LDAP server (AD DS)
#  -f    : filter %u:User %g:Gourp
#  %LOGIN : SSO login user
external_acl_type security_group %LOGIN /usr/lib64/squid/ext_ldap_group_acl -v 3 -P -R -S -b "ou=employee,dc=prosper2,dc=net" -D searchuser@prosper2.net -w s3arch#PWD -h 10.254.10.241 -f '(&(objectclass=person)(sAMAccountName=%u)(memberOf=CN=%g,ou=employee,dc=prosper2,dc=net))'

external_acl_type ou_check %LOGIN /usr/lib64/squid/ext_ldap_group_acl -v 3 -P -R -S -b "ou=employee,dc=prosper2,dc=net" -D searchuser@prosper2.net -w s3arch#PWD -h 10.254.10.241 -f '(&(objectclass=person)(sAMAccountName=%u))'

acl gr_unlimit   external security_group ProxyUnlimit
acl gr_limit     external security_group ProxyLimit
acl gr_employee  external ou_check       employee


# ------------------------------------------------------
#  original rules
# ------------------------------------------------------
acl manager proto cache_object
acl localhost src localhost
acl localhost src 127.0.0.1/32

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

# Allow cache
http_access allow localhost manager
http_access deny manager

# Deny not Safe_ports
http_access deny !Safe_ports

# Deny CONNECT request on not SSL_ports
http_access deny CONNECT !SSL_ports


# ------------------------------------------------------
#  user rules
# ------------------------------------------------------

# Deny Blacklist sites
acl blacklist  url_regex -i "/etc/squid/blacklist"
http_access deny blacklist

# Allow Whitelist sites
acl whitelist  url_regex -i "/etc/squid/whitelist"
http_access allow whitelist

# Deny not Domain User
http_access deny !gr_unlimit !gr_limit !gr_employee

# permit : ProxyUnlimit
http_access allow gr_unlimit

# permit : ProxyLimit and permlist
acl permlist   url_regex -i "/etc/squid/permlist"
http_access allow gr_limit permlist

# permit : No security gourp and intralist
acl intralist  url_regex -i "/etc/squid/intralist"
http_access allow gr_employee intralist

# deny : default
http_access deny all


# ------------------------------------------------------
#  SSL BUMP exeption whitelist
# ------------------------------------------------------

http_port 8081 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/certs/icacert.pem key=/etc/squid/certs/icaprivkey.pem
sslcrtd_program /usr/lib64/squid/security_file_certgen -s /var/local/squid/ssl_db -M 4MB
sslcrtd_children 5
ssl_bump bump !whitelist
sslproxy_cert_error allow intralist
sslproxy_cert_error deny all


# ------------------------------------------------------
#  default options
# ------------------------------------------------------
visible_hostname proxy-ad

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 .               0       20%     4320

```

#### URLフィルタのリスト

ブラックリストは空のファイルでも大丈夫です。
後述する動作確認の際のリストと同一です。

```:proxy-ad/blacklist
qiita.com/bashaway
```

ホワイトリストはひとまずwindowsとcentos(yum)の対応としています。
後述する動作確認の際のリストと同一です。

```:proxy-ad/whitelist
microsoft.com
www.msftconnecttest.com
onecs-live.azureedge.net
windowsupdate.com
google.com
google-analytics.com
fedoraproject.org
centos.org
ftp.nara.wide.ad.jp
ftp.jaist.ac.jp
ftp.riken.jp
ftp.iij.ad.jp
ftp.tsukuba.wide.ad.jp
mirror.fairway.ne.jp
ftp.yz.yamagata-u.ac.jp
ftp-srv2.kddilabs.jp
yum.mariadb.org
```

一部許可リストはブラックリストとの比較のため、これにしています。
後述する動作確認の際のリストと同一です。

```:proxy-ad/permlist
qiita.com
```

イントラ用リストも通信確認のため、以下をサンプルにしていますが、ADのドメインとあわせておくとよいでしょう。

```:proxy-ad/intralist
ugtop.com
```

#### syslog

syslogという名前で引けるサーバにむけて514/udpでsyslogを投げます。
対象は `access.log` `cache.log` の2種類です。

```:proxy-ad/rsyslog.conf
module(load="imfile")
input(type="imfile"
      file="/var/log/squid/access.log"
      tag="pseudolog_squid_access_log"
      facility="local0"
      severity="notice")
:syslogtag, isequal, "pseudolog_squid_access_log" @syslog:514
input(type="imfile"
      file="/var/log/squid/cache.log"
      tag="pseudolog_squid_cache_log"
      facility="local0"
      severity="notice")
:syslogtag, isequal, "pseudolog_squid_cache_log" @syslog:514
```

ログがたまるので、１週間でローテートします。

```:proxy-ad/squid_log
/var/log/squid/*.log {
        daily
        rotate 8
        compress
        missingok
        notifempty
        postrotate
          /bin/systemctl restart rsyslog
        endscript
}
```

#### 証明書

このほか、[証明書の準備](#証明書の準備) で作成した、秘密鍵と証明書も同じディレクトリに配置します。



### コンテナの作成

まず、IPv6のネットワークをつくります。
サブネットは適宜修正ください。

```sh
# docker network create --ipv6  --driver=bridge  --subnet=fd5a:ceb9:ed8d:a::/64 br_proxy_nw
```

でネットワークをつくったら、IPv6が有効になっているかを確認します。

```sh
# docker network inspect br_proxy_nw | grep IPv6
        "EnableIPv6": true,
```

ビルドし、コンテナを起動させます。

```sh
# docker-compose build
# docker-compose up -d
```


## 動作確認

テストには上記の構成ファイルの説明で例示した **[URLフィルタのリスト](#URLフィルタのリスト)** を利用します。

動作確認用のユーザは前述の **[ADユーザの準備](#ADユーザの準備)** で作成した、以下を利用します。

|カテゴリ|ユーザ名|
|:--:|:--:|
|全許可ユーザ|soumu.tarp|
|一部許可ユーザ|jinji.jiro|
|通常ユーザ|josys.saburo|
|非ドメインユーザ|ローカルadministrator<BR>認証ダイアログ表示はキャンセルする|



アクセス先と想定される動作は以下です。

|URL|想定される動作|
|:--|:--|
|https://ftp.riken.jp/|全員アクセスOK|
|https://ugtop.com/|OU=employee所属の<BR>ユーザはアクセスOK|
|https://qiita.com/|OU=employee所属で<BR>セキュリティグループがProxyUnlimit/ProxyLimitの<BR>ユーザはアクセスOK|
|https://crt.sh/|OU=employee所属で<BR>セキュリティグループがProxyUnlimitの<BR>ユーザはアクセスOK|
|https://qiita.com/bashaway|全員アクセスNG|

また、非ドメインユーザの確認として、CentOSのyumアップデートを実施します。

### インターセプト後の証明書
SSLをいったんsquidで終端し、プライベートPKI上の中間CAでサーバ証明書を動的に生成しなおしています。
そのため、インターネット上のサイトにアクセスすると、以下のようなサーバ証明書が返ってきます。
サブジェクト代替名にCNを入れてくれるみたいなので、chromeエラーもでません。よかった。
[![Screenshot from Gyazo](https://gyazo.com/78a89be9941e239d96e135ab1d2ede45/raw)](https://gyazo.com/78a89be9941e239d96e135ab1d2ede45)


### 全許可ユーザ（soumu.taro）
**https://ftp.riken.jp/**
アクセスOK

```
TCP_TUNNEL/200 8880 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
TCP_TUNNEL/200 3729 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
TCP_TUNNEL/200 3729 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
```

**https://ugtop.com/**
アクセスOK

```
TCP_DENIED/407 4061 CONNECT ugtop.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT ugtop.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT ugtop.com:443 PROSPER2\\soumu.taro HIER_NONE/- -
TCP_MISS/200 2499 GET https://ugtop.com/ PROSPER2\\soumu.taro HIER_DIRECT/219.94.129.26 text/html
TCP_MISS/304 235 GET https://ugtop.com/index.css PROSPER2\\soumu.taro HIER_DIRECT/219.94.129.26 -
TCP_MISS/304 233 GET https://ugtop.com/title2002.gif PROSPER2\\soumu.taro HIER_DIRECT/219.94.129.26 -
TCP_DENIED/407 4120 GET http://www.ugtop.com/favicon.ico - HIER_NONE/- text/html
TCP_DENIED/407 4482 GET http://www.ugtop.com/favicon.ico - HIER_NONE/- text/html
TCP_MISS/302 556 GET http://www.ugtop.com/favicon.ico PROSPER2\\soumu.taro HIER_DIRECT/219.94.129.26 text/html
```

**https://qiita.com/**
アクセスOK

```
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT qiita.com:443 PROSPER2\\soumu.taro HIER_NONE/- -
TCP_MISS/200 16714 GET https://qiita.com/ PROSPER2\\soumu.taro HIER_DIRECT/2406:da14:add:900:a151:96dc:63d3:7b6 text/html
TCP_DENIED/407 4077 CONNECT cdn.qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4439 CONNECT cdn.qiita.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT cdn.qiita.com:443 PROSPER2\\soumu.taro HIER_NONE/- -
TCP_MISS/304 435 GET https://cdn.qiita.com/assets/public/style-62725e4620e989e818f0a740fac95a08.min.css PROSPER2\\soumu.taro HIER_DIRECT/2600:9000:208e:bc00:13:f1f4:ebc0:93a1 -
TCP_MISS/304 435 GET https://cdn.qiita.com/assets/public/bundle-64959777c315371f97ccc3068267aeec.min.js PROSPER2\\soumu.taro HIER_DIRECT/2600:9000:208e:bc00:13:f1f4:ebc0:93a1 -
TCP_DENIED/407 4077 CONNECT cdn.qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4439 CONNECT cdn.qiita.com:443 - HIER_NONE/- text/html
TCP_MISS/304 453 GET https://cdn.qiita.com/assets/public/hero-background-885fd333ab5d2e15054b2b2b3b970ebc.png PROSPER2\\soumu.taro HIER_DIRECT/2600:9000:208e:bc00:13:f1f4:ebc0:93a1 -
NONE/200 0 CONNECT cdn.qiita.com:443 PROSPER2\\soumu.taro HIER_NONE/- -
TCP_MISS/304 545 GET https://cdn.qiita.com/assets/public/fontawesome-webfont-674f50d287a8c48dc19ba404d20fe713.eot? PROSPER2\\soumu.taro HIER_DIRECT/2600:9000:208e:bc00:13:f1f4:ebc0:93a1 -
```

**https://crt.sh/**
アクセスOK

```
TCP_DENIED/407 4049 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/407 4411 CONNECT crt.sh:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT crt.sh:443 PROSPER2\\soumu.taro HIER_NONE/- -
TCP_MISS/200 4530 GET https://crt.sh/ PROSPER2\\soumu.taro HIER_DIRECT/2a0e:ac00:c7:d449::5bc7:d449 text/html
TCP_DENIED/407 4049 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/407 4411 CONNECT crt.sh:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT crt.sh:443 PROSPER2\\soumu.taro HIER_NONE/- -
TCP_MISS/200 4820 GET https://crt.sh/sectigo_s.png PROSPER2\\soumu.taro HIER_DIRECT/2a0e:ac00:c7:d449::5bc7:d449 image/png
```

**https://qiita.com/bashaway**
アクセスNG

```
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT qiita.com:443 PROSPER2\\soumu.taro HIER_NONE/- -
TCP_DENIED/403 4604 GET https://qiita.com/bashaway PROSPER2\\soumu.taro HIER_NONE/- text/html
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT qiita.com:443 PROSPER2\\soumu.taro HIER_NONE/- -
```

### 一部許可ユーザ（jinji.jiro）

**https://ftp.riken.jp/**
アクセスOK

```
TCP_TUNNEL/200 8880 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
TCP_TUNNEL/200 3729 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
TCP_TUNNEL/200 3729 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
```

**https://ugtop.com/**
アクセスOK

```
TCP_DENIED/407 4061 CONNECT ugtop.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT ugtop.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT ugtop.com:443 PROSPER2\\jinji.jiro HIER_NONE/- -
TCP_MISS/200 2499 GET https://ugtop.com/ PROSPER2\\jinji.jiro HIER_DIRECT/219.94.129.26 text/html
TCP_MISS/304 235 GET https://ugtop.com/index.css PROSPER2\\jinji.jiro HIER_DIRECT/219.94.129.26 -
TCP_MISS/304 233 GET https://ugtop.com/title2002.gif PROSPER2\\jinji.jiro HIER_DIRECT/219.94.129.26 -
TCP_DENIED/407 4120 GET http://www.ugtop.com/favicon.ico - HIER_NONE/- text/html
TCP_DENIED/407 4482 GET http://www.ugtop.com/favicon.ico - HIER_NONE/- text/html
TCP_MISS/302 556 GET http://www.ugtop.com/favicon.ico PROSPER2\\jinji.jiro HIER_DIRECT/219.94.129.26 text/html
```

**https://qiita.com/**
アクセスOK

```
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT qiita.com:443 PROSPER2\\jinji.jiro HIER_NONE/- -
TCP_MISS/200 16734 GET https://qiita.com/ PROSPER2\\jinji.jiro HIER_DIRECT/2406:da14:add:902:a992:3bc3:1c46:cdfa text/html
TCP_DENIED/407 4077 CONNECT cdn.qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4439 CONNECT cdn.qiita.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT cdn.qiita.com:443 PROSPER2\\jinji.jiro HIER_NONE/- -
TCP_MISS/304 435 GET https://cdn.qiita.com/assets/public/style-62725e4620e989e818f0a740fac95a08.min.css PROSPER2\\jinji.jiro HIER_DIRECT/2600:9000:208e:ca00:13:f1f4:ebc0:93a1 -
TCP_MISS/304 435 GET https://cdn.qiita.com/assets/public/bundle-64959777c315371f97ccc3068267aeec.min.js PROSPER2\\jinji.jiro HIER_DIRECT/2600:9000:208e:ca00:13:f1f4:ebc0:93a1 -
TCP_DENIED/407 4077 CONNECT cdn.qiita.com:443 - HIER_NONE/- text/html
TCP_MISS/304 453 GET https://cdn.qiita.com/assets/public/hero-background-885fd333ab5d2e15054b2b2b3b970ebc.png PROSPER2\\jinji.jiro HIER_DIRECT/2600:9000:208e:ca00:13:f1f4:ebc0:93a1 -
TCP_DENIED/407 4439 CONNECT cdn.qiita.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT cdn.qiita.com:443 PROSPER2\\jinji.jiro HIER_NONE/- -
TCP_MISS/304 545 GET https://cdn.qiita.com/assets/public/fontawesome-webfont-674f50d287a8c48dc19ba404d20fe713.eot? PROSPER2\\jinji.jiro HIER_DIRECT/2600:9000:208e:ca00:13:f1f4:ebc0:93a1 -
```

**https://crt.sh/**

```
TCP_DENIED/407 4049 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/407 4411 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT crt.sh:443 PROSPER2\\jinji.jiro HIER_NONE/- -
NONE/403 4622 GET https://crt.sh/ PROSPER2\\jinji.jiro HIER_NONE/- text/html
TCP_DENIED/407 4049 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/407 4411 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT crt.sh:443 PROSPER2\\jinji.jiro HIER_NONE/- -
```

**https://qiita.com/bashaway**

```
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT qiita.com:443 PROSPER2\\jinji.jiro HIER_NONE/- -
NONE/403 4633 GET https://qiita.com/bashaway PROSPER2\\jinji.jiro HIER_NONE/- text/html
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT qiita.com:443 PROSPER2\\jinji.jiro HIER_NONE/- -
```


### 通常ユーザの場合（josys.saburo）

**https://ftp.riken.jp/**
アクセスOK

```
TCP_TUNNEL/200 8880 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
TCP_TUNNEL/200 3729 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
TCP_TUNNEL/200 3729 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
```

**https://ugtop.com/**
アクセスOK

```
TCP_DENIED/407 4061 CONNECT ugtop.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT ugtop.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT ugtop.com:443 PROSPER2\\josys.saburo HIER_NONE/- -
TCP_MISS/200 2499 GET https://ugtop.com/ PROSPER2\\josys.saburo HIER_DIRECT/219.94.129.26 text/html
TCP_MISS/304 235 GET https://ugtop.com/index.css PROSPER2\\josys.saburo HIER_DIRECT/219.94.129.26 -
TCP_MISS/304 233 GET https://ugtop.com/title2002.gif PROSPER2\\josys.saburo HIER_DIRECT/219.94.129.26 -
TCP_DENIED/407 4120 GET http://www.ugtop.com/favicon.ico - HIER_NONE/- text/html
TCP_DENIED/407 4482 GET http://www.ugtop.com/favicon.ico - HIER_NONE/- text/html
TCP_MISS/302 556 GET http://www.ugtop.com/favicon.ico PROSPER2\\josys.saburo HIER_DIRECT/219.94.129.26 text/html
```

**https://qiita.com/**
アクセスNG

```
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT qiita.com:443 PROSPER2\\josys.saburo HIER_NONE/- -
NONE/403 4667 GET https://qiita.com/ PROSPER2\\josys.saburo HIER_NONE/- text/html
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT qiita.com:443 PROSPER2\\josys.saburo HIER_NONE/- -
```

**https://crt.sh/**
アクセスNG

```
TCP_DENIED/407 4049 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/407 4411 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT crt.sh:443 PROSPER2\\josys.saburo HIER_NONE/- -
NONE/403 4660 GET https://crt.sh/ PROSPER2\\josys.saburo HIER_NONE/- text/html
TCP_DENIED/407 4049 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/407 4411 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT crt.sh:443 PROSPER2\\josys.saburo HIER_NONE/- -
```

**https://qiita.com/bashaway**
アクセスNG

```
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT qiita.com:443 PROSPER2\\josys.saburo HIER_NONE/- -
NONE/403 4669 GET https://qiita.com/bashaway PROSPER2\\josys.saburo HIER_NONE/- text/html
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT qiita.com:443 PROSPER2\\josys.saburo HIER_NONE/- -
```

### 非ドメインユーザで認証キャンセル

ローカルユーザでログインすると、ダイアログが表示されるので、「キャンセル」で閉じる
[![Screenshot from Gyazo](https://gyazo.com/0293b9e06f2092f9f6d9f76d0c5c8cd5/raw)](https://gyazo.com/0293b9e06f2092f9f6d9f76d0c5c8cd5)


**https://ftp.riken.jp/**
アクセスOK

```
TCP_TUNNEL/200 8880 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
TCP_TUNNEL/200 3729 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
TCP_TUNNEL/200 3729 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
```

**https://ugtop.com/**
アクセスNG

```
TCP_DENIED/407 4061 CONNECT ugtop.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT ugtop.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4750 CONNECT ugtop.com:443 PROSPER2\\administrator HIER_NONE/- text/html
```

**https://qiita.com/**
アクセスNG

```
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4754 CONNECT qiita.com:443 PROSPER2\\administrator HIER_NONE/- text/html
```

**https://crt.sh/**
アクセスNG

```
TCP_DENIED/407 4049 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/407 4411 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/407 4740 CONNECT crt.sh:443 PROSPER2\\administrator HIER_NONE/- text/html
```

**https://qiita.com/bashaway**
アクセスNG

```
TCP_DENIED/407 4061 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT qiita.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4750 CONNECT qiita.com:443 PROSPER2\\administrator HIER_NONE/- text/html
```

この時の接続エラーはsquidのエラーページではなく、ブラウザのエラーページとなります。
[![Screenshot from Gyazo](https://gyazo.com/2ba51ccc935fb9ff704220aeeaf87845/raw)](https://gyazo.com/2ba51ccc935fb9ff704220aeeaf87845)


### システムユーザ（yumコマンドによるリポジトリへのアクセス）

以下のようにproxy設定を追記する。

```:/etc/yum.conf
--------8<----(snip)----8<--------
proxy=http://proxy-ad.prosper2.net:8081/
--------8<----(snip)----8<--------
```

あとは、 `yum update` を走らせる。

```
TCP_MISS/200 995 GET http://mirrorlist.centos.org/? - HIER_DIRECT/2604:1580:fe02:2::10 text/plain
TCP_MISS/200 1025 GET http://mirrorlist.centos.org/? - HIER_DIRECT/2604:1580:fe02:2::10 text/plain
TCP_MISS/200 1049 GET http://mirrorlist.centos.org/? - HIER_DIRECT/2604:1580:fe02:2::10 text/plain
TCP_MISS/200 4110 GET http://ftp.jaist.ac.jp/pub/Linux/CentOS/7.7.1908/os/x86_64/repodata/repomd.xml - HIER_DIRECT/2001:df0:2ed:feed::feed application/xml
TCP_MISS/200 5854 GET http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/7/x86_64/repodata/repomd.xml - HIER_DIRECT/2001:df0:2ed:feed::feed application/xml
TCP_MISS/200 3367 GET http://ftp.jaist.ac.jp/pub/Linux/CentOS/7.7.1908/extras/x86_64/repodata/repomd.xml - HIER_DIRECT/2001:df0:2ed:feed::feed application/xml
TCP_MISS/200 3334 GET http://yum.mariadb.org/10.4/centos7-amd64/repodata/repomd.xml - HIER_DIRECT/142.4.217.28 application/xml
TCP_MISS/200 3381 GET http://ftp.jaist.ac.jp/pub/Linux/CentOS/7.7.1908/updates/x86_64/repodata/repomd.xml - HIER_DIRECT/2001:df0:2ed:feed::feed application/xml
TCP_MISS/200 1039445 GET http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/7/x86_64/repodata/66b3561eb58c5f02cd36cf21cb7a1a0a3f564932bfa268c1113e4f7741f93672-updateinfo.xml.bz2 - HIER_DIRECT/2001:df0:2ed:feed::feed application/x-bzip2
TCP_MISS/200 7053786 GET http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/7/x86_64/repodata/b4f2590ec8c2474cba36dd314b195fd8df46b7e51fc49eafabdf23b6c0219a23-primary.sqlite.bz2 - HIER_DIRECT/2001:df0:2ed:feed::feed application/x-bzip2
TCP_TUNNEL/200 11011 CONNECT mirrors.fedoraproject.org:443 - HIER_DIRECT/2604:1580:fe00:0:dead:beef:cafe:fed1 -
```

### squidログの中身

**whitelistの場合**
インターセプトせず、トンネルしていることがわかる。

```
TCP_TUNNEL/200 8880 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
TCP_TUNNEL/200 3729 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
TCP_TUNNEL/200 3729 CONNECT ftp.riken.jp:443 - HIER_DIRECT/134.160.38.1 -
```

**ユーザを認識したうえでアクセス可となる場合**
コード 407 で認証要求が発せられ、ACLチェック後にAllowされる。

```
TCP_DENIED/407 4423 CONNECT ugtop.com:443 - HIER_NONE/- text/html
NONE/200 0 CONNECT ugtop.com:443 PROSPER2\\soumu.taro HIER_NONE/- -
TCP_MISS/200 2499 GET https://ugtop.com/ PROSPER2\\soumu.taro HIER_DIRECT/219.94.129.26 text/html
```

**ユーザを認識したうえでアクセス不可となる場合**
コード 407 で認証要求が発せられ、ACLチェック後にDenyされる。

```
TCP_DENIED/407 4411 CONNECT crt.sh:443 - HIER_NONE/- text/html
TCP_DENIED/200 0 CONNECT crt.sh:443 PROSPER2\\jinji.jiro HIER_NONE/- -
NONE/403 4622 GET https://crt.sh/ PROSPER2\\jinji.jiro HIER_NONE/- text/html
```

**認証要求にこたえられない場合**
コード 407 で認証要求が発せられ、応じられないので、クライアントとしてエラーになる。（ブラウザのエラー画面）

```
TCP_DENIED/407 4061 CONNECT ugtop.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4423 CONNECT ugtop.com:443 - HIER_NONE/- text/html
TCP_DENIED/407 4750 CONNECT ugtop.com:443 PROSPER2\\administrator HIER_NONE/- text/html
```


# 中身の解説

## Dockerfile

Dockerfileの順番で解説していきます。

イメージCentOS8を利用してます。
NTLM認証によるAD連携をSSOで行うため、sambaとwinbindを入れています。
最後にSSLインターセプトのための証明書を保管するディレクトリを作成しています。

```docker:Dockerfile
FROM centos:centos8
RUN  ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime ; \
     dnf -y update ; dnf -y install epel-release rsyslog logrotate cronie ; \
     rm -f /etc/logrotate.d/syslog ; \
     dnf -y install squid samba samba-winbind openldap-clients authselect samba-winbind-clients ; \
     mkdir /etc/squid/certs ;\
     systemctl enable squid
```

なお、手動で実施すると、以下のような出力になります。
（最初はディレクトリが無かったのでエラーになっています）

```sh
# /usr/lib64/squid/security_file_certgen -c -s /var/local/squid/ssl_db -M 4MB
Initialization SSL db...
/usr/lib64/squid/security_file_certgen: Cannot create /var/local/squid/ssl_db
# mkdir /var/local/squid
# chown squid.squid /var/local/squid
# /usr/lib64/squid/security_file_certgen -c -s /var/local/squid/ssl_db -M 4MB
Initialization SSL db...
Done
```

ここは必要なファイルをローカルからコンテナへコピーしているだけです。
ファイルは空でもよいですが、ファイル自体が存在していないとエラーになります。

```docker:Dockerfile
COPY squid.conf /etc/squid
COPY icacert.pem /etc/squid/certs
COPY icaprivkey.pem /etc/squid/certs
COPY squid_log /etc/logrotate.d
COPY blacklist /etc/squid
COPY whitelist /etc/squid
COPY permlist  /etc/squid
COPY intralist /etc/squid
COPY rsyslog.conf /etc
COPY smb.conf /etc/samba
COPY docker-entrypoint.sh /usr/local/bin/
```

squidでSSLインターセプトするため、一時的にsquid自身がアクセス先のサーバ証明書を作成します。
そのサーバ証明書を入れておくディレクトリの作成と、ディレクトリの初期化を行います。
squidがアクセスする必要があるので、オーナーを変更します。

```docker:Dockerfile
RUN  mkdir /var/local/squid ;\
     /usr/lib64/squid/security_file_certgen -c -s /var/local/squid/ssl_db -M 4MB ;\
     chown -R squid.squid /var/local/squid ;\
```

初回起動時の処理を行うためのヘルパースクリプトをコンテナ内にコピーしています。

```docker:Dockerfile
     ln -s usr/local/bin/docker-entrypoint.sh /
ENTRYPOINT ["docker-entrypoint.sh"]
CMD [ "/usr/sbin/init" ]
```

## docker-entrypoint.sh

初回起動時のみ処理させたいものをここにまとめています。
ヘルパースクリプトの動作は **[dockerで初回起動時のみ特定の処理を行うヘルパースクリプト](https://qiita.com/bashaway/items/e6279ba432d18c2d4299)** に書きました。

smbとwinbindはインストールしただけでは、enableになっていないので、それを初回起動の判断条件としています。
認証にwinbindを利用するコマンドを実施後、 `net ads join -U` で自身のコンピュータをADに登録します。
登録時はドメインユーザであればOKですので、検索用に作成したユーザを指定しています。
その後、sambaとwinbindを有効化しています。

```sh:docker-entrypoint.sh
#!/bin/sh

if [ ! -e /etc/systemd/system/multi-user.target.wants/smb.service ] ; then
  authselect select winbind --force
  net ads join -U searchuser%s3arch#PWD
  systemctl enable smb
  systemctl enable winbind
  systemctl start smb
  systemctl start winbind
fi

exec "$@"
```

なお、手動で実施すると、以下のような出力になります。

```
# net ads join -U searchuser%s3arch#PWD
Using short domain name -- PROSPER2
Joined 'PROXY-AD' to dns domain 'prosper2.net'
No DNS domain configured for proxy-ad. Unable to perform DNS Update.
DNS update failed: NT_STATUS_INVALID_PARAMETER
```

エラーっぽい出力になっていますが、以下のようにコンピュータが登録されます。
[![Screenshot from Gyazo](https://gyazo.com/7c6d48799633c44d130b95a2f6a6e5f5/raw)](https://gyazo.com/7c6d48799633c44d130b95a2f6a6e5f5)

## squid.conf

認証がらみが多く出てきます。
各セクションごとに説明しますが、コメントは外しています。

NTLM認証のヘルパーを使います。
以下設定では子プロセスを５としているので、大量のユーザで利用する場合は、チューニングが必要です。

```:squid.conf
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 5
```

ここは、SSOのユーザがどのセキュリティグループに所属しているのかを `ext_ldap_group_acl` でチェックします。
セキュリティグループがProxyUnlimitなら、squid内でgr_unlimitというaclを定義しています。
セキュリティグループがProxyLimitなら、squid内でgr_limitというaclを定義しています。
このままだと、どちらのセキュリティグループにも所属していないと、後にでてくる http_access で不具合がでます。
なので、 `ext_ldap_group_acl` を再度処理して、SSOユーザがOU=employeeに所属していれば、 `gr_employee` をいうaclを定義しています。
ベースDNをそのままにして、検索フィルタでOUを抜き出したいのですが、OU=employee配下のユーザでOU=employee配下のセキュリティグループに所属していないと、memberOf属性で検索ができない。加えて、DN属性にはワイルドカードが利用できないので、 `CN=*,OU=employee,DC=prosper2,DC=net` という検索ができない。そのため、このような回避策をしています。

```:squid.conf
external_acl_type security_group %LOGIN /usr/lib64/squid/ext_ldap_group_acl -v 3 -P -R -S -b "ou=employee,dc=prosper2,dc=net" -D searchuser@prosper2.net -w s3arch#PWD -h 10.254.10.241 -f '(&(objectclass=person)(sAMAccountName=%u)(memberOf=CN=%g,ou=employee,dc=prosper2,dc=net))'

external_acl_type ou_check %LOGIN /usr/lib64/squid/ext_ldap_group_acl -v 3 -P -R -S -b "ou=employee,dc=prosper2,dc=net" -D searchuser@prosper2.net -w s3arch#PWD -h 10.254.10.241 -f '(&(objectclass=person)(sAMAccountName=%u))'

acl gr_unlimit   external security_group ProxyUnlimit
acl gr_limit     external security_group ProxyLimit
acl gr_employee  external ou_check       employee
```

`ext_ldap_group_acl` のオプションなどは、以下のとおりです。

```
# LDAP search helper : check ActiveDirectory Security Group
#  -v 3  : use LDAP version 3
#  -P    : persistent LDAP connection
#  -R    : do not follow referrals
#  -S    : Strip Domain name
#  -b    : Base DN (search group)
#  -D -w : bind DN (search user) and password
#  -h    : LDAP server (AD DS)
#  -f    : filter %u:User %g:Gourp
#  %LOGIN : SSO login user
```

このあたりは、デフォルトの動作とほぼ同じです。
ただし、proxyで許可するポートを http/https/ftp に限定しています。

```:squid.conf
acl manager proto cache_object
acl localhost src localhost
acl localhost src 127.0.0.1/32

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

# Allow cache
http_access allow localhost manager
http_access deny manager

# Deny not Safe_ports
http_access deny !Safe_ports

# Deny CONNECT request on not SSL_ports
http_access deny CONNECT !SSL_ports
```

squidの条件判定はFWなんかと同じで、上からチェックしてマッチしたらそこで終了です。
前述した `ext_ldap_group_acl` は http_access句でチェックされようとするタイミングで発動するため、blacklistとwhitelistはldap処理の前にもってきています。

```:squid.conf
# Deny Blacklist sites
acl blacklist  url_regex -i "/etc/squid/blacklist"
http_access deny blacklist

# Allow Whitelist sites
acl whitelist  url_regex -i "/etc/squid/whitelist"
http_access allow whitelist
```

ドメインユーザでなければ拒否します。（ホワイトリストは前述でallowのため、影響ありません。）

```:squid.conf
# Deny not Domain User
http_access deny !gr_unlimit !gr_limit !gr_employee
```

セキュリティグループ：ProxyUnlimit は、接続先によらず許可です。

```:squid.conf
# permit : ProxyUnlimit
http_access allow gr_unlimit
```

セキュリティグループ：ProxyLimit は、permlistにあるサイトは許可です。

```:squid.conf
# permit : ProxyLimit and permlist
acl permlist   url_regex -i "/etc/squid/permlist"
http_access allow gr_limit permlist
```

OU：employeeのユーザはintralistにあるサイトは許可です。

```:squid.conf
# permit : No security gourp and intralist
acl intralist  url_regex -i "/etc/squid/intralist"
http_access allow gr_employee intralist
```

これまでに許可されなかったクライアントは拒否です。

```:squid.conf
# deny : default
http_access deny all
```


待ち受けを8081/tcpとして、SSL_BUMPしています。
SSL_BUMPは子プロセスを５としているので、大量のユーザで利用する場合は、チューニングが必要です。
whitelistはSSL_BUMPせず、そのまま転送します。（これしないと yum でエラー出る）

```:squid.conf
http_port 8081 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/squid/certs/icacert.pem key=/etc/squid/certs/icaprivkey.pem
sslcrtd_program /usr/lib64/squid/security_file_certgen -s /var/local/squid/ssl_db -M 4MB
sslcrtd_children 5
ssl_bump bump !whitelist
sslproxy_cert_error allow intralist
sslproxy_cert_error deny all
```

あとはデフォルトのまま。

```:squid.conf
visible_hostname proxy-ad

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 .               0       20%     4320
```


# トラブルシューティング

winbindがうまく動作しない場合、ldapフィルタが思うように動作しない場合など、以下の通りチェックしてみます。


## winbindの動作

正常に接続できるかの確認

```sh
# wbinfo -t
checking the trust secret for domain PROSPER2 via RPC calls succeeded
```

ユーザリストが取得できるか

```sh
# wbinfo -u
PROSPER2\administrator
PROSPER2\guest
PROSPER2\krbtgt
PROSPER2\aad_7dfc1e6f942a
PROSPER2\msol_7dfc1e6f942a
PROSPER2\soumu.taro
PROSPER2\jinji.jiro
PROSPER2\josys.saburo
PROSPER2\searchuser
```

指定ユーザで認証できるか

```sh
# wbinfo -a PROSPER2.NET\\searchuser%s3arch#PWD
plaintext password authentication succeeded
challenge/response password authentication succeeded
```

## ldapsearch

windowsのログインユーザを指定して、対象ユーザの情報を表示

```
# ldapsearch -b "dc=prosper2,dc=net" -D searchuser@prosper2.net -w s3arch#PWD -h 10.254.10.241   "sAMAccountName=soumu.taro" 
```

フィルタを組み合わせて、対象ユーザの情報を表示

```
# ldapsearch -b "dc=prosper2,dc=net" -D searchuser@prosper2.net -w s3arch#PWD -h 10.254.10.241  \
  '(&(objectclass=person)(sAMAccountName=soumu.taro)(memberOf=CN=ProxyUnlimit,OU=employee,DC=prosper2,DC=net))'
```

フィルタを組み合わせて、対象ユーザの情報を表示
（この場合、jinji.jiroはProxyUnlimitのmemberOfではないため、表示されない）

```
# ldapsearch -b "dc=prosper2,dc=net" -D searchuser@prosper2.net -w s3arch#PWD -h 10.254.10.241  \
  '(&(objectclass=person)(sAMAccountName=jinji.jiro)(memberOf=CN=ProxyUnlimit,OU=employee,DC=prosper2,DC=net))'
```

## ext_ldap_group_acl

squid.conf で記載しているコマンドは、そのままコマンドラインで確認できる。
ログイン名とセキュリティグループの組み合わせが正しいかをチェック

```
# /usr/lib64/squid/ext_ldap_group_acl -v 3 -P -R -S -b "dc=prosper2,dc=net" \
  -D searchuser@prosper2.net -w s3arch#PWD -h 10.254.10.241 \
  -f '(&(objectclass=person)(sAMAccountName=%u)(memberOf=CN=%g,ou=employee,dc=prosper2,dc=net))'
soumu.taro   ProxyUnlimit
OK
jinji.jiro   ProxyUnlimit
ERR
josys.saburo ProxyUnlimit
ERR
soumu.taro   ProxyLimit
ERR
jinji.jiro   ProxyLimit
OK
josys.saburo ProxyLimit
ERR
```

ログイン名とがOU:employeeに存在するかをチェック
（引数を１つしか指定していないため、第2引数はなんの文字列でもかまわない）

```
# /usr/lib64/squid/ext_ldap_group_acl -v 3 -P -R -S -b "ou=employee,dc=prosper2,dc=net" \
  -D searchuser@prosper2.net -w s3arch#PWD -h 10.254.10.241 \
  -f '(&(objectclass=person)(sAMAccountName=%u))'
soumu.taro   ABCDEFG
OK
jinji.jiro   ABCDEFG
OK
josys.saburo ABCDEFG
OK
searchuser   ABCDEFG
ERR
```

# さいごに
前回チャレンジしたのが2014年の **[squidとActiveDirectoryの連携](http://www.prosper2.org/devwiki/index.php?squid%E3%81%A8ActiveDirectory%E3%81%AE%E9%80%A3%E6%90%BA)** でした。
今回はSSLインターセプトを追加してDockerコンテナで作成しましたが、squid4.4になっても大きく変わっていなかったので、比較的すんなり検証できました。

次はKerberos認証にチャレンジ予定です。


# 出典
http://www.prosper2.org/devwiki/index.php?squid%E3%81%A8ActiveDirectory%E3%81%AE%E9%80%A3%E6%90%BA
https://www7390uo.sakura.ne.jp/wordpress/archives/777
https://smoothnet.org/squid-v3-5-proxy-with-ssl-bump/
https://social.technet.microsoft.com/Forums/lync/en-US/24e0eec0-7984-4bc3-b2e8-319be2d57112/ldap-filter-limiting-to-specific-ou
https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx