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

らくがきちょう

なんとなく

Cisco CSR 1000V に REST API でアクセスするには

Cisco CSR 1000V に REST API でアクセスする為の設定をまとめておきます。商用環境で利用する際はセキュリティへの配慮が必要です。

検証環境

VIRL 上で以下の構成を作成しました。端末側は Micro Core Linux を使っています。Micro Core Linux はカスタムしてあり、最新の 6.3 系をベースに curl、nmap、python 等を追加してあります。

f:id:sig9:20150722002912p:plain

Cisco CSR 1000V の設定

Cisco CSR 1000V の設定は以下の通りです。

username USER privilege 15 password PASSWORD
!
transport-map type persistent webui REST-API
 secure-server
!
interface GigabitEthernet2
 ip address 192.168.1.1 255.255.255.0
 no shutdown
!
interface VirtualPortGroup 0
  ip unnumbered GigabitEthernet 2
!
virtual-service csr_mgmt
 vnic gateway VirtualPortGroup0
  guest ip address 192.168.1.2
 activate
!
ip http authentication local
ip http secure-server
ip route 192.168.1.2 255.255.255.255 VirtualPortGroup0
!
transport type persistent webui input REST-API
!
end

Virtual-Service の状態を確認すると以下のように表示されました。REST API が 55443/TCP で Listen していることも分かります。55443/TCP はデフォルト値ですが、設定で変更することも可能です。

Router# show virtual-service detail
Virtual service csr_mgmt detail
  State                 : Activated
  Package information
    Name                : iosxe-remote-mgmt.03.14.00.S.155-1.S-std.ova
    Path                : bootflash:/iosxe-remote-mgmt.03.14.00.S.155-1.S-std.ova
    Application
      Name              : csr_mgmt
      Installed version : 1.5.1
      Description       : CSR-MGMT
    Signing
      Key type          : Cisco development key
      Method            : SHA-1
    Licensing
      Name              : Not Available
      Version           : Not Available

  Detailed guest status

----------------------------------------------------------------------
Process               Status            Uptime           # of restarts
----------------------------------------------------------------------
nginx                  UP         0Y 0W 0D  0: 0:18        0
climgr                 UP         0Y 0W 0D  0: 0:18        0
restful_api            UP         0Y 0W 0D  0: 0:18        0
fcgicpa                Down
pnscag                 Down
pnscdme                Down
----------------------------------------------------------------------
Feature         Status                 Configuration
----------------------------------------------------------------------
Restful API   Enabled, UP             port: 55443
                                      auto-save-timer: 30 seconds
                                      socket: unix:/usr/local/nginx/csrapi-fcgi.sock;

PNSC          Disabled, Down

Network stats:
 eth0: RX  packets:16, TX  packets:6
 eth1: RX  packets:7, TX  packets:7

Coredump file(s): lost+found

  Activated profile name: None
  Resource reservation
    Disk                : 756 MB
    Memory              : 512 MB
    CPU                 : 30% system CPU

  Attached devices
    Type              Name        Alias
    ---------------------------------------------
    NIC               ieobc_1     ieobc
    NIC               dp_1_0      net2
    Disk              _rootfs
    Disk              /opt/var
    Disk              /opt/va...
    Serial/shell                  serial0
    Serial/aux                    serial1
    Serial/Syslog                 serial2
    Serial/Trace                  serial3
    Watchdog          watchdo...

  Network interfaces
    MAC address             Attached to interface
    ------------------------------------------------------
    54:0E:00:0B:0C:02       ieobc_1
    00:1E:E6:41:35:BA       VirtualPortGroup0

  Guest interface
  ---
  Interface: eth1
  ip address: 192.168.1.2/24

  ---

  Guest routes
  ---
  Address/Mask                         Next Hop                          Intf.
-------------------------------------------------------------------------------
0.0.0.0/0                            192.168.1.1                       eth1

  ---

  Resource admission (without profile) : passed
    Disk space    : 756MB
    Memory        : 512MB
    CPU           : 30% system CPU
    VCPUs         : Not specified

サーバ側からの通信確認

サーバ側から通信確認を行います。具体的には curl を使って POST します。

tc@box:~$ curl -k -X POST https://192.168.1.2:55443/api/v1/auth/token-services -
H "Accept:application/json" -u "USER:PASSWORD"
{"kind": "object#auth-token", "expiry-time": "Tue Jul 21 15:23:28 2015", "token-id": "q+gLN9oVJ0M9+hvVBAvG0DXAl2OsUiEiyyQp4ciV484=", "link": "https://192.168.1.2:55443/api/v1/auth/token-services/8476463567"}

JSON 形式でレスポンスを取得します。ただ、これでは見辛いので python -mjson.tool にパイプします。これで JSON のデータが整形されるので、かなり見やすくなったはずです。

tc@box:~$ curl -k -X POST https://192.168.1.2:55443/api/v1/auth/token-services -
H "Accept:application/json" -u "USER:PASSWORD" | python -mjson.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   207  100   207    0     0    190      0  0:00:01  0:00:01 --:--:--   190
{
    "expiry-time": "Tue Jul 21 15:23:28 2015",
    "kind": "object#auth-token",
    "link": "https://192.168.1.2:55443/api/v1/auth/token-services/8476463567",
    "token-id": "q+gLN9oVJ0M9+hvVBAvG0DXAl2OsUiEiyyQp4ciV484="
}

取得した認証トークンを指定しつつ、ホスト名を取得してみます。

tc@box:~$ curl -k -X GET https://192.168.1.2:55443/api/v1/global/host-name -H "A
ccept:application/json" -H 'X-auth-token:q+gLN9oVJ0M9+hvVBAvG0DXAl2OsUiEiyyQp4ci
V484=' -u "admin:admin" | python -mjson.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    51  100    51    0     0    131      0 --:--:-- --:--:-- --:--:--   131
{
    "host-name": "Router",
    "kind": "object#host-name"
}