share facebook facebook2 twitter menu hatena pocket slack

2013.02.07 THU

Squid経由でAWSマネジメントコンソールにアクセスしてソースIP制限や認証やログ取得

鈴木 宏康

WRITTEN BY鈴木 宏康

AWSマネジメントコンソールは非常に便利なのですが、基本的にどの場所からでも利用することが可能で、
誰が何の作業をしたかというログも、現状取得することができません。

しかし実際は、IAMで利用できるポリシーでAPIのアクセス制限に下記のようにソースIPを指定することが
できます。

{ "Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*",
"Condition": {
"IpAddress": { "aws:SourceIp": "xxx.xxx.xxx.xxx" }
}
}
] }

上記のように指定したIP(xxx.xxx.xxx.xxx)以外からAWSマネジメントコンソールにアクセスすると
下記のようにログインはできるのですが、おそらくAPIを利用して取得しているリソースに
アクセスすることができません。

これにより、取り急ぎ「どの場所からでも利用することが可能」という課題は解決できます。

そしてもう一つ、「ユーザーの操作ログが取得できない」という課題ですが、下記のように
AWS上(AWSに限らず)にHTTP(S)のプロキシーサーバ(Squid)を起動し、「誰が何の作業をしたか」のログが
取得できないか試してみました。

結論からいいますと、SquidでProxyを利用するときに認証(User/Passを発行)を必要とする設定にすることで、
Squidのアクセスログに、そのユーザー名が表示され誰がいつAWSマネジメントコンソールにアクセスしているかは
確認できます。

しかし、HTTPS通信になるので、出力されるログはCONNECTのもののみとなり、暗号化されてるので、
メソッドやパス、パラメータはわかりません。

それを補うためにiptablesで、Outboundの443とInboundの3128の通信ログも取得しCONNECT以外の
TCP(ヘッダ)レベルのログも取得できるようにしましたが、今度はユーザーとの紐付けができません。

上記のような結果になりました。

これでも無いよりは良いかと思いますし、様々なAWSアカウントへのアクセスをSquidのユーザー管理(認証)で
一括で制御できることは便利だと思いますので、次に作り方を簡単ですが紹介します。

○EC2(Squid)に適用するセキュリティグループの設定

オープンプロキシーにならないように必要なものだけ許可します。
※EIP(上記のxxx.xxx.xxx.xxx)を付与してインターネットへと直接通信できる前提です。

○パッケージ(Squid & Apache)のインストール

Squidは、htpasswdを利用するのでApacheもインストールしています。

# yum -y install squid
...
# yum -y install httpd
...

○Squid起動のための準備(ディレクトリ & パスワードファイル)

・ログ出力ディレクトリの準備

# mkdir -p /opt/suz-lab/var/log/apache
# mkdir -p /opt/suz-lab/etc/squid
# touch /opt/suz-lab/etc/squid/squid.log
# chown squid.squid /opt/suz-lab/etc/squid/squid.log

・パスワードファイルの準備

# htpasswd -c /opt/suz-lab/etc/squid/squid.htpasswd suzuki
New password:
Re-type new password:

○Squidの設定ファイル

設定ファイルは下記のようにしました。
(ソースIP制限はセキュリティグループに任せています)

# cat /etc/squid/squid.conf
auth_param basic program /usr/lib64/squid/ncsa_auth /opt/suz-lab/etc/squid/squid.htpasswd
auth_param basic children 20
auth_param basic realm SUZ-LAB Proxy Server
auth_param basic credentialsttl 1 hours

acl port_https port 443
acl auth_basic proxy_auth REQUIRED

http_access allow all auth_basic port_https
http_access deny all
cache deny all

http_port 3128
coredump_dir /var/spool/squid
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %h" "%{User-Agent}>h" %Ss:%Sh
access_log /opt/suz-lab/var/log/apache/squid.log combined

そしてSquidの起動になります。

# chkconfig squid on
# /etc/init.d/squid start
squid を起動中: . [ OK ]

○ブラウザ側(Mac & Chrome)のプロキシー設定

Chromeのメニューにある設定ボタンから開始します。

最後にOSからの確認や、ChromeがポップアップでUser/Passを催促してくるかも知れませんが、
適宜処理して下さい。

○再度AWSコンソールにアクセス

今度は無事リソースにアクセスできています。

Squidのログは下記のようになります。
(ユーザー「suzuki」も出力されてます)

yyy.yyy.yyy.yyy - suzuki [24/Dec/2012:21:19:26 +0900] "CONNECT aws.amazon.com:443 HTTP/1.1" 200 4061 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11" TCP_MISS:DIRECT
yyy.yyy.yyy.yyy - suzuki [24/Dec/2012:21:19:26 +0900] "CONNECT aws.amazon.com:443 HTTP/1.1" 200 122 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11" TCP_MISS:DIRECT
yyy.yyy.yyy.yyy - suzuki [24/Dec/2012:21:19:26 +0900] "CONNECT console.aws.amazon.com:443 HTTP/1.1" 200 5096 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11" TCP_MISS:DIRECT
yyy.yyy.yyy.yyy - suzuki [24/Dec/2012:21:19:29 +0900] "CONNECT aws.amazon.com:443 HTTP/1.1" 200 3007 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.101 Safari/537.11" TCP_MISS:DIRECT

○iptablesでログ出力

下記のようにINPUT:3128とOUTPUT:443で取得することにします。

# chkconfig iptables on
# /etc/init.d/iptables start
# /sbin/iptables -A INPUT -p tcp --dport 3128 -j LOG
# /sbin/iptables -A OUTPUT -p tcp --dport 443 -j LOG
# /etc/init.d/iptables save
iptables: ファイアウォールのルールを /etc/sysconfig/iptable[ OK ]中:
# /etc/init.d/iptables restart
iptables: ファイアウォールルールを消去中: [ OK ]
iptables: チェインをポリシー ACCEPT へ設定中filter [ OK ]
iptables: モジュールを取り外し中: [ OK ]
iptables: ファイアウォールルールを適用中: [ OK ]
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
LOG tcp -- anywhere anywhere tcp dpt:squid LOG level warning

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
LOG tcp -- anywhere anywhere tcp dpt:https LOG level warning

ログは次のように出力されます。

Dec 24 21:28:19 ip-10-0-0-4 kernel: IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=yyy.yyy.yyy.yyy DST=10.0.0.4 LEN=617 TOS=0x00 PREC=0x00 TTL=51 ID=39187 DF PROTO=TCP SPT=51590 DPT=3128 WINDOW=8192 RES=0x00 ACK PSH URGP=0
Dec 24 21:28:19 ip-10-0-0-4 kernel: IN= OUT=eth0 SRC=10.0.0.4 DST=zzz.zzz.zzz.zzz LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=50434 DF PROTO=TCP SPT=40967 DPT=443 WINDOW=648 RES=0x00 ACK URGP=0

○最後に

誰が何の作業をしたかを完全に追いかけられるログは取得できませんでしたが、複数のアカウントがある場合等は、
IAMは共用のアカウントを一つ作り、関係者はそれでSquid経由でアクセスすることにし、各ユーザーの制御は
Squidの認証で一元管理する方法も良いかと思います。

また、Squidの認証はLDAPと連携できますし、OpenVPNでVPN接続した後にプロキシーを利用すれば、
ソースIPもユーザー毎に変えることができるはずなので、iptablesのログもより意味を持ってくると思います。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。