投稿日

【SORACOM Napter】新機能: SIMごとにリモートアクセス権限を付与する方法

こんにちは、ソリューションアーキテクトの 守谷 (ニックネーム: moris) です。今日は2025年9月に提供開始となった SORACOM Napter の機能についてご紹介したいと思います。

SORACOM Napter とはSIMを指定して、そのSIMが挿されたデバイスにSSHやRDPでログインしたり、HTTP(s)でリクエストを送れる機能です。導入企業様からは、遠隔からのメンテナンスや問題発生時の調査に簡単に利用できるとご好評をいただいております。

メンテナンスを委託する場合の権限管理

SORACOMではSAM (SORACOM Access Management)というアクセス管理の仕組みを持っており、アカウント所有者(ルートユーザー)以外にも一部の機能のみ使えるユーザー(SAMユーザー)の払い出しができます。

例えば、 SIMの設定変更はできないが、SORACOM Napterを使うことはできる、というSAMユーザーを作ることができます。SORACOM Napter を利用してメンテナンス作業をされる方に、こうしたSAMユーザーのログイン情報だけ渡しておけば、安全にメンテナンス作業を実施いただくことができます。

SAMを利用した権限設定について、詳細は こちらのブログ をご参照ください。

これまでは「あるSAMユーザーは、特定のSIMだけにリモートアクセスできる(他のSIMにはリモートアクセスできない)」とか「あるSAMユーザーは、特定のSIMにはリモートアクセスできない」といった権限を付与することはできませんでした。オンデマンドリモートアクセスを作成できるSAMユーザーは、どのSIMにも同じように作成できていました。

遠隔地のデバイスの保守を他社に委託するというのは良くあるユースケースだと思います。この場合、SIMを管理しているオペレータにリモートアクセスを許可したSAMユーザーを作成し、そのSAMユーザーのログイン情報を委託先に提供することが多いと思いますが、これだと全てのSIMがリモートアクセス可能になってしまいます。

施設ごとや組織ごと、遠隔保守を提供するお客様ごとなど、SIMの属性によって SORACOM Napterを利用するSAMユーザーを分けるために、これまではオペレータ自体を分ける必要がありました。

SAMユーザーごとにリモートアクセスできるSIMを制限できるようになりました

2025年9月に新しくリリースされた API により、SAMユーザーごとにリモートアクセスできるSIMを制限できるようになりました。

下記の図をご覧ください。これまでのユーザーコンソールと従来のAPIでは、 「1. これまで」のようにSORACOM Napterの権限を持つSAMユーザーであれば、そのオペレータの全てのデバイスにリモートアクセスが可能でした。

新しいAPIを使うことで、「2. これから」のようにデバイスごとにそのSAMユーザーがリモートアクセス可能かどうかを設定することができるようになりました。

これにより、「特定のSIMにだけアクセス可能なSAMユーザー」を作成することができ、オペレータを分けることなく作業者の権限を絞ることが可能になりました。

権限設定に必要な前提知識(パーミッション構文)

具体的な設定方法を見ていく前に、SORACOMプラットフォームにおける権限設定の方法を確認しておきましょう。SAMユーザーの権限を設定するには こちら のドキュメントに従って JSON形式でパーミッション構文を記述し、ユーザーやロールに設定する必要があります。

SIMの一覧を取得するパーミッション構文

{
  "statements": [
    {
      "effect": "allow",
      "api": [
        "Sim:listSims"
      ]
    }
  ]
}

権限をより細かく設定するには、 conditionフィールドを設定します。例えば、特定の期間のみユーザーに権限を与えたいときは以下のように記述します。

{
  "statements": [
    {
      "effect": "allow",
      "api": [
        "Sim:listSims"
      ],
      "condition": "currentDate >= date(2025, 10, 01) and currentDate <= date(2025, 12, 31)"
    }
  ]
}

conditionフィールドに 操作が行われた日付( currentDate変数 ) と date関数 によって指定された日付を比較する計算式が記述されています。

このように、パーミッション構文では関数や変数を使って操作時点で変わるような値を権限付与の条件とすることができます。

conditionフィールドに利用可能な関数として、pathVariable関数 があります。この関数を使って、APIのパスに含まれる変数の値を比較条件として利用できます。

例えば、ユーザーのパスワードを更新する updateUserPassword API は operator_id と user_name というパス変数を持っています。pathVariable関数を使うことで、これらのパス変数に特定の値が設定された場合のみ実行を許可/拒否する権限を設定できます。

特定のユーザーのパスワードだけ更新できるパーミッション構文

{
  "statements": [
    {
      "effect": "allow",
      "api": "User:updateUserPassword",
      "condition": "pathVariable('user_name') == samUserName"
    }
  ]
}

ここで、SORACOM Napter のオンデマンドリモートアクセスを作成するAPIを見てみましょう。

従来のAPI: createPortMapping (/port_mappings)

新しいAPI: createPortMappingForSim (/port_mappings/sims/{sim_id}

従来のAPIでは対象の SIM ID がAPIのパスに含まれず、リクエストボディ内に記述するため、pathVariable関数などでの権限制御ができません。今回リリースされた createPortMappingForSim API では パス変数として SIM ID が利用できるため、 pathVariable関数でSIM IDごとの権限を設定できます。

2025年10月に ユーザーコンソールからのオンデマンドリモートアクセス作成にもこちらの新しいAPIが適用されています。つまり、この新しいAPIへの権限を適切に設定することで、「特定のSIMにのみアクセスできるSAMユーザーを作り、メンテナンスや障害調査を委託する」という運用がユーザーコンソールを通じて行えるようになっています。

なお、ユーザーコンソールからオンデマンドリモートアクセスを作成する際は他のAPIの権限も必要となります(後述)。

特定のSIMにのみリモートアクセスする権限を設定する

前置きが長くなりましたが、いよいよ具体的な設定方法に入っていきます。

対象とするSIM IDの確認

ここからは特定のSIM IDにのみ、SORACOM Napterのオンデマンドリモートアクセスを作成できる権限を作成していきます。あらかじめ対象となるSIMのSIM IDを確認しておきましょう。

ユーザーコンソールのSIM一覧画面から、対象となるSIMの名前をクリックし、展開されるSIM詳細画面からSIM IDを確認します。また、SIMの名前もメモしておきましょう。

SAMロールの作成

次にSAMロールを作っていきます。ユーザーコンソール右上のSAMユーザー名をクリックし、表示されるメニューから「セキュリティ」を選択します。権限設定の詳細な手順については こちら をご確認ください。

左のメニューから「ロール」を選択し、ロール一覧画面を表示します。さらに「オペレーター管理ロールを作成」ボタンをクリックします。

「オペレーター管理ロールを作成」というモーダルダイアログが表示されますので、ロール名に「Napter_For_\<対象のSIMの名前>」と入力します。\<対象のSIMの名前> の部分は先ほど確認したSIMの名前を入力しましょう。

権限設定の入力欄に、以下のように記入します。

{
  "statements": [
    {
      "effect": "allow",
      "api": [
        "PortMapping:createPortMappingForSim",     
        "PortMapping:listPortMappingsForSim"
      ],
      "condition": "pathVariable('sim_id') == '1234567890123456789'"
    },
    {
      "effect": "allow",
      "api": [
        "Query:searchSims",
        "Group:listGroups",
        "Subscriber:getSubscriber"
      ]
    }
  ]
}

1234567890123456789 は実際のSIM ID に置き換えます。 SIM IDは19桁または32桁の数字となりますが、’ (シングルクォーテーション) で囲む必要があります。

2つ目のステートメントブロック( "Query:searchSims", "Group:listGroups", "Subscriber:getSubscriber" の許可) は、ユーザーコンソールでNapterの設定画面を表示するまでに必要なSIM管理画面及びオンデマンドリモートアクセス作成画面を表示するための設定です。

SAMユーザーを作成し、ロールを設定する

新たにSAMユーザーを作成し、先ほど作成したロールを割り当てましょう。

左のメニューから「ユーザー」をクリックし、SAMユーザー一覧画面を表示します。「SAMユーザー作成」ボタンをクリックします。

「SAMユーザーを作成」というモーダルダイアログが表示されますので、名前欄に適当な名前を入力し、「作成」ボタンをクリックしてSAMユーザーを作成しましょう。

SAMユーザー一覧から、作成したSAMユーザーをクリックし、ユーザーの設定画面を表示します。

下の方の「ロール指定」セクションの「+ ロールをアタッチ」ボタンをクリックします。

「ユーザーにロールをアタッチ」というモーダルダイアログが表示されますので、先ほど作成したロールにチェックを入れて「アタッチ」をクリックし、ユーザーにロールを割り当てます。

最後に、SAMユーザーの設定画面で「認証設定」からSAMユーザーのパスワードを設定し、ユーザーコンソールにログイン可能な状態にしておきましょう。

作成したSAMユーザーでリモートアクセスを試す

一旦 ユーザーコンソールからログアウトし、先ほどのSAMユーザーでログインし直しましょう。

SIM管理画面を開き、リモートアクセスを許可したSIMに対してオンデマンドリモートアクセスを作成してみましょう。

詳しい手順は PC のターミナルを使って SSH 接続する をご確認ください。

リモートアクセスを作成し、SSHでログインできました。

次は別のSIMにリモートアクセスを作成してみましょう。オンデマンドリモートアクセスの作成画面で、以下のようなエラーが出るようになっています。これは、ロールに設定したパーミッション構文の condition フィールドで、このSIMに対しては PortMapping の権限が与えられないように設定されているからです。

権限設定により特定のSIMにのみオンデマンドリモートアクセスを作成できることが確認できました!

なお、 Webターミナルを使って SSH したい場合は別の権限設定が必要になります。Webターミナルで 特定の SIM にリモートアクセスを許可したい場合 をご確認ください。

複数のSIMにアクセスを許可する場合

複数の SIM ID に対して許可設定をしたい場合、condition句の条件式を or で繋ぎます。

{
  "statements": [
    {
      "effect": "allow",
      "api": [
        "PortMapping:createPortMappingForSim",     
        "PortMapping:listPortMappingsForSim"
      ],
      "condition": "pathVariable('sim_id') == '1234567890123456789' or pathVariable('sim_id') == '9999999999999999999'"
    },
    {
      "effect": "allow",
      "api": [
        "Query:searchSims",
        "Group:listGroups",
        "Subscriber:getSubscriber"
      ]
    }
  ]
}

この場合、SIM IDが 12345678901234567899999999999999999999 の SIMのみにリモートアクセスができます。さらに他のSIMを許可したい場合、同様に or pathVariable('sim_id') == '<SIM ID>' を後ろに繋げていきます。

その他の権限設定

その他、いくつかのパターンでどのような権限設定が必要になるかみていきましょう。

Webターミナルで 特定の SIM にリモートアクセスを許可したい場合

Webターミナルを利用する場合は、 Sim:getSim API に対する許可が必要になります。以下のように権限を設定してください。Webターミナルの使い方は こちら をご確認ください。

{
  "statements": [
    {
      "effect": "allow",
      "api": [
        "PortMapping:createPortMappingForSim",
        "PortMapping:listPortMappingsForSim",
        "Sim:getSim"
      ],
      "condition": "pathVariable('sim_id') == '1234567890123456789'"
    },
    {
      "effect": "allow",
      "api": [
        "Query:searchSims",
        "Group:listGroups",
        "Subscriber:getSubscriber"
      ]
    }
  ]
}

指定した以外の SIM に対して Webターミナルで接続しようとすると、以下のようなエラーメッセージが表示されます。

特定のSIM にのみリモートアクセスさせたくない場合

「特定のSIM IDにのみオンデマンドリモートアクセスできない」権限を設定してみましょう。

以下のようなパーミッション構文を設定してください。

{
  "statements": [
    {
      "effect": "allow",
      "api": [
        "PortMapping:createPortMappingForSim",     
        "PortMapping:listPortMappingsForSim"
      ]
    },
    {
      "effect": "deny",
      "api": [
        "PortMapping:createPortMappingForSim",     
        "PortMapping:listPortMappingsForSim"
      ],
      "condition": "pathVariable('sim_id') == '1234567890123456789'"
    },
    {
      "effect": "allow",
      "api": [
        "Query:searchSims",
        "Group:listGroups",
        "Subscriber:getSubscriber"
      ]
    }
  ]
}

1つ目のステートメントブロックで オンデマンドリモートアクセスの作成を許可しつつ、2つ目のステートメントブロックで特定の SIM に対する作成を拒否しています。同じAPIに対して許可と拒否が指定された場合、拒否の方が優先されます。この場合は、指定された SIM に対するオンデマンドリモートアクセスのみが拒否され、それ以外の SIM に対しては許可されます。

先ほどと同様に試してみると、指定した SIM ID の SIM ではオンデマンドリモートアクセスを作成できませんが、それ以外のSIMに対しては作成できるようになっているはずです。

他のSIMを見せずに特定のSIMへのリモートアクセスをさせたい

これまでの方法だと、SIM一覧画面を表示する必要があるため、対象のSIM以外の情報もSAMユーザーに見えてしまいます。運用方法によっては、そうした情報を一切見せずに対象のSIMへのリモートアクセスだけを提供したい、という場合もあるでしょう。

APIを直接使うなど色々な方法がありますが、2025年10月現在、WebターミナルはSIMによって固定であり、URLだけですぐにアクセスすることができるため、簡単に始めたい場合は便利です。

なお、URLの仕様については公式に定められたものではありませんので、今後この方法が使えなくなる可能性はあります。あくまで 本記事投稿時点で利用可能であるだけ、とご理解ください。

まず、以下のように権限をSAMユーザーに設定します。

{
  "statements": [
    {
      "effect": "allow",
      "api": [
        "PortMapping:createPortMappingForSim",
        "PortMapping:listPortMappingsForSim",
        "Sim:getSim"
      ],
      "condition": "pathVariable('sim_id') == '1234567890123456789'"
    }
  ]
}

次に、対象のSIMのWebターミナルを開き、URLをメモしておきます。URLは以下のような形式になっています。

https[://]terminal.soracom.io/?sim=1234567890123456789\&port=22\&service=air\&duration=3600\&protocol=ssh\&coverage_type=jp

(このリンクは正常に動きません。お使いのSIMのWebターミナルを開いてURLを取得してください)

SAMユーザーを使う担当者にこのURLを共有します。担当者がこのURLをブラウザで開くと、Webターミナルにアクセスできます( SAMユーザーでのログインが必要です)。

これにより、他のSIM情報を見ることなく、直接デバイスへのアクセスを行うことができます。URLのクエリパラメータ(?以降の設定値)を調整すれば持続時間などの設定を変更することもできます。

このSAMユーザーが SIM IDを書き換えて他のSIMにアクセスしようとしても、権限がないためエラーとなります。

まとめ

いかがでしたでしょうか。

新しくユーザーコンソールに適用された PortMapping:createPortMappingForSim API を用いて 特定のSIMにのみ リモートアクセスする方法を解説いたしました。また、関連するいくつかのパターンについても権限の設定方法を共有いたしました。

ご参考になればと思います。それでは!

― ソラコム守谷(moris)