fbpx

CL LAB

HOME > CL LAB > softlayer-api-ruby-client で Hardware Firewall のルールを追加する #softlayer

softlayer-api-ruby-client で Hardware Firewall のルールを追加する #softlayer

 ★ 3

softlayer-api-ruby-client で Hardware Firewall のルールを操作

前回の記事では、SoftLayer_Product_Order::placeOrder を用いて、Hardware Firewall つきの Virtual Server を作成し、SoftLayer_Account サービスからファイアウォールのルールを確認しました。

本記事では SoftLayer_Network_Component_Firewall サービス、SoftLayer_Network_Firewall_Update_Request サービスを用いて Hardware Firewall のルールを追加します。

Hardware Firewall のルールの取得

SoftLayer_Network_Component_Firewall サービスの SoftLayer_Network_Component_Firewall::getRules を用いることで、ファイアウォールのルールを取得できます。


#!/usr/bin/ruby

#
# http://sldn.softlayer.com/blog/phil/Getting-started-Firewalls
#

require 'softlayer_api'
require 'pp'

#
# fill your SoftLayer API username and API key
#
api_username = ENV['SOFTLAYER_API_USERNAME'] || 'YOUR_SOFTLAYER_API_USERNAME'
api_key = ENV['SOFTLAYER_API_KEY'] || 'YOUR_SOFTLAYER_API_KEY'

#
# Firewall id
#
id = ARGV.shift()

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Network_Component_Firewall
#
network_component_firewall_service = SoftLayer::Service.new(
'SoftLayer_Network_Component_Firewall',
:username => api_username,
:api_key => api_key,
)

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Network_Component_Firewall/getRules
#
response = network_component_firewall_service.
object_with_id( id ).
getRules()

#
# result
#
pp response

__END__


[{"action"=>"permit",
"destinationIpAddress"=>"any on server",
"destinationIpCidr"=>32,
"destinationIpSubnetMask"=>"255.255.255.255",
"destinationPortRangeEnd"=>22,
"destinationPortRangeStart"=>22,
"id"=>XXXXX16,
"orderValue"=>1,
"protocol"=>"tcp",
"sourceIpAddress"=>"0.0.0.0",
"sourceIpCidr"=>0,
"sourceIpSubnetMask"=>"0.0.0.0",
"status"=>"allow_edit",
"version"=>4}]

slコマンドでも確認してみましょう。


:...:........:..........:.........:..........:.....................:.................:
: # : action : protocol : src_ip : src_mask : dest : dest_mask :
:...:........:..........:.........:..........:.....................:.................:
: 1 : permit : tcp : 0.0.0.0 : 0.0.0.0 : any on server:22-22 : 255.255.255.255 :
:...:........:..........:.........:..........:.....................:.................:

Hardware Firewall のルールの追加

現在は簡単に言えば 22/tcp を素通しする設定のみとなっていますが、これに 80/tcp を素通しする設定を末尾に追加してみましょう。

ルールの追加には SoftLayer_Network_Firewall_Update_Request サービスの SoftLayer_Network_Firewall_Update_Request::createObject を利用します。またその際のルールの形式は SoftLayer_Network_Firewall_Update_RequestSoftLayer_Network_Firewall_Update_Request_Rule を参照してください。

ここで注意すべき点がいくつかあります。
まず、ルールを単純に追加することはできません。一旦既存のルールをすべて取得し、それに新しいルールを追加して、丸ごと再設定するという形を取ります。これは変更や削除においても同様にプログラム側で対応可能ということを意味します。
次に、取得したルールをそのまま適用するとエラーになってしまうので加工が必要となります。ここではstatusキーが設定できる値ではないので削除しています。


#!/usr/bin/ruby

#
# http://sldn.softlayer.com/blog/phil/Getting-started-Firewalls
#

require 'softlayer_api'
require 'pp'

#
# fill your SoftLayer API username and API key
#
api_username = ENV['SOFTLAYER_API_USERNAME'] || 'YOUR_SOFTLAYER_API_USERNAME'
api_key = ENV['SOFTLAYER_API_KEY'] || 'YOUR_SOFTLAYER_API_KEY'

#
# Firewall id
#
id = ARGV.shift()

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Network_Component_Firewall
#
network_component_firewall_service = SoftLayer::Service.new(
'SoftLayer_Network_Component_Firewall',
:username => api_username,
:api_key => api_key,
)

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Network_Component_Firewall/getRules
#
rules = network_component_firewall_service.
object_with_id( id ).
getRules()

#
# http://sldn.softlayer.com/reference/datatypes/SoftLayer_Network_Firewall_Update_Request_Rule
#
new_rule = {
'action' => 'permit',
'destinationIpAddress' => 'any',
'destinationPortRangeEnd' => 80,
'destinationPortRangeStart' => 80,
'orderValue' => rules.size + 1,
'protocol' => 'tcp',
'sourceIpAddress' => 'any',
'version' => 4,
}

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Network_Firewall_Update_Request
#
network_firewall_update_request_service = SoftLayer::Service.new(
'SoftLayer_Network_Firewall_Update_Request',
:username => api_username,
:api_key => api_key,
)

#
# remove needless key
#
rules.each do |rule|
rule.delete( 'status' )
end

#
# add
#
rules.push( new_rule )

#
# http://sldn.softlayer.com/reference/datatypes/SoftLayer_Network_Firewall_Update_Request
#
update_request = {
'networkComponentFirewallId' => id,
'rules' => rules
}

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Network_Firewall_Update_Request/createObject
#
response = network_firewall_update_request_service.createObject( update_request )

#
# result
#
pp response

__END__

これを実行すると次のような結果が得られます。
22/tcp の許可に加えて、80/tcp を許可するルールが追加されています。


:
(中略)
:
"rules"=>
[{"action"=>"permit",
"destinationIpAddress"=>"any on server",
"destinationIpCidr"=>32,
"destinationIpSubnetMask"=>"255.255.255.255",
"destinationPortRangeEnd"=>22,
"destinationPortRangeStart"=>22,
"firewallUpdateRequestId"=>XXX52,
"id"=>XXXXX40,
"orderValue"=>1,
"protocol"=>"tcp",
"sourceIpAddress"=>"0.0.0.0",
"sourceIpCidr"=>0,
"sourceIpSubnetMask"=>"0.0.0.0",
"version"=>4},
{"action"=>"permit",
"destinationIpAddress"=>"any on server",
"destinationIpCidr"=>32,
"destinationIpSubnetMask"=>"255.255.255.255",
"destinationPortRangeEnd"=>80,
"destinationPortRangeStart"=>80,
"firewallUpdateRequestId"=>XXX52,
"id"=>XXXXX42,
"orderValue"=>2,
"protocol"=>"tcp",
"sourceIpAddress"=>"0.0.0.0",
"sourceIpCidr"=>0,
"sourceIpSubnetMask"=>"0.0.0.0",
"version"=>4}]}

slコマンドでも確認してみましょう。


:...:........:..........:.........:..........:.....................:.................:
: # : action : protocol : src_ip : src_mask : dest : dest_mask :
:...:........:..........:.........:..........:.....................:.................:
: 1 : permit : tcp : 0.0.0.0 : 0.0.0.0 : any on server:22-22 : 255.255.255.255 :
: 2 : permit : tcp : 0.0.0.0 : 0.0.0.0 : any on server:80-80 : 255.255.255.255 :
:...:........:..........:.........:..........:.....................:.................:

まとめ

本記事では SoftLayer_Network_Component_Firewall サービス、SoftLayer_Network_Firewall_Update_Request サービスを用いて Hardware Firewall のルールを追加しました。
これを応用すれば Ruby のプログラムでルールの変更、削除も可能となるでしょう。是非挑戦してみてください。

CL LAB Mail Magazine

CL LABの情報を逃さずチェックしよう!

メールアドレスを登録すると記事が投稿されるとメールで通知します。

メールアドレス: 登録

※登録後メールに記載しているリンクをクリックして認証してください。

Related post

新規CTA