動機
いらいらしてやった。後悔はしていない。
というのは冗談ですが、「開発環境をニフティクラウドに置いていて外出先からテザリングで使う」ようなケースがあるかどうかはわからないので置いて置いて。
いつもとは違う環境からニフクラのサーバーにログインしようとして、「FWに穴が空いてなくてログインできない!どうしよう!」というケースは障害の時とか急いでいる時に限ってよくあるものです。
そういう時に限ってコントロールパネルにはアクセス元IPで制限がかかっており、外出先などからは操作できないようにしてあるもので、急いでいるのに会社の同僚に頼んでFWにIP許可制限を入れてもらうなんて時間のロスが発生したりしなかったりするかもしれません。
そんな時でも、ニフティクラウドのAPIは使えるので、ファイアウォールのIN許可設定に今の自分の端末がサーバーにアクセスする時に使うIPを設定しちゃえるわけです。(アクセスキーとシークレットアクセスキーだけ控えておけば)
作ったもの
# -*- coding: utf-8 -*-
import hashlib
import hmac
import base64
import requests
from datetime import datetime
ACCESS_KEY = u'12345678901234567890'
SECRET_KEY = u'1234567890abcdefghijklmnopqrstuvwxyzABCD'
region = 'east-1'
fw_group_name = 'hogehoge'
port = 22
src_ip = requests.get('https://httpbin.org/ip').json()['origin']
endpoint = 'https://' + region + '.cp.cloud.nifty.com/api/'
date = datetime.now().isoformat(timespec='milliseconds') + 'Z'
params = {
'Action':'AuthorizeSecurityGroupIngress',
'GroupName':fw_group_name,
'IpPermissions.1.IpProtocol':'TCP',
'IpPermissions.1.FromPort':port,
'IpPermissions.1.ToPort':port,
'IpPermissions.1.IpRanges.1.CidrIp':src_ip,
'IpPermissions.1.Description':'SetCurrentIpToFW.py',
'AccessKeyId':ACCESS_KEY,
'SignatureVersion':0,
'Timestamp':date
}
string_to_sign = params['Action'] + params['Timestamp']
params['Signature'] = base64.b64encode(
hmac.new(
SECRET_KEY.encode('utf-8'),
string_to_sign.encode('utf-8'),
hashlib.sha1
).digest()
)
resp = requests.get(url=endpoint, params=params)
print(resp.content)
使い方
- 必要なライブラリを
pip install
します。(私はrequests
だけで十分だったみたいです) -
ACCESS_KEY
とSECRET_KEY
にそれぞれアクセスキーとシークレットキーをニフクラのコンパネから取得して設定します。 -
region
,fw_group_name
,port
を適切に設定します。 -
src_ip
は実行環境がインターネットにアクセスするGlobalなIPを取って来ていますが、任意のIPを手打ちしてもOKです。 - 諸々を設定したら実行します。
- 実行結果の見辛い XML の中に True の文字があったら成功です。
7. エラーが出たら頑張ってデバッグしてください。
参考
http://cloud.nifty.com/api/rest/authenticate.htm
http://cloud.nifty.com/api/rest/AuthorizeSecurityGroupIngress.htm