Macでのリモートアクション用スクリプトの作成
この記事で説明されている操作の実行に助けが必要な場合は、Nexthink認定パートナーにお問い合わせください。
このページでは、Mac上でNexthinkのリモートアクションスクリプトを準備するプロセスの詳細を説明します。 スクリプトは、Unix系の多くのオペレーティングシステムでサポートされているコマンドラインシェルおよびスクリプティング言語であるBashで書かれた後、セキュリティーのために証明書で署名されます。 Bashスクリプトは、タスクの自動化や構成管理に適しており、リモートアクションを従業員のデバイスで実行することができます。
macOSデバイスでMobile Accountsが有効になっている場合、リモートアクションは現在サポートされていません。 このモードでは、アクションが成功したように見えることがありますが、実際には変更が適用されません。
リモートアクションの主な使用ケースは、デバイスからのオンデマンドデータ収集、自己修復タスク、および設定の変更を含みます。
この記事は、読者がBashスクリプティングに精通していることを前提としています。
詳細については、Remote Actionsグループのコミュニティのドキュメントを参照してください。
詳しくは、Nexthink Securityの[Remote Actionsのセキュリティに関するベストプラクティス](https://docs.nexthink.com/security/security-best-practices/remote-actions-security-best-practices)を参照してください。
スクリプトの作成
一般的なスクリプトと入力変数
デジタル署名されたスクリプトのカスタマイズが必要な場合に、汎用スクリプトは便利です。 署名済みスクリプトを変更するとその署名は無効になりますが、汎用スクリプトはパラメーターでカスタマイズでき、署名を保持します。
スクリプトの冒頭でパラメータを宣言し、Bashの位置パラメータとして次のように2つの特別なコメントの間に挿入します:
# NXT_PARAMETERS_BEGIN
Parameter1=$1
Parameter2=$2
Parameter3=$3
# NXT_PARAMETERS_ENDリモートアクションの構成中にスクリプトをアップロードするとき、システムはBashスクリプト内の特別なNexthinkコメントの間にあるパラメーターを取得します。 それらをスクリプトテキストの下にあるパラメーターセクションに一覧表示します。 各パラメータ名の右側に表示されたテキスト入力ボックスに、実際の値を提供してください。
実際の値は常にテキストとしてスクリプトに渡されます。 スクリプトがstring以外の型でパラメータを宣言している場合は、スクリプトが期待する型に変換できる値を提供してください。
アウトプット変数の作成
スクリプトを実行すると、オンデマンドデータとして保存したいアウトプットが生成されることがあります。 Nexthinkは、Collectorと同時に従業員デバイスにインストールされるBashスクリプト(nxt_ra_script_output.sh)を提供しています。 このスクリプトには、結果をデータレイヤーに書き込むための関数が含まれています。
リモートアクションのアウトプットにNexthinkスクリプトの関数を使用するには、Bashスクリプトの最初に以下のヘッダーを追加してください。
すべての書き込み方法は、アウトプット名と書き込む値の2つの引数を受け入れます。 例えば、ディレクトリ内のファイル数をデータレイヤーに返したい場合、スクリプト内の変数nfilesにその数が含まれます。 nfilesの値をFileNumberというアウトプット名でデータレイヤーに書き込むには、符号なし整数の書き込み関数を呼び出してください。
リモートアクションエディタは、スクリプト内のアウトプットの書き込み呼び出しを認識し、アウトプット変数をアウトプットセクションに一覧表示します。 アウトプットのラベルを設定して、調査やメトリクスでどのように参照するかを示してください。
各writeメソッドの終了はアウトプットの種類を示します。 Bashは、緩やかに型付けされた言語であるため、アウトプットの種類は文脈によって解釈されます。 利用可能なメソッドの一覧は次のとおりです。
nxt_write_output_string
0 - 1024 バイト(これ以上の場合、出力が切り捨てられます)
nxt_write_output_bool
true / false
nxt_write_output_uint32
最小値: 0
最大値: 4 294 967 295
nxt_write_output_float
最小値: -3.4E+38
最大値: 3.4E+38
nxt_write_output_size
最小値: 0
最大値: 3.4E+38
nxt_write_output_ratio
nxt_write_output_bitrate
nxt_write_output_duration
最小値: 0ミリ秒
最大値: 49日
ミリ秒単位の精度
nxt_write_output_date_time
YYYY年MM月DD日 HH時MM分SS秒
nxt_write_output_string_list
0 - 1024 バイト(これ以上の場合、出力が切り捨てられます)
出力フィールドの定義
スクリプトを開発する際は次のことを必ず行ってください:
すべての出力フィールドの名前を事前に定義する: これにより、スクリプトが実行中に出力テーブルの正しいフィールドにデータを入力することが保証されます。 事前にフィールド名が定義されていない場合、未知の出力スキーマによりスクリプトが失敗する可能性があります。
出力フィールドの名前は常に
string形式であるべきです。例:
nxt_write_output_string 'output_field_name' "$output_value"
出力フィールドの数を定義する: スクリプトは常に固定数の出力フィールドを指定する必要があります。 固定スキーマにより、予測可能な結果と互換性が保証されます。
動的フィールドを避ける。 動的な出力構造は、プラットフォームにおける不整合や潜在的な処理エラーを引き起こします。
スクリプトを実行するとき、出力フィールドを定義するためにループを使用しないでください。
キャンペーンの実装
従業員が独自に問題を解決できるよう、リモートアクションとキャンペーンを組み合わせましょう。 キャンペーンを使用して、従業員に問題の検出を通知し、その解決に向けて誘導します。
デバイスとやり取りしている従業員のデスクトップにキャンペーンを表示するには:
キャンペーンはリモートアクショントリガーを持ち、公開されなければなりません。
リモートアクションのスクリプトは以下のいずれかで実行できます。
特別な権限を必要としないアクションの場合、従業員のコンテクストで。
管理者特権を必要とするアクションの場合、ローカルシステムアカウントのコンテクストで。
キャンペーン識別子の取得
リモートアクションからキャンペーンを実行するメソッドでは、引数としてキャンペーン識別子を渡す必要があります。 キャンペーンNQL ID(推奨)とキャンペーンUID(クラシックオプション)の両方を使用できます。
リモートアクションにキャンペーン識別子を渡すには、必要なキャンペーンごとにリモートアクションのスクリプトでパラメータを宣言します。 リモートアクションを編集するときに、実際の値としてNQL ID(またはUID)を使用します。
キャンペーンのNQL IDまたはUIDを取得する方法に関する詳細情報は、キャンペーンを起動するドキュメントを参照してください。
リモートアクションのスクリプトからキャンペーンを実行する
エラーログは/Library/Logs/nxtcod.logで確認できます。 これは、ファイル構造によって異なる場合があります。
次の関数はリモートアクションのスクリプト機能を拡張します。
この関数は、引数として渡されたNQL ID(推奨)またはUIDに一致するキャンペーンを実行し、解答を内部に保存します。
キャンペーンのステータスを受信した場合、関数は0を返します。
その他のケースでは関数は1を返し、エラーはログに記録されます。
この関数を呼び出すと、従業員がキャンペーンを完了するか、却下するまでリモートアクションの実行が一時停止されます。
この関数は、引数として渡されたNQL ID(推奨)またはUIDとタイムアウト(秒単位: 0 < T < 1 週間)に一致するキャンペーンを実行し、解答を内部に保存します。
キャンペーンのステータスを受信した場合、関数は0を返します。
その他のケースでは関数は1を返し、エラーはログに記録されます。
この関数を呼び出すと、従業員がキャンペーンを完了するか却下するか、タイムアウト前にキャンペーンを完了できなかった場合までリモートアクションの実行が一時停止されます。
この関数は、引数として渡されたNQL ID(推奨)またはUIDに一致するキャンペーンを実行し、解答を内部に保存します。
キャンペーンのステータスを受信した場合、関数は0を返します。
その他のケースでは関数は1を返し、エラーはログに記録されます。
この関数を実行すると、キャンペーンの開始がトリガーされ、従業員の回答を待たずにリモートアクションの実行が続行されます。
関数:
res_varにキャンペーンのステータスが無事に保存された場合は0を返します。その場合は1を返します。
その後、キャンペーンのステータスを文字列として抽出し、指定された変数 res_var に保存します。 関数が0の結果を返すと、res_varには以下のいずれかの値が入ります:
完全: 従業員がキャンペーンの質問に完全に回答しました。
タイムアウト: ユーザーが回答を終える前にキャンペーンがタイムアウトしました。
延期: 従業員がキャンペーンへの参加に同意しました。
拒否: 従業員がキャンペーンへの参加を拒否しました。
接続失敗: スクリプトがキャンペーン通知を制御するCollectorコンポーネントに接続できませんでした。
通知失敗: スクリプトがキャンペーンを正常に表示できなかった理由は次のいずれかです。
存在しないキャンペーン、または未公開のキャンペーンのため、プラットフォームからキャンペーン定義を取得できませんでした。
別のキャンペーンが既に従業員に表示されています。
Collectorの集中保護または「邪魔しないで」ルールのために急を要しないキャンペーンを表示できません。 詳細については、キャンペーンの受信率を制限する方法のドキュメントを参照してください。
最後のキャンペーンが失敗した場合は空白になります。
質問ラベルを文字列パラメータのクエリ_keyとして使用して、最後のキャンペーンに問い合わせます。 関数は回答を文字列として抽出し、指定された変数 res_var に保存します。
res_varにキャンペーンの回答が正常に保存された場合は0を返します。それ以外の場合は1を返します。
スクリプトのエンコード
リモートアクション用Bashスクリプトを書くには:
スクリプトを含むファイルをBOMなしのUTF-8でエンコードします。
コードの各行は、UNIXシステムの通常の文字
LFで終了します。
エンコードを正しく行い、エラーや機能しないスクリプトを避けてください。
コード例
回答へのアクセス
この例では、リモートアクションがキャンペーンの回答データを要求し、配列として出力します。 各回答は対応する番号付きオプションで表されます。 Bashは0を最低オプションとして使用し、Zshは1を使用します。
非ブロッキングキャンペーンの実行
この例では、リモートアクションはユーザー入力を必要とせず、キャンペーンをトリガーした後も実行を続けます。 ユーザーはいつでもキャンペーンを閉じることができます。 これは主に、データを取得するのではなく、ユーザーに情報を提供するために使用されます。
詳しくは魅力的なキャンペーンの実施のドキュメントを参照してください。
スクリプトの署名
セキュリティ上の理由から、NexthinkはmacOS上でのリモートアクションのBashスクリプトをcodesignツールでデジタル署名する必要があります。 Appleは署名をファイルの拡張属性に保存します。 署名済みスクリプトをtar.gzファイルとしてパッケージ化し、拡張属性を保持してください。 Nexthink web インターフェースは、macOSを対象としたリモートアクションのスクリプトをインポートする際、tar.gz拡張子のファイルのみを受け付けます。
Nexthinkは、本番環境でのすべてのスクリプトの署名を推奨しています。 署名のないスクリプトはテスト環境でのみ使用するべきです。
オプション1: システム証明書ストアに依存する
署名証明書の作成
MacOS Sequoia (バージョン15)から、Appleによる変更により、署名証明書自体をすべてのデバイスで信頼されたものとして展開する代わりに、署名証明書のルート認証局 (CA) を展開する必要があります。 オペレーティングシステムに事前インストールされた公開ルートCAは機能しません。
リモートアクションが実行されるすべてのデバイスに以下のオプションのいずれかを展開できます。
リモートアクション専用の自己署名ルートCA
社内のルートCA
以下は、自己署名ルートCAを作成し、それを使用してリモートアクションの署名用コード署名証明書を生成する方法の例です:
Macデバイスでキー チェーンアクセスを起動します。
Keychain Access > 証明書アシスタント > 証明書局を作成... に移動します。

証明書局の名前をEnterします。
ユーザー証明書でコード署名を選択します。
管理目的の連絡先として使用するメールアドレスをEnterします。
Create をクリックして証明書を生成します。

以下は、コード署名証明書自体を作成する方法の例です。
MacデバイスでKeychain Accessを起動します。
キー チェーンアクセス > 証明書アシスタント > 証明書を作成… に移動します。

証明書名を入力してください。

この証明書の発行者としてルートCAを選択します。

証明書を生成し、以下のように確認を得るために、作成をクリックします。

証明書が作成されると、Keychain Accessアプリケーションに表示されます。 証明書を右クリックし、情報を取得をクリックします。

下までスクロールしてSHA-1をコピーアンドペーストします。 リモートアクションスクリプトを署名するために、値からスペースを削除します。

署名スクリプトにコード署名証明書を使用します:

以下のようにコマンドを実行して、以前のスクリプト署名手順が成功したかどうかを確認します。

パッケージ化
.tarアーカイブと.gzip圧縮を用いてリモートアクションスクリプトをパッケージ化してください。 ".tar.gz"拡張子は必須です。
スクリプトファイルが署名されている場合、tarユーティリティはその拡張属性もパックします。 この方法で、システムはコード署名とスクリプトファイルを転送できます。
制限事項
一つのアーカイブには一つのスクリプトしか入れられません。
スクリプトファイルはルートパッケージフォルダに配置する必要があります。
./myscript/myscript.shパスは正しくありません。スクリプトは.sh拡張子を持っていなければなりません。
スクリプトファイル名はUTF-8エンコードである必要があります。これはmacOSでデフォルト設定です。
例
test.sh スクリプトのパッケージ化の例:
生成された example_ra_script.tar.gz はリモートアクションスクリプトファイルです。
Nexthinkは署名とパッケージ化のプロセスを簡素化するために、このスクリプトを使用することを推奨しています。
ルートCAが生成されたマシンで署名済みスクリプトをテストする
Root CAが作成された同じマシンで署名されたスクリプトをテストするとき、以下のステップを実行する必要があります。
ルートCAをシステムキーチェーンにコピーし、信頼済みとしてマークする
Appleはデフォルトで生成されたRoot CAを**「ログイン」キーチェーンに配置します。 しかし、適切な機能を保証するためには、それを「システム」**キーチェーンにインストールする必要があります。
証明書をシステムキーチェーンにコピーするには、次のステップを実行します。
キーチェーンアクセスを開きます。
ルートCA証明書を右クリックして、エクスポートを選択してエクスポートします。 ポップアップウィンドウで、証明書 (.cer) ファイル形式を選択します。

ターミナルアプリケーションを開きます。
Root CAをシステムキーチェーンにインポートするために、次のコマンドを実行します:
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain Certificate.cerインポート後、証明書がシステムキーチェーンに表示されることを確認します:
キーチェーンアクセスに戻ります。
左サイドバーでシステムセクションを選択します。
右上の検索バーを使用して証明書を見つけます。
結果テーブルで、キーチェーン列がシステムを表示していることを確認します。
Root CA証明書を右クリックし、情報を見るを選択して信頼済みにマークします。
信頼セクションで、ルートCAを信頼済みとしてマークするように設定を調整します。

署名証明書のルートCAをエンドポイントに展開する
macOS Sequoiaバージョン15では、Windowsのようにすべてのデバイスに署名証明書を信頼済みとして導入するのではなく、署名証明書のRoot CAを導入する必要があります。
Collector Cloud 24.10.2.10およびCollector on-prem 24.10.30.26は、署名された証明書に代わる展開されたRoot CAに基づくリモートアクションスクリプト信頼ソース検証をサポートしています。
Root CAは、以下に示すように、主にJAMFを使用して構成プロファイルを作成することで導入することができます。
ルートCAで作成された証明書のエクスポート
ポップアップウィンドウで_証明書(.cer)_ファイル形式を選択します。


上記の構成プロファイルを使用してすべてのエンドポイントに展開します。 ルートCAは自動的に信頼としてマークされます。


証明書がエンドポイントに正しくインポートされたことを確認する
署名済みのリモートアクションスクリプトをendpointにコピーして解凍してください。
あなたの署名を確認してください。
署名証明書のRoot CAが適切にインポートされた場合、次の出力が表示されます:

オプション2: 証明書ピニングに依存する
Collector バージョン2025.9.1.xから、macOSのCollectorは、実行可能なスクリプトを制御する追加の実行ポリシーをサポートします。 このセクションでは、詳細を説明します。
新しい実行ポリシー
macOSでは、2つの新しい実行ポリシーが導入されています:
signed_pinned
signed_pinned_or_nexthink
さらに、新しいインストーラオプションcert_fingerprintsが追加されました。
cert_fingerprintsインストーラーオプション
cert_fingerprints オプションは、スクリプトの署名ハッシュリストを定義することを可能にします(各ハッシュは1つの , で区切られ、その周りにスペースはありません)。 スクリプト署名サムプリントは、署名のリーフ証明書のサムプリントでなければなりません。
署名されたスクリプトファイルのリーフ証明書の指紋を抽出するには、以下のスクリプトを使用します:
cert_fingerprints オプションは、新しい実行ポリシー(signed_pinned と signed_pinned_or_nexthink)を使用する場合にのみ適用されます。 これは他の実行ポリシーに影響を与えません。
ポリシーの動作
signed_pinned
アンシグネードスクリプトは許可されていません。 実行中に失敗し、Collectorが関連するステータスを報告します。
Nexthink LibraryのRAスクリプト:
cert_fingerprintsが署名のリーフ証明書のサムプリントを含んでいる場合にのみ実行が許可されます。 そうでなければ、実行はブロックされ、ステータスが報告されます。他のスクリプト:
cert_fingerprintsが署名のリーフ証明書のサムプリントを含んでいる場合にのみ実行が許可されます。 そうでなければ、実行はブロックされ、ステータスが報告されます。
signed_pinned_or_nexthink
アンシグネードスクリプトは許可されていません。 実行中に失敗し、Collectorが関連するステータスを報告します。
Nexthink LibraryのRAスクリプト:実行は常に許可されます(ポリシーによってブロックされません)。
他のスクリプト:
cert_fingerprintsが署名のリーフ証明書のサムプリントを含んでいる場合のみ実行が許可されます。 そうでなければ、実行はブロックされ、ステータスが報告されます。
実行ポリシーの概要表
signed_trusted(既存)
ブロックされました
ブロックされました
信頼された証明書によって署名された場合は許可
効果なし
signed_trusted_or_nexthink(既存)
ブロックされました
常に許可されます
信頼された証明書によって署名された場合は許可
効果なし
signed_pinned
ブロックされました
サムプリントが許可リスト内にある場合に許可されます(cert_fingerprints内)
サムプリントが許可リスト内にある場合に許可されます(cert_fingerprints内)
必要
signed_pinned_or_nexthink
ブロックされました
常に許可されます
サムプリントが許可リスト内にある場合に許可されます(cert_fingerprints内)
必要
証明書ピニング用のコード署名証明書の作成
証明書ピニングでは、あらゆる種類のコード署名証明書がサポートされています:
Appleの開発者サイトで作成されたコード署名証明書
Appleの証明書アシスタントを使用して作成されたコード署名証明書
プライベートルートCAでのコード署名証明書
パブリックルートCAでのコード署名証明書
その他の種類の証明書でも
プライベートルートCAでコード署名証明書を使用したい場合は、具体的な手順を上記で確認できます。
署名済みリモートアクションスクリプトのパッケージ化、既知の制限
コード署名証明書が作成されたら、Keychain Accessアプリケーションで開くためにダブルクリックしてください。 証明書を右クリックし、「情報を取得」をクリックします。

一番下までスクロールし、そこからSHA-1をコピー&ペーストします。 リモートアクションスクリプトの署名に使用するために、その値からスペースを削除します。

コード署名証明書を使用してスクリプトに署名します:

次のコマンドを実行して、前のスクリプト署名手順が成功したことを確認します。

パッケージ
リモートアクションスクリプトを.tarアーカイブと.gzip圧縮でパッケージ化します。 拡張子「.tar.gz」は必須です。
スクリプトファイルが署名されている場合、tarユーティリティはその拡張属性もパックします。 この方法で、システムはコード署名とスクリプトファイルを転送できます。
制限事項
1つのアーカイブには1つのスクリプトのみを入れることができます。
スクリプトファイルはルートパッケージフォルダに配置する必要があります;
./myscript/myscript.shのパスは正しくありません。スクリプトには.sh拡張子が必要です。
スクリプトファイル名はUTF-8エンコードされている必要があります。この形式はmacOSでデフォルトとなっています。
例
test.sh スクリプトのパッケージ化の例:
生成された example_ra_script.tar.gz はリモートアクションスクリプトファイルです。
{% 提示スタイル="情報" %}
Nexthinkは、このスクリプトを使用して署名およびパッケージ化プロセスを簡素化することをお勧めします。
署名証明書のルートCAをエンドポイントに展開する
証明書は、証明書ピンニングでエンドポイントに展開する必要はありません。 上記の説明に従って、すべてのエンドポイントに cert_fingerprints コレクターインストーラオプションを設定してください。
スクリプトの保守
比較と検証
リモートアクションスクリプトを展開する前に、Nexthinkが準備した他のスクリプトと比較することができます。 このステップはオプションですが、初めてスクリプトを準備する場合は推奨されます。
Nexthink Libraryで、コンテンツを選択してください。
リモートアクションでフィルタリングします。
リモートアクション管理ページに移動してください。
Nexthink Library から直接インストールされたリモートアクションスクリプトの中で、ターゲットオペレーティングシステムに一致するものを選択してください。
スクリプトをエクスポートし、その構文を自分のスクリプトと比較してください。
スクリプトの終了とタイムアウト
リモートアクションスクリプトからサブプロセスを開始し、リモートアクションスクリプトが終了またはタイムアウトすると、Collectorはサブプロセスを自動的に終了します。 リモートアクションが終了した後もサブプロセスを実行し続けるには、&文字を使用してスクリプトがサブプロセスをデタッチすることを確認してください。例:
Zshコマンドインタープリタ
Collectorバージョン6.27.2以降では、Zsh Unixシェル用に書かれたスクリプトを実行できます。 シェルスクリプトの一番最初に以下の行を追加する必要があります:
これはシバンと呼ばれる文字列です(シバンとは(外部リンク))。
システムがMac上でリモートアクションを実行すると、Collectorはコードの最初の行をチェックし、指定されたインタープリタを使用して残りの指示を実行します。 シバンのないスクリプトは、Bashコマンドインタープリタを使って実行されます。
Nexthinkは常にシェルスクリプトにシバンを使用し、標準インタープリタに従うことを推奨しています。
アーカイブ済み - 証明書の生成、署名、展開、確認(旧アプローチ、macOS Sequoiaおよびそれ以降には非対応)
Root CAなしの証明書生成アプローチ
この証明書生成アプローチは、すべてのデバイスで引き続き機能しますが、デバイス上で信頼済みとしてマークするためにユーザーの操作が必要です。
MacデバイスでKeychain Accessを起動します。
Keychain Access > 証明書アシスタント > 証明書を作成... に進みます。

証明書の名前を入力します。
証明書の種類としてコード署名を選択してください。
テスト目的の場合、デフォルトを上書きさせてくださいをチェックなしのままにすることができます。

作成および完了をクリックしてください。 システムが証明書を生成しました。

署名
標準macOSコードサインユーティリティを使用してリモートアクションスクリプトに署名します。
パラメータ:
コード署名証明書のアイデンティティはキーチェーン内にあります。 通常、これは証明書主題の共通名または証明書のハッシュです。 詳細については、codesignマニュアルページを参照してください。
署名の信頼できるタイムスタンプ。
コード署名識別子へのプレフィックス。 企業のアイデンティティを識別子に付加し、識別子をユニークにするのに役立ちます。 コード署名識別子生成規則については、UNIXのcodesignマニュアルページを参照してください。
既存のコード署名を上書きすることを強制します。
例
example_ra_script.sh リモートアクションスクリプトのテスト証明書の例:
スクリプトファイルの署名は、ファイルに関連付けられたファイルシステムの拡張属性で生成されます。 コードサインの詳細を取得し署名を検証するためにcodesignユーティリティを使用してください。

エンドポイントへの署名証明書の配置
この展開アプローチは動作を続けますが、ユーザーの操作が必要になります。

ポップアップウィンドウで公開証明書用に 証明書 (.cer) ファイル形式を選択します。
証明書をendpointのキーチェーンにインポートする
署名済みの証明書をSystemキーチェーンにインポートして、Trusted Publisher 実行ポリシーを使用してリモートアクションスクリプトを使用します。
.cerファイルをダブルクリックし、キーチェーンのドロップダウンメニューでシステムオプションを選択します。

証明書をインポートするためにルートパスワードを入力してください。

これらの作業を自動化するために、セキュリティユーティリティ(外部リンク)または自動化フレームワークを使用してください。
証明書が正しくendpointにインポートされたか確認する
署名済みのリモートアクションスクリプトをエンドポイントにコピーして展開します。
署名を確認します。
署名が正しくインポートされている場合、次の出力が表示される必要があります:

Last updated
Was this helpful?