読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

はじめての Cisco onePK

Cisco Network onePK

Cisco onePK とは

Cisco onePK(以下、onePK)はネットワークの雄・Cisco 社が公式にリリースしている SDK(Software Development Kit)です。プログラマーにとっては当たり前の用語である「SDK」も、ネットワークエンジニアの方には耳慣れないかもしれません。Wikipedia によると SDK は以下のように定義されています。とりあえず、「これが無いと onePK アプリケーションを開発出来ないんだ」程度に覚えておけば問題無いかと思います。

ソフトウェア開発キット(ソフトウェアかいはつキット、英語: Software Development Kit、SDK)は一般に、特定のソフトウェアパッケージ、ソフトウェアフレームワーク、ハードウェアプラットフォーム、コンピュータシステム、ゲーム機、オペレーティングシステムなどのためのアプリケーションを作成するためにソフトウェア技術者が使用する開発ツールのセットを意味する。

ソフトウェア開発キット

従来、ネットワークエンジニアは主にコンソールからコマンドを入力し、Cisco 製品を設定してきました。ターミナルソフトウェアのマクロや expect スクリプトで操作を自動化することも出来ましたが、これらは基本的に「コマンドラインとの対話」である為、IOS のバージョンアップでコマンドの出力が変わると動作しない、といった問題がありました。

しかし、今後は onePK アプリケーションを開発・利用することで「外部のアプリケーションから Cisco ルータや Catalyst スイッチを設定したり、状態確認する」ことが、より高度に・簡単に行えるようになりました。

動作モデル / 動作環境

onePK を用いたアプリケーションを開発するには以下のうち、いずれかの言語を用いてプログラミングする必要があります。どの言語を選択しても実現出来ることは同じですので、自分が最も習熟している言語を選択すると良いと思います。「どの言語も経験が無い」という方は、とっつき易さから Python をオススメします。

  1. C
  2. Java
  3. Python

onePK の動作環境を俯瞰視すると、以下のように図示することが出来ます。C / Java / Python のいずかで書かれた onePK アプリケーションを実行すると onePK API プレゼンテーション層へ命令が伝わります。これが onePK API インフラストラクチャー層で各 OS ごとの命令に変換され、相手がどの OS であっても(サポート対象であれば)任意の命令が実行されることになるそうです。

f:id:sig9:20141225184911p:plain

onePK アプリケーションの配備モデルは以下の 3 パターンあります。各々、「onePK アプリケーションがどこで実行されているか?」といった違いがあるものの、どの配備モデルであっても全く同じソースコードを動作させることが出来ます。

(1) プロセス ホスティング
Cisco 製品内で直接、onePK アプリケーションを動作させる配備モデル。遅延が無い、といったメリットがある。
(2) ブレード ホスティング
SRE-V や UCS E シリースサーバ等、一部のプラットフォームでのみ、サポートされている配備モデル。プロセスホスティング同様、Cisco 製品内で直接、onePK アプリケーションを動作させる(らしい)。
(3) エンド・ポイント ホスティング
onePK アプリケーションは外部ホスト(サーバ)に配備するモデル。onePK アプリケーションの実行に高いスペックが必要な場合や、onePK アプリケーションの実行位置を中央管理したい場合に有効と思われる。

図示すると以下のようになります。

f:id:sig9:20141226152722p:plain

エンド・ポイント ホスティングの場合、「制御する側であるホスト」と「制御される側であるデバイス」に分けて考えます。ホスト 〜 デバイス間は HTTPS 通信でセキュリティを確保する為に利用されている "TLS 方式" で暗号化されたトンネル内で通信が行われる為、安全です。標準でデバイス側は onePK 用通信を TCP/15002 で待ち受けます。

f:id:sig9:20141226163209p:plain

エンド・ポイント ホスティングの場合、ホスト側は onePK さえインストールされていれば OS は問わないと思います。但し、環境構築や安定運用の容易さから、ホストには Linux を利用するケースが多くなると思われます。

デバイス側は 2014 年 12 月時点で特定の機種しかサポートされていません。Catalyst 等も順次、サポートされていくそうですので、今後に期待です。onePK は IP Base で動作する為、追加のライセンス購入は不要です。

OS サポート対象機種
IOS ISR G2
IOS-XE ASR1000, CSR1000V
IOS-XR ASR9000
NX-OS Nexus 3000/7000

メリット・デメリット

「onePK のメリット」ですが、そもそも「アプリケーションを開発して何かを制御するメリット」がそのまま当てはまると思います。具体的には以下等をメリットとして挙げることが出来ると思います。

○ ニーズに合わせたアプリケーションを作れる
従来の設定だけでは対応出来ない、条件によって振る舞いを変えるような、複雑な動作をするアプリケーションを作ることが出来る為、ユーザのニーズを実現しやすい。
○ OS ごとの設定コマンドを覚える必要が無い
IOS, IOS-XE/XR, NX-OS 等の「OS の違い(設定コマンドの違い)」を意識せず、同じアプリケーションで異なる OS を制御することが出来る為、汎用性が高い。
○ 従来の設定と共存出来る
onePK は従来の設定や監視システムと共存出来る為、既存の仕組みを活かしたまま、「必要な部分だけを onePK で自動化する」といったことが容易である。
○ 本格的な統合開発環境を利用出来る
マクロ言語では無く、本格的な言語でプログラミングをしなければならない分、別の言い方をすると「本格的な開発環境を利用出来、開発効率が上がる(場合もある)」とも言える。もちろん、使い慣れたエディタでも良い。

逆に、(当たり前なのですが)デメリットとしては以下を挙げることが出来ると思います。

● プログラミングしないと、何も出来ない
onePK は「SDK」に過ぎない為、開発(=プログラミング)しないと全く意味を成さない。

サービスセットとは

「サービスセット」とは onePK で提供される機能をグループごとにまとめたものです。onePK アプリケーションを開発する際は必要なサービスセットを駆使して、プログラミングしていくことになります。

サービスセット Service Set 内容
データパス Data Path パケットやフローレベルでの通信制御等
ポリシー Policy ACL 情報の取得・設定、QoS 蔵法の取得・設定等
ルーティング Routing ルーティング情報の取得、ルーティングの追加・削除等
エレメント Element onePK アプリケーションと Cisco 機器のセッション管理等
ディスカバリ Discovery Cisco 機器内サービスの探索、ネットワーク・トポロジーの探索等
ユーティリティ Utilities Syslog イベントの処理、AAA イベントの処理等
デベロッパ Developer onePK のデバッグ

Hello, onePK!

簡単なアプリケーションを開発し、onePK を体験してみます。ホスト側は「Ubuntu」を、デバイス側は「Cisco CSR1000V」を利用します。バージョンは以下の通りです。開発言語は Python を使うことにします。

  • ホスト側(Linux
  • デバイス側(Cisco CSR1000V)
    • Cisco IOS XE Software, Version 03.13.01.S - Extended Support Release
    • Cisco IOS Software, CSR1000V Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 15.4(3)S1, RELEASE SOFTWARE (fc3)
    • onePK 1.3.0

【デバイス側】基本的な設定

onePK の設定を始める前に Cisco ルータで基本的な設定を済ませておきます。"ADMIN" というユーザを作成していますが、これは SSH ログイン用だけでは無く、onePK 接続時にも利用します。具体的なコンフィグ例は以下の通りです。

hostname R1
!
service timestamps debug datetime localtime
service timestamps log datetime localtime
!
aaa new-model
!
clock timezone JST 9 0
!
ip domain-name example.local
!
username ADMIN privilege 15 password PASSWORD
!
crypto key generate rsa modulus 2048
!
interface GigabitEthernet1
 ip address 192.168.253.22 255.255.0.0
 no shutdown
!
line vty 0 4
 exec-timeout 60 0
 privilege level 15
 transport input ssh
!
end

【デバイス側】自己証明書の発行

onePK と Cisco ルータ間は前述の通り、TLS 方式で保護された通信が行われます。正式には公開 CA 局から発行された証明書を使うべきだと思いますが、今回はあくまで「検証」なので、Cisco ルータ自身で自己証明書を発行します。最初に show crypto pki certificates を実行し、既定の状態では証明書が無いことを確認しておきます。

R1# show crypto pki certificates
R1#

show onep status を実行して onePK の状態を確認しておきます。まだ何も設定していない為、トランスポートが「Transport: tls; Status: disabled」と、無効になっています。

R1# show onep status
Status: enabled by: Container Installed
Version: 1.3.0
Transport: tls; Status: disabled
Transport: tipc; Status: running; Port: 15003
Session Max Limit: 10
CPU Interval: 0 seconds
CPU Falling Threshold: 0%
CPU Rising Threshold: 0%
History Buffer: Enabled
History Buffer Purge: Oldest
History Buffer Size: 32768 bytes
History Syslog: Disabled
History Archived Session: 0
History Max Archive: 16
Trace buffer debugging level is info


Service Set: Base               State: Enabled     Version 1.3.0
Service Set: Vty                State: Disabled    Version 0.1.0
Service Set: OneFW              State: Disabled    Version 0.1.0
Service Set: Mediatrace         State: Disabled    Version 1.0.0
Service Set: AdvancedRouting    State: Disabled    Version 1.0.0

以下のコマンドを実行し、onePK で利用するトランスポートに TLS を指定しつつ、自己証明書を発行します。

R1(config)# onep
R1(config-onep)# transport type tls disable-remotecert-validation

show crypto pki certificates を確認すると、自己証明書(IOS-Self-Signed-Certificate)が発行されているのが分かります。

R1# show crypto pki certificates
Router Self-Signed Certificate
  Status: Available
  Certificate Serial Number (hex): 01
  Certificate Usage: General Purpose
  Issuer:
    cn=IOS-Self-Signed-Certificate-3877283833
  Subject:
    Name: IOS-Self-Signed-Certificate-3877283833
    cn=IOS-Self-Signed-Certificate-3877283833
  Validity Date:
    start date: 00:21:58 JST Dec 27 2014
    end   date: 09:00:00 JST Jan 1 2020
  Associated Trustpoints: TP-self-signed-3877283833
  Storage: nvram:IOS-Self-Sig#1.cer

show onep status を実行すると、トランスポートが TLS になっており、自己証明書を参照していることが分かります。

R1# show onep status
Status: enabled by: Config,Container Installed
Version: 1.3.0
Transport: tls; Status: running; Port: 15002; localcert: TP-self-signed-3877283833; client cert validation disabled
Certificate Fingerprint SHA1: 5C9BFCDE F106B9BB EA76AAE9 582A1B6B BBA9CD7D
Transport: tipc; Status: running; Port: 15003
Session Max Limit: 10
CPU Interval: 0 seconds
CPU Falling Threshold: 0%
CPU Rising Threshold: 0%
History Buffer: Enabled
History Buffer Purge: Oldest
History Buffer Size: 32768 bytes
History Syslog: Disabled
History Archived Session: 0
History Max Archive: 16
Trace buffer debugging level is info


Service Set: Base               State: Enabled     Version 1.3.0
Service Set: Vty                State: Disabled    Version 0.1.0
Service Set: OneFW              State: Disabled    Version 0.1.0
Service Set: Mediatrace         State: Disabled    Version 1.0.0
Service Set: AdvancedRouting    State: Disabled    Version 1.0.0

但し、このままでは自己証明書を利用することが出来ません。証明書には onePK 接続を受け付けるアドレスを埋め込む必要がある為です。よって、IOS 上で証明書を登録(enroll)し直します。「% Include an IP address in the subject name?」に yes と回答し、onePK 接続を受け付けるアドレスを入力し、enroll し直します。

R1(config)# crypto pki enroll TP-self-signed-1978128535
% Include the router serial number in the subject name? [yes/no]: no
% Include an IP address in the subject name? [no]: yes
Enter Interface name or IP Address[]: 10.100.4.254
Generate Self Signed Router Certificate? [yes/no]: yes

再度、show crypto pki certificates を実行すると、今回は IP アドレスが追加登録されていることが分かります。

R1# show crypto pki certificates
Router Self-Signed Certificate
  Status: Available
  Certificate Serial Number (hex): 01
  Certificate Usage: General Purpose
  Issuer:
    ipaddress=192.168.253.22+hostname=R1.example.local
    cn=IOS-Self-Signed-Certificate-3877283833
  Subject:
    Name: R1.example.local
    IP Address: 192.168.253.22
    ipaddress=192.168.253.22+hostname=R1.example.local
    cn=IOS-Self-Signed-Certificate-3877283833
  Validity Date:
    start date: 00:54:07 JST Dec 27 2014
    end   date: 09:00:00 JST Jan 1 2020
  Associated Trustpoints: TP-self-signed-3877283833

【デバイス側】自己署名 CA 証明書のエクスポート

自己署名の CA 証明書を Linux 側にインポートする為、まずは Cisco ルータから証明書を PEM 形式でターミナルにエクスポートします。

R1(config)# crypto pki export TP-self-signed-3877283833 pem terminal
% Self-signed CA certificate:
-----BEGIN CERTIFICATE-----
MIICpzCCAhCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMS8wLQYDVQQDEyZJT1Mt
U2VsZi1TaWduZWQtQ2VydGlmaWNhdGUtMzg3NzI4MzgzMzE8MBsGCSqGSIb3DQEJ
CBMOMTkyLjE2OC4yNTMuMjIwHQYJKoZIhvcNAQkCFhBSMS5leGFtcGxlLmxvY2Fs
MB4XDTE0MTIyNjE1NTQwN1oXDTIwMDEwMTAwMDAwMFowbzEvMC0GA1UEAxMmSU9T
LVNlbGYtU2lnbmVkLUNlcnRpZmljYXRlLTM4NzcyODM4MzMxPDAbBgkqhkiG9w0B
CQgTDjE5Mi4xNjguMjUzLjIyMB0GCSqGSIb3DQEJAhYQUjEuZXhhbXBsZS5sb2Nh
bDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAnkDRsr6m6X5N2M7/rg2j6spu
fdCZUlU9qP/kVdFikPuOJXmGkUVQfGPXVWLa4gFAgieJVmB6pxZX1mdNlzZUeiqp
AqKWcu763Nnee8G/I2KDZilxw+EBqjiz209dheRMmR9pMB517sTCzklXoiZYGqHX
NunS7IRGzz4USjmpPpECAwEAAaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
GDAWgBT6pXbh4hxgCI9NiPFNCbAGABEF+DAdBgNVHQ4EFgQU+qV24eIcYAiPTYjx
TQmwBgARBfgwDQYJKoZIhvcNAQEFBQADgYEAMZR4ZP/wMRefTPcBverDc6QlkX7l
F6F8LTVFSRITBvby1tc2otVb3QAtv+UUw3JEFkaOSc8ZbViVkJyG8q89+3aNi1d9
NDRjV/5AsnBfRDYKDlUMzh45SXRjHtV9GFWo0ZmIA8T1OY/tddoiFR5ZUG/RBRYk
ogZJlEqzEpuKNRg=
-----END CERTIFICATE-----

% General Purpose Certificate:
-----BEGIN CERTIFICATE-----
MIICpzCCAhCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMS8wLQYDVQQDEyZJT1Mt
U2VsZi1TaWduZWQtQ2VydGlmaWNhdGUtMzg3NzI4MzgzMzE8MBsGCSqGSIb3DQEJ
CBMOMTkyLjE2OC4yNTMuMjIwHQYJKoZIhvcNAQkCFhBSMS5leGFtcGxlLmxvY2Fs
MB4XDTE0MTIyNjE1NTQwN1oXDTIwMDEwMTAwMDAwMFowbzEvMC0GA1UEAxMmSU9T
LVNlbGYtU2lnbmVkLUNlcnRpZmljYXRlLTM4NzcyODM4MzMxPDAbBgkqhkiG9w0B
CQgTDjE5Mi4xNjguMjUzLjIyMB0GCSqGSIb3DQEJAhYQUjEuZXhhbXBsZS5sb2Nh
bDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAnkDRsr6m6X5N2M7/rg2j6spu
fdCZUlU9qP/kVdFikPuOJXmGkUVQfGPXVWLa4gFAgieJVmB6pxZX1mdNlzZUeiqp
AqKWcu763Nnee8G/I2KDZilxw+EBqjiz209dheRMmR9pMB517sTCzklXoiZYGqHX
NunS7IRGzz4USjmpPpECAwEAAaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
GDAWgBT6pXbh4hxgCI9NiPFNCbAGABEF+DAdBgNVHQ4EFgQU+qV24eIcYAiPTYjx
TQmwBgARBfgwDQYJKoZIhvcNAQEFBQADgYEAMZR4ZP/wMRefTPcBverDc6QlkX7l
F6F8LTVFSRITBvby1tc2otVb3QAtv+UUw3JEFkaOSc8ZbViVkJyG8q89+3aNi1d9
NDRjV/5AsnBfRDYKDlUMzh45SXRjHtV9GFWo0ZmIA8T1OY/tddoiFR5ZUG/RBRYk
ogZJlEqzEpuKNRg=
-----END CERTIFICATE-----

【ホスト側】自己署名 CA 証明書のインポート

Cisco ルータからエクスポートした PEM 形式の出力結果のうち、「% Self-signed CA certificate:」直下の「-----BEGIN CERTIFICATE-----」から「-----END CERTIFICATE-----」を Linux ホスト上の任意のファイルに保存します。今回は /root/ca.pem というファイルにしました。後ほど作成する onePK アプリケーションから、この証明書を参照することになります。

-----BEGIN CERTIFICATE-----
MIICpzCCAhCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMS8wLQYDVQQDEyZJT1Mt
U2VsZi1TaWduZWQtQ2VydGlmaWNhdGUtMzg3NzI4MzgzMzE8MBsGCSqGSIb3DQEJ
CBMOMTkyLjE2OC4yNTMuMjIwHQYJKoZIhvcNAQkCFhBSMS5leGFtcGxlLmxvY2Fs
MB4XDTE0MTIyNjE1NTQwN1oXDTIwMDEwMTAwMDAwMFowbzEvMC0GA1UEAxMmSU9T
LVNlbGYtU2lnbmVkLUNlcnRpZmljYXRlLTM4NzcyODM4MzMxPDAbBgkqhkiG9w0B
CQgTDjE5Mi4xNjguMjUzLjIyMB0GCSqGSIb3DQEJAhYQUjEuZXhhbXBsZS5sb2Nh
bDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAnkDRsr6m6X5N2M7/rg2j6spu
fdCZUlU9qP/kVdFikPuOJXmGkUVQfGPXVWLa4gFAgieJVmB6pxZX1mdNlzZUeiqp
AqKWcu763Nnee8G/I2KDZilxw+EBqjiz209dheRMmR9pMB517sTCzklXoiZYGqHX
NunS7IRGzz4USjmpPpECAwEAAaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
GDAWgBT6pXbh4hxgCI9NiPFNCbAGABEF+DAdBgNVHQ4EFgQU+qV24eIcYAiPTYjx
TQmwBgARBfgwDQYJKoZIhvcNAQEFBQADgYEAMZR4ZP/wMRefTPcBverDc6QlkX7l
F6F8LTVFSRITBvby1tc2otVb3QAtv+UUw3JEFkaOSc8ZbViVkJyG8q89+3aNi1d9
NDRjV/5AsnBfRDYKDlUMzh45SXRjHtV9GFWo0ZmIA8T1OY/tddoiFR5ZUG/RBRYk
ogZJlEqzEpuKNRg=
-----END CERTIFICATE-----

【ホスト側】onePK のインストール

onePK SDK for Python ページから Python 版の onePK をダウンロードします。現時点ではバージョン 1.3.0.181 が最新です。

f:id:sig9:20141226165437p:plain

ダウンロードした onePK を展開し、インストールします。

tar zxvf onePK-sdk-python-rel-1.3.0.181.tar.gz
cd onePK-sdk-python-rel-1.3.0.181
python setup.py install

【ホスト側】最小のサンプルを実行してみる

最小のサンプルプログラミングを作成し、はじめての onePK アプリケーションを試してみます。任意のディレクトリに以下のファイルを作成します。ファイル名は「HelloOnePK.py」にしました。

#! /usr/bin/env python
import sys
from onep.element.NetworkElement import NetworkApplication, NetworkElement
from onep.element.SessionConfig import SessionConfig

argvs = sys.argv

myapp = NetworkApplication.get_instance()
ne = myapp.get_network_element(argvs[1])
config = SessionConfig(SessionConfig.SessionTransportMode.TLS)
config.ca_certs = "/root/ca.pem"

sh = ne.connect(argvs[2],argvs[3],config)

print ne.properties

ne.disconnect()

引数の意味は以下の通りです。

引数 意味
第一引数 onePK デバイスの IP アドレス
第二引数 onePK アクセス用ユーザ名
第三引数 onePK アクセス用ユーザのパスワード

作成した onePK アプリケーションを実行してみます。以下のような実行結果になれば成功です!

# python HelloOnePK.py 192.168.253.22 ADMIN PASSWORD
ElementProperty  [ 192.168.253.22 ]
	Product ID   : CSR1000V
	Processor    : VXE
	Serial No    : 94IVZYEJNNE
	sysName      : R1
	sysUpTime    : 1171
	sysDescr     : Cisco IOS Software, CSR1000V Software (X86_64_LINUX_IOSD-UNIVERSALK9-M), Version 15.4(3)S1, RELEASE SOFTWARE (fc3)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2014 by Cisco Systems, Inc.
Compiled Fri 31-Oct-14 17:32 by mcpre

onePK アプリケーションが接続してきた場合、デバイス側には以下のようなログが出力されます。

*Dec 27 01:04:23: %ONEP_BASE-6-CONNECT: [Element]: ONEP session Application:onePK_App Host:192.168.253.22 ID:7402 User:ADMIN has connected.
*Dec 27 01:04:23: %ONEP_BASE-6-DISCONNECT: [Element]: ONEP session Application:onePK_App Host:192.168.253.22 ID:7402 User:ADMIN has disconnected.