Squid で安全なインターネットアクセス環境を構築する方法

こんにちは。情報システム部の松平です! 今回は社内ネットワーク内から安全にインターネット上の Web サービスを活用するためのプロキシ構築方法を紹介します。

1. Web プロキシの NAT に対する利点

企業では、ルータやファイアウォールなどの NAT 機能を利用して、社内ネットワーク内のコンピュータからインターネットにアクセスすることが多いのではないかと思います。
NAT の構成では、悪質なサイトなど、特定のサイトへのアクセスを IP アドレスでしかブロックできない場合があります。

IP アドレスでブロックした場合、AWSAkamai といった CDN まで対象に含めてしまうと、まったく関係のないサイトで利用されている CSS、JavaScript ファイルまでブロックしてしまうケースが出てきます。

そこで注目したいのが Web プロキシである Squid の活用です。 Web プロキシは、IP アドレスではなく FQDN でブロックが可能となっており、昨今の CDN を多用する Web サービスを安全に利用できます。 また、FQDN で接続ログが残るのも良い点になります。

2. Squid とは

Squid はコンピュータとサーバー間の通信を中継するプロキシサーバーソフトです。 様々なプロトコルに対応しており、 Web サービスへのアクセスに用いられる HTTP、HTTPS の通信を中継することができる Web プロキシサーバーになります。

3. 具体的な設定例

Squid は CentOS などの環境に簡単にインストールできます。インストール後、コンピュータ側のブラウザでプロキシの経由設定を行えば完了です。 ここでは CentOS 7.2 にインストールする手順を参考として記載します。

Squid を構築する

1) Squid をインストールする

yum -y install squid

2) Squid の設定ファイルを理解する

Squid では squid.conf ファイルを編集することでブラックリスト方式とホワイトリスト方式によるアクセス制御ができます。

squid.conf
# ローカルネットワークの定義
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10# RFC 4291 link-local (directly plugged) machines

# SSL接続時に 443 ポート以外の CONNECT を拒否
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports

# 接続先として指定されているポート以外を拒否
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
http_access deny !Safe_ports

# キャッシュの設定( manager を定義してないので無効な値)
http_access allow localhost manager
http_access deny manager

# ローカルネットワークからのアクセスを許可
http_access allow localnet
   
# 自身からのアクセスを許可
http_access allow localhost

# ここまで一致しなかった場合は拒否
http_access deny all

# Squid が使用するポート
http_port 3128

# core 出力場所の設定
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   

初期設定では、localnet が acl として定義されており、定義したネットワークから定義したポート以外への接続が禁止されている構成になっています。
上記設定ファイル内の http_access から始まる行でアクセスルールを定めています。
これらの定義は、上から順番に評価されますので記述する順番をよく考える必要があります。

初期設定時のアクセスルール
↓ http_access deny CONNECT !SSL_ports # SSL接続時に 443 ポート以外の CONNECT を拒否  
↓ http_access deny !Safe_ports        # 接続先として指定されているポート以外を拒否  
↓ http_access allow localhost manager # manager が localhost から接続することを許可  
↓ http_access deny manager            # manager が接続することを拒否  
↓ http_access allow localnet          # localnet が接続することを許可  
↓ http_access allow localhost         # localhost が接続することを許可  
↓ http_access deny all                # ここまで一致しなかったものは拒否  
3) コンピュータ側のブラウザでプロキシの経由設定を行う

インターネットオプション – [接続]タブの、「LAN の設定」をクリックし Squid を経由する設定を行います。
f:id:cybozuinsideout:20170201151058p:plain

ブラックリスト方式

※ ここでは localnet の acl を利用した設定例を記載します。
ブラックリストは特定のサイトのみをブロックする方式です。原則としてアクセスを許可する場合は向いていますが、安全性でいえば後述するホワイトリストのほうが高いです。

1) ブラックリスト用にファイルを新規作成する

ブラックリスト用にファイルを新規作成し、アクセスをブロックしたいサイトを 1 行づつ記述します。 先頭に. (ドット)を入れることで、サブドメインを含めた指定が可能です。
2017/1/30 時点で cybozu.com において、URL のタイプミスを利用した攻撃サイトが確認されています。 タイプミスを利用した攻撃サイトのブロックを想定してみます。

blacklist
.cybouz.com
.cyboz.com
.cybosu.com

2) squid.conf を編集する

ブラックリスト用の acl 、http_access の定義を追加し、ブラックリスト記載のサイトをブロックします。

squid.conf

acl blacklist dstdomain "/etc/squid/blacklist"
http_access deny blacklist
http_access allow localnet
http_access allow localhost
http_access deny all

3) Squid の設定を反映させる

Squid をリロードして設定を読み込みます。

systemctl reload squid

ホワイトリスト方式

ホワイトリストは特定のサイトのみアクセスを許可する方式です。例えば、cybozu.com のみ許可するといった設定が可能です。

1) ホワイトリスト用にファイルを新規作成する

ブラックリスト形式と同様に、ホワイトリスト用のファイルを新規作成します。

2) squid.conf を編集する

ホワイトリスト用の acl、http_access の定義を追加し、ホワイトリスト記載のサイト以外はブロックするようにコメントアウトします。

squid.conf
acl whitelist dstdomain "/etc/squid/whitelist"
http_access allow whitelist
#http_access allow localnet
#http_access allow localhost
http_access deny all

3) Squid の設定を反映させる

Squid をリロードして設定を読み込みます。

cybozu.com を使うためのホワイトリスト設定

自社の cybozu.com 環境のみアクセスを許可したい場合は、上記のホワイトリスト方式を利用し、ホワイトリスト用のファイルに cybozu.com のアクセスに必要なドメインを追記します。

サブドメイン名.cybozu.com
static.cybozu.com
store.cybozu.com
www.cybozu.com
help.cybozu.com

4. プロキシ設定の配布

Squid を経由するためには、前述したとおり、コンピュータ側での設定が必要となります。コンピュータが大量にあると大変手間な作業ですよね。
また、ノート PC など、社内ネットワーク外にコンピュータを持ちだした場合、プロキシの設定を解除する必要が出てきます。

上記の課題について解決する選択肢の 1 つとして、 WPAD を利用したプロキシの自動検出があります。
WPAD の利用については、賛否あると思いますが、今回は効率的にプロキシを展開する方法として紹介します。

WPAD 方式

WPAD は、プロキシの設定を自動配布するための方法として開発された技術です。 WPAD は、Windows や Mac で利用可能な仕組みです。
プロキシの情報を自動配布するには、DHCP サーバーや DNS サーバーに対してプロキシサーバーを検出させる仕組みの設定が必要となります。
ここでは、DNS サーバーに対する設定を簡単にご説明します。

1) Web サーバーを構築する

まず、社内に Apache などの Web サーバーを構築し、社内のコンピュータからアクセスできるようにします。

2) 自動構成スクリプトファイルを配置する

Web サーバーのルートディレクトリに wpad.dat というファイル名の自動構成スクリプトファイルを格納します。
自動構成スクリプトファイルには、社内のプロキシの接続環境を記述しておきます。

wpad.dat
function FindProxyForURL(url, host)
{
        return "PROXY 192.168.0.10:3128;
        # PROXY サーバーIPアドレス:192.168.0.10 ポート番号:3128 の場合
}

3) DNS サーバーを設定する

DNS サーバーで wpad という名前の DNS レコード( A レコードまたは CNAME レコード)を登録し、社内ネットワーク上で、wpad の名前を解決できるようにします。

4) コンピュータ側の設定を確認する

Windows のブラウザの設定

初期値で [設定を自動的に検出する]のチェックがオンになっているため、特に設定することなくプロキシを自動検出できます。
f:id:cybozuinsideout:20170201151124p:plain

Macのブラウザ設定

初期値で[自動プロキシ検出]のチェックがオフになっているため、チェックをオンにする必要があります。
f:id:cybozuinsideout:20170201151140p:plain
Mac を社内ネットワーク外に持ち出した場合の挙動は利用するブラウザやアプリケーションの挙動に依存するようです。
Safari など社外で接続できない場合は、[自動プロキシ検出]のチェックをオフにする、またはネットワーク環境を切り替える必要があります。
詳しくは Apple 社のネットワーク環境を使うを参照ください。

Active Directory 方式

社内ネットワークのコンピュータが Active Directory により管理されている場合は、Active Directory のグループポリシーの基本設定を利用して、
コンピュータの[設定を自動的に検出する]のチェックを強制することや、自動構成スクリプトファイルの使用を強制することも可能です。
詳細を記載すると長くなるので今回は割愛させていただきます。
詳しくは Microsoft 社のグループポリシー管理コンソール-基本設定項目の構成をご参照ください。
なお、Active Directory 方式は、Mac は対象とできない点が欠点になります。

5. プロキシのログ監査

Squid では、どの IP アドレスからどのサイトへアクセスしたか /var/log/squid/access.log に記録するようになっています。
ログを保管しておくことで、ウイルス感染などの不正通信チェックなど、通信状況を把握する調査に役立ちます。 ログフォーマットの指定によりカスタマイズもできます。

6. まとめ

いかがでしたでしょうか。細かい設定まで説明しきれてなくて大変申し訳ないのですが、Squid を利用することで FQDN でサイトを許可、または拒否できることがイメージいただけたのではないかと思っております。 弊社 cybozu.com をご利用いただく上での安全な Web プロキシの構築方法として参考になれば幸いです。

7. 参考サイト

Japan IE Support Team Blog LAN のプロキシ サーバーの設定について
Japan IE Support Team Blog “WPAD” について