Help us understand the problem. What is going on with this article?

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

概要

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

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

Screenshot from Gyazo

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

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

検証環境

機器など

  • 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

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

証明書の準備

参考エントリ
ActiveDirectory証明機関(ADCS)から中間CAを生成する
OpenSSLでプライベート認証局の構築(ルートCA、中間CA)

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

dockerネットワークのIPv6化

参考エントリ
dockerネットワークのipv6対応方法と通信経路の整理

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

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
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 で権限付与してください。

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

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

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

証明書

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

コンテナの作成

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

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

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

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

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

# docker-compose build
# docker-compose up -d

動作確認

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

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

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

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

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

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

インターセプト後の証明書

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

全許可ユーザ(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://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

システムユーザ(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インターセプトのための証明書を保管するディレクトリを作成しています。

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

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

# /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

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

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がアクセスする必要があるので、オーナーを変更します。

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 ;\

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

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

docker-entrypoint.sh

初回起動時のみ処理させたいものをここにまとめています。
ヘルパースクリプトの動作は dockerで初回起動時のみ特定の処理を行うヘルパースクリプト に書きました。

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

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

squid.conf

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

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

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は子プロセスを5としているので、大量のユーザで利用する場合は、チューニングが必要です。
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の動作

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

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

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

# 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

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

# 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に存在するかをチェック
(引数を1つしか指定していないため、第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の連携 でした。
今回は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

bashaway
2019/1/1よりQiita利用開始しました。よろしくお願いします。 趣味は自宅ラボ&ホビープログラム。いまはcactiのcisco用コンフィグ取得プラグインの作成中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away