SORACOM Napter で簡単に SSH できる nssh を作りました
「一般消費者が事業者の表示であることを判別することが困難である表示」の運用基準に基づく開示: この記事は記載の日付時点で株式会社ソラコムのエンジニアリングチームに所属する社員が執筆しました。ただし、個人としての投稿であり、株式会社ソラコムとしての正式な発言や見解ではありません。
はじめに
SORACOM Advent Calendar 2020 7 日目の記事です。今日は昨年の SORACOM Napter 用の Visual Studio Code 拡張を作りました に続いて SORACOM Napter (以下 Napter) に関する話題です。
SORACOM Napter とは
Napter は、SORACOM の SIM を使用したデバイスへ簡単にセキュアにリモートアクセスできるサービスです。SORACOM IoT SIM の刺さっているデバイスであれば、グローバル IP アドレスを割り当てたり、踏み台サーバーを用意したり、デバイスにエージェントをインストールしたりせずリモートからアクセスできます。必要な時にさっとアクセスできるためちょっとした作業やメンテナンス時にとても便利に使っています。
nssh
とは
nssh
(GitHub repository) は、SIM に付けた名前を利用して簡単に SSH できる CLI アプリケーションです。
残念ながら現時点では macOS のみで動作します。Linux と Windows で実行すると
x/crypto/ssh.readVersion
の途中でハングアップしてしまい SSH 接続が確立できません。手元では Big Sky :: Windows からも ssh でリモートコマンド実行したい、それ golang で出来るよ のサンプルも動作しなかったので環境起因の問題かなと思われますが、アドベントカレンダーの期日までに調査できませんでした。
昨年作った Visual Studio Code 用の拡張 SORACOM Napter Tools は今も便利に使っています。しかしながらどんどんものぐさになっていくもので、簡単な作業 — ログを見る、SORACOM Harvest にテスト的にデータを送ってみるなど — のたびに vscode の新規ウィンドウが立ち上がってくるのが面倒だなーと思うようになってきました。
シェルスクリプトで SORACOM CLI のラッパーを作ってもよかったのですが、x/crypto/ssh
という Go の標準パッケージが簡単に使えそうだったため勉強を兼ねて作成しました。勉強なので soracom/soracom-sdk-go は使用せずすべて自前で実装しています。
ここから事前準備と使い方を説明します。
事前準備
一度だけの事前準備として以下の 4 ステップが必要です。公式ドキュメントを紹介しつつ、簡単に手順を説明します。SORACOM Advent Calendar ということでアカウントの作成などは省いていますが、まだの方はぜひ SORACOM Air for セルラーの利用方法: 今すぐ始めよう から。
- (SORACOM ユーザーコンソールの作業) SAM ユーザーを作成し、認証キー ID と認証キーシークレットを生成する
- (SORACOM ユーザーコンソールの作業) SSH でアクセスしたい SIM カードに名前をつける
- (アクセス元マシンでの作業)
nssh
をインストールする - (アクセス先マシンでの作業) Raspberry Pi などに USB ドングル + SORACOM IoT SIM を装着する
SAM ユーザーを作成し、認証キー ID と認証キーシークレットを生成する
この拡張は SORACOM API を使用していますので、呼び出しのために認証キー ID と認証キーシークレットが必要です。まずはこれらをゲットしましょう。
セキュリティの観点から専用の SORACOM Access Managament (SAM) ユーザーを作成することをおすすめしますが、すでに SORACOM CLI などを利用中で、必要な権限を持っている default.json
がある場合はコピーして nssh.json
を作っても OK です。SAM は、管理ユーザー毎にアクセス権限を設定できるアクセス管理機能で、不要なアクセスや操作ミスを未然に防げます。
- SORACOM ユーザーコンソール へログイン
- 右上のユーザー名のボタンから セキュリティ をクリック
- ユーザー作成 ボタンをクリックし、適当な名前と説明を入力して 作成 ボタンをクリック
- 作成したユーザー名をクリック
- 権限設定 タブで以下の設定を入力し 保存 ボタンをクリック
{
"statements": [
{
"api": [
"Subscriber:listSubscribers",
"PortMapping:listPortMappingsForSubscriber",
"PortMapping:createPortMapping"
],
"effect": "allow"
}
]
}
- 認証設定 タブの 認証キーを生成 ボタンをクリックし表示された 認証キー ID と 認証キーシークレット をコピー
$HOME/.soracom/nssh.json
として以下の内容を保存
{
"coverageType": "jp", // デフォルトのカバレッジ
"authKeyId": "keyId-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // 認証キー ID
"authKey": "secret-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // 認証キーシークレット
}
用語や詳細なガイドは SORACOM API 利用ガイド を、権限設定の詳細は SORACOM Access Management を使用して操作権限を管理する も参照してみてください。
SSH でアクセスしたい SIM カードに名前をつける
ユーザーコンソールの使い方 などを参照し名前をつけておいてください。
nssh
をインストールする
Releases セクションからバイナリをダウンロードし、展開した実行ファイルを PATH
の通ったディレクトリへ置いてください。
Raspberry Pi などに USB ドングル + SORACOM IoT SIM を装着する
3G 対応データ通信端末 AK-020 や LTE 対応データ通信端末 Huawei MS2372h-607 などに SORACOM の SIM をセットし Raspberry Pi に装着、 setup_air.sh
を実行してセルラー通信ができるようにしてください。詳細な手順は 各種デバイスで SORACOM Air を使用する にあります。
使い方
さて、ここまで来たら SSH はあっという間です。
- お好みのターミナルを開きます
- SIM の名前を指定して
nssh
を実行します:nssh connect ユーザー名@SIMの名前
- Enjoy!
SIM の名前に空白やシェルが特別に解釈しそうな文字列を含む場合はクオートするなり '
や "
で囲んでみてください。以下のように気が利いている(と思う)ので便利に使えます。
- SIM がオフラインの場合はポートマッピングを作成しません。
- アクセス元の CIDR が許可されているポートマッピングがすでに存在する場合は再利用します。
ユーザー名@
を省略した場合はpi
を使用します。
そのほかにもいくつかオプションがありますので --help
や README をご覧ください。
--duration
: アクセス可能時間(デフォルト 60 分)を指定--port
: 宛先ポート(デフォルト22
)を指定--identity
: 公開鍵認証に使用するファイルを指定--coverage-type
: カバレッジを指定--profile-name
: 使用するプロファイル(デフォルトnssh
) を指定
バグ報告やご質問は GitHub Issues までどうぞ。
まとめ
雑に計測したところ SSH ログインまでの所要時間を大きく短縮できました。45 秒も充分にお手軽ですが、6 秒でアクセスできると便利さのレベルが変わりますね。2020 年 12 月現在、SORACOM Napter は 1 アカウントあたり 1 SIM 分を無料で利用できますのでぜひお試しください。
- ユーザーコンソールを使う方法: 45 秒
- ブラウザを開く
- ユーザーコンソール へログインする (+ MFA 認証)
- SIM 一覧画面から自分の SIM を探して選択する
- 操作 メニューから オンデマンドリモートアクセス を選択する
- OK をクリックする
- 払い出された IP アドレスとポート番号をターミナルへコピペして SSH アクセスする
- Visual Studio Code 拡張を使う方法: 18 秒
- vscode を開く
- コマンドパレット(⇧⌘P)から
Create New Port Mapping
を選ぶ - 対象の SIM を選択する
- vscode がなぜか毎回聞いてくるので OS の種類として
Linux
を選択する - vscode が上がってくるのを待ち統合ターミナルでアクセスする
nssh
を使う方法: 6 秒 (ただし、シェルの履歴機能を使用)- ターミナルを開く
nssh connect ユーザー名@SIMの名前
で SSH を開始する