最終更新日: 2014年1月13日
Squid Homeへ】

古いOSやブラウザからのアクセス拒否

サイト管理者の中には組織内のセキュリティ確保を考慮して、ユーザが利用するクライアント端末のOSやブラウザを制限したい場合があるかも知れません。 例えば、セキュリティサポートが終了してしまったWindows 95/98、また間もなくサポートの終了するWindows XPなどからのアクセスや、セキュリティ的に問題のある古いブラウザ(IE4, IE5, IE6)などからのインターネットアクセスを強制的に排除したいかも知れません。
squidにアクセスしたユーザがどんなOSやブラウザを使っているかは、クエストされたHTTPプロトコル上のUser-Agentヘッダーを調べることができます。
squidは、ACLとしてこのUser-Agentを確認する方法が用意されており、このACLを使いアクセス制御を行うことで特定のOSやブラウザからのアクセスを制限することが可能です。

取りあえず自分のブラウザがどんなUser-Agentヘッダーを出しているかを見てみましょう。 squid を使っている環境でブラウザを起動して、存在しない適当なURL(ex. http://www.aaa.bbb.ccc.jp )をアクセスしてみてください。以下のような画面になると思います。


ここでProxy管理者への連絡用リンク(上記では"root")をクリックしてみてください。するとメールクライアントが起動して次のような画面が表示されると思います。

表示されたメール本文にクライアントがリクエストした際のHTTPパケットの内容が自動的に貼り付けられています。 ここの「User-Agent: 」がクライアントがクエストした際のUser-Agentヘッダーになります。
User-Agentに書かれている意味はこちらを参考にしてください。
バージョントークンを調べることでブラウザのバージョンが、またプラットフォームトークンを調べることで端末のOSの種類が判断できます。
例えば、IEのバージョンは次のように分類できます。

バージョントークン 説明
rv:11.0 Internet Explorer 11
MSIE 10.0 Internet Explorer 10
MSIE 9.0 Internet Explorer 9
MSIE 8.0 Internet Explorer 8
MSIE 7.0 Internet Explorer 7
MSIE 7.0b Internet Explorer 7(Beta 1 プレリリース バージョンのみ
MSIE 6.0 Internet Explorer 6
MSIE 6.0b Internet Explorer 6(プレリリース)
MSIE 5.5 Internet Explorer 5.5
MSIE 5.01 Internet Explorer 5.01
MSIE 5.0 Internet Explorer 5
MSIE 5.0b1 Internet Explorer 5(プレリリース)
MSIE 4.01 Internet Explorer 4.01

また、Windowsの種類は次のようなプラットフォームに分類できます。

プラットフォームトークン 説明
Windows NT 6.3 Windows 8.1
Windows NT 6.2 Windows 8
Windows NT 6.1 Windows 7
Windows NT 6.0 Windows Vista
Windows NT 5.2 Windows Server 2003; Windows XP x64 Edition
Windows NT 5.1 Windows XP
Windows NT 5.01 Windows 2000, Service Pack 1 (SP1)
Windows NT 5.0 Windows 2000
Windows NT 4.0 Microsoft Windows NT 4.0
Windows 98; Win 9x 4.90 Windows Millennium Edition (Windows Me)
Windows 98 Windows 98
Windows 95 Windows 95
Windows CE Windows CE

 

以下では、ACLによるアクセス制御を実施するために必要な設定について説明します。 なお、設定を行うファイルは次のファイルとなります。

【設定ファイルの場所】
ファイル名 CentOS, Redhat Debian, Ubuntu 備考
squid.conf /etc/squid/squid.conf /etc/squid3/squid.conf (Squid3の場合)
/etc/squid2/squid.conf (Squid2の場合)
 
エラーメッセージ
フォルダ
/usr/share/squid/errors/ja
/usr/share/squid/errors/en
/usr/share/squid-langpack/Japanese
/usr/share/squid-langpack/English
(日本語)
(英語・デフォルト)
       
なお、Squid が動作する状態になっていない場合には先にこちらを参考に Squid が動作する状態になってから以下の作業を実施してください。

1.squid.confの編集

squid.conf ファイルに対してACLを使ったアクセス制御を設定していきます。 

::
#Default:
# acl all src all
#
# Windows CE #acl DenyOS browser -i windows.ce
# Windows 95 #acl DenyOS browser -i windows.95
# Windows 98 #acl DenyOS browser -i windows.98
# Windows me #acl DenyOS browser -i windows.me
# Windows NT #acl DenyOS browser -i windows.nt.4\.0
# Windows 2000 #acl DenyOS browser -i windows.nt.5\.0
# Windows XP #acl DenyOS browser -i windows.nt.5\.1
# Windows2003,XP-x64 # acl DenyOS browser -i windows.nt.5\.2
# WindowsVist # acl DenyOS browser -i windows.nt.6\.0
# Windows7 # acl DenyOS browser -i windows.nt.6\.1
acl DenyOS browser -i windows.95
acl DenyOS browser -i windows.98
acl DenyOS browser -i windows.me
acl DenyOS browser -i windows.nt.5\.1
acl DenyOS browser -i windows.nt.4\.0

acl DenyBrowser -i MSIE.4
acl DenyBrowser -i MSIE.5
acl DenyBrowser -i MSIE.6
acl DenyBrowser -i MSIE.7


::
#Default:
# http_access deny all
#
# Old OS Deny
http_access deny DenyOS
# Old Browser Deny
http_access deny DenyBrowser
#
# Recommended minimum Access Permission configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
::
#Default:
# none
#
deny_info ERR_SECURITY_DENY DenyOS
deny_info ERR_SECURITY_DENY DenyBrowser


 

上記の設定の内容は以下の通りです。

設定内容  備考
acl DenyOS browser -i windows.95
acl DenyOS browser -i windows.98
acl DenyOS browser -i windows.me
acl DenyOS browser -i windows.nt.5\.1
acl DenyOS browser -i windows.nt.4\.0
acl DenyBrowser -i MSIE.4
acl DenyBrowser -i MSIE.5
acl DenyBrowser -i MSIE.6
acl DenyBrowser -i MSIE.7
DenyOSとDenyBrowserいう名前でACLを定義します。
DenyOSではUser-Agentに含まれるトークン古いWindowsのものを判定します。
DenyBrowserには、古いIEとして判断するトークンを指定しています。
なお判断するトークン文字列は正規表現で指定できます。"-i" を指定することで大文字と小文字を区別しません。
正規表現について詳しい説明はここで行いませんが、"windows.95" の意味は
  > "windows"の後に何か1文字(.)があり、その後が "95" となる文字列
を意味します。また、"\"マークはその直後の文字をそのまま評価するという意味です。
http_access deny DenyOS
http_access deny DenyBrowser
ACLのDenyOSとDenyBrowserで指定されたトークンを使ってアクセスしてきた端末からの接続を拒否します。
deny_info ERR_SECURITY_DENY DenyOS
deny_info ERR_SECURITY_DENY DenyBrowser
DenyOSとDenyBrowserで拒否した場合のエラーメッセージとしてここでは ERR_SECURITY_DENY というファイルを使用します。

なお、"http_access deny xxx" を記述する際には、その前にある "http_access" ステートメントの影響を受けないか良く注意してください。 たとえば、この "dnay"ルールの前にすべてのアクセスを許可(allow)するルールがあると禁止ルールは無意味になってしまいます。
また逆に、禁止のためのACLの確認条件がすべてに当てはまってしまうようなACLを作ってしまうと、すべてのアクセスが禁止されてしまい結果として全くアクセスできない環境になります。
(Memo)

squid.conf のデフォルト状態ではアクセス制御ストートメントに

::
http_access allow localhost

という行があります。
よくある間違いで、ACLとして"localnet"を定義はしたもののアクセス制御の箇所でlocalhostとlocalnetを許可しようして

::
http_access allow localhost localnet

と記述してしまうと、これの意味は「localhost と localnet」の2つを同時に満たす場合を意味してしまい、絶対に不可能な条件となってしまい、結果としてクライアントはsquid経由でインターネットにアクセスできなくなってしまいます。
正しいくは、

::
http_access allow localnet
http_access allow localhost

と2行に分けて記述します。
アクセスルールの順番を確認したい場合には、コマンドプロンプトから

$ cat squid.conf | grep ^http_access

としてアクセスルールの評価順を確認すると良いでしょう。

2.ERR_SECURITY_DENYの作製(日本語用)

エラーメッセージフォルダ(日本語用)に ERR_SECURITY_DENY という名前でエラー表示のためのコンテンツファイルを作成します。 内容としては以下のような形で良いかと思います。
なお作成するファイルはUTF-8形式で保存してください。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>エラー: リクエストされた URL は取得できませんでした</title>
<style type="text/css">
<!-- %l body :lang(fa) { direction: rtl; font-size: 100%; font-family: Tahoma, Roya, sans-serif; float: right; } :lang(he) { direction: rtl; float: right; } -->
</style>
</head>
<body>
<div id="titles">
<h1>ERROR</h1>
<h2><span id="result_box" class="short_text" lang="ja"><span class="">古いOSやブラウザの禁止</span></span></h2>
</div>
<hr>
<div id="content">
<blockquote id="error"> <p><b>セキュリティ制限によってリクエストは拒否されました。 </b>
</p>
</blockquote>
<p>これは、利用している端末のOSやブラウザが古いためセキュリティ制限でアクセスが禁止されたことを意味します。</p>
<p>このプロキシの管理者への連絡は <a href="mailto:%w%W">%w</a> です。</p>
<br>
</div>
<hr>
<div id="footer">
<p>%Tに%h (%s)が生成しました。</p>
<!-- %c -->
</div>
</body>
</html>

英語版のメッセージが必要な場合には上記を参考にしてファイルを作成しエラーメッセージフォルダ(英語用)に ERR_SECURITY_DENY という名前で保存してください

Squid Homeへ】

参考: