2012年12月25日火曜日

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

スズキです。

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 %<st "%{Referer}>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の
認証で一元管理するってやり方はありかも知れません。
(cloudpackはアカウントが多すぎて、該当するメンバーをすべてのアカウントの
IAMに登録するのは現状厳しい...どうせ全員、全アカウントにログインするし...)

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

どっかでLDAP、がんばらないとなー...
--------
http://www.suz-lab.com

0 コメント: