ノート:

Pythonを使用したOCI IAMアイデンティティ・ドメインからのユーザー・グループ・メンバーシップ・レポートの生成

イントロダクション

Oracle Cloud Infrastructure(OCI)は、ストレージ、ネットワーキング、インフラストラクチャなど、さまざまなクラウド・サービスを提供できるクラウド・プラットフォームです。Oracle Cloud Infrastructure Identity and Access Management (OCI IAM)は、OCIリソースへのアクセスを管理できるサービスです。ユーザーおよびグループに対する認証および認可を提供します。

OCI IAMの主な機能の1つは、アクセス管理を簡素化するためにユーザーをグループに割り当てる機能です。OCI IAMのお客様の1つの一般的なシナリオは、OCI IAMアイデンティティ・ドメインからレポートを生成することです。OCI IAMアイデンティティ・ドメイン・コンソールから簡単に生成できるIAMレポートがいくつかあります。ただし、現在のところ、ユーザー・グループ・メンバーシップ・レポートの取得はOCI IAMのすぐに使用できる機能ではありませんが、REST APIコールを使用して簡単に生成できます。

対象読者

このチュートリアルは、IAMのプロフェッショナルおよび管理者を対象としています。

目標

このチュートリアルでは、Pythonを使用したREST APIを使用して、OCI IAMアイデンティティ・ドメインからユーザー・グループ・メンバーシップ・レポートを生成する方法について確認します。

前提条件

タスク1: OCI IAMアイデンティティ・ドメインでの機密アプリケーションの作成

チュートリアルに従って、機密アプリケーションを作成し、クライアントIDおよびクライアント・シークレットを取得します。これを使用して、アクセス・トークンおよび後続のAPIエンドポイントを取得するためにOCI IAMへのREST APIコールを実行できます。

タスク2: config.jsonファイルの設定

ローカル・マシンで構成ファイルを設定します。config.jsonファイルには、アクセス・トークンの生成に使用されるアイデンティティ・ドメインURL、クライアントIDおよびクライアント・シークレットに関する情報が含まれます。

 {
 "iamurl"         : "https://idcs-###########.identity.oraclecloud.com",
"client_id"      : "#######################",
"client_secret"  : "#######################"
 }

タスク3: アクセス・トークンの取得

config.jsonファイルが配置されたら、最初にアクセス・トークンを生成する必要があります。このトークンを使用して、OCI IAMエンドポイントをさらにREST APIコールできます。

次のコード・スニペットでは、関数get_encodedが引数としてクライアントIDおよびクライアント・シークレットを取得し、base64-encoded文字列を返します。

このエンコードされた文字列は、POSTリクエストを実行してアクセス・トークンを取得するために、認可ヘッダーとして関数get_access_tokenに引数としてさらに渡されます。

#get base64 encoded
def get_encoded(self,clid, clsecret):
    encoded = clid + ":" + clsecret
    baseencoded = base64.urlsafe_b64encode(encoded.encode('UTF-8')).decode('ascii')
    return baseencoded

#get access token
def get_access_token(self,url, header):
    para = "grant_type=client_credentials&scope=urn:opc:idm:__myscopes__"
    response = requests.post(url, headers=header, data=para, verify=False)
    jsonresp = json.loads(response.content)
    access_token = jsonresp.get('access_token')
    return access_token

#print access token
def printaccesstoken(self):
    obj = IAM()
    encodedtoken = obj.get_encoded(clientID, clientSecret)
    extra = "/oauth2/v1/token"
    headers = {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
               'Authorization': 'Basic %s' % encodedtoken, 'Accept': '*/*'}
    accesstoken = obj.get_access_token(idcsURL + extra, headers)
    return accesstoken

タスク4: ユーザー情報の取得- ユーザー名およびグループ・メンバーシップ

アクセス・トークンがあり、これを使用して、様々なOCI IAMアイデンティティ・ドメインのRESTエンドポイントに対してさらにREST APIコールを実行できます。次のコード・スニペットは、結果の合計数を取得し、結果の合計数とリクエスト当たりの数に基づいて必要な反復数(ループ)を計算するために、/admin/v1/Usersエンドポイントに必要なヘッダーおよびパラメータを使用してGETリクエストを作成する方法を示しています。

def searchusers(self):
    obj = IAM()
    accesstoken = obj.printaccesstoken()
    startIndex = 0
    count = 50
    extra = "/admin/v1/Users"
    headers = {'Accept': '*/*', 'Authorization': 'Bearer ' + accesstoken}
    param = {'attributes': "userName,groups.display", 'startIndex': startIndex, 'count': count}
    resp = requests.get(idcsURL + extra, headers=headers, verify=False, params=param)
    jsonresp = json.loads(resp.content)
    total = jsonresp.get("totalResults")
    print(total)
    tCount = total
    loop = int(tCount / count)
    print(loop)
    mainlist = []
    for i in range(loop + 1):
        param1 = {'attributes': "userName,groups.display", 'startIndex': startIndex, 'count': count}
        resp1 = requests.get(idcsURL + extra, headers=headers, verify=False, params=param1)
        startIndex += count
        jsonresp1 = json.loads(resp1.content)
        tempjsn = jsonresp1.get("Resources")
        for x in tempjsn:
            trimjsn ={}
            user = trimjsn["Username"] = x.get("userName")
            grp = x.get("groups")
            if grp is None:
                trimjsn["Groups"] = "None"
                mainlist.append(trimjsn.copy())
                continue
            for i in grp:
                grpname = trimjsn["Groups"] = i.get("display")
                print(trimjsn)
                mainlist.append(trimjsn.copy())
            print(mainlist)
    return mainlist

タスク5: リストのCSVレポートへの変換

ユーザー情報を取得したら、次のコード・スニペットは、メイン・リスト・データからDataFrameを作成し、DataFrameを現在の作業ディレクトリのmainlist.CSVという名前のCSVファイルに保存するのに役立ちます。

df_mainlist = pd.DataFrame(mainlist)
print(df_mainlist)
df_mainlist.to_csv('mainlist.csv')

タスク6: クラウド・シェルでのスクリプトの使用

スクリプトの準備が整ったら、ローカル・マシン(Pythonインストール済)またはPython開発をサポートするIDEで簡単に実行できます。ここでは、OCI Cloud Shellを使用してスクリプトを実行し、目的のレポートを取得します。

  1. OCIコンソールにログインし、画面の右上隅からCloud Shellを開き、Pythonスクリプトおよびconfig.jsonファイルをアップロードします。

    イメージ 1

    イメージ 2

    イメージ 3

  2. コマンドpip3 install pandas --userを実行して、モジュールをインストールします。

    イメージ 4

    ノート: モジュール・エラーに対してコマンドを実行します。モジュールは、使用する前に取り付ける必要があります。

  3. 次に、python GroupMembership_Pagination.pyを実行します。

  4. mainlist.csvをダウンロードします。

    イメージ 5

    イメージ 6

    ノート: mainlist.csvファイルには、すべてのユーザー・グループ・メンバーシップの詳細が含まれます。ユーザーがどのグループにも属していない場合、値は「なし」に設定されます。

謝辞

作成者 - Gautam Mishra (シニア・クラウド・エンジニア)

その他の学習リソース

docs.oracle.com/learnで他のラボをご覧いただくか、Oracle Learning YouTubeチャネルでより無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。