AWS EC2 Amazon Linuxでウイルス対策プロキシサーバ(Squid & Clamav)を構築し、SSHポートフォワーディング(トンネリング)でプロキシ経由のアクセスをする

11月 13, 2015AWS,EC2

AWSのEC2サービスが登場したことによって、個人で簡単に自由に操作できるサーバ環境を比較的リーズナブルに作成できるようになりました。

EC2サービスで実現できるシステムは山のようにありますが、個人使用を想定するとセキュリティ対策の一貫として導入しておきたいのがプロキシサーバです。

AWSのEC2サービスを使用すればサーバ環境を自由に設定できるため、プロキシサーバも簡単に構築することができます。

今回はAWS EC2 Amazon Linux上にウイルス対策ソフトClamavと連携したプロキシサーバをSquidで構築することで、無料ソフトウェアの範囲内でセキュアなプロキシサーバを構築する方法を備忘録として記載しておきます。

AWS EC2 Amazon Linuxでウイルス対策プロキシサーバ(Squid & Clamav)を構築し、SSHポートフォワーディング(トンネリング)でプロキシ経由のアクセスをする

AWS EC2 Amazon Linuxでプロキシサーバ(Squid)を構築する

squidのインストールと設定

squidをyumでインストールします。

[root@localhost ~]# yum install -y squid

squidの設定ファイルを記述します。[EC2インスタンスのElasticIP]の部分はプロキシサーバにするAmazon LinuxのElastic IPに変更してください。

[root@localhost ~]# vim /etc/squid/squid.conf
#
# Recommended minimum configuration:
#
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
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

acl SSL_ports port 443
acl Safe_ports port 22
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
acl CONNECT method CONNECT

acl source src [EC2インスタンスのElasticIP]/32

#
# Recommended minimum Access Permission configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager

# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost
http_access allow source

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

# Squid normally listens to port 3128
http_port 3128

# We recommend you to use at least the following line.
hierarchy_stoplist cgi-bin ?

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

# Add any of your own refresh_pattern entries above these.
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
visible_hostname unknown
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

#icap_enable on
#icap_send_client_ip on
#icap_send_client_username on
#icap_client_username_header X-Authenticated-User
#icap_service service_req reqmod_precache bypass=1 icap://127.0.0.1:1344/squidclamav
#adaptation_access service_req allow all
#icap_service service_resp respmod_precache bypass=1 icap://127.0.0.1:1344/squidclamav
#adaptation_access service_resp allow all

max_filedesc 4096

squidのサービスを起動し、サーバ起動時に起動するように設定します。

[root@localhost ~]# /etc/init.d/squid start
[root@localhost ~]# chkconfig --add squid

プロキシサーバsquidのみでウイルス対策としてClamavを連携させないのであればここまででAmazon Linuxのプロキシサーバの構築は終了です。

AWS EC2 Amazon Linuxでウイルス対策ソフト(Clamav)を導入し、プロキシサーバ(Squid)と連携する

必要モジュールのインストールとfreshclamの設定

続いてプロキシサーバsquidとウイルス対策ソフトClamavを連携させる設定を行います。
必要モジュールをyumでインストールします。

[root@localhost ~]# yum install -y gcc make clamav clamav-update clamd

clamav-updateのインストールで導入されるウイルスパターン更新コマンドfreshclamの設定ファイルを作成します。

[root@localhost ~]# vim /etc/freshclam.conf
DatabaseDirectory /var/lib/clamav

UpdateLogFile /var/log/freshclam.log

LogSyslog yes

DatabaseOwner clamupdate

DatabaseMirror database.clamav.net

ウイルスパターンファイルを下記のコマンドで更新します。
ウイルスパターンファイルを最新に保つためにはfreshclamコマンドをcronなどで定期的に実行させる必要があります。

[root@localhost ~]# freshclam

clamdの設定

clamdの設定ファイルを記述します。

[root@localhost ~]# vim /etc/clamd.d/scan.conf
LogSyslog yes
LocalSocket /var/run/clamd.scan/clamd.sock
FixStaleSocket yes
TCPAddr 127.0.0.1
User clamscan
AllowSupplementaryGroups yes

clamdのサービスを起動し、サーバ起動時に起動するように設定します。

[root@localhost ~]# /etc/init.d/clamd.scan start
[root@localhost ~]# chkconfig --add clamd.scan

c_icapのインストールと設定

c_icapをダウンロードしてインストールします。

[root@localhost ~]# curl -L -O https://sourceforge.net/projects/c-icap/files/c-icap/0.4.x/c_icap-0.4.2.tar.gz
[root@localhost ~]# tar zxvf c_icap-0.4.2.tar.gz
[root@localhost ~]# cd c_icap-0.4.2
[root@localhost c_icap-0.4.2]# ./configure
[root@localhost c_icap-0.4.2]# make
[root@localhost c_icap-0.4.2]# make install
[root@localhost c_icap-0.4.2]# cp /usr/local/etc/c-icap.conf /etc/

c_icapの設定ファイルを記述します。

[root@localhost ~]# vim /etc/c-icap.conf

#161行目あたり:サーバ管理者メールアドレスの変更
ServerAdmin you@your.address

#170行目あたり:サーバ名の変更
ServerName YourServerName

#568行目あたり:squidclamavライブラリの追加
Service squidclamav squidclamav.so

c_icapの起動スクリプトを作成します。

[root@localhost ~]#  vim /etc/init.d/c-icap
#!/bin/bash

# c-icap: Start/Stop c-icap
# chkconfig: - 70 30
# description: c-icap is an implementation of an ICAP server.
# processname: c-icap
# pidfile: /var/run/c-icap/c-icap.pid

. /etc/rc.d/init.d/functions
. /etc/sysconfig/network

CONFIG_FILE=/etc/c-icap.conf
PID_DIR=/var/run/c-icap

RETVAL=0
start() {
   echo -n $"Starting c-icap: "
   daemon /usr/local/bin/c-icap -f $CONFIG_FILE
   RETVAL=$?
   echo
   [ $RETVAL -eq 0 ] && touch /var/lock/subsys/c-icap
   return $RETVAL
}
stop() {
   echo -n $"Stopping c-icap: "
   killproc c-icap
   rm -f /var/run/c-icap/c-icap.ctl
   RETVAL=$?
   echo
   [ $RETVAL -eq 0 ] && rm -f $PID_DIR/c-icap.pid /var/lock/subsys/c-icap
   return $RETVAL
}
case "$1" in
   start)
      start
   ;;
   stop)
      stop
   ;;
   status)
      status c-icap
   ;;
   restart)
      stop
      start
   ;;
   *)
      echo $"Usage: $0 {start|stop|status|restart}"
   exit 1
esac
exit $?

c_icapの起動スクリプトに実行権限を付与します。

[root@localhost ~]# chmod 755 /etc/rc.d/init.d/c-icap

squidclamavのインストールと設定

squidclamavをダウンロードしてインストールします。

[root@localhost ~]# curl -L -O https://sourceforge.net/projects/squidclamav/files/squidclamav/6.14/squidclamav-6.14.tar.gz
[root@localhost ~]# tar zxvf squidclamav-6.14.tar.gz
[root@localhost ~]# cd squidclamav-6.14
[root@localhost squidclamav-6.14]# ./configure --with-c-icap
[root@localhost squidclamav-6.14]# make
[root@localhost squidclamav-6.14]# make install

c_icapの設定ファイルのシンボリックリンクを作成し設定を記述します。

[root@localhost ~]# ln -s /usr/local/etc/squidclamav.conf /etc/squidclamav.conf 
[root@localhost ~]# vim /etc/squidclamav.conf

#18行目あたり:プロキシ経由のアクセスでウイルスが検出された場合のリダイレクト先
redirect https://[WEBサーバアドレス]/your_path/error.html

#27行目あたり:clamdの設定、つまり/etc/clamd.d/scan.confのPidFileの出力先に合わせる。
clamd_local /var/run/clamd.scan/clamd.sock

c-icapのサービスを起動し、サーバ起動時に起動するように設定します。

[root@localhost ~]# /etc/init.d/c-icap start
[root@localhost ~]# chkconfig --add c-icap 

squidをclamavと連携するように設定

squidの設定ファイルをsquidclamav経由でclamavと連携するように修正します。

[root@localhost ~]# vi /etc/squid/squid.conf
#最終行に追記または該当部分のコメントアウトを解除
icap_enable on
icap_send_client_ip on
icap_send_client_username on
icap_client_username_header X-Authenticated-User
icap_service service_req reqmod_precache bypass=1 icap://127.0.0.1:1344/squidclamav
adaptation_access service_req allow all
icap_service service_resp respmod_precache bypass=1 icap://127.0.0.1:1344/squidclamav
adaptation_access service_resp allow all

squidのサービスを再起動します。

[root@localhost ~]# /etc/init.d/squid restart

プロキシサーバsquidとウイルス対策ソフトClamavを連携させる設定はここまでです。

SSHポートフォワーディング(トンネリング)でプロキシ経由のアクセスをする

続いてプロキシサーバsquidとウイルス対策ソフトClamavを連携させる設定が終わったら、実際にローカルからSSHポートフォワーディング(トンネリング)でAmazon Linuxのプロキシサーバに接続し、ブラウザでポートフォワーディングされたポート経由でプロキシを利用します。

プロキシサーバを使用するクライアントがMac OSXまたはLinuxの場合におけるSSHポートフォワーディングの方法

SSHのCompressionLevelは通信の圧縮率を0〜9で設定します。圧縮率によって若干通信速度が変化するので自分の環境で速いと思われるものを設定してください。

ssh -C -o CompressionLevel=9 -L [ポートフォワーディングで使用するローカルポート]:127.0.0.1:3128 ec2-user@[EC2インスタンスのElasticIP] -i ~/.ssh/your_key.pem

(例)

ssh -C -o CompressionLevel=9 -L 13128:127.0.0.1:3128 ec2-user@54.1.2.3 -i ~/.ssh/your_key.pem

プロキシサーバを使用するクライアントがWindowsの場合におけるSSHポートフォワーディングの方法

TeraTermのSSH転送を使用した例を示します。

TeraTermを起動>設定>SSH転送>追加 の順番で項目を選択し、「SSHポート転送」画面まで進みます。
ローカルポート:[ポートフォワーディングで使用するポート]
リッスン:(空白のまま)
リモート側ホスト:[EC2インスタンスのElasticIP]
ポート:3128

(例)
ローカルポート:13128
リッスン:(空白のまま)
リモート側ホスト:54.1.2.3
ポート:3128

ブラウザのプロキシ設定とウイルスチェックのテスト

上記のSSHポートフォワーディングの方法の例で設定したローカルポートであれば、ウェブブラウザのHTTPプロキシ情報を下記のように入力すればAmazon Linuxのプロキシ経由でインターネットへアクセスできます。
ホスト名: 127.0.0.1
ポート:13128

プロキシサーバのウイルスチェックの動作確認は下記ページに遷移し、テストウイルスが存在するページ「eicar.com」にアクセスして設定した「プロキシ経由のアクセスでウイルスが検出された場合のリダイレクト先」に遷移するかを確認してください。
https://eicar.org/85-0-Download.html

Reference: Tech Blog citing related sources

AWS,EC2

Posted by magtranetwork