Sumo Logic に OneLogin の ユーザーデータを取り込んでみた

f:id:pentiotech:20200420115752p:plain ペンティオの Sumo Logic 担当の佐藤です。

今回は Sumo Logic に OneLogin のユーザーデータを取り込む方法を紹介します。
そもそも、Sumo Logic にデータがないとデータを分析することはできません!
Sumo Logic における「データの取り込み」について参考になれば幸いです。

準備するもの

  • Read Users の権限が与えられた OneLogin API Credentials
  • Sumo Logic の HTTP EndPoints

概要

f:id:wjnos:20200413135628p:plain
構成図

今回は OneLogin から Sumo Logic にデータを送る仲介となるプログラムを作成します。 OneLogin の API を利用してユーザーデータを取得し、そのデータを Sumo Logic に POST送信する流れをコーディングしていきます。

OneLogin ユーザーデータ

以下の API を利用してユーザーデータを取得していきます。

developers.onelogin.com

実装

今回実装したプログラムです。

import requests
import json
import datetime

## アクセストークンを発行する
class Token:
    def __init__(token, client_id, client_secret):
        token.client_id = client_id
        token.client_secret = client_secret
        token.session = requests.Session()
        token.session.headers = {'Content-Type': 'application/json'}
        oauth_endpoint = '/auth/oauth2/v2'
        token.base_url = 'https://api.us.onelogin.com'
        token.target = token.base_url + oauth_endpoint
        token.status = token.get_token()
    
    def get_token(token):
        authorization = 'client_id: %s, client_secret: %s' % (token.client_id, token.client_secret)
        token.session.headers.update({'Authorization':authorization})
        r = token.session.post(token.target + '/token', json={'grant_type':'client_credentials'})
        if r.status_code != 200:
            return False
        else:
            token.access_token = r.json()['access_token']
            return True

## ユーザーデータを取得する
class User(Token):
    def __init__(user, token):
        user.session = requests.Session()
        user.session.headers = {'Content-Type': 'application/json'}
        user.user_endpoint = '/api/1/users'
        user.base_url = token.base_url
        user.session.headers.update({'Authorization': 'Bearer:%s' % token.access_token})
    
    def get_all_users(user, query='?sort=+id'):
        next_page = 1
        response = []
        original_user_endpoint = user.user_endpoint
        while next_page != 0:
            r = user.session.get(user.base_url + user.user_endpoint + query)
            if r.status_code != 200:
                next_page == 0
                return False
            else:
                if r.json()['pagination']['next_link'] == None:
                    next_page == 0
                    response.extend(r.json()['data'])
                    return response
                else:
                    user.user_endpoint = original_user_endpoint + query + '&after_cursor=' + r.json()['pagination']['after_cursor']
                    response.extend(r.json()['data'])

### 1. API を利用してデータを取得する ###
client_id = '' # ここに OneLogin の Client ID を書く
client_secret = '' # ここに OneLogin の Client Secret を書く
token = Token(client_id=client_id, client_secret=client_secret)
user = User(token)
result = user.get_all_users()

### 2. 必要に応じてデータを整形する ###
payload = ''
now = datetime.datetime.now(datetime.timezone(datetime.timedelta(hours=9))).strftime("%Y-%m-%dT%H:%M:%S%Z")
for user_data in result:
    post_data = {}
    post_data['timestamp'] = now
    post_data['data'] = user_data
    post_data['data_type'] = 'User'
    payload += json.dumps(post_data) + '\n'

### 3. Sumo Logic に POST する ###
url = '' # ここに Sumo Logic の HTTP EndPoints を書く
requests.post(url, data=payload)

基本的な流れは

  1. API を利用してデータを取得する
  2. 必要に応じてデータを整形する
  3. Sumo Logic に POST する

結果

Sumo Logic にデータが取り込まれました。

f:id:wjnos:20200423164011p:plain
Sumo Logic に取り込まれた OneLogin ユーザーデータ

まとめ

今回は OneLogin のユーザーデータに絞りましたが、API が利用できるサービスであれば Sumo Logic にデータを取り込ませることは可能です。プログラムを活用して、Sumo Logic にどんどんデータを取り込みましょう。