TestFlight内部テスターに設定する最小権限を考えてみた

:::note 
これは2024年9月時点での情報となります
:::

## はじめに
iOSアプリでのサービス開発で、様々なデバイス、OSバージョンでの動作検証をするために、アプリ開発チーム外のメンバーに協力してもらうことがあると思います。
TestFlightを利用してテストを実施する場合は、内部テスター、外部テスターのいずれかを利用することになります。以下、内部テスターと外部テスターの概要です。

- 内部テスター  
開発チーム内でのテストなど、狭い範囲を対象としたものです。最大人数は100人。テストに参加するには、AppleアカウントをADP（AppleDeveloperProgram）のチームに招待する必要があります。テストを開始するにあたり、Appleの審査はありません。

- 外部テスター  
アプリ開発チームだけではなく、外部関係者など、より広い範囲を対象としたものです。最大人数は10,000人。テストに参加するには、テスターのメールアドレス登録を行うか、生成されたパブリックリンクにアクセスしてもらう必要があります。テストを開始するにあたり、事前にAppleの審査があります。審査には通常1-2日かかります。

アプリ開発チーム外のメンバーに協力してもらう場合は、外部テスターの利用でも問題はないのですが、テスト工程で不具合修正と動作確認が頻発する状況の中、Appleによる事前審査がある外部テスターを利用するのは効率が悪いです。
そのため一部のメンバーには内部テスターを利用したいと考えたのですが、ADPに招待するユーザの権限をどう設定するのがよいか不明確だったため、改めて検討しました。

## 設定する権限の検討

ADPのユーザ権限には、下記の8つが存在します。

|  | 権限 | 概要 |
| --- | --- | --- |
| 1 | Account Holder | ライセンス所有者。AppStoreConnect上の全権限 |
| 2 | Admin | 管理者権限。契約関連の処理を除くAccount Holderと同等の権限 |
| 3 | App Manager | アプリの登録や削除など、主にアプリに関する権限 |
| 4 | Developer | 開発者権限。課金アイテムの登録や内部テスターの登録など一部のアプリ関連権限 |
| 5 | Finance | 主に契約関連の情報管理やアナリティクス閲覧権限（契約処理の権限はない） |
| 6 | Marketing | アプリ登録、アプリ内イベントや課金アイテムの登録などの権限 |
| 7 | Sales | アナリティクス閲覧権限のみ |
| 8 | Customer Support | アプリ評価、レビュー回答権限のみ |

[Apple Developer Programにおける役割](https://developer.apple.com/jp/help/account/manage-your-team/roles/)

悪意はなくとも誤って操作をしてしまう可能性もあるため、招待するメンバーの権限は、可能な限りADPや登録しているアプリに対しての影響が少ないものを選択する必要があります。
Developer、Sales、Customer Supportあたりが落としどころだと思われますが、それぞれ考えられるリスクが異なるので、対応や影響を吟味して選択する必要があります。以下、それぞれの権限の詳細と考えられるリスクです。

#### Developer

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883236/7d265d8c-d3c7-4f80-e7ab-3049a4607321.png" width=100% />

| 主な権限 | リスク | 見解 |
| --- | --- | --- |
| ビルドのアップロード | 不要なビルドのアップロード | アップロードされてしまったバージョン、ビルド番号の組み合わせが利用できなくなり、アプリのバージョン運用方針が崩れる可能性があります |
| 課金アイテムの作成 | 不要な課金アイテムの作成 | 誤って作成したとしても、課金アイテムはAppleの審査を通過しないと公開できず、Developer権限では審査申請をすることができないため、そこまで大きなリスクはないと思われます |
| Sandboxテスターの管理 | 不要なSandboxテスターの追加 | 課金やApplePayのテストのためのSandboxテスターユーザを追加したとしても、Sandboxテストができるだけなので、そこまで大きな問題はないと思われます |

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883236/c56c1fdd-ff24-bcba-25ed-8636a4cd27e0.png" width=75% />

上記の「Certificates, Identifiers & Profiles（証明書、ID、プロファイル）へのアクセス。」の設定については注意が必要です。
この設定を有効にすることで、Xcodeでの自動署名が有効になり、開発用の証明書、プロビジョニングプロファイルの作成や端末登録が可能になってしまいます。
ADP上で管理する端末には100台上限の制約があるため、不要な機器の登録ができないように、上記設定を有効にしないように気を付ける必要があります。

#### Sales
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883236/99c35e0f-747a-96e6-95ed-d13081926811.png" width=100% />

| 主な権限 | リスク | 見解 |
| --- | --- | --- |
| App Analytics/売上とトレンドの表示 | アナリティクスデータの流出 | 売上やDL数などが閲覧可能で、これらの値の流出のリスクがあります |

#### Customer Support
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883236/ece25ba5-fdf4-0d96-68d3-8dc0d59125c4.png" width=100% />

| 主な権限 | リスク | 見解 |
| --- | --- | --- |
| カスタマーレビューへの回答および編集 | レビューへの不誠実な回答 | ユーザへ不誠実な回答により、ユーザの信頼喪失やレビューの悪化を招き、最終的にはAppleからアプリの公開を停止されるリスクがあります |

禁止事項の教育を徹底するなど、プロジェクトや招待される側の状況もあるため、一概には言えませんが、上記を踏まえると、権限としてはDeveloperが無難なのではないかと思われます。
またTestFlightの内部テスターとして招待できる権限については権限表には明示がないため、すべての権限について内部テスターとして追加可能かを確認したところ、いずれの権限でも内部テスターとして追加は可能でした。

#### 管理対象アプリ指定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3883236/8067234b-06bd-3825-f613-722e496b3bc7.png" width=100% />

権限を最小にするためには、上記の様に管理対象のアプリの設定をテスト対象のアプリのみに設定することも必要です。

## まとめ
TestFlight内部テスターに設定する最小権限を検討してきました。
そもそも内部テスター目的の場合は、招待したアカウントでAppStoreConnectの管理ページにアクセスしないようにしてもらえばよいのですが、同アカウントで複数のチームに参加しているなどで、誤って操作してしまう可能性はあると思います。
招待するユーザ権限により、様々なリスクが考えられるため、Developer権限かつアプリを特定して招待するのが良いのではないかと思われます。
現状は内部テスターのみ実施可能な権限がないため、いずれかの余剰な権限を選択する必要がありますが、将来的に内部テスターのみ可能な権限が追加されると良いですね。

またDeveloper権限含め、登録されている全てのユーザは、「ユーザとアクセス」からチームに登録されている全てのユーザの情報が閲覧可能なので、不都合がある場合は内部テスターではなく、外部テスターを選択する必要があるので注意してください。

## We Are Hiring!
https://www.biprogy.com/recruit/recruiting/