VPCで外部に公開されているインスタンスをチェックする

記事タイトルとURLをコピーする

こんにちは、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からセキュリティグループの設定状態を確認するのは、結構手間だったので、ひとまずこれでチェックが楽になりました。