LoginSignup
1
0

FortiGateのアプリケーションコントロールIDを取得する

Last updated at Posted at 2019-12-13

はじめに

FortiGateのアプリケーションコントロールIDはfortiguard.comにて公開されてますが、一覧では表示されません。。。
フローコレクタに情報を読み込ませる時など、csvで一覧が欲しいと思った方は少なからずいるはず。

本体から取得する

下記のコマンドを利用してCLIから一覧を取得できます。

config application list
edit default
config entries
edit 1

# set application ?

?を入力すると出力されるわけですが、機器によって対応しているアプリケーションが異なるので、できればfortiguard.comから全てのデータを取得したい。

自作ツール作りました。

pythonで自作ツールを作りました。

pip install beautifulsoup4 lxml requests
import requests
import csv
import re
import time
from bs4 import BeautifulSoup

s = requests.Session()

url = 'https://www.fortiguard.com/appcontrol'

user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
headers = {'User-Agent': user_agent, 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'}

while True:
    try:
        get_url_info = s.get(url, headers=headers, timeout=5)
        get_url_info.raise_for_status()
        bs4Obj = BeautifulSoup(get_url_info.content, 'lxml')
        result = bs4Obj.find('div', class_='sidebar-content')
        appids = int(re.findall('[0-9]+', result.find('a').get_text().replace(',', ''))[0])
        perPage = int(len(bs4Obj.find_all('div', class_='title')))
        break
    except Exception as e:
        print(e)
        time.sleep(1)
        continue

if appids % perPage == 0:
    pages = int(appids // perPage)
else:
    pages = int(appids // perPage) + 1

i = 1
datas = []
url_base = 'https://www.fortiguard.com/appcontrol?page='

while pages + 1 > i:
    print('page:', i, '/', pages)
    url = url_base + str(i)
    try:
        time.sleep(1)
        get_url_info = s.get(url, headers=headers, timeout=5)
        get_url_info.raise_for_status()
        bs4Obj = BeautifulSoup(get_url_info.content, 'lxml')
        app_list = bs4Obj.find_all('div', class_='title')
        if len(app_list) != perPage:
            if i == pages:
                pass
            else:
                continue
    except Exception as e:
        print(e)
        continue
    j = 0
    while True:
        try:
            app_name = str(app_list[j].find('a').get_text())
            app_num = int(re.findall('[0-9]+', app_list[j].find('a').get('href'))[0])
            data = [app_num, app_name]
            datas.append(data)
            j += 1
        except:
            break
    i += 1

print('result:', len(datas), '/', appids)

with open('appid.csv', 'w') as file:
    writer = csv.writer(file, lineterminator='\n')
    writer.writerows(sorted(datas))

Githubに同じコードをアップしてます。
https://github.com/Connie-Wild/FortiOS_AppControlID
それでは!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0