OCI CLI と Identity Domains(新IAM)を使って、ユーザー管理を自動化するスクリプト集です。
新IAM(Identity Domains)対応版
本記事のスクリプトは oci iam user list 等の旧IAMコマンドではなく、oci identity-domains SCIM API を使用しています。
oci iam domain list で Identity Domain が確認できる環境(2023年以降に作成されたテナンシーの多く)が対象です。
前提条件
OCI 環境構成
テナンシー(root)
└── prod コンパートメント
└── prod Identity Domain(ACTIVE)
├── oci-ops-user ← スクリプト実行ユーザー
├── user01
└── user02
~/.oci/config
[DEFAULT]
user=ocid1.user.oc1..(oci-ops-userのOCID)
fingerprint=xx:xx:xx:...
key_file=/home/<your-user>/.oci/oci-ops-user_key.pem
tenancy=ocid1.tenancy.oc1..(テナンシーOCID)
region=ap-tokyo-1
[admin]
user=ocid1.user.oc1..(管理者ユーザーのOCID)
fingerprint=xx:xx:xx:...
key_file=/home/<your-user>/.oci/oci_api_key.pem
tenancy=ocid1.tenancy.oc1..(テナンシーOCID)
region=ap-tokyo-1
共通変数
各スクリプト冒頭の DOMAIN_ENDPOINT を自身の環境に合わせて変更してください。
# エンドポイント確認コマンド
oci iam domain list \
--profile admin \
--compartment-id <prod-compartment-ocid> \
--query 'data[*].{Name:"display-name", URL:url}' \
--output table
スクリプト一覧
| スクリプト | 用途 |
|---|---|
do_oci_start.sh |
インスタンス起動 |
do_oci_stop.sh |
インスタンス停止 |
do_oci_user_list.sh |
ユーザー一覧 |
do_oci_user_create.sh |
ユーザー作成 |
do_oci_user_delete.sh |
ユーザー削除 |
do_oci_user_password_reset.sh |
パスワードリセット |
do_oci_user_unlock.sh |
アカウントロック解除 |
do_oci_user_mfa_reset.sh |
MFAリセット |
do_oci_user_grant_admin.sh |
管理者権限付与 |
do_oci_user_revoke_admin.sh |
管理者権限剥奪 |
do_oci_start.sh — インスタンス起動
#!/usr/bin/bash
# OCI コンピュートインスタンス 起動スクリプト(prod コンパートメント固定)
# 使い方: bash do_oci_start.sh <インスタンス名> [OCIプロファイル名]
set -eu
if [ "${#}" -lt 1 ]; then
echo "使い方: $0 <インスタンス名> [OCIプロファイル名]"
exit 1
fi
INSTANCE_NAME="${1}"
OCI_PROFILE="${2:-DEFAULT}"
COMPARTMENT_ID="<your-prod-compartment-ocid>"
LOG="/home/hijiri/claude2026001/do_oci_start_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG") 2>&1
echo "=== ログ出力先: $LOG ==="
echo "=== パラメータ ==="
echo " インスタンス名 : ${INSTANCE_NAME}"
echo " OCIプロファイル : ${OCI_PROFILE}"
echo " コンパートメント: ${COMPARTMENT_ID}"
echo "=== [1/3] インスタンス検索 (name=${INSTANCE_NAME}, state=STOPPED) ==="
INSTANCE_ID=$(oci compute instance list \
--profile "${OCI_PROFILE}" \
--compartment-id "${COMPARTMENT_ID}" \
--display-name "${INSTANCE_NAME}" \
--lifecycle-state STOPPED \
--all \
--query 'data[0].id' \
--raw-output || true)
if [ -z "${INSTANCE_ID}" ] || [ "${INSTANCE_ID}" = "null" ]; then
echo "INFO: '${INSTANCE_NAME}' の STOPPED インスタンスが見つかりません (既に起動中か存在しない)"
oci compute instance list \
--profile "${OCI_PROFILE}" \
--compartment-id "${COMPARTMENT_ID}" \
--display-name "${INSTANCE_NAME}" \
--all \
--query 'data[*].{Name:"display-name", State:"lifecycle-state"}' \
--output table || true
exit 0
fi
echo "対象インスタンスID: ${INSTANCE_ID}"
echo "=== [2/3] インスタンス起動 ==="
if ! oci compute instance action \
--profile "${OCI_PROFILE}" \
--instance-id "${INSTANCE_ID}" \
--action START \
--wait-for-state RUNNING \
--max-wait-seconds 300 \
--query 'data.{ID:id, State:"lifecycle-state"}' \
--output table; then
echo "WARN: 300秒以内に RUNNING になりませんでした"
fi
echo "=== [3/3] 起動完了サマリ ==="
oci compute instance list \
--profile "${OCI_PROFILE}" \
--compartment-id "${COMPARTMENT_ID}" \
--display-name "${INSTANCE_NAME}" \
--all \
--query 'data[*].{Name:"display-name", ID:id, State:"lifecycle-state"}' \
--output table
do_oci_stop.sh — インスタンス停止
#!/usr/bin/bash
# OCI コンピュートインスタンス 停止スクリプト(prod コンパートメント固定)
# 使い方: bash do_oci_stop.sh <インスタンス名> [OCIプロファイル名]
set -eu
if [ "${#}" -lt 1 ]; then
echo "使い方: $0 <インスタンス名> [OCIプロファイル名]"
exit 1
fi
INSTANCE_NAME="${1}"
OCI_PROFILE="${2:-DEFAULT}"
COMPARTMENT_ID="<your-prod-compartment-ocid>"
LOG="/home/hijiri/claude2026001/do_oci_stop_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG") 2>&1
echo "=== ログ出力先: $LOG ==="
echo "=== パラメータ ==="
echo " インスタンス名 : ${INSTANCE_NAME}"
echo " OCIプロファイル : ${OCI_PROFILE}"
echo " コンパートメント: ${COMPARTMENT_ID}"
echo "=== [1/3] インスタンス検索 (name=${INSTANCE_NAME}, state=RUNNING) ==="
INSTANCE_ID=$(oci compute instance list \
--profile "${OCI_PROFILE}" \
--compartment-id "${COMPARTMENT_ID}" \
--display-name "${INSTANCE_NAME}" \
--lifecycle-state RUNNING \
--all \
--query 'data[0].id' \
--raw-output || true)
if [ -z "${INSTANCE_ID}" ] || [ "${INSTANCE_ID}" = "null" ]; then
echo "INFO: '${INSTANCE_NAME}' の RUNNING インスタンスが見つかりません (既に停止中か存在しない)"
oci compute instance list \
--profile "${OCI_PROFILE}" \
--compartment-id "${COMPARTMENT_ID}" \
--display-name "${INSTANCE_NAME}" \
--all \
--query 'data[*].{Name:"display-name", State:"lifecycle-state"}' \
--output table || true
exit 0
fi
echo "対象インスタンスID: ${INSTANCE_ID}"
echo "=== [2/3] インスタンス停止 ==="
if ! oci compute instance action \
--profile "${OCI_PROFILE}" \
--instance-id "${INSTANCE_ID}" \
--action STOP \
--wait-for-state STOPPED \
--max-wait-seconds 300 \
--query 'data.{ID:id, State:"lifecycle-state"}' \
--output table; then
echo "WARN: 300秒以内に STOPPED になりませんでした"
fi
echo "=== [3/3] 停止完了サマリ ==="
oci compute instance list \
--profile "${OCI_PROFILE}" \
--compartment-id "${COMPARTMENT_ID}" \
--display-name "${INSTANCE_NAME}" \
--all \
--query 'data[*].{Name:"display-name", ID:id, State:"lifecycle-state"}' \
--output table
do_oci_user_list.sh — ユーザー一覧
表示項目:ユーザー名 / ステータス / 電子メール / 最終アクセス / 所属グループ
#!/usr/bin/bash
# OCI Identity Domains ユーザー一覧スクリプト
# 使い方: bash do_oci_user_list.sh [OCIプロファイル名]
set -eu
OCI_PROFILE="${1:-DEFAULT}"
DOMAIN_ENDPOINT="https://<your-identity-domain-endpoint>"
echo "=== パラメータ ==="
echo " OCIプロファイル : ${OCI_PROFILE}"
echo " ドメインURL : ${DOMAIN_ENDPOINT}"
echo "=== [1/1] ユーザー一覧 ==="
SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--attributes "userName,active,emails,groups,urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User" \
--count 100 2>&1 | python3 -c "
import sys, json
data = json.load(sys.stdin)['data']
users = data.get('resources', [])
total = data.get('total-results', 0)
W = {'user': 20, 'status': 8, 'email': 30, 'last': 22, 'groups': 50}
sep = '+' + '+'.join('-' * (w + 2) for w in W.values()) + '+'
hdr = '| {:<{}} | {:<{}} | {:<{}} | {:<{}} | {:<{}} |'.format(
'UserName', W['user'],
'Status', W['status'],
'Email', W['email'],
'LastAccess', W['last'],
'Groups', W['groups'],
)
print(f'総ユーザー数: {total}')
print(sep)
print(hdr)
print(sep)
for u in users:
name = u.get('user-name', '')
status = 'Active' if u.get('active') else 'Inactive'
emails = u.get('emails') or []
email = next((e['value'] for e in emails if e.get('type') == 'work'), '')
state = u.get('urn-ietf-params-scim-schemas-oracle-idcs-extension-user-state-user') or {}
last = state.get('last-successful-login-date') or '(未ログイン)'
groups = ', '.join(g.get('display', '') for g in (u.get('groups') or []))
print('| {:<{}} | {:<{}} | {:<{}} | {:<{}} | {:<{}} |'.format(
name[:W['user']], W['user'],
status[:W['status']], W['status'],
email[:W['email']], W['email'],
last[:W['last']], W['last'],
groups[:W['groups']], W['groups'],
))
print(sep)
"
echo "=== 完了 ==="
do_oci_user_create.sh — ユーザー作成
#!/usr/bin/bash
# OCI Identity Domains ユーザー作成スクリプト
# 使い方: bash do_oci_user_create.sh <ユーザー名> <メールアドレス> [グループ名] [OCIプロファイル名]
set -eu
if [ "${#}" -lt 2 ]; then
echo "使い方: $0 <ユーザー名> <メールアドレス> [グループ名] [OCIプロファイル名]"
exit 1
fi
USERNAME="${1}"
EMAIL="${2}"
TARGET_GROUP="${3:-readonly}"
OCI_PROFILE="${4:-DEFAULT}"
DOMAIN_ENDPOINT="https://<your-identity-domain-endpoint>"
echo "=== パラメータ ==="
echo " ユーザー名 : ${USERNAME}"
echo " メールアドレス : ${EMAIL}"
echo " 追加グループ : ${TARGET_GROUP}"
echo " OCIプロファイル : ${OCI_PROFILE}"
echo "=== [1/4] ユーザー重複チェック ==="
EXISTING=$(SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" | \
python3 -c "import sys,json; print(json.load(sys.stdin)['data']['total-results'])")
if [ "${EXISTING}" != "0" ]; then
echo "INFO: ユーザー '${USERNAME}' は既に存在します"
exit 0
fi
echo "=== [2/4] ユーザー作成 ==="
USER_SCIM_ID=$(SUPPRESS_LABEL_WARNING=True oci identity-domains user create \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--schemas '["urn:ietf:params:scim:schemas:core:2.0:User"]' \
--user-name "${USERNAME}" \
--name "{\"familyName\":\"${USERNAME}\"}" \
--emails "[{\"value\":\"${EMAIL}\",\"type\":\"work\",\"primary\":true}]" | \
python3 -c "import sys,json; print(json.load(sys.stdin)['data']['id'])")
echo "作成完了 / SCIM ID: ${USER_SCIM_ID}"
echo "=== [3/4] グループ '${TARGET_GROUP}' へ追加 ==="
GROUP_SCIM_ID=$(SUPPRESS_LABEL_WARNING=True oci identity-domains groups list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "displayName eq \"${TARGET_GROUP}\"" | \
python3 -c "
import sys, json
d = json.load(sys.stdin)['data']
print(d['resources'][0]['id'] if d['total-results'] > 0 else '')
")
if [ -z "${GROUP_SCIM_ID}" ]; then
echo "WARN: グループ '${TARGET_GROUP}' が見つかりません。グループ追加をスキップします"
else
SUPPRESS_LABEL_WARNING=True oci identity-domains group patch \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--group-id "${GROUP_SCIM_ID}" \
--schemas '["urn:ietf:params:scim:api:messages:2.0:PatchOp"]' \
--operations "[{\"op\":\"add\",\"path\":\"members\",\"value\":[{\"value\":\"${USER_SCIM_ID}\",\"type\":\"User\"}]}]" \
--query 'data."display-name"' --raw-output
echo "グループ追加完了"
fi
echo "=== [4/4] 作成完了サマリ ==="
SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" \
--attributes "userName,active,emails,groups" | \
python3 -c "
import sys, json
u = json.load(sys.stdin)['data']['resources'][0]
emails = u.get('emails') or []
email = next((e['value'] for e in emails if e.get('type') == 'work'), '')
groups = ', '.join(g.get('display','') for g in (u.get('groups') or []))
print(f' UserName : {u[\"user-name\"]}')
print(f' Active : {u[\"active\"]}')
print(f' Email : {email}')
print(f' Groups : {groups}')
"
echo ""
echo "========================================"
echo " ユーザー作成完了!"
echo " ユーザー名 : ${USERNAME}"
echo " メールアドレス : ${EMAIL}"
echo " グループ : ${TARGET_GROUP}"
echo " ※ アクティベーションメールが ${EMAIL} に送信されます"
echo "========================================"
do_oci_user_delete.sh — ユーザー削除
#!/usr/bin/bash
# OCI Identity Domains ユーザー削除スクリプト
# 使い方: bash do_oci_user_delete.sh <ユーザー名> [OCIプロファイル名]
# ※ MFA登録済みユーザーも削除可能(--force-delete true で自動対応)
set -eu
LOG="/home/hijiri/claude2026001/do_oci_user_delete_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a "$LOG") 2>&1
echo "=== ログ出力先: $LOG ==="
if [ "${#}" -lt 1 ]; then
echo "使い方: $0 <ユーザー名> [OCIプロファイル名]"
exit 1
fi
USERNAME="${1}"
OCI_PROFILE="${2:-DEFAULT}"
DOMAIN_ENDPOINT="https://<your-identity-domain-endpoint>"
echo "=== パラメータ ==="
echo " ユーザー名 : ${USERNAME}"
echo " OCIプロファイル : ${OCI_PROFILE}"
echo "=== [1/3] ユーザー確認 (${USERNAME}) ==="
USER_INFO=$(SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" \
--attributes "id,groups" | \
python3 -c "
import sys, json
d = json.load(sys.stdin)['data']
if d['total-results'] == 0:
print('NOT_FOUND|')
else:
u = d['resources'][0]
groups = ','.join(g['value'] for g in (u.get('groups') or []))
print(f'{u[\"id\"]}|{groups}')
")
if [[ "${USER_INFO}" == "NOT_FOUND|"* ]]; then
echo "ERROR: ユーザー '${USERNAME}' が見つかりません"
exit 1
fi
USER_SCIM_ID="${USER_INFO%%|*}"
GROUP_IDS="${USER_INFO##*|}"
echo "SCIM ID: ${USER_SCIM_ID}"
echo "=== [2/3] グループメンバーシップ削除 ==="
if [ -z "${GROUP_IDS}" ]; then
echo "グループメンバーシップなし"
else
for GID in $(echo "${GROUP_IDS}" | tr ',' '\n'); do
[ -z "${GID}" ] && continue
SUPPRESS_LABEL_WARNING=True oci identity-domains group patch \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--group-id "${GID}" \
--schemas '["urn:ietf:params:scim:api:messages:2.0:PatchOp"]' \
--operations "[{\"op\":\"remove\",\"path\":\"members[value eq \\\"${USER_SCIM_ID}\\\"]\"}]" \
--query 'data."display-name"' --raw-output || true
echo "グループから除外: ${GID}"
done
fi
echo "=== [3/3] ユーザー削除 ==="
# --force-delete true でMFAデバイス参照を自動削除してからユーザー削除する
SUPPRESS_LABEL_WARNING=True oci identity-domains user delete \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--user-id "${USER_SCIM_ID}" \
--force-delete true \
--force
echo ""
echo "========================================"
echo " ユーザー削除完了!"
echo " ユーザー名 : ${USERNAME}"
echo "========================================"
do_oci_user_password_reset.sh — パスワードリセット
#!/usr/bin/bash
# OCI Identity Domains ユーザー パスワードリセットスクリプト
# 使い方: bash do_oci_user_password_reset.sh <ユーザー名> [OCIプロファイル名]
# ※ ランダムパスワードを設定し、初回ログイン時に変更を強制する
set -eu
if [ "${#}" -lt 1 ]; then
echo "使い方: $0 <ユーザー名> [OCIプロファイル名]"
exit 1
fi
USERNAME="${1}"
OCI_PROFILE="${2:-DEFAULT}"
DOMAIN_ENDPOINT="https://<your-identity-domain-endpoint>"
echo "=== パラメータ ==="
echo " ユーザー名 : ${USERNAME}"
echo " OCIプロファイル : ${OCI_PROFILE}"
echo "=== [1/3] ユーザー確認 (${USERNAME}) ==="
USER_SCIM_ID=$(SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" | \
python3 -c "
import sys, json
d = json.load(sys.stdin)['data']
print(d['resources'][0]['id'] if d['total-results'] > 0 else '')
")
if [ -z "${USER_SCIM_ID}" ]; then
echo "ERROR: ユーザー '${USERNAME}' が見つかりません"
exit 1
fi
echo "SCIM ID: ${USER_SCIM_ID}"
echo "=== [2/3] 一時パスワード生成 ==="
TEMP_PASSWORD=$(python3 -c "
import random, string
chars = string.ascii_letters + string.digits + '!@#\$%'
pw = (random.choice(string.ascii_uppercase)
+ random.choice(string.ascii_lowercase)
+ random.choice(string.digits)
+ random.choice('!@#\$%'))
pw += ''.join(random.choices(chars, k=12))
print(''.join(random.sample(pw, len(pw))))
")
echo "=== [3/3] パスワードリセット ==="
SUPPRESS_LABEL_WARNING=True oci identity-domains user patch \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--user-id "${USER_SCIM_ID}" \
--schemas '["urn:ietf:params:scim:api:messages:2.0:PatchOp"]' \
--operations "[{\"op\":\"replace\",\"value\":{\"password\":\"${TEMP_PASSWORD}\",\"urn:ietf:params:scim:schemas:oracle:idcs:extension:user:User\":{\"mustChangePassword\":true}}}]" \
--query 'data."user-name"' --raw-output
echo ""
echo "========================================"
echo " パスワードリセット完了!"
echo " ユーザー名 : ${USERNAME}"
echo " 新しいパスワード: ${TEMP_PASSWORD}"
echo " ※ 初回ログイン時にパスワード変更が必要"
echo "========================================"
do_oci_user_unlock.sh — アカウントロック解除
#!/usr/bin/bash
# OCI Identity Domains ユーザーアカウントロック解除スクリプト
# 使い方: bash do_oci_user_unlock.sh <ユーザー名> [OCIプロファイル名]
set -eu
if [ "${#}" -lt 1 ]; then
echo "使い方: $0 <ユーザー名> [OCIプロファイル名]"
exit 1
fi
USERNAME="${1}"
OCI_PROFILE="${2:-DEFAULT}"
DOMAIN_ENDPOINT="https://<your-identity-domain-endpoint>"
echo "=== パラメータ ==="
echo " ユーザー名 : ${USERNAME}"
echo " OCIプロファイル : ${OCI_PROFILE}"
echo "=== [1/3] ユーザー確認 & ロック状態チェック (${USERNAME}) ==="
USER_INFO=$(SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" \
--attributes "id,urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User" | \
python3 -c "
import sys, json
d = json.load(sys.stdin)['data']
if d['total-results'] == 0:
print('NOT_FOUND|False')
else:
u = d['resources'][0]
state = u.get('urn-ietf-params-scim-schemas-oracle-idcs-extension-user-state-user') or {}
locked = str((state.get('locked') or {}).get('on', False))
print(f'{u[\"id\"]}|{locked}')
")
if [[ "${USER_INFO}" == "NOT_FOUND|"* ]]; then
echo "ERROR: ユーザー '${USERNAME}' が見つかりません"
exit 1
fi
USER_SCIM_ID="${USER_INFO%%|*}"
IS_LOCKED="${USER_INFO##*|}"
echo "SCIM ID : ${USER_SCIM_ID}"
echo "ロック状態 : ${IS_LOCKED}"
if [ "${IS_LOCKED}" = "False" ]; then
echo "INFO: ユーザー '${USERNAME}' はロックされていません"
exit 0
fi
echo "=== [2/3] アカウントロック解除 ==="
SUPPRESS_LABEL_WARNING=True oci identity-domains user patch \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--user-id "${USER_SCIM_ID}" \
--schemas '["urn:ietf:params:scim:api:messages:2.0:PatchOp"]' \
--operations '[{"op":"replace","path":"urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User:locked","value":{"on":false}}]' \
--query 'data."user-name"' --raw-output
echo "=== [3/3] 解除後の状態確認 ==="
SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" \
--attributes "userName,active,urn:ietf:params:scim:schemas:oracle:idcs:extension:userState:User" | \
python3 -c "
import sys, json
u = json.load(sys.stdin)['data']['resources'][0]
state = u.get('urn-ietf-params-scim-schemas-oracle-idcs-extension-user-state-user') or {}
locked = (state.get('locked') or {}).get('on', False)
print(f' UserName : {u[\"user-name\"]}')
print(f' Active : {u[\"active\"]}')
print(f' Locked : {locked}')
"
echo ""
echo "========================================"
echo " アカウントロック解除完了!"
echo " ユーザー名 : ${USERNAME}"
echo "========================================"
do_oci_user_mfa_reset.sh — MFAリセット
#!/usr/bin/bash
# OCI Identity Domains ユーザー MFAリセットスクリプト
# 使い方: bash do_oci_user_mfa_reset.sh <ユーザー名> [OCIプロファイル名]
# ※ MFA登録をリセットし、次回ログイン時に再登録させる
set -eu
if [ "${#}" -lt 1 ]; then
echo "使い方: $0 <ユーザー名> [OCIプロファイル名]"
exit 1
fi
USERNAME="${1}"
OCI_PROFILE="${2:-DEFAULT}"
DOMAIN_ENDPOINT="https://<your-identity-domain-endpoint>"
echo "=== パラメータ ==="
echo " ユーザー名 : ${USERNAME}"
echo " OCIプロファイル : ${OCI_PROFILE}"
echo "=== [1/2] ユーザー確認 (${USERNAME}) ==="
USER_SCIM_ID=$(SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" | \
python3 -c "
import sys, json
d = json.load(sys.stdin)['data']
print(d['resources'][0]['id'] if d['total-results'] > 0 else '')
")
if [ -z "${USER_SCIM_ID}" ]; then
echo "ERROR: ユーザー '${USERNAME}' が見つかりません"
exit 1
fi
echo "SCIM ID: ${USER_SCIM_ID}"
echo "=== [2/2] MFA リセット ==="
SUPPRESS_LABEL_WARNING=True oci identity-domains user patch \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--user-id "${USER_SCIM_ID}" \
--schemas '["urn:ietf:params:scim:api:messages:2.0:PatchOp"]' \
--operations '[{"op":"replace","path":"urn:ietf:params:scim:schemas:oracle:idcs:extension:mfa:User:mfaStatus","value":"UNENROLLED"}]' \
--query 'data."user-name"' --raw-output
echo ""
echo "========================================"
echo " MFAリセット完了!"
echo " ユーザー名 : ${USERNAME}"
echo " ※ 次回ログイン時にMFAデバイスの再登録が必要"
echo "========================================"
do_oci_user_grant_admin.sh — 管理者権限付与
#!/usr/bin/bash
# OCI Identity Domains ユーザー管理者権限付与スクリプト(administrator グループへの追加)
# 使い方: bash do_oci_user_grant_admin.sh <ユーザー名> [OCIプロファイル名]
set -eu
if [ "${#}" -lt 1 ]; then
echo "使い方: $0 <ユーザー名> [OCIプロファイル名]"
exit 1
fi
USERNAME="${1}"
OCI_PROFILE="${2:-DEFAULT}"
ADMIN_GROUP="Domain_Administrators"
DOMAIN_ENDPOINT="https://<your-identity-domain-endpoint>"
echo "=== パラメータ ==="
echo " ユーザー名 : ${USERNAME}"
echo " OCIプロファイル : ${OCI_PROFILE}"
echo " 追加グループ : ${ADMIN_GROUP}"
echo "=== [1/4] ユーザー確認 & グループ所属チェック (${USERNAME}) ==="
USER_INFO=$(SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" \
--attributes "id,groups" | \
python3 -c "
import sys, json
d = json.load(sys.stdin)['data']
if d['total-results'] == 0:
print('NOT_FOUND|')
else:
u = d['resources'][0]
groups = ','.join(g.get('display','') for g in (u.get('groups') or []))
print(f'{u[\"id\"]}|{groups}')
")
if [[ "${USER_INFO}" == "NOT_FOUND|"* ]]; then
echo "ERROR: ユーザー '${USERNAME}' が見つかりません"
exit 1
fi
USER_SCIM_ID="${USER_INFO%%|*}"
CURRENT_GROUPS="${USER_INFO##*|}"
echo "SCIM ID : ${USER_SCIM_ID}"
echo "現在のグループ : ${CURRENT_GROUPS}"
if echo "${CURRENT_GROUPS}" | grep -q "${ADMIN_GROUP}"; then
echo "INFO: ユーザー '${USERNAME}' は既に '${ADMIN_GROUP}' グループに所属しています"
exit 0
fi
echo "=== [2/4] グループ '${ADMIN_GROUP}' の SCIM ID 取得 ==="
GROUP_SCIM_ID=$(SUPPRESS_LABEL_WARNING=True oci identity-domains groups list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "displayName eq \"${ADMIN_GROUP}\"" | \
python3 -c "
import sys, json
d = json.load(sys.stdin)['data']
print(d['resources'][0]['id'] if d['total-results'] > 0 else '')
")
if [ -z "${GROUP_SCIM_ID}" ]; then
echo "ERROR: グループ '${ADMIN_GROUP}' が見つかりません"
exit 1
fi
echo "グループ SCIM ID: ${GROUP_SCIM_ID}"
echo "=== [3/4] グループへ追加 ==="
SUPPRESS_LABEL_WARNING=True oci identity-domains group patch \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--group-id "${GROUP_SCIM_ID}" \
--schemas '["urn:ietf:params:scim:api:messages:2.0:PatchOp"]' \
--operations "[{\"op\":\"add\",\"path\":\"members\",\"value\":[{\"value\":\"${USER_SCIM_ID}\",\"type\":\"User\"}]}]" \
--query 'data."display-name"' --raw-output
echo "グループへの追加完了"
echo "=== [4/4] 更新後のグループ確認 ==="
SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" \
--attributes "userName,groups" | \
python3 -c "
import sys, json
u = json.load(sys.stdin)['data']['resources'][0]
groups = ', '.join(g.get('display','') for g in (u.get('groups') or []))
print(f' UserName : {u[\"user-name\"]}')
print(f' Groups : {groups}')
"
echo ""
echo "========================================"
echo " administrator 権限付与完了!"
echo " ユーザー名 : ${USERNAME}"
echo "========================================"
do_oci_user_revoke_admin.sh — 管理者権限剥奪
#!/usr/bin/bash
# OCI Identity Domains ユーザー管理者権限剥奪スクリプト(administrator グループからの除外)
# 使い方: bash do_oci_user_revoke_admin.sh <ユーザー名> [OCIプロファイル名]
set -eu
if [ "${#}" -lt 1 ]; then
echo "使い方: $0 <ユーザー名> [OCIプロファイル名]"
exit 1
fi
USERNAME="${1}"
OCI_PROFILE="${2:-DEFAULT}"
ADMIN_GROUP="Domain_Administrators"
DOMAIN_ENDPOINT="https://<your-identity-domain-endpoint>"
echo "=== パラメータ ==="
echo " ユーザー名 : ${USERNAME}"
echo " OCIプロファイル : ${OCI_PROFILE}"
echo " 除外グループ : ${ADMIN_GROUP}"
echo "=== [1/4] ユーザー確認 & グループ所属チェック (${USERNAME}) ==="
USER_INFO=$(SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" \
--attributes "id,groups" | \
python3 -c "
import sys, json
d = json.load(sys.stdin)['data']
if d['total-results'] == 0:
print('NOT_FOUND||')
else:
u = d['resources'][0]
group_ids = ','.join(g['value'] for g in (u.get('groups') or []))
group_names = ','.join(g.get('display','') for g in (u.get('groups') or []))
print(f'{u[\"id\"]}|{group_ids}|{group_names}')
")
if [[ "${USER_INFO}" == "NOT_FOUND|"* ]]; then
echo "ERROR: ユーザー '${USERNAME}' が見つかりません"
exit 1
fi
USER_SCIM_ID=$(echo "${USER_INFO}" | cut -d'|' -f1)
GROUP_IDS=$(echo "${USER_INFO}" | cut -d'|' -f2)
GROUP_NAMES=$(echo "${USER_INFO}" | cut -d'|' -f3)
echo "SCIM ID : ${USER_SCIM_ID}"
echo "現在のグループ : ${GROUP_NAMES}"
if ! echo "${GROUP_NAMES}" | grep -q "${ADMIN_GROUP}"; then
echo "INFO: ユーザー '${USERNAME}' は既に '${ADMIN_GROUP}' グループに所属していません"
exit 0
fi
echo "=== [2/4] グループ '${ADMIN_GROUP}' の SCIM ID 取得 ==="
GROUP_SCIM_ID=$(SUPPRESS_LABEL_WARNING=True oci identity-domains groups list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "displayName eq \"${ADMIN_GROUP}\"" | \
python3 -c "
import sys, json
d = json.load(sys.stdin)['data']
print(d['resources'][0]['id'] if d['total-results'] > 0 else '')
")
if [ -z "${GROUP_SCIM_ID}" ]; then
echo "ERROR: グループ '${ADMIN_GROUP}' が見つかりません"
exit 1
fi
echo "グループ SCIM ID: ${GROUP_SCIM_ID}"
echo "=== [3/4] グループから除外 ==="
SUPPRESS_LABEL_WARNING=True oci identity-domains group patch \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--group-id "${GROUP_SCIM_ID}" \
--schemas '["urn:ietf:params:scim:api:messages:2.0:PatchOp"]' \
--operations "[{\"op\":\"remove\",\"path\":\"members[value eq \\\"${USER_SCIM_ID}\\\"]\"}]" \
--query 'data."display-name"' --raw-output
echo "グループからの除外完了"
echo "=== [4/4] 更新後のグループ確認 ==="
SUPPRESS_LABEL_WARNING=True oci identity-domains users list \
--profile "${OCI_PROFILE}" \
--endpoint "${DOMAIN_ENDPOINT}" \
--filter "userName eq \"${USERNAME}\"" \
--attributes "userName,groups" | \
python3 -c "
import sys, json
u = json.load(sys.stdin)['data']['resources'][0]
groups = ', '.join(g.get('display','') for g in (u.get('groups') or []))
print(f' UserName : {u[\"user-name\"]}')
print(f' Groups : {groups if groups else \"(なし)\"}')
"
echo ""
echo "========================================"
echo " administrator 権限剥奪完了!"
echo " ユーザー名 : ${USERNAME}"
echo "========================================"