こんにちは、CSチームのかわむらです。
VPC内で立てるインスタンスは、内部にある気楽さもあってか、特に試験的に立てたインスタンスでは一時のつもりでElasticIPを付けたり、セキュリティグループの設定を甘くしたりしたままになりがちです。
しかし、そうしたインスタンスが放置されると、VPC内のサーバーが外部からクラックされるという危険な目にも遭いかねません。
そこで外部に公開設定となっているセキュリティグループを検出するスクリプトを作ってみました。
AWS SDK for Rubyをインストール
環境はRuby 1.8.7です。
gem install aws-sdk
設定ファイルを作成する
アクセスキーとシークレットアクセスキー、リージョン(東京)を指定したconfig.ymlファイルを作ります。
config.yml
access_key_id:
secret_access_key:
ec2_endpoint: ec2.ap-northeast-1.amazonaws.com
セキュリティグループをチェックするスクリプト
check-vpc-sg.rb
[ruby]
#!/usr/bin/env ruby
require 'rubygems'
require 'yaml'
require 'aws-sdk'
config = YAML.load(File.read("config.yml"))
AWS.config(config)
ec2 = AWS::EC2.new
ec2.instances.each do |instance|
if instance.vpc_id =~ /^vpc-.*$/
instance.security_groups.each do |sg|
sg.ip_permissions.each do |permission|
permission.ip_ranges.each do |source|
if source == "0.0.0.0/0"
puts "(danger)"
puts "Instance: #{instance.vpc_id}"
puts "Protocol: #{permission.protocol}"
puts "Source: #{source}"
puts "Port_range: #{permission.port_range}"
end
end
end
end
end
end
[/ruby]
取得したインスタンス一覧からvpc_idを持つインスタンスのセキュリティグループを取得し、アクセス元が"0.0.0.0/0"に設定されていたらセキュリティグループの情報を表示します。
$ ruby check-vpc-sg.rb
(danger)
Instance: vpc-xxxxxxxx
Protocol: tcp
Source: 0.0.0.0/0
Port_range: 80..80
スクリプトのネストが深くて恥ずかしいのですが、AWS Management Consoleからセキュリティグループの設定状態を確認するのは、結構手間だったので、ひとまずこれでチェックが楽になりました。