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のIAMポリシーで陥りがちなミスと解決方法   ①Python SDKで時間ベースアクセス制限を検証したい!編

Last updated at Posted at 2025-10-16

目的

AWSでIAMポリシーを運用してきた経験がある方でも、OCIの独特な仕様でつまずくことがあると思います。
この記事では、実際の現場を想定したトラブル事例と効果的な解決策、そしてPython SDKを使用した動作確認を行うための検証手順を提示しております。

※記事の内容は参考までにご覧ください。

前提知識

  • AWS IAMの基本的な概念を理解している
  • OCIのコンソールにアクセス可能
  • 基本的なOCIサービス(Compute、Networking等)の操作経験
  • Python(バージョンは2025/10/10時点で3.14.0が最新版)がインストール済みであること

トラブル事例1: 条件句の誤り

発生する問題

時間制限やIPアドレス制限をかけたつもりが、期待通りに動作しませんでした。

# 動作しない例
Allow group Contractors to manage compute-instances in compartment Development 
where request.time > '09:00' and request.time < '18:00'

正しい実装方法

OCIの条件句は独特な文法があります。
なお、上記の時間制限の記載について、OCIのIAMポリシーでは「時間制限」や「曜日制限」を直接記述する構文は現時点(2025年10月現在)ではそもそも存在していません。

もし、どうしても時間帯に制限をかけたいのであれば、特定時間外にインスタンスを自動で停止/起動するResource Scheduler(リソーススケジューラ) というものを使います。

# IPアドレス制限
# Network Source には、許可するIPレンジやVCN CIDR(10.0.0.0/16や192.168.10.0/24など)
を設定できます
Allow group RemoteUsers to manage compute-instances in compartment Development 
where request.networkSource.name = '(事前に登録したNetwork Sourceの名前を記載)'

# リソースタイプによる制限
# 「VM.Standardシリーズの形状のみ管理可」などの制御が可能です。
Allow group Developers to manage compute-instances in compartment Development 
where target.instance.shape like 'VM.Standard*'

# タグベースの制限
# タグによる細かいアクセス制御が可能です。
# チームやプロジェクト単位での権限管理に有効
Allow group ProjectA to manage all-resources in compartment Development 
where target.resource.freeform-tags.project = 'web-portal'

Python SDKで時間ベースアクセス制限を検証する手順

条件句の動作確認には、以下の手順が有効です。

※ 本手順は学習・検証目的です。本番適用前に必ずテスト環境で確認してください。

【ステップ1】Python SDKをインストール

コマンドプロンプトを開いて以下を実行します。

スクリーンショット 2025-10-09 150235.png

以下実行結果↓
最後に「Successfully installed...」と出力されていればOKです!

スクリーンショット 2025-10-08 145835.png

※pip が認識されない場合は、PythonのPATH設定を見直してください。

【ステップ2】APIキーを作成して設定ファイルを準備

①OCIコンソールにログイン

②画面右上(赤枠)のユーザーアイコンをクリック

スクショ_02_20251009.png

③プロフィールの中の「User settings」をクリック

スクショ_03_20251009.png

④「Tokens and keys」タブをクリック

スクショ_04_20251009.png

⑤「add API Keys」をクリックします。

スクショ_05_20251009.png


「1」「Generate API key pair」が選択されていることを確認したら、

「2」
・Download private key(秘密鍵をダウンロード)
・Download public key(公開鍵をダウンロード)(省略可能)

をクリックしてそれぞれの鍵をローカルに落とした後、

「3」「add」をクリックする。

※秘密鍵は 他人に見られないよう 保管してください。誤って公開してしまうとアカウントが危険に晒されます。

スクショ_06_20251009.png

⑦ ⑥でダウンロードしたファイル(拡張子が.pemのもの)を「.oci」フォルダの直下に保存します。

C:\Users\<ユーザー名>\.oci\<⑥でダウンロードしたファイル>

※「.oci」ファイルは「.(ドット)」が付いているので要注意!

image.png

⑧ ⑥で、最後に「add」ボタンをクリックすると、自動的に設定ファイルのプレビュー画面に遷移します。

設定ファイルには以下の情報が含まれています。

・user(ユーザー OCID)
・fingerprint(先ほど作成した鍵の指紋情報)
・tenancy(テナンシ OCID)
・region(現在選択中のリージョン)
・key_file(秘密鍵ファイルのパス。⑦で保存したパスを記載する)

この設定ファイルの情報をコピーして、メモ帳などのテキストエディタに張り付けて「.oci」フォルダ直下に「config」というファイル名で保存します。

・保存場所
C:\Users\<ユーザー名>\.oci\config

※拡張子 .txt がつかないように注意してください(config.txt はNG)。

【設定ファイルのプレビュー画面】
image.png

【configの保存場所】
image.png

【ステップ3】設定ファイルの動作確認

コマンドプロンプトで下記のコマンドを実行する。

image.png

【出力例(成功時)】

image.png

これでOCI SDKとの接続準備は完了です。

【ステップ4】検証スクリプトを作成

①メモ帳を開いて以下を貼り付けます。
※コード内下部の「compartment_id」には⑧で確認したテナンシIDを置き換えてください。

# 現在時刻をチェック
# 業務時間内かどうか判定
# 実際にOCI APIを呼び出してアクセス可否を確認
# 期待結果と実際の結果を比較
import oci
from datetime import datetime

def test_time_based_access(config, compartment_id):
    """
    時間ベースアクセス制限のテスト
    注意: request.time.* は実験的機能のため本番前に検証必須
    """
    current_hour = datetime.now().hour
    print(f"現在時刻: {current_hour}")
    
    # 業務時間(9-18時)判定
    expected_access = 9 <= current_hour < 18
    status = "業務時間内" if expected_access else "業務時間外"
    print(f"{status} - アクセス{'許可' if expected_access else '拒否'}されるはずです")
    
    try:
        # 実際のアクセステスト
        compute = oci.core.ComputeClient(config)
        compute.list_instances(compartment_id=compartment_id)
        actual_access = True
        print("アクセス結果: 成功")
    except oci.exceptions.ServiceError as e:
        actual_access = False
        error_messages = {
            401: "認証エラー",
            403: "権限エラー(時間制限の可能性)",
            404: "コンパートメントが見つかりませんでした"
        }
        print(f"{error_messages.get(e.status, 'エラー')}: {e.message}")
    except Exception as e:
        actual_access = False
        print(f"予期しないエラー: {e}")
    
    # 結果判定
    result = "期待通り" if expected_access == actual_access else "設定要確認"
    print(f"{result}")

# 使用例
if __name__ == "__main__":
    config = oci.config.from_file()
    compartment_id = "ocid1.compartment.oc1..aaaaaaaa..."  # 実際のOCIDに置換
    test_time_based_access(config, compartment_id)

② ファイル名を「time_access_test.py」(拡張子は.py)にして保存します。

【ステップ5】スクリプトを実行

コマンドプロンプトでファイルを保存したフォルダに移動し、以下を実行する(出力例ではDocumentsを保存先に指定している)。

【出力例】

image.png

image.png

【補足】わざわざSDKで確認する理由

直接コンソールにアクセスできるか手動で確認するだけでも十分な場合があります。

ただし、API経由(SDKやCLI)でのアクセス制御も検証したい場合は、このPythonスクリプトが有効です。

まとめ

これらの解決策を実装することで、セキュアで効率的なOCI環境を構築できます。AWSからOCIに移行する際も、これらの違いを理解することでスムーズな移行が可能になります。

参考リンク

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?