Squidでホワイトリストプロキシを作成する

新しくファイルサーバーを家に導入したので、セキュリティをちゃんと設定する一環として、ホワイトリストを使用するプロキシを作成しました。
大体の設定しか行っていないため、不足とかあれば教えていただければと思います。
とりあえずドメインによるホワイトリストが動作するまでで、HTTPSのキャッシュを行うSSLBumpはまた機会があれば。

# 環境
Raspberry Pi 3 + Raspbian jessie

# インストール
前述のSSLBumpを使用しないのであれば普通にインストール可能です。

```bash
sudo apt-get install squid
```

# 基本設定
続いて基本設定と、ホワイトリストとして運用するように変更します。
ホワイトリストではlocalnetで許可してしまうと**URLでフィルタリングできない**ので注意です。
その代わり、localnet以外を拒否という設定を行います。
否定は"!"を前につけることで表現できます。

```apache:/etc/squid/squid.conf
# IPアドレスの定義
acl all src all
acl localhost src 127.0.0.1/32
acl localnet src 192.168.1.0/24
 
# 接続先ポートによる拒否
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
 
# SSL接続時に443ポート以外のCONNECTを拒否
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports
 
# キャッシュまわりの設定
acl manager proto cache_object
http_access allow manager localhost
http_access deny manager

# 自身からのアクセスはすべて許可する
http_access allow localhost
 
# 自分のネットワーク以外を拒否
http_access deny !localnet

# ホワイトリストの設定
acl whitelist dstdomain "/etc/squid/whitelist"
http_access allow whitelist
 
# ここまで一致しなかった場合は拒否
http_access deny all
 
 
# Squidが使用するポート
http_port 3128
 
# キャッシュディレクトリとキャッシュメモリサイズを指定
cache_dir ufs /var/spool/squid 200 16 256
cache_mem 128 MB
 
# キャッシュを使用しないURLの対象
hierarchy_stoplist cgi-bin ?
 
# コアダンプファイル？を配置するディレクトリ
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
 
# クライアントおよびプロキシ情報を隠蔽する
forwarded_for off
header_access Referer deny all
header_access X-Forwarded-For deny all
header_access Via deny all
 
# ホスト名を匿名にする
visible_hostname unknown
```

キャッシュのヒット率については以下のページで詳しく説明されていました。

- [Squidの更新パターンでインターネットアクセスを高速化する 2ページ | OSDN Magazine](https://osdn.jp/magazine/08/11/26/019236/2)


# ホワイトリストの作成
ホワイトリストの設定はドメインの形式です。
正規表現がいいなと思ったけど、なんか上手く動作してくれなかったので。

```:/etc/squid/whitelist
.microsoft.com
.windows.com
.windowsupdate.com
```

とりあえず、Windows Update等で必要になるものを例として記載しています。
"."から始まるものはサブドメインまで許可するとのこと。

# 動作確認

```bash
$ sudo squid -k parse

以下いずれかで再読み込み
$ sudo service squid restart
$ sudo service squid reload
```

指定したURLでアクセスできるか、それ以外でアクセスできるかを確認します。
あと、指定したIP以外からアクセスが拒否されるかを確認すればいいかと思います。

# あとで行う設定
特定のコンピュータだけ通信を制限したいのであれば、ファイアウォールルールでそのコンピュータのすべてのパケットを破棄するように設定してあげれば、ルータを越えるプロキシを通さない通信は出来なくなります。

# ホワイトリストの設定
基本的なことかと思いますが、ホワイトリストのドメインのリスト作成の仕方です。

- ログを開く

```bash
sudo tail -f /var/log/squid/access.log
sudo less +f /var/log/squid/access.log
```

- 追加したいサイトにアクセスする(更新させる)
- 流れてきたサイトのドメインを抽出・判断する

# おまけ : Windowsでのプロキシの設定
1. IEのインターネットオプションで設定する。(ユーザー用)
2. netsh で設定する(システム用)

Windows Updateは2番目を使用するため、1に設定するだけでは足りません。
1の設定をした後で以下のコマンドを管理者のコマンドプロンプトで実行します。

```bat
netsh winhttp import proxy source=ie
```

 
# 参考にさせていただいたサイト
- [CentOS Squidの設定 | UnixPower on Networking](http://www.unix-power.net/linux/squid.html)
- [squid で特定のサイトのみアクセスを許可する | futuremix](http://futuremix.org/2005/07/squid-access-allow)