Centos7 上の Squid をActive Directory と連携させ、ADのグループに登録されたユーザはデータセンタのProxyを経由してInternetへアクセス可能としつつ、Office365への通信はそもそも認証なしでクラウド上のManaged Proxy経由で接続させる

個別要件ごとに記事を分けて書こうかとも思ったんですが、面倒になったのでぜんぶひとまとめに書きます
わかりにくい場合はごめんなさい

今回作成するProxyサーバに求められる要件

  • Office365への通信は認証不要でクラウド上のManaged Proxy経由で接続
  • ADのグループに登録されたユーザはデータセンタに配置されたProxyを経由してInternetのすべてのサーバへのアクセスを可能とする

技術的なトライは2つ

  • 宛先ドメインに応じて上位プロキシを選択する
  • ADと連携し、指定したグループに属するユーザのみ利用可能とする

つまり、Squidによる宛先に応じた上位プロキシの振り分けと、AD連携、それもグループによる振り分け(?)を同時に満たすってことですね

yumで普通にインストールするだけなので、Squidの基本的なインストール方法は記載しません

宛先ドメインに応じて上位プロキシを選択する

このために必要なのは、Office365が使用するドメインのリストを作成しaclとして設定、cache_peer_access を使って宛先がリストに含まれる場合は指定した上位プロキシ(今回はクラウド上のManaged Proxy)経由での接続を許可する

# vi /etc/squid/squid.conf

#http_access allow localnet

acl whitelist dstdomain "/etc/squid/whitelist"

cache_peer [Managed ProxyのFQDN] parent [Managed Proxyのport] 0 no-query
cache_peer [DCのProxyのFQDN] parent [DCのProxyのport] 0 no-query #default proxy

cache_peer_access [Managed ProxyのFQDN] allow whitelist

never_direct allow all

以下ちょっとした解説

#http_access allow localnet

デフォルトで許可されているlocalnetからの通信はとりあえず不許可としておく
sqid.conf の書き方というか解釈のされ方としては、1行の中で書かれているものは and の条件で解釈し、各行はそれぞれ or で評価される
そのため、localnetからのアクセスを許可されてしまうと、その他でどれだけ制限をかけてもこの行のためにすべてが許可されてしまう
というわけでこの行はコメントにしておく

acl whitelist dstdomain "/etc/squid/whitelist"

まずはOffice365が使用するドメインのリストを作る
リストの中は
1行1ドメインとし、以下のページに記載されているドメインはすべてリストに入れたつもり

docs.microsoft.com

cache_peer [Managed ProxyのFQDN] parent [Managed Proxyのport] 0 no-query
cache_peer [DCのProxyのFQDN] parent [DCのProxyのport] 0 no-query #default proxy

上位プロキシをcache_peerとしてリスト化しておく
この際、Office365へのアクセスで使用する方を上に、その他すべての宛先へのアクセスに使用する方を下に書くと、下の方がデフォルトとされるとのこと

cache_peer_access [Managed ProxyのFQDN] allow whitelist

この書き方でOffice365でへのアクセスには認証を要求しないこととクラウド上のManaged Proxyを経由する設定を同時に行っている

ADと連携し、指定したグループに属するユーザのみ利用可能とする

Centos7のSquidをADと連携させるには、Squidのサーバをドメインにjoinさせる必要はないが、realmdのほか、 sssd、adcli、samba-common-toolsを追加でインストールした
正直全てが必要かどうかは不明だが、4つすべてがインストールされていない環境ではADへの接続ができなかった

# yum install realmd sssd adcli samba-common-tools

# vi /etc/squid/squid.conf

# Active Directory Auth
auth_param basic program /usr/lib64/squid/basic_ldap_auth -v3 -R -b "DC=[ドメイン],DC=local" -D "CN=[squid専用に作成した、権限を最小限に抑えたユーザ],CN=Users,DC=[ドメイン],DC=local" -W /etc/squid/secret -f "(&(sAMAccountName=%s)(objectClass=Person))" -h [認証に使用するドメインコントローラのFQDN]
auth_param basic children 5

external_acl_type ldap_group ttl=30 %LOGIN /usr/lib64/squid/ext_ldap_group_acl -v 3 -R -b "DC=[ドメイン],DC=local" -D "CN=[squid専用に作成した、権限を最小限に抑えたユーザ],CN=Users,DC=[ドメイン],DC=local" -W /etc/squid/secret -f '(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=Users,DC=[ドメイン],DC=local))' -h [ドメインコントローラのFQDN] -S

acl proxy_allow_group external ldap_group [ドメインに作成したグループ名]

http_access allow localnet proxy_allow_group


# And finally deny all other access to this proxy
http_access deny all

同じく以下解説

auth_param basic program /usr/lib64/squid/basic_ldap_auth -v3 -R -b "DC=[ドメイン],DC=local" -D "CN=[squid専用に作成した、権限を最小限に抑えたユーザ],CN=Users,DC=[ドメイン],DC=local" -W /etc/squid/secret -f "(&(sAMAccountName=%s)(objectClass=Person))" -h [認証に使用するドメインコントローラのFQDN]

この行では basic_ldap_auth というSquidが提供している外部コマンドを使ってユーザが入力するIDとパスワードの組み合わせを検証する方法を設定しますが、引数として以下を設定しています

  • v3:LDAPプロトコルのバージョン 3を使用する
  • R:Do not follow referrals ドメインコントローラが他のLDAPサーバに問い合わせをリダイレクトすることを許可しません
  • b:basedn 対象ドメインそのものの識別名
  • D:binddn ドメインコントローラへ接続する際に使用するユーザの識別名
  • W:secretfile 上記ユーザのパスワードを記載したファイルへのパス
  • f:LDAP search filter LDAPの検索に使用するフィルタ
  • h:認証に使用するドメインコントローラ

肝心のフィルタの意味としては

-f "(&(sAMAccountName=%s)(objectClass=Person))"

sAMAccountName が入力されたIDで、かつobjectClassがPersonのものに限定している

external_acl_type ldap_group ttl=30 %LOGIN /usr/lib64/squid/ext_ldap_group_acl -v 3 -R -b "DC=[ドメイン],DC=local" -D "CN=[squid専用に作成した、権限を最小限に抑えたユーザ],CN=Users,DC=[ドメイン],DC=local" -W /etc/squid/secret -f '(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=Users,DC=[ドメイン],DC=local))' -h [ドメインコントローラのFQDN] -S

この行では ext_ldap_group_acl という同じくSquidが提供している外部コマンドを使って、上記ユーザが対象グループに含まれているかどうかを確認している
引数の大半は basic_ldap_auth と共通

  • S:引数として渡されたIDからドメイン名を削る

フィルタの意味としては

  • f '(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=Users,DC=[ドメイン],DC=local))'

objectclass が Person で、sAMAccountName が入力されたユーザで、かつ対象のグループのメンバーであるように絞り込んでいる

acl proxy_allow_group external ldap_group [ドメインに作成したグループ名]

proxy_allow_groupというaclを設定し、対象のグループを指定している

http_access allow localnet proxy_allow_group

上の方で許可することをやめたlocalnetとandでAD認証かつ対象グループに含まれることを要求している

http_access deny all

一番下でこれを入れておくことで、この上で許可されたもの以外はすべて不許可としている


以下はとても参考になった
ありがとうございました

ITに関すること: [CentOS7] SquidでADと連携する方法
http://itsp0.blogspot.com/2017/09/centos7-squidad.html