0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCI CLI で作る運用自動化スクリプト集(Identity Domains 新IAM対応)

0
Last updated at Posted at 2026-06-04

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 "========================================"
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?