View a markdown version of this page

AWS IoT Greengrass V2 コアデバイスを非ルートとして設定する - AWS IoT Greengrass

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS IoT Greengrass V2 コアデバイスを非ルートとして設定する

このページでは、 AWS IoT Greengrass Core ソフトウェアを非ルートとして実行するための 4 つのソリューションを紹介します。比較表を確認して各ソリューションの特徴とトレードオフを理解し、決定フローチャートを使用して要件に合ったものを特定します。

注記

このページの非ルートソリューションは、Linux デバイスの AWS IoT Greengrass nucleus にのみ適用されます。は Windows のシステムサービスとして実行 AWS IoT Greengrass V2 する必要があるため、Windows は含まれません。Linux での標準ルートインストールについては、「」を参照してください自動リソースプロビジョニングを使用して AWS IoT Greengrass Core ソフトウェアをインストールする

非ルートユーザーとして AWS IoT Greengrass nucleus lite を実行するには、 AWS IoT Greengrass nucleus lite GitHub リポジトリの「Podman の使用」を参照してください。

非ルートソリューションを選択する

次の表を使用して、非ルートソリューションを比較し、そのトレードオフを理解します。各ソリューションは、セキュリティ要件とデバイスの制約に応じて異なる機能を提供します。

非ルートソリューション
ソリューション ルートアクセスが必要 コンポーネントを異なるユーザーとして実行できる Greengrass をシステムサービスとして実行します 次の用途に適しています

解決策 1: ルートアクセスなし

いいえ

いいえ

いいえ (ユーザーサービスはオプション)

ルートアクセスがないデバイス

解決策 2: 非ルート、単一ユーザー

はい (セットアップのみ)

いいえ

はい

すべてのコンポーネントが同じユーザーとして実行されている非ルートユーザーとして Greengrass を実行する

解決策 3: 非ルート、マルチユーザー

はい (セットアップのみ)

はい

はい

コンポーネントを異なるユーザーとして実行しながら、非ルートユーザーとして Greengrass を実行する

解決策 4: 機能が制限されたルート

はい

はい

はい

Linux 機能の限られたセットで Greengrass をルートとして実行する

次のフローチャートは、デバイスの制約と要件に基づいて適切なソリューションを選択する方法を示しています。

非ルートソリューションを選択するための決定プロセスを示すフローチャート。まず、コアデバイスにルートアクセスがあるかどうかを尋ねます。いいえの場合は、ソリューション 1 を使用します。「はい」の場合は、コンポーネントを別の Linux ユーザーとして実行する必要があるかどうかを尋ねます。いいえの場合は、ソリューション 2 を使用します。「はい」の場合は、機能が制限されたルートユーザーとして Greengrass を実行するかどうかを尋ねます。「はい」の場合は、ソリューション 4 を使用します。いいえの場合は、ソリューション 3 を使用します。

解決策 1: ルートアクセス AWS IoT Greengrass V2 なしでセットアップする

このソリューションは、デバイスでルートアクセスがない場合に使用します。この設定では、 AWS IoT Greengrass Core ソフトウェアは、昇格された権限のない非ルートユーザーとして完全に実行されます。

トレードオフ

このソリューションには以下の制限があります。

  • コンポーネントユーザーの分離なし – すべてのコンポーネントは、 AWS IoT Greengrass Core ソフトウェアを実行するのと同じユーザーとして実行されます。posixUser 設定を使用して、コンポーネントを異なるユーザーとして実行することはできません。

  • RequiresPrivilege ignored – AWS IoT Greengrass Core ソフトウェアは、コンポーネントレシピの RequiresPrivilegeオプションを無視します。コンポーネントは昇格された権限をリクエストできません。

  • システムサービスなし – AWS IoT Greengrass Core ソフトウェアをシステムサービスとしてインストールすることはできません。オプションで、systemd ユーザーサービスとして を実行する AWS IoT Greengrass V2 ように を設定できます。

前提条件

このソリューションには以下が必要です。

  • デバイス上の非ルートユーザーアカウント

  • AWS IoT Greengrass Core ソフトウェアをインストールするディレクトリへの書き込みアクセス

ルートアクセス AWS IoT Greengrass V2 なしでインストールして実行するには
  1. から次の手順を実行します自動リソースプロビジョニングを使用して AWS IoT Greengrass Core ソフトウェアをインストールする。デバイス環境のセットアップ、認証情報の提供、 AWS IoT Greengrass Core ソフトウェアのダウンロード。

  2. インストールディレクトリを作成し、ユーザーがそのディレクトリを所有していることを確認します。

    mkdir -p $HOME/greengrass/v2
  3. なしでインストーラを実行しますsudo--component-default-user を現在のユーザーに設定します。

    java -Droot="$HOME/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-region region \ --thing-name MyGreengrassCore \ --thing-group-name MyGreengrassCoreGroup \ --thing-policy-name GreengrassV2IoTThingPolicy \ --tes-role-name GreengrassV2TokenExchangeRole \ --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \ --component-default-user $USER \ --provision true

    システムサービスを作成するためのルートアクセス--setup-system-service trueがないため、 を使用しないでください。

(オプション) systemd ユーザーサービスを設定する

AWS IoT Greengrass Core ソフトウェアを管理するように systemd ユーザーサービスを設定できます。これにより、ログイン時にソフトウェアを自動的に起動できます。

systemd ユーザーサービスをセットアップするには
  1. AWS IoT Greengrass Core ソフトウェアが現在実行されている場合は停止します。

    kill $(cat $HOME/greengrass/v2/alts/loader.pid)
  2. systemd ユーザーサービスディレクトリを作成します。

    mkdir -p $HOME/.config/systemd/user
  3. 次のコンテンツ$HOME/.config/systemd/user/greengrass.serviceを含むサービスファイルを に作成します。

    [Unit] Description=Greengrass Core [Service] Type=simple PIDFile=%h/greengrass/v2/alts/loader.pid RemainAfterExit=no Restart=on-failure RestartSec=10 ExecStart=/bin/sh %h/greengrass/v2/alts/current/distro/bin/loader Environment="JAVA_HOME=/path/to/java" [Install] WantedBy=default.target

    systemd ユーザーユニットファイルでは、 %hはサービスを実行しているユーザーのホームディレクトリに解決される指定子です。

    /path/to/java を Java インストールへのパスに置き換えます。

  4. サービスを有効にして起動します。

    systemctl --user daemon-reload systemctl --user enable greengrass.service systemctl --user start greengrass.service
再起動と OTA 更新の動作

動作は、systemd ユーザーサービスを設定したかどうかによって異なります。

ユーザーサービスを使用する
  • デバイスの再起動 – ユーザーがログインすると AWS IoT Greengrass Core ソフトウェアが自動的に起動します。

  • OTA 更新 – OTA 更新は成功し、ソフトウェアは自動的に再起動します。

ユーザーサービスなし
  • デバイス再起動 – AWS IoT Greengrass Core ソフトウェアは自動的に再起動しません。手動で起動する必要があります。

  • OTA 更新 – OTA 更新は成功しますが、後で AWS IoT Greengrass Core ソフトウェアを手動で起動する必要があります。

システムリソースの制限

非ルートユーザーは で cgroup ディレクトリを作成できないため、cgroup を使用するコンポーネントごとのリソース制限はこのソリューションでは機能しません/sys/fs/cgroup/。リソース制限が設定されたコンポーネントをデプロイすると、 AWS IoT Greengrass Core ソフトウェアは設定された制限を無視します。

リソースの使用を管理するには、次の代替方法を使用できます。

  • Systemd ユーザーサービスの制限 – AWS IoT Greengrass Core ソフトウェアを systemd ユーザーサービスとして実行する場合は、 のサービスファイルにリソース制限を追加できます$HOME/.config/systemd/user/greengrass.service。これらの制限は、Greengrass nucleus とすべてのコンポーネントを含むサービス全体に適用されます。

    MemoryMax=2G CPUQuota=100%
  • Greengrass nucleus JVM の制限 – JVM オプションを設定することで、Greengrass nucleus プロセスメモリを制限できます。詳細については、「AWS IoT Greengrass Core ソフトウェアを設定する」を参照してください。

解決策 2: コンポーネントユーザーを分離せずに非ルート AWS IoT Greengrass V2 としてセットアップする

このソリューションは、初期セットアップ用のルートアクセスがあり、 AWS IoT Greengrass Core ソフトウェアを非ルートシステムサービスとして実行する場合に使用しますが、コンポーネントを別のユーザーとして実行する必要はありません。これはソリューション 1 に似ていますが、ソフトウェアは起動時に自動的に開始されるシステムサービスとして実行されます。

トレードオフ

このソリューションには以下の制限があります。

  • コンポーネントユーザーの分離なし – すべてのコンポーネントは、 AWS IoT Greengrass Core ソフトウェアを実行するのと同じユーザーとして実行されます。posixUser 設定を使用して、コンポーネントを異なるユーザーとして実行することはできません。

  • RequiresPrivilege ignored – AWS IoT Greengrass Core ソフトウェアは、コンポーネントレシピの RequiresPrivilegeオプションを無視します。コンポーネントは昇格された権限をリクエストできません。

前提条件

このソリューションには以下が必要です。

  • 初期設定のルートアクセス

  • デバイス上の systemd

コンポーネントユーザーを分離せずに非ルート AWS IoT Greengrass V2 としてインストールして実行するには
  1. から次の手順を実行します自動リソースプロビジョニングを使用して AWS IoT Greengrass Core ソフトウェアをインストールする。デバイス環境のセットアップ、認証情報の提供、 AWS IoT Greengrass Core ソフトウェアのダウンロード。

  2. AWS IoT Greengrass Core ソフトウェアとすべてのコンポーネントを実行する非ルートユーザーを作成します。

    sudo useradd --create-home gg_non_root
  3. 非ルートユーザーとしてログインし、インストーラを実行します。を同じユーザー--component-default-userに設定します。を使用したりsudo、システムサービスをセットアップしたりしないでください。

    java -Droot="/home/gg_non_root/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-region region \ --thing-name MyGreengrassCore \ --thing-group-name MyGreengrassCoreGroup \ --thing-policy-name GreengrassV2IoTThingPolicy \ --tes-role-name GreengrassV2TokenExchangeRole \ --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \ --component-default-user gg_non_root \ --provision true \ --setup-system-service false
  4. root として、次の内容/etc/systemd/system/greengrass.serviceのシステムサービスファイルを に作成します。

    [Unit] Description=Greengrass Core After=network.target [Service] Type=simple User=gg_non_root PIDFile=/home/gg_non_root/greengrass/v2/alts/loader.pid RemainAfterExit=no Restart=on-failure RestartSec=10 ExecStart=/bin/sh -c "exec /home/gg_non_root/greengrass/v2/alts/current/distro/bin/loader >> /home/gg_non_root/greengrass/v2/logs/loader.log 2>&1" KillMode=mixed NoNewPrivileges=true ProtectSystem=strict ReadWritePaths=/home/gg_non_root/greengrass /tmp [Install] WantedBy=multi-user.target
  5. 実行中の AWS IoT Greengrass Core インスタンスを停止し、システムサービスを有効にして起動します。

    sudo systemctl daemon-reload sudo systemctl enable greengrass.service sudo systemctl start greengrass.service
再起動と OTA 更新の動作

このソリューションでは、次の操作を行います。

  • AWS IoT Greengrass Core ソフトウェアはシステムサービスとして実行され、障害発生時またはデバイスの再起動時に自動的に再起動します。

  • AWS IoT Greengrass Core ソフトウェアの OTA 更新は機能します。設定された非ルートユーザーとしてサービスが自動的に再起動します。

システムリソースの制限

cgroups を使用するコンポーネントごとのリソース制限は、Linux 機能を持たない非ルートユーザーは で cgroup ディレクトリを作成できないため、このソリューションでは機能しません/sys/fs/cgroup/。リソース制限が設定されたコンポーネントをデプロイすると、 AWS IoT Greengrass Core ソフトウェアは設定された制限を無視します。

リソースの使用を管理するには、次の代替方法を使用できます。

  • Systemd service limits – のシステムサービスファイルにリソース制限を追加できます/etc/systemd/system/greengrass.service。これらの制限は、Greengrass nucleus とすべてのコンポーネントを含むサービス全体に適用されます。

    MemoryMax=2G CPUQuota=100%
  • Greengrass nucleus JVM の制限 – JVM オプションを設定することで、Greengrass nucleus プロセスメモリを制限できます。詳細については、「AWS IoT Greengrass Core ソフトウェアを設定する」を参照してください。

解決策 3: コンポーネントユーザーを分離して非ルート AWS IoT Greengrass V2 として設定する

このソリューションは、初期設定用のルートアクセスがあるが、コンポーネントを異なるユーザーとして実行する能力を維持しながら、 AWS IoT Greengrass Core ソフトウェアを非ルートユーザーとして実行する場合に使用します。この設定では、Linux 機能と sudoer を使用して、非ルートユーザーがコンポーネントの実行時に他のユーザーに切り替えることができます。

トレードオフ

このソリューションには以下の制限があります。

  • sudoers 設定が必要 – AWS IoT Greengrass V2 ユーザーが他のユーザーとしてコマンドを実行できるように sudoers を設定する必要があります。

前提条件

このソリューションには以下が必要です。

  • 初期設定のルートアクセス

  • systemd バージョン 229 以降。 をサポートしていますAmbientCapabilities。バージョンを確認するには、systemctl --version を実行します。

コンポーネントユーザーを分離して非ルート AWS IoT Greengrass V2 としてインストールして実行するには
  1. から次の手順を実行します自動リソースプロビジョニングを使用して AWS IoT Greengrass Core ソフトウェアをインストールする。デバイス環境のセットアップ、認証情報の提供、 AWS IoT Greengrass Core ソフトウェアのダウンロード。

  2. AWS IoT Greengrass Core ソフトウェアを実行する非ルートユーザーを作成します。

    sudo useradd --create-home gg_non_root
  3. 非ルートユーザーを sudoers に追加して、コンポーネントユーザーとしてコマンドを実行できるようにします。でファイルを作成します/etc/sudoers.d/gg_non_root

    gg_non_root ALL=(ggc_user:ggc_group) NOPASSWD: SETENV: /bin/sh, /bin/bash

    で追加のユーザーとして を実行するようにコンポーネントを設定する場合はposixUser、ユーザーごとに sudoers エントリを追加します。例えば、次のようになります。

    gg_non_root ALL=(ggc_user:ggc_group) NOPASSWD: SETENV: /bin/sh, /bin/bash gg_non_root ALL=(another_user:another_group) NOPASSWD: SETENV: /bin/sh, /bin/bash
  4. 非ルートユーザーとしてログインし、インストーラを実行します。を使用したりsudo、システムサービスをセットアップしたりしないでください。

    java -Droot="/home/gg_non_root/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-region region \ --thing-name MyGreengrassCore \ --thing-group-name MyGreengrassCoreGroup \ --thing-policy-name GreengrassV2IoTThingPolicy \ --tes-role-name GreengrassV2TokenExchangeRole \ --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \ --component-default-user ggc_user:ggc_group \ --provision true \ --setup-system-service false
  5. root として、次の内容/etc/systemd/system/greengrass.serviceのシステムサービスファイルを に作成します。

    [Unit] Description=Greengrass Core After=network.target [Service] Type=simple User=gg_non_root PIDFile=/home/gg_non_root/greengrass/v2/alts/loader.pid RemainAfterExit=no Restart=on-failure RestartSec=10 ExecStart=/bin/sh -c "exec /home/gg_non_root/greengrass/v2/alts/current/distro/bin/loader >> /home/gg_non_root/greengrass/v2/logs/loader.log 2>&1" KillMode=mixed AmbientCapabilities=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE ProtectSystem=strict ReadWritePaths=/home/gg_non_root/greengrass /tmp [Install] WantedBy=multi-user.target

    必要な機能の詳細については、「」を参照してくださいに必要な Linux 機能 AWS IoT Greengrass V2

    • AmbientCapabilities は、サービスを実行している非ルートユーザーに指定された Linux 機能を付与します。これにより、 AWS IoT Greengrass Core ソフトウェアは、ルートとして実行せずに、コンポーネントの実行時にユーザーを切り替えるなどの特権オペレーションを実行できます。

    • CapabilityBoundingSet は、サービスとその子プロセスが使用できる機能の最大セットを制限します。このセットにない機能は完全に削除されます。

    • ProtectSystem=strict は、 サービスのファイルシステム全体を読み取り専用にして、オペレーティングシステムの変更を防ぎます。

    • ReadWritePaths は、サービスが書き込むことができる唯一のディレクトリを指定します。

  6. 実行中の AWS IoT Greengrass Core インスタンスを停止し、システムサービスを有効にして起動します。

    sudo systemctl daemon-reload sudo systemctl enable greengrass.service sudo systemctl start greengrass.service
再起動と OTA 更新の動作

このソリューションでは、次の操作を行います。

  • AWS IoT Greengrass Core ソフトウェアはシステムサービスとして実行され、障害発生時またはデバイスの再起動時に自動的に再起動します。

  • AWS IoT Greengrass Core ソフトウェアの OTA 更新は機能します。設定された非ルートユーザーとしてサービスが自動的に再起動します。

システムリソースの制限

このソリューションでのメモリと CPU のコンポーネントごとのリソース制限は、 AWS IoT Greengrass Core ソフトウェアをルートとして実行する場合と同じ方法で機能します。

解決策 4: 機能が制限されたルート AWS IoT Greengrass V2 としてセットアップする

AWS IoT Greengrass Core ソフトウェアをルートとして実行するが、Linux 機能のセットを減らす場合は、このソリューションを使用します。この設定は、ソフトウェアとそのコンポーネントで使用できる機能を制限することで、攻撃対象領域を制限しながら、ルートとして を実行するための完全な機能を提供します。

トレードオフ

このソリューションには以下の考慮事項があります。

  • RequiresPrivilege を使用するコンポーネントには制限された機能があります – を使用するコンポーネントは、完全なルート権限ではなく、 AWS IoT Greengrass Core ソフトウェアと同じ制限された機能セットでRequiresPrivilege実行されます。

前提条件

このソリューションには以下が必要です。

  • ルートアクセス

  • デバイス上の systemd

機能が制限されたルート AWS IoT Greengrass V2 としてインストールして実行するには
  1. から次の手順を実行します自動リソースプロビジョニングを使用して AWS IoT Greengrass Core ソフトウェアをインストールする。デバイス環境のセットアップ、認証情報の提供、 AWS IoT Greengrass Core ソフトウェアのダウンロード。

  2. Core AWS IoT Greengrass ソフトウェアをダウンロードしたディレクトリGreengrassInstaller/bin/greengrass.service.templateの でサービステンプレートファイルを変更します。インストーラを実行する前に、次の行を [Service]セクションに追加します。

    CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE ProtectSystem=strict ReadWritePaths=/greengrass /tmp
    • CapabilityBoundingSet は、 AWS IoT Greengrass Core ソフトウェアとそのすべての子プロセスで使用できる Linux 機能を制限する systemd セキュリティ機能です。境界セットを設定することで、ルートとして実行されている場合でも、Greengrass nucleus プロセスとコンポーネントが実行できる操作を制限できます。各機能の詳細については、「」を参照してくださいに必要な Linux 機能 AWS IoT Greengrass V2

    • ProtectSystem=strict は、 サービスのファイルシステム全体を読み取り専用にして、オペレーティングシステムの変更を防ぎます。これにより、悪意のあるコンポーネントが昇格された権限で実行されていても、システムファイルを保護するシステム化されたサンドボックスが提供されます。

    • ReadWritePaths は、サービスが書き込むことができる唯一のディレクトリを指定します。これによりProtectSystem=strict、 とともに、ルート AWS IoT Greengrass V2 ディレクトリと への書き込みのみに制限されます/tmp

  3. でインストーラを実行します--setup-system-service true

    sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-region region \ --thing-name MyGreengrassCore \ --thing-group-name MyGreengrassCoreGroup \ --thing-policy-name GreengrassV2IoTThingPolicy \ --tes-role-name GreengrassV2TokenExchangeRole \ --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \ --component-default-user ggc_user:ggc_group \ --provision true \ --setup-system-service true
再起動と OTA 更新の動作

このソリューションでは、次の操作を行います。

  • AWS IoT Greengrass Core ソフトウェアはシステムサービスとして実行され、障害発生時またはデバイスの再起動時に自動的に再起動します。

  • AWS IoT Greengrass Core ソフトウェアの OTA 更新は機能します。ソフトウェアは自動的に更新および再起動します。

システムリソースの制限

このソリューションでのメモリと CPU のコンポーネントごとのリソース制限は、 AWS IoT Greengrass Core ソフトウェアをルートとして実行する場合と同じ方法で機能します。

に必要な Linux 機能 AWS IoT Greengrass V2

次の表は、非ルート設定で を実行するときに AWS IoT Greengrass Core ソフトウェアに必要な Linux 機能を示しています。これらの機能は、ソリューション 3 および 4 で使用されます。

必要な Linux 機能
機能 説明 に必須

CAP_CHOWN

ファイルの UIDs と GIDs

コンポーネントを実行するユーザーに応じてファイルの所有権を変更する

CAP_DAC_OVERRIDE

ファイルの読み取り、書き込み、実行のアクセス許可チェックをバイパスする

でスクリプトに使用すると、Greengrass nucleus ユーザーにファイルの実行を許可する RequiresPrivilege

CAP_DAC_READ_SEARCH

ファイル読み取りアクセス許可チェックとディレクトリ読み取りおよび実行アクセス許可チェックをバイパスする

Greengrass nucleus ユーザーに読み取り許可がないフォルダでもフォルダ階層をウォークする

CAP_FOWNER

プロセスのファイルシステム UID がファイルの UID と一致する必要があるオペレーションのアクセス許可チェックをバイパスする

ファイル所有権チェックをバイパスする

CAP_SETUID

プロセス UIDs

Greengrass nucleus を実行しているユーザーとは異なるユーザーとしてスクリプトを実行するsudoときに を使用する

CAP_SETGID

プロセス GIDs

Greengrass nucleus を実行しているグループとは異なるグループとしてスクリプトを実行するsudoときに を使用する

CAP_SYS_RESOURCE

リソース制限を上書きする

デプロイで制限が指定されていない場合でも、コンポーネントプロセスにリソース制限を設定する

CAP_AUDIT_WRITE

カーネル監査ログにレコードを書き込む

がカーネル監査ログsudoに書き込むことを許可する