fbpx

softlayer-api-ruby-client で Virtual Server と Hardware Firewall を同時に作成する #softlayer

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

Virtual Server と Hardware Firewall を API 経由で同時に作成する方法

前回の記事では、SoftLayer_Product_Order::verifyOrder および SoftLayer_Product_Order::placeOrder を用いて、SoftLayer_Virtual_Guest::createObject で作成できるものと同じ Virtual Server を作成しました。

本記事では SoftLayer_Product_Order::placeOrder を用いて、Hardware Firewall つきの Virtual Server を作成してみます。

SoftLayer におけるファイアウォール

SoftLayer でのファイアウォールはいくつかの種類に分類することができます。
まず大きく分けて、ソフトウェアファイアウォールとハードウェアファイアウォールです。

ソフトウェアファイアウォールは OS に組み込まれたファイアウォールで、SoftLayer では Linux 用の APF Software Firewall for Linux (Install and Configure Advanced Policy Firewall (APF)) と Windows 用の Microsoft Windows Firewall があります。APF Software Firewall for Linux は「SoftLayerのネットワークとセキュリティの基礎でも多少触れているので参考にしてください。

ハードウェアファイアウォールはネットワークに配置するファイアウォールで、SoftLayer では VLAN 自体に適用する Hardware Firewall (Dedicated) (VLAN routed firewalls) と個々のサーバに適用する Hardware Firewall (Single device firewalls があります。

本記事では、個々のサーバに適用する Hardware Firewall つきの Virtual Server を作成してみます。

SoftLayer_Product_Order::placeOrder を用いて Virtual Server と Hardware Firewall を同時に注文する

前回の記事 のように、SoftLayer_Product_Order::placeOrder を用いて注文を行います。

  • ホスト名: test-年月日時分秒
  • ドメイン名: example.jp
  • CPUコア数: 1
  • メモリ: 1024MB
  • 課金:
  • ディスク: ローカルディスク
  • ブロックデバイス: 0番 25GB
  • データセンター: サンノゼ
  • OS: Ubuntu 12.04 (amd64)
  • ネットワーク: 10Mbps
  • 外部への転送量: 5000GB
  • ファイアウォール: サーバ個別ハードウェアファイアウォール

前回の記事の注文と異なる箇所は強調で表しています。
まず、ハードウェアファイアウォールは時間課金がないため、月課金となります。なお、満了前にキャンセルしても日割り計算されないので注意してください。
また、外部への転送量が月に 5000GB となります。


#!/usr/bin/ruby

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'

#
# http://sldn.softlayer.com/reference/datatypes/SoftLayer_Container_Product_Order_Virtual_Guest
#
product_order = {
'complexType' => 'SoftLayer_Container_Product_Order_Virtual_Guest',
'quantity' => 1,
#
# http://sldn.softlayer.com/reference/datatypes/SoftLayer_Virtual_Guest
#
'virtualGuests' => [
{
'hostname' => 'test-%s' % Time.now.strftime( '%F%T' ).gsub(/\D/, '' ),
'domain' => 'example.jp'
}
],
'location' => 168642, # NOTE: 168642 is 'sjc01' location ID
'packageId' => 46, # NOTE: 46 is 'Virtual Guests' package ID
'useHourlyPricing' => false,
'prices' => [
#
# Required Categories
#
{ 'id' => 1640 }, # 1640 -- 1 x 2.0 GHz Core
{ 'id' => 1644 }, # 1644 -- 1 GB
{ 'id' => 905 }, # 905 -- Reboot / Remote Console
{ 'id' => 272 }, # 272 -- 10 Mbps Public & Private Network Uplinks
{ 'id' => 248 }, # 248 -- 5000 GB Bandwidth
{ 'id' => 21 }, # 21 -- 1 IP Address
{ 'id' => 13899 }, # 13899 -- 25 GB (LOCAL)
{ 'id' => 17446 }, # 17446 -- Ubuntu Linux 12.04 LTS Precise Pangolin - Minimal Install (64 bit)
{ 'id' => 55 }, # 55 -- Host Ping
{ 'id' => 57 }, # 57 -- Email and Ticket
{ 'id' => 58 }, # 58 -- Automated Notification
{ 'id' => 420 }, # 420 -- Unlimited SSL VPN Users & 1 PPTP VPN User per account
{ 'id' => 418 }, # 418 -- Nessus Vulnerability Assessment & Reporting
#
{ 'id' => 410 }, # 410 -- 10Mbps Hardware Firewall
]
}

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

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/verifyOrder
#
begin
result = product_order_service.verifyOrder( product_order )
puts "The order was verified successfully"
pp result
rescue => error_reason
puts "The order could not be verified by the server: #{error_reason}"
exit
end

#
# http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/placeOrder
#
begin
result = product_order_service.placeOrder( product_order )
puts "The order was placed successfully"
pp result
rescue => error_reason
puts "The order could not be placed by the server: #{error_reason}"
exit
end


__END__

これを実行すると次のような結果が得られます。


The order was verified successfully
:
(中略)
:
{"currentPriceFlag"=>nil,
"id"=>410,
"itemId"=>299,
"laborFee"=>"0",
"onSaleFlag"=>nil,
"oneTimeFee"=>"0",
"oneTimeFeeTax"=>"0",
"proratedRecurringFee"=>"17.387096774194",
"proratedRecurringFeeTax"=>"0",
"quantity"=>nil,
"recurringFee"=>"49",
"recurringFeeTax"=>"0",
"setupFee"=>"0",
"sort"=>0,
"categories"=>
[{"categoryCode"=>"firewall",
"id"=>30,
"name"=>"Hardware & Software Firewalls",
"quantityLimit"=>0}],
"item"=>
{"capacity"=>"10",
"description"=>"10Mbps Hardware Firewall",
"id"=>299,
"softwareDescriptionId"=>nil,
"units"=>"Mbps",
"upgradeItemId"=>nil,
"bundle"=>[]}}],
:
(中略)
:
The order was placed successfully
:
(中略)
:
{"currentPriceFlag"=>nil,
"id"=>410,
"itemId"=>299,
"laborFee"=>"0",
"onSaleFlag"=>nil,
"oneTimeFee"=>"0",
"oneTimeFeeTax"=>"0",
"proratedRecurringFee"=>"17.387096774194",
"proratedRecurringFeeTax"=>"0",
"quantity"=>nil,
"recurringFee"=>"49",
"recurringFeeTax"=>"0",
"setupFee"=>"0",
"sort"=>0,
"categories"=>
[{"categoryCode"=>"firewall",
"id"=>30,
"name"=>"Hardware & Software Firewalls",
"quantityLimit"=>0}],
"item"=>
{"capacity"=>"10",
"description"=>"10Mbps Hardware Firewall",
"id"=>299,
"softwareDescriptionId"=>nil,
"units"=>"Mbps",
"upgradeItemId"=>nil,
"bundle"=>[]}}],
:
(中略)
:
{"categoryCode"=>"firewall",
"description"=>"10Mbps Hardware Firewall",
"id"=>33974552,
"itemId"=>299,
"itemPriceId"=>"410",
"laborFee"=>"0",
"laborFeeTaxRate"=>"0",
"oneTimeFee"=>"0",
"oneTimeFeeTaxRate"=>"0",
"parentId"=>33974526,
"promoCodeId"=>nil,
"quantity"=>nil,
"recurringFee"=>"49",
"setupFee"=>"0",
"setupFeeDeferralMonths"=>12,
"setupFeeTaxRate"=>"0",
"bundledItems"=>[],
"category"=>
{"categoryCode"=>"firewall",
"id"=>30,
"name"=>"Hardware & Software Firewalls",
"quantityLimit"=>0},
"children"=>[],
"order"=>nil,
"storageGroups"=>[]},
:
(中略)
:
{"categoryCode"=>"firewall",
"description"=>"10Mbps Hardware Firewall",
"id"=>33974552,
"itemId"=>299,
"itemPriceId"=>"410",
"laborFee"=>"0",
"laborFeeTaxRate"=>"0",
"oneTimeFee"=>"0",
"oneTimeFeeTaxRate"=>"0",
"parentId"=>33974526,
"promoCodeId"=>nil,
"quantity"=>nil,
"recurringFee"=>"49",
"setupFee"=>"0",
"setupFeeDeferralMonths"=>12,
"setupFeeTaxRate"=>"0",
"bundledItems"=>[],
"category"=>
{"categoryCode"=>"firewall",
"id"=>30,
"name"=>"Hardware & Software Firewalls",
"quantityLimit"=>0},
"children"=>[],
"order"=>nil,
"storageGroups"=>[]},
:
(中略)
:
{"categoryCode"=>"firewall",
"description"=>"10Mbps Hardware Firewall",
"id"=>33974552,
"itemId"=>299,
"itemPriceId"=>"410",
"laborFee"=>"0",
"laborFeeTaxRate"=>"0",
"oneTimeFee"=>"0",
"oneTimeFeeTaxRate"=>"0",
"parentId"=>33974526,
"promoCodeId"=>nil,
"quantity"=>nil,
"recurringFee"=>"49",
"setupFee"=>"0",
"setupFeeDeferralMonths"=>12,
"setupFeeTaxRate"=>"0",
"bundledItems"=>[],
"category"=>
{"categoryCode"=>"firewall",
"id"=>30,
"name"=>"Hardware & Software Firewalls",
"quantityLimit"=>0},
"children"=>[],
"order"=>nil,
"storageGroups"=>[]},
:
(中略)
:

Virtual Server と Hardware Firewall が同時に作成できました。

なお、デフォルトではファイアウォールにルールが設定されておらず、すべての通信が素通しの状態となっています。
ファイアウォールの操作については次の記事に譲ります。

Virtual Server に結び付けられた Hardware Firewall を確認する

では、作成した Virtual Server と Hardware Firewall を確認してみましょう。

まずはslコマンドで作成した Virtual Server を確認します。


% sl vs list
:.........:............:................................:.......:........:.................:..............:....................:
: id : datacenter : host : cores : memory : primary_ip : backend_ip : active_transaction :
:.........:............:................................:.......:........:.................:..............:....................:
: XXXXX64 : sjc01 : test-20140516144201.example.jp : 1 : 1G : 108.168.XX8.XX7 : 10.88.X5.XX1 : - :
:.........:............:................................:.......:........:.................:..............:....................:


% sl vs detail XXXXX64
:....................:.....................................................:
: Name : Value :
:....................:.....................................................:
: id : XXXXX64 :
: hostname : test-20140516144201.example.jp :
: status : Active :
: active_transaction : - :
: state : Running :
: datacenter : sjc01 :
: os : Ubuntu :
: os_version : 12.04-64 Minimal for VSI :
: cores : 1 :
: memory : 1G :
: public_ip : 108.168.XX8.XX7 :
: private_ip : 10.88.X5.XX1 :
: private_only : False :
: private_cpu : False :
: created : 2014-05-16T14:42:06+09:00 :
: modified : 2014-05-16T14:58:55+09:00 :
: vlans : :.........:........:........: :
: : : type : number : id : :
: : :.........:........:........: :
: : : PUBLIC : XX04 : XXXX26 : :
: : : PRIVATE : XX52 : XXXX28 : :
: : :.........:........:........: :
:....................:.....................................................:

次にslコマンドで作成した Virtual Server に紐付いている Hardware Firewall を確認します。
ファイアウォールのserver/vlan idはVirtual Serverのidであることがわかります。


% sl firewall list
:.............:................:..........:................:
: firewall id : type : features : server/vlan id :
:.............:................:..........:................:
: cci:XXX94 : CCI - standard : - : XXXXX64 :
:.............:................:..........:................:

Hardware Firewallのルールはまだ設定されていません。


% sl firewall detail cci:XXX94
:...:........:..........:........:..........:......:...........:
: # : action : protocol : src_ip : src_mask : dest : dest_mask :
:...:........:..........:........:..........:......:...........:
:...:........:..........:........:..........:......:...........:

softlayer-api-ruby-client からも Virtual Server に紐付いた Hardware Firewall を確認してみましょう。

次は SoftLayer_Account サービスから sl firewall detail コマンド同様のマスク を設定してデータオブジェクトを取得することで、Hardware Firewall の情報を取得するプログラムです。


#!/usr/bin/ruby

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'

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

#
# https://github.com/softlayer/softlayer-python/blob/v3.1.0/SoftLayer/managers/firewall.py#L171
#
mask=[
'networkVlans[' +
'firewallNetworkComponents, ' +
'networkVlanFirewall, ' +
'dedicatedFirewallFlag, ' +
'firewallGuestNetworkComponents, ' +
'firewallInterfaces, ' +
'firewallRules, ' +
'highAvailabilityFirewallFlag]'
# 'primarySubnet': None,
]
response = account_service.
object_mask( 'mask[' + mask.join( ',' ) + ']' ).
getObject()

pp response


#
# result
#
__END__

これを実行すると次のような結果が得られます。


{
:
(中略)
:
"networkVlans"=>
[{"accountId"=>XXXX78,
"id"=>XXXX26,
"modifyDate"=>"2014-05-07T10:50:07+09:00",
"networkVrfId"=>nil,
"primarySubnetId"=>XXXX98,
"vlanNumber"=>XX04,
"dedicatedFirewallFlag"=>0,
"firewallGuestNetworkComponents"=>
[{"guestNetworkComponentId"=>XXXXX66,
"id"=>XXX94,
"networkComponentId"=>nil,
"status"=>"bypass",
"guestNetworkComponent"=>
{"createDate"=>"2014-05-16T14:42:34+09:00",
"guestId"=>XXXXX64,
"id"=>2242466,
"macAddress"=>"XX:XX:XX:XX:XX:94",
"maxSpeed"=>10,
"modifyDate"=>"2014-05-16T14:42:59+09:00",
"name"=>"eth",
"networkId"=>XXXXX18,
"port"=>1,
"speed"=>10,
"status"=>"ACTIVE",
"uuid"=>"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"guest"=>
{"accountId"=>XXXX78,
"createDate"=>"2014-05-16T14:42:06+09:00",
"dedicatedAccountHostOnlyFlag"=>false,
"domain"=>"example.jp",
"fullyQualifiedDomainName"=>"test-20140516144201.example.jp",
"hostname"=>"test-20140516144201",
"id"=>XXXXX64,
"lastPowerStateId"=>nil,
"lastVerifiedDate"=>nil,
"maxCpu"=>1,
"maxCpuUnits"=>"CORE",
"maxMemory"=>1024,
"metricPollDate"=>nil,
"modifyDate"=>"2014-05-16T17:32:22+09:00",
"startCpus"=>1,
"statusId"=>1001,
"uuid"=>"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"}}}],
"firewallInterfaces"=>
[{"id"=>XX54, "name"=>"inside"}, {"id"=>XX55, "name"=>"outside"}],
"firewallNetworkComponents"=>[],
"firewallRules"=>[],
"highAvailabilityFirewallFlag"=>false},
:
(中略)
:

ここで一旦 API ではなく Web ポータル画面からファイアウォールのルールの設定を行っておきます。
[Devices]メニューから[Device List]を選び、作成した Virtual Server を選択し、[Firewall]タブを開きます。


softlayer-api-ruby-vs-hwfw-1-firewall

Action: Permit、Port Range: 22-22、Protocol: TCP と入力し、[Process Rules]ボタンを押下してルールを追加します。

では、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 :
:...:........:..........:.........:..........:.....................:.................:

先のプログラムでも同様に確認してみましょう。


:
(中略)
:
"firewallInterfaces"=>
[{"id"=>4654, "name"=>"inside"}, {"id"=>4655, "name"=>"outside"}],
"firewallNetworkComponents"=>[],
"firewallRules"=>
[{"action"=>"permit",
"destinationIpAddress"=>"any on server",
"destinationIpCidr"=>32,
"destinationIpSubnetMask"=>"255.255.255.255",
"destinationPortRangeEnd"=>22,
"destinationPortRangeStart"=>22,
"id"=>XXXXX26,
"orderValue"=>1,
"protocol"=>"tcp",
"sourceIpAddress"=>"0.0.0.0",
"sourceIpCidr"=>0,
"sourceIpSubnetMask"=>"0.0.0.0",
"status"=>"allow_edit",
"version"=>4}],
"highAvailabilityFirewallFlag"=>false},
:
(中略)
:

firewallRulesが更新されていることがわかります。

まとめ

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

Author

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

Daisuke Higuchiの記事一覧

新規CTA