fbpx

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

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

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 のプログラムでルールの変更、削除も可能となるでしょう。是非挑戦してみてください。

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA