ノート:
- このチュートリアルではOracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructure資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了する場合は、これらの値をクラウド環境に固有の値に置き換えてください。
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アイデンティティ・ドメインからユーザー・グループ・メンバーシップ・レポートを生成する方法について確認します。
前提条件
- アクティブなOCIサブスクリプション。
- OCI IAMとPythonに精通しています。
- OCI IAMアイデンティティ・ドメインREST APIの使用に関する知識が必要です。
- アプリケーションを管理するための認可を持つIAMユーザー(Identity Domain Administrator、Security AdministratorまたはApplication Administrator)。
- システムにインストールされているPython 3.x。
- 'urllib3'、'requests'および'pandas' Pythonパッケージがインストールされています。
タスク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リクエストを作成する方法を示しています。
-
この関数は、すべてのユーザー情報を格納するために空のリストを初期化します。ユーザー情報をバッチで取得するためのループがあります。
-
反復のたびに、適切なパラメータを指定してGETリクエストを送信し、ユーザー情報(ユーザー名およびグループ・メンバーシップ)のバッチを取得し、空のディクショナリに追加します。
-
ユーザーが1つ以上のグループに属している場合は、別のループに入り、各グループ名を取得します。また、ユーザーがどのグループにも属していない場合は、値を「なし」に設定し、ディクショナリのコピーをリストに追加します。
-
すべての反復の後、関数は必要なすべてのユーザー情報を含むメイン・リストを返します。
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を使用してスクリプトを実行し、目的のレポートを取得します。
-
OCIコンソールにログインし、画面の右上隅からCloud Shellを開き、Pythonスクリプトおよび
config.json
ファイルをアップロードします。 -
コマンド
pip3 install pandas --user
を実行して、モジュールをインストールします。ノート: モジュール・エラーに対してコマンドを実行します。モジュールは、使用する前に取り付ける必要があります。
-
次に、
python GroupMembership_Pagination.py
を実行します。 -
mainlist.csv
をダウンロードします。ノート:
mainlist.csv
ファイルには、すべてのユーザー・グループ・メンバーシップの詳細が含まれます。ユーザーがどのグループにも属していない場合、値は「なし」に設定されます。
関連リンク
謝辞
作成者 - Gautam Mishra (シニア・クラウド・エンジニア)
その他の学習リソース
docs.oracle.com/learnで他のラボをご覧いただくか、Oracle Learning YouTubeチャネルでより無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Generate User Group membership report from OCI IAM Identity Domains using Python
F82226-01
May 2023
Copyright © 2023, Oracle and/or its affiliates.