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