証明書のなりすましのないHTTPSフィルタリングを備えたSquid、Active Directory 2012R2 + WPADとの統合

このマニュアルは、ユーザーのトラフィック(httpおよびhttps)を監視する実稼働の必要性と、ホワイトリストおよびブラックリストへのアクセスの分布に関連して書かれています。 記事は基礎として取り上げられました: this and thisで、 peek-n-spliceテクノロジーが使用されました。 これらの記事では、構成にはsquidをゲートウェイとして使用するホストが含まれます。構成を完了した後、Active Directoryからグループにアクセス権を配布できる本格的なプロキシサーバーを取得します。 構成が完了すると、プロキシサーバーの設定をユーザーに転送するという質問が発生しました。 ラップトップはオフィスに持ち帰られることが多いという事実を考慮して、全体のアイデアは行き詰まりました。 当初は、DHCPを介してプロキシサーバー設定を発行するオプションが検討されましたが、最適ではありません。異なるサブネットおよび異なる機器のオフィスでは、WPADがこの状況から抜け出しました。 このテクノロジーについて簡単に説明すると、OS Windows上のクライアントマシンは、ネットワークで動作するための構成ファイルを要求するためにwpad.example.ru(最大3レベルドメイン)という名前のホストを探していると言えます。 この原則に基づいて、Webサーバーを上げる必要がありますが、これはwpad.datファイルを提供するだけで、プロキシサーバーを使用してホストでWebサーバーを上げ(完了)、DNSサーバーのプロキシサーバーでcname wpadを作成できます。 。 多数の選択肢があるため、統計を収集および表示する機能を持つプロキシサーバーを使用することをお勧めします。 いくつかの保守的な考慮事項により、SARGを選択することが決定されました。 最大100人の従業員がいるオフィスでは、設定が簡単で、かなり受け入れられる統計情報です。

内容


1.1簡略化されたWPADスキーム


-Windows OS上のクライアントは、ホストwpad.example.ruへのリクエストでDNSサーバーに接続し、DNSサーバー名に対応するレコードは、どこへ行くかを示します。 次に、クライアントは、設定ファイルの要求でwpad.example.ruに連絡します。 それを受け取ると、それはその中の指示に従って行動し始めます。

1.2この技術の良いところ


長所:

-すべてのGPOを介してプロキシアドレスを登録する必要はありません。
-従業員のモビリティ(オフィス外のインターネットへのアクセス)
-このテクノロジーの使用をオフにするには、[インターネットオプション]-[設定を自動的に取得する]でオフにします。

短所:

-「設定の自動取得」はすべてのユーザーに対して無効にできるため、この機能はオンのままにしておくとGPOを介した変更を防ぐことができます

1.3 Squid Peek-n-splice-仕組み


従業員がプロキシ経由でhttpsでサイトにアクセスしようとしています。 暗号化された接続をインストールすると、「あいさつ」が発生します。これは明確な形式で送信され、プロキシサーバーはそれを傍受し、設定に基づいて、squidは接続を許可または拒否します。 つまり 「挨拶」を見るためにインターセプトされ、接続を許可またはドロップしました。

1.4ピークアンドスプライスの長所と短所


長所:

-これはMITM攻撃ではなく、銀行のクライアントには問題ありません
-https経由でリクエストされたサイトの統計でのドメイン名の表示

短所:

-残念ながら、MITM攻撃中にどのWebページが開かれたかを正確に確認することは不可能です
-この設定はCentOSでのみうまく機能しました(しばらくの間カーネルパニックが発生した後、Debianで問題が発生しました)

1.5そして、今、与えられたものに注目する価値があります


-Active Directory 2012R2(ユーザー認証方法-Kerberos)10.0.0.9のホスト
-CentOS 7(x64)のホスト(別名wpad.datアップロード用のWebサーバー、別名プロキシサーバー)10.0.0.10
-Windowsでホストをテストして、操作10.0.0.11をテストします
「行こう」ガガーリン・ユ・ア

2オペレーティングシステムの設定とSquidのインストール


CentOSのインストールプロセスを説明する意味はありません。 したがって、CentOS 7 x64を新たにインストールしたことに留意してください。 したがって、Squidがhttpトラフィックとhttpsトラフィックで同等に機能するには、次のものが必要です。

2.1このようなパラメーターを使用してSquidをコンパイルする必要があります


イカ-v
$ squid -v
Squid Cache:バージョン3.5.16
サービス名:squid
設定オプション: '--build = x86_64-redhat-linux-gnu' '--host = x86_64-redhat-linux-gnu' '--program-prefix =' '--prefix = / usr' '--exec- prefix = / usr '' --bindir = / usr / bin '' --sbindir = / usr / sbin '' --sysconfdir = / etc '' --datadir = / usr / share '' --includedir = / usr / include '' --libdir = / usr / lib64 '' --libexecdir = / usr / libexec '' --sharedstatedir = / var / lib '' --mandir = / usr / share / man '' --infodir = / usr / share / info '' --verbose '' --exec_prefix = / usr '' --libexecdir = / usr / lib64 / squid '' --localstatedir = / var '' --datadir = / usr / share / squid '' --sysconfdir = / etc / squid '' --with-logdir = $(localstatedir)/ log / squid '' --with-pidfile = $(localstatedir)/run/squid.pid '' --disable -dependency-tracking '' --enable-follow-x-forwarded-for '' --enable-auth '' --enable-auth-basic = DB、LDAP、NCSA、NIS、PAM、POP3、RADIUS、SASL、 SMB、getpwnam、fake '' --enable-auth-ntlm = smb_lm、fake '' --enable-auth-digest = file、LDAP、eDirectory '' --enable-auth-negotiate = kerberos、wrapper ''- enable-external-acl-helpers = wbinfo_group、kerberos_ldap_group、LDAP_group、delayer、file_userip、SQL _session、unix_group、session、time_quota '' --enable-cache-digests '' --enable-cachemgr-hostname = localhost '' --enable-delay-pools '' --enable-epoll '' --enable-icap -client '' --enable-ident-lookups '' --enable-linux-netfilter '' --enable-removal-policies = heap、lru '' --enable-snmp '' --enable-storeio = aufs、 diskd、ufs、rock '' --enable-wccpv2 '' --enable-esi '' --enable-ssl-crtd '' --enable-icmp '' --with-aio '' --with-default- user = squid '' --with-filedescriptors = 16384 '' --with-dl '' --with-openssl '' --with-pthreads '' --with-included-ltdl '' --disable-arch-ネイティブ '' --enable-ecap '' --without-nettle '' build_alias = x86_64-redhat-linux-gnu '' host_alias = x86_64-redhat-linux-gnu '' CFLAGS = -O2 -g -pipe -Wall- Wp、-D_FORTIFY_SOURCE = 2 -fexceptions -fstack-protector-strong --param = ssp-buffer-size = 4 -grecord-gcc-switches -m64 -mtune = generic '' LDFLAGS = -Wl、-z、relro '' CXXFLAGS = -O2 -g -pipe -Wall -Wp、-D_FORTIFY_SOURCE = 2 -fexceptions -fstack-protector-strong --param = ssp-buffer-size = 4 -grecord-gcc-switches -m64 -mtune = generic -fP IC '' PKG_CONFIG_PATH =:/ usr / lib64 / pkgconfig:/ usr / share / pkgconfig '—enable-ltdl-convenience

または、アセンブルされたsquidとその依存関係を含むアーカイブをダウンロードできます。

2.2公式リポジトリから必要なパッケージをインストールする


squidをインストールするにはいくつかの依存関係が必要であることに注意してください。 残念ながら、CentOSの公式リポジトリはかなり少ないため、一部のパッケージは非公式のものからダウンロードする必要があります。 リポジトリから必要なパッケージをインストールします。

# yum install -y libtool-ltdl perl-DBI perl-Digest-MD5 cyrus-sasl-gssapi krb5-workstation 

2.3 Squidおよびオプションパッケージの手動インストール


 # rmp -Uvh squid-3.5.8-4.el7.centos.x86_64.rpm libecap-1.0.0-3.el7.centos.x86_64.rpm squid-helpers-3.5.8-4.el7.centos.x86_64.rpm perl-Crypt-OpenSSL-X509-1.803-4.el7.x86_64.rpm 

何かが間違っている場合、不足しているものが端末に表示されます。

2.4スワップディレクトリのパーミッションを設定する


 # chown squid:squid /var/spool/squid 

2.5構成ファイル/etc/squid/squid.conf


squid.conf
###ケルベロスの交渉
auth_paramネゴシエートプログラム/ usr / lib64 / squid / negotiate_kerberos_auth -s HTTP/sq.example.ru@EXAMPLE.RU
auth_paramは子60をネゴシエートします
auth_paramネゴシエートkeep_aliveオフ

external_acl_type inet_medium ttl = 300 negative_ttl = 60%LOGIN / usr / lib64 / squid / ext_kerberos_ldap_group_acl -g Internet-medium@EXAMPLE.RU
external_acl_type inet_full ttl = 300 negative_ttl = 60%LOGIN / usr / lib64 / squid / ext_kerberos_ldap_group_acl -g Internet-full@EXAMPLE.RU
external_acl_type inet_low ttl = 300 negative_ttl = 60%LOGIN / usr / lib64 / squid / ext_kerberos_ldap_group_acl -g Internet-low@EXAMPLE.RU

acl localnet src 10.0.0.0/24
acl localnet src 192.168.0.0/24

acl my_full外部inet_full
acl my_medium外部inet_medium
acl my_low外部inet_low
acl auth proxy_auth必須

#デフォルトの443に加えて、オンラインビジネスでは追加が必要です。 ポート9443
acl SSL_portsポート443 9443
acl Safe_portsポート80#http
acl Safe_portsポート21#ftp
acl Safe_portsポート443#https
acl Safe_ports port 70#gopher
acl Safe_portsポート210#wais
acl Safe_ports port 1025-65535#未登録ポート
acl Safe_portsポート280#http-mgmt
acl Safe_portsポート488#gss-http
acl Safe_portsポート591#ファイルメーカー
acl Safe_ports port 777#multiling http
acl CONNECTメソッドCONNECT

#この構成では、ホワイトリストはユーザーグループInternet-low@EXAMPLE.RUの許可されたサイトのリストです(whitelist.txtにあるサイトのみにアクセスできます)
#また、blocked_http.txt-Internet-medium@EXAMPLE.RUグループの禁止サイトのリスト(blocked_http.txt内のサイトを除くすべてのサイトにアクセスできます)
acl white_list dstdomain "/etc/squid/whitelist.txt"
acl black_list dstdomain "/etc/squid/blocked_http.txt"
dns_nameservers 10.0.0.9

#アクセス規則

http_access deny!Safe_ports
http_access deny CONNECT!SSL_ports
http_access allow localhost manager
http_access拒否マネージャー
http_access deny!auth

http_access deny my_medium black_list
http_access allow my_medium
http_access allow my_low white_list
http_access deny my_low all
http_access allow my_full
#ローカルホストを許可
http_access allow localhost

#他のすべてを禁止する
http_accessすべて拒否

#クライアントホストがプロキシサーバーと対話するための不透明なポート

http_port 10.0.0.10:3130 options = NO_SSLv3:NO_SSLv2

always_directすべて許可
sslproxy_cert_errorすべて許可
sslproxy_flags DONT_VERIFY_PEER

#このオプションは、peek-n-spliceが正しく機能するために必要です。 blocked_https.txtファイル自体は何にも影響しませんが、空にしないでください。 魔法。


ACLブロックssl :: server_name "/etc/squid/blocked_https.txt"
acl step1 at_step sslbump1
ssl_bumpピークステップ1

#クライアントが禁止されたリソースにアクセスした場合、接続を終了します
ssl_bump終了ブロック
ssl_bump splice all

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

cache_dir aufs / var / spool / squid 20000 49 256
maximum_object_size 61440 KB
minimum_object_size 3 KB

#httpd_suppress_version_string on
#visible_hostname PROXYSERVER

cache_swap_low 90
cache_swap_high 95
maximum_object_size_in_memory 512 KB
memory_replacement_policy lru
logfile_rotate 4

2.6最初に、このコンテンツにファイル/ etc / hostsを持ってくる必要があります


 127.0.0.1 localohost 10.0.0.10 sq.example.ru sq 

2.7 selinuxの構成


ファイル/ etc / selinux / configの値は次のとおりです。
 SELINUX=enforcing 

selinuxを使用するためのパッケージをインストールします。
 # yum install policycoreutils-python 

selinuxルールを追加する

squidへの接続を許可します。
 # setsebool -P squid_connect_any on 

Kerberosを許可:
 # setsebool -P allow_kerberos on 

ポート3130でのsquidへの接続を許可します。
 # semanage port -a -t squid_port_t -p tcp 3130 

selinux設定を変更したら、システムを再起動してそれらを適用する必要があります。
 # reboot 


2.8スワップ生成


 # squid -z 

2.9 squidデーモンの有効化、設定ファイルの確認


 # systemctl enable squid # squid -k parse 

警告とエラーはありません。 何かがある場合は、設定を確認する必要があります。

2.10トラフィック転送を許可する


 # echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf 

その場で設定を適用します。
 # sysctl -p 


3 Active Directory 2012R2ドメインコントローラーとの統合


ドメインユーザーがKerberosプロトコルを使用してプロキシサーバーにログインできるように、ドメインコントローラーとの統合が必要です。 最も合理的な解決策は、この方法が最も安全であり、承認が自動的に行われるという事実を考慮して、Kerberosのみを残すことです。 ドメイン外にあるクライアントマシンについては、ここで問題はありません。認証ポップアップウィンドウでログインとパスワードを手動で入力できます。 チェック済み、動作します。

3.1構成ファイル/etc/krb5.conf


構成ファイル/etc/krb5.confは、次のように縮小する必要があります。

krb5.conf
[libdefaults]
default_realm = EXAMPLE.RU
ticket_lifetime = 24h
default_keytab_name = /etc/krb5.keytab

[レルム]
EXAMPLE.RU = {
kdc = dc1.example.ru
admin_server = dc1.example.ru
default_domain = example.ru
}

[domain_realm]
.example.ru = EXAMPLE.RU
example.ru = EXAMPLE.RU

3.2 DNSレコードの作成


Active DirectoryがDNSに密接に結びついていることは誰もが知っていることであり、認証が正しく機能するためには、ホスト名とそのIPアドレス(ホストアドレス(AまたはAAA))を作成する必要があります)

3.3ドメイン統合オプション


そのため、ドメイン統合オプションには2つの椅子があります。 最初のオプション-Windows( ktpass )を使用し、2番目のオプション-LinuxMsktutil )を使用します。 Windowsオプションは、 squidユーザーのパスワードの有効期限を無効にできるという点で優れています。 Linuxバージョンは、コンピューターアカウントを作成することでドメインに入力できるため、優れています。

3.3.1 Windows統合


ADでユーザーを作成します(例: squid)
ここでkrb5.keytabを生成します 。 管理者権限を持つドメインコントローラーのコマンドプロンプトで、次のコマンドを実行する必要があります。

 C:\Windows\system32> ktpass -princ HTTP/sq.example.ru@EXAMPLE.RU -mapuser squid@EXAMPLE.RU -crypto rc4-hmac-nt -pass Pa$$wd12 -ptype KRB5_NT_PRINCIPAL -out C:\ 

krb5.keytab ファイル自体は、 sq.example.ru上の/ etcディレクトリに移動できます (WinSCPを使用できます)。

3.3.2 Linuxの統合


squidと依存関係のあるアーカイブには、msktutilも添付されています。インストールしてください:

 # rpm -Uhv msktutil-0.5.1-2.el7.x86_64.rpm 


次のコマンドを実行します。

 # msktutil -c -b "CN=COMPUTERS" -s HTTP/sq.example.ru -k /etc/krb5.keytab --computer-name sq-k --upn HTTP/sq.example.ru --server dc1.example.ru --verbose --enctypes 28 

成功した場合、コマンドの出力は素晴らしいものになります。ここにはポイントがありません。 エラーと警告はすべきではありません。 --computer-name sq-kはタイプミスではないことに注意する価値があります。 ホスト名は異なっている必要があります。

コンピューターアカウントのパスワードを更新する必要があるため、これはcronを使用して実行できます。
  # crontab -e 

タスクを追加する必要があります。
 00 3 * * * msktutil --auto-update --verbose --computer-name sq-k 


3.4 krb5.keytabファイルの推奨される許可


krb5.keytabを移動した後、ファイルのパーミッションを下げることをお勧めします

 # chown squid:squid /etc/krb5.keytab && chmod 644 /etc/krb5.keytab 

3.5 ADアクセスグループ


OU ユーザーの ActiveDirectoryではインターネットアクセスの配布に応じて Internet- full、 Internet-mediumInternet-lowの 3つのグループを作成する必要があります。

3.6認可チェック


/etc/krb5.keytabファイルを使用したActive Directoryでの承認の確認

 # kinit -V -k -t /etc/krb5.keytab HTTP/sq.example.ru@EXAMPLE.RU 

コマンドからの出力は次のようになります。

 Using default cache: /tmp/krb5cc_0 Using principal: HTTP/sq.example.ru@EXAMPLE.RU Using keytab: /etc/krb5.keytab Authenticated to Kerberos v5 

また、 klistは次を表示する必要があります。

klist
チケットキャッシュ:FILE:/ tmp / krb5cc_0
デフォルトのプリンシパル:HTTP/sq.example.ru@EXAMPLE.RU

有効な開始有効期限サービスプリンシパル
10/09/2016 10:19:20 10/10/2016 08:19:20 krbtgt/EXAMPLE.RU@EXAMPLE.RU
10/10/2016 10:19:20 PMまで更新

これでSquidのセットアップはほぼ完了しました。ホストを再起動して設定を適用します。 テストのためにリブートした後、ポート3130を指定することによりsq.example.ru設定でプロキシを手動で登録できます。

4 WPAD


4.1 apache2 Webサーバーのインストールと設定


Webサーバーのインストール:

 # yum install -y httpd 

インストール後、スタートアップに含めます:

 # systemctl enable httpd 

以下を開始します。

 # systemctl start httpd 

ブラウザでsq.example.ruドメイン名を開こうとすると、apache2テストページが開きます。

次に、次の内容の/ var / www / html / wpad.datファイルを作成する必要があります。

wpad.dat
関数FindProxyForURL(URL、ホスト)
{
// var ip_host = dnsResolve(ホスト);
// var localnet = "192.168.0.0";
// var localhost = "127.0.0.0";
// var localnet = "10.0.0.0";
if(isInNet(host、 "192.168.0.0"、 "255.255.255.0")||
isInNet(ホスト、「10.0.0.0」、「255.255.255.0」)||
isInNet(ホスト、「127.0.0.0」、「255.0.0.0」)||
shExpMatch(ホスト、「* .example.ru」))
{「DIRECT」を返す; }
if(dnsDomainIs(host、 "* .inet-example.ru"))
{「DIRECT」を返す; }
return "PROXY sq.exmaple.ru:3130";
}

4.2 wpad.datファイルの説明


デフォルトでは、/ var / www / html / wpad.datディレクトリで、ファイルは追加のapache2設定なしで全員に与えられます。これは、Windows上のクライアントマシンとの正しい対話に必要です。



 if (isInNet( host, "192.168.0.0", "255.255.255.0") || isInNet( host, "10.0.0.0", "255.255.255.0") || 

これは、192.168.0.0 / 24、10.0.0.0 / 24、および127.0.0.0/8サブネット(後者はlocalhostにアクセスするときにサービスが正しく機能するために必要です)上のホストへの呼び出しが直接転送され、.exampleドメインホストへの接続も直接転送されることを意味します.ru:

行:

 if (dnsDomainIs( host, "*.inet-example.ru" )) { return "DIRECT"; } 

ドメイン名にアクセスするときに.inet-example.ruが直接発生することを示します

要求されたリソースが上記の条件に該当しない場合、次のことが当てはまります。

 return "PROXY sq.exmaple.ru:3130"; 

4.3 CNAMEの作成


Active Directory DNSサーバーで、 sq.example.ruに cname wpad (FQDN wpad.example.ru)を作成します。

確認するには、ブラウザでwpad / wpad.datを開く必要があり、wpad.datファイルが自動的にダウンロードされます。 したがって、すべてのホストは指定されたファイルをダウンロードし、コンテンツから続行します。 ファイルがダウンロードされるように、Windows OS上のドメイン内のすべてのコンピューターを再ログまたは再起動することをお勧めします。

5統計


5.1ソースからのSARGのインストール


gccがまだインストールされていない場合、今がその時です。

 # yum install -y gcc gd gd-devel make wget # wget http://liquidtelecom.dl.sourceforge.net/project/sarg/sarg/sarg-2.3.10/sarg-2.3.10.tar.gz # tar -xvzf sarg-2.3.10.tar.gz # cd sarg-2.3.10 # ./configure # make 

po / Makefile.in.inファイルでは、gettextバージョンは0.18に指定されているため、makeインストール中にエラーが発生しないため、0.19に変更する必要があります。

 # make install 

5.2 SARGの構成


標準の設定ファイル/usr/local/etc/sarg.confをバックアップすることをお勧めします。

 # mv /usr/local/etc/sarg.conf /usr/local/etc/sarg.conf.default 

次に、次の内容でsarg.confファイルを作成します。

 access_log /var/log/squid/access.log output_dir /var/www/html/squid-reports date_format e overwrite_report yes language UTF-8 

5.3 cronを使用したレポートのスケジュール


 # crontab -e 

次の行を追加します。

 55 23 * * * /usr/local/bin/sarg -xd day-0 

この行は、毎日23:55にレポートが生成されることを示しています

5.4 Webサーバーの構成


以前にインストールされたWebサーバーでは、レポートを表示するタスクと、承認のためのログインとパスワードの入力を要求するタスクを割り当てることもできます。 次の内容で/etc/httpd/conf.d/sarg.confファイルを作成します。

sarg.conf
エイリアス/レポート/ var / www / html / squid-reports /

<ディレクトリ/ var / www / html / squid-reports />

AuthType Basic
AuthName「基本認証」
AuthUserFile /etc/httpd/conf/.htpasswd
有効なユーザーが必要
AddDefaultCharset UTF-8


5.5統計付きのサイトでの承認


認証のためのログインおよびパスワードファイルの生成

 # htpasswd -c /etc/httpd/conf/.htpasswd administrator 

apache2を再起動します

 # systemctl restart httpd 

sq.example.ru/reportsを開こうとすると、ログイン名とパスワードの入力を求められます。 認証が成功した場合、統計を表示できます。

6グループポリシー


ここのすべては曖昧であり、いくつかの機能に依存する場合があります。 現在のタスクでは、ユーザープロキシサーバーのインストール、または「設定の自動検出」の無効化の可能性を除外することが合理的な決定でした。

6.1 GPOの編集


プロキシサーバーの入力またはパラメーターの自動決定の設定の変更を禁止するには、グループポリシーを使用できます。 グループポリシーを作成し、 officeなどのOUに関連付けます。

グループポリシーの編集:

ユーザー→ポリシー→管理用テンプレート→Windowsコンポーネント→Internet Explorer

このディレクトリで、パラメータを見つけて「有効」ステータスに変換します。

「プロキシ設定の変更を禁止する」
「自動設定変更を無効にする」

結論として、私はこれを言うことができます、この構成は2016年の春から現在まで正常に機能しており、それ自体が優れていることが証明されています。 すべての質問にお答えできてうれしいです。

UPD No. 1:11/12/16
1ポート3128および3129の余分な行がsquid構成から削除されました。
2にはselinuxが含まれ、ルールが追加されました。
3証明書の生成がマニュアルから削除されました(それがなくても機能します)
4マイナーな修正
UPD No. 2:11.20.16
1 krb5.conf構成から余分な行が削除されました
2 Msktutilを介したADとの統合方法を追加
3追加された転送
4 squidと依存関係を含む更新されたアーカイブ

Source: https://habr.com/ru/post/J314918/


All Articles